| Safe Haskell | Safe-Inferred |
|---|---|
| Language | Haskell2010 |
Downhill.BVar.Traversable
Contents
Description
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 as, 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
Constructors
| TraversableVar | |
Fields
| |