module Synapse.NN.Losses
(
LossFn
, Loss (Loss, unLoss)
, mse
, msle
, mae
, mape
, logcosh
) where
import Synapse.Tensors (ElementwiseScalarOps((+.), (*.), (**.)), SingletonOps(mean))
import Synapse.Autograd (SymbolMat, Symbolic)
type LossFn a = SymbolMat a -> SymbolMat a -> SymbolMat a
newtype Loss a = Loss
{ forall a. Loss a -> LossFn a
unLoss :: LossFn a
}
mse :: (Symbolic a, Floating a) => LossFn a
mse :: forall a. (Symbolic a, Floating a) => LossFn a
mse SymbolMat a
true SymbolMat a
predicted = SymbolMat a -> SymbolMat a
forall f. (SingletonOps f, Fractional (DType f)) => f -> f
mean (SymbolMat a -> SymbolMat a) -> SymbolMat a -> SymbolMat a
forall a b. (a -> b) -> a -> b
$ (SymbolMat a
true SymbolMat a -> SymbolMat a -> SymbolMat a
forall a. Num a => a -> a -> a
- SymbolMat a
predicted) SymbolMat a -> DType (SymbolMat a) -> SymbolMat a
forall f.
(ElementwiseScalarOps f, Floating (DType f)) =>
f -> DType f -> f
**. a
DType (SymbolMat a)
2.0
msle :: (Symbolic a, Floating a) => LossFn a
msle :: forall a. (Symbolic a, Floating a) => LossFn a
msle SymbolMat a
true SymbolMat a
predicted = SymbolMat a -> SymbolMat a
forall f. (SingletonOps f, Fractional (DType f)) => f -> f
mean (SymbolMat a -> SymbolMat a) -> SymbolMat a -> SymbolMat a
forall a b. (a -> b) -> a -> b
$ (SymbolMat a -> SymbolMat a
forall a. Floating a => a -> a
log (SymbolMat a
true SymbolMat a -> DType (SymbolMat a) -> SymbolMat a
forall f.
(ElementwiseScalarOps f, Num (DType f)) =>
f -> DType f -> f
+. a
DType (SymbolMat a)
1) SymbolMat a -> SymbolMat a -> SymbolMat a
forall a. Num a => a -> a -> a
- SymbolMat a -> SymbolMat a
forall a. Floating a => a -> a
log (SymbolMat a
predicted SymbolMat a -> DType (SymbolMat a) -> SymbolMat a
forall f.
(ElementwiseScalarOps f, Num (DType f)) =>
f -> DType f -> f
+. a
DType (SymbolMat a)
1)) SymbolMat a -> DType (SymbolMat a) -> SymbolMat a
forall f.
(ElementwiseScalarOps f, Floating (DType f)) =>
f -> DType f -> f
**. a
DType (SymbolMat a)
2.0
mae :: (Symbolic a, Floating a) => LossFn a
mae :: forall a. (Symbolic a, Floating a) => LossFn a
mae SymbolMat a
true SymbolMat a
predicted = SymbolMat a -> SymbolMat a
forall f. (SingletonOps f, Fractional (DType f)) => f -> f
mean (SymbolMat a -> SymbolMat a) -> SymbolMat a -> SymbolMat a
forall a b. (a -> b) -> a -> b
$ SymbolMat a -> SymbolMat a
forall a. Num a => a -> a
abs (SymbolMat a
true SymbolMat a -> SymbolMat a -> SymbolMat a
forall a. Num a => a -> a -> a
- SymbolMat a
predicted)
mape :: (Symbolic a, Floating a) => LossFn a
mape :: forall a. (Symbolic a, Floating a) => LossFn a
mape SymbolMat a
true SymbolMat a
predicted = SymbolMat a -> SymbolMat a
forall f. (SingletonOps f, Fractional (DType f)) => f -> f
mean (SymbolMat a -> SymbolMat a
forall a. Num a => a -> a
abs (SymbolMat a
true SymbolMat a -> SymbolMat a -> SymbolMat a
forall a. Num a => a -> a -> a
- SymbolMat a
predicted) SymbolMat a -> SymbolMat a -> SymbolMat a
forall a. Fractional a => a -> a -> a
/ SymbolMat a
true) SymbolMat a -> DType (SymbolMat a) -> SymbolMat a
forall f.
(ElementwiseScalarOps f, Num (DType f)) =>
f -> DType f -> f
*. a
DType (SymbolMat a)
100
logcosh :: (Symbolic a, Floating a) => LossFn a
logcosh :: forall a. (Symbolic a, Floating a) => LossFn a
logcosh SymbolMat a
true SymbolMat a
predicted = SymbolMat a -> SymbolMat a
forall f. (SingletonOps f, Fractional (DType f)) => f -> f
mean (SymbolMat a -> SymbolMat a) -> SymbolMat a -> SymbolMat a
forall a b. (a -> b) -> a -> b
$ SymbolMat a -> SymbolMat a
forall a. Floating a => a -> a
log (SymbolMat a -> SymbolMat a) -> SymbolMat a -> SymbolMat a
forall a b. (a -> b) -> a -> b
$ SymbolMat a -> SymbolMat a
forall a. Floating a => a -> a
cosh (SymbolMat a
true SymbolMat a -> SymbolMat a -> SymbolMat a
forall a. Num a => a -> a -> a
- SymbolMat a
predicted)