0 | module NN.Optimisers.Instances
2 | import Data.Materialise
3 | import Data.Container.Additive
5 | import NN.Optimisers.Definition
11 | GA : Num pType => (mon : ComMonoid pType) => FromDouble pType =>
12 | {default 0.001 lr : pType} -> Optimiser (Const pType) Unit
14 | (!% \(p, ()) => (
p ** \p' => (p + lr * p', ()))
)
21 | (mon : ComMonoid pType) => FromDouble pType =>
22 | {default 0.001 lr : pType} -> Optimiser (Const pType) Unit
23 | GD = GA {lr = negate lr}
27 | momentumUpdate : Neg pType =>
34 | momentumUpdate gamma p s p' = let s' = gamma * s + p'
35 | in (p - lr * s', s')
38 | lookAhead : Num pType =>
39 | (gamma, p, s : pType) ->
41 | lookAhead gamma p s = p + gamma * s
45 | GDMomentum : Neg pType =>
46 | (mon : ComMonoid pType) =>
48 | {default False nesterov : Bool} ->
49 | {default 0.001 lr : pType} ->
50 | {default 0.9 gamma : pType} ->
51 | Optimiser (Const pType) pType
52 | GDMomentum = MkOptimiser
53 | (!% \(p, s) => (
if nesterov then lookAhead gamma p s else p
54 | ** momentumUpdate {lr} gamma p s)
)
61 | adamUpdate : Neg pType => Fractional pType => Sqrt pType =>
62 | FromDouble pType => Materialise pType =>
66 | (epsilon : pType) ->
73 | (pType, pType, pType, Double, Double)
74 | adamUpdate beta1 beta2 epsilon p m v b1p b2p g =
75 | let g' = materialise g
76 | m' = materialise (fromDouble beta1 * m + fromDouble (1 - beta1) * g')
77 | v' = materialise (fromDouble beta2 * v + fromDouble (1 - beta2) * g' * g')
80 | mHat = fromDouble (1 / (1 - b1p')) * m'
81 | vHat = fromDouble (1 / (1 - b2p')) * v'
82 | in (p - lr * mHat / (sqrt vHat + epsilon), m', v', b1p', b2p')
92 | (mon : ComMonoid pType) =>
93 | FromDouble pType => Materialise pType =>
94 | Fractional pType => Sqrt pType =>
95 | {default 0.001 lr : pType} ->
96 | {default 0.9 beta1 : Double} ->
97 | {default 0.999 beta2 : Double} ->
98 | {default 1.0e-8 epsilon : pType} ->
99 | Optimiser (Const pType) (pType, pType, Double, Double)
101 | (!% \(p, (m, v, b1p, b2p)) =>
102 | (
p ** adamUpdate {lr} beta1 beta2 epsilon p m v b1p b2p)
)
103 | (pure (0, 0, 1, 1))