packages feed

synapse-0.1.0.0: src/Synapse/NN/Losses.hs

{- | Provides collection of functions that are used to as a reference of what needs to be minimised during training.

'LossFn' type alias represents those functions, and "Synapse" offers a variety of them.
-}


module Synapse.NN.Losses
    ( -- * 'LossFn' type alias and 'Loss' newtype

      LossFn
    
    , Loss (Loss, unLoss)

      -- * Regression losses
    
    , mse
    , msle
    , mae
    , mape
    , logcosh
    ) where


import Synapse.Tensors (ElementwiseScalarOps((+.), (*.), (**.)), SingletonOps(mean))

import Synapse.Autograd (SymbolMat, Symbolic)


-- | 'LossFn' type alias represents functions that are able to provide a reference of what relation between matrices needs to be minimised.
type LossFn a = SymbolMat a -> SymbolMat a -> SymbolMat a


{- | 'Loss' newtype wraps 'LossFn's - differentiable functions that are able to provide a reference of what relation between matrices needs to be minimised.

Every loss function must return symbol of singleton matrix.
-}
newtype Loss a = Loss 
    { unLoss :: LossFn a  -- ^ Unwraps 'Loss' newtype.
    }


-- Regression losses

-- | Computes the mean of squares of errors.
mse :: (Symbolic a, Floating a) => LossFn a
mse true predicted = mean $ (true - predicted) **. 2.0

-- | Computes the mean squared logarithmic error.
msle :: (Symbolic a, Floating a) => LossFn a
msle true predicted = mean $ (log (true +. 1) - log (predicted +. 1)) **. 2.0

-- | Computes the mean of absolute error.
mae :: (Symbolic a, Floating a) => LossFn a
mae true predicted = mean $ abs (true - predicted)

-- | Computes the mean absolute percentage error.
mape :: (Symbolic a, Floating a) => LossFn a
mape true predicted = mean (abs (true - predicted) / true) *. 100

-- | Computes the logarithm of the hyperbolic cosine of the error.
logcosh :: (Symbolic a, Floating a) => LossFn a
logcosh true predicted = mean $ log $ cosh (true - predicted)