Safe Haskell | Safe-Inferred |
---|---|
Language | Haskell2010 |
Easy backpropagation when all variables have the same type.
data MyRecord a = ... deriving (Functor, Foldable, Traversable) deriving via (TraversableVar MyRecord a) instance HasGrad a => HasGrad (MyRecord a)
Gradient type
One might excect gradient type to be type Grad (MyRecord a) = MyRecord (Grad a)
, but it's not
the case, because record could contain additional members apart from a
s, for example:
data MyPoint a = MyPoint { , pointLabel :: String , pointX :: a , pointY :: a }
and MyPoint (Grad a)
can't be made VectorSpace
. Gradient type Grad (MyRecord a)
is a newtype wrapper over IntMap
that is not exported.
Synopsis
- backpropTraversable :: forall f a b p. (Traversable f, Grad (f a) ~ Grad (TraversableVar f a), HasGrad a, HasGrad p) => Grad p -> (a -> Grad a -> b) -> (forall r. f (BVar r a) -> BVar r p) -> f a -> f b
- backpropTraversable_GradOnly :: forall f a p. (Traversable f, Grad (f a) ~ Grad (TraversableVar f a), HasGrad a, HasGrad p) => Grad p -> (forall r. f (BVar r a) -> BVar r p) -> f a -> f (Grad a)
- backpropTraversable_ValueAndGrad :: forall f a p. (Traversable f, Grad (f a) ~ Grad (TraversableVar f a), HasGrad a, HasGrad p) => Grad p -> (forall r. f (BVar r a) -> BVar r p) -> f a -> f (a, Grad a)
- splitTraversable :: forall f r a. (Traversable f, Grad (f a) ~ Grad (TraversableVar f a), HasGrad a) => BVar r (f a) -> f (BVar r a)
- newtype TraversableVar f a = TraversableVar {
- unTraversableVar :: f a
Backpropagate
backpropTraversable :: forall f a b p. (Traversable f, Grad (f a) ~ Grad (TraversableVar f a), HasGrad a, HasGrad p) => Grad p -> (a -> Grad a -> b) -> (forall r. f (BVar r a) -> BVar r p) -> f a -> f b Source #
backpropTraversable one combine fun
one
is a value to be backpropagated. In case of p
being scalar, set one
to 1 to compute unscaled gradient.
combine
is given value of a parameter and its gradient to construct result,
just like zipWith
.
fun
is the function to be differentiated.
backpropTraversable_GradOnly :: forall f a p. (Traversable f, Grad (f a) ~ Grad (TraversableVar f a), HasGrad a, HasGrad p) => Grad p -> (forall r. f (BVar r a) -> BVar r p) -> f a -> f (Grad a) Source #
Like backpropTraversable
, but returns gradient only.
backpropTraversable_ValueAndGrad :: forall f a p. (Traversable f, Grad (f a) ~ Grad (TraversableVar f a), HasGrad a, HasGrad p) => Grad p -> (forall r. f (BVar r a) -> BVar r p) -> f a -> f (a, Grad a) Source #
backpropTraversable
specialized to return a pair of value and gradient.
Split
splitTraversable :: forall f r a. (Traversable f, Grad (f a) ~ Grad (TraversableVar f a), HasGrad a) => BVar r (f a) -> f (BVar r a) Source #
Note that splitTraversable
won't be useful
for top level BVar
, because the type Grad (f a)
is not exposed.
TraversableVar
newtype TraversableVar f a Source #
Provides HasGrad instance for use in deriving via
TraversableVar | |
|