module Synapse.NN.Layers.Regularizers
(
RegularizerFn
, Regularizer (Regularizer, unRegularizer)
, l1
, l2
) where
import Synapse.Tensors (ElementwiseScalarOps((*.)), SingletonOps(elementsSum))
import Synapse.Autograd (SymbolMat, Symbolic)
type RegularizerFn a = SymbolMat a -> SymbolMat a
newtype Regularizer a = Regularizer
{ forall a. Regularizer a -> RegularizerFn a
unRegularizer :: RegularizerFn a
}
l1 :: (Symbolic a, Num a) => a -> RegularizerFn a
l1 :: forall a. (Symbolic a, Num a) => a -> RegularizerFn a
l1 a
k SymbolMat a
mat = SymbolMat a -> SymbolMat a
forall f. (SingletonOps f, Num (DType f)) => f -> f
elementsSum (SymbolMat a -> SymbolMat a
forall a. Num a => a -> a
abs SymbolMat a
mat) SymbolMat a -> DType (SymbolMat a) -> SymbolMat a
forall f.
(ElementwiseScalarOps f, Num (DType f)) =>
f -> DType f -> f
*. a
DType (SymbolMat a)
k
l2 :: (Symbolic a, Num a) => a -> RegularizerFn a
l2 :: forall a. (Symbolic a, Num a) => a -> RegularizerFn a
l2 a
k SymbolMat a
mat = SymbolMat a -> SymbolMat a
forall f. (SingletonOps f, Num (DType f)) => f -> f
elementsSum (SymbolMat a
mat SymbolMat a -> SymbolMat a -> SymbolMat a
forall a. Num a => a -> a -> a
* SymbolMat a
mat) SymbolMat a -> DType (SymbolMat a) -> SymbolMat a
forall f.
(ElementwiseScalarOps f, Num (DType f)) =>
f -> DType f -> f
*. a
DType (SymbolMat a)
k