mltool-0.1.0.0: src/MachineLearning/NeuralNetwork/WeightInitialization.hs
{-|
Module: MachineLearning.NeuralNetwork.WeightInitialization
Description: Weight Initialization
Copyright: (c) Alexander Ignatyev, 2017
License: BSD-3
Stability: experimental
Portability: POSIX
Various Weight Initialization algorithms.
-}
module MachineLearning.NeuralNetwork.WeightInitialization
(
nguyen
, he
)
where
import qualified Numeric.LinearAlgebra as LA
import qualified Control.Monad.Random as RndM
import MachineLearning.Types (Matrix)
import MachineLearning.Random (getRandomRMatrixM)
-- | Weight Initialization Algorithm discussed in Nguyen at al.: https://web.stanford.edu/class/ee373b/nninitialization.pdf
-- Nguyen, Derrick, Widrow, B. Improving the learning speed of 2-layer neural networks by choosing initial values of adaptive weights.
-- In Proc. IJCNN, 1990; 3: 21-26.
nguyen :: RndM.RandomGen g => (Int, Int) -> RndM.Rand g (Matrix, Matrix)
nguyen (r, c) = do
let b = LA.konst 0 (1, r)
eps = (sqrt 6) / (sqrt . fromIntegral $ r + c)
w <- getRandomRMatrixM r c (-eps, eps)
return (b, w)
-- | Weight Initialization Algorithm discussed in He at al.: https://arxiv.org/abs/1502.01852
-- Kaiming He, Xiangyu Zhang, Shaoqing Ren, Jian Sun.
-- Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification.
he :: RndM.RandomGen g => (Int, Int) -> RndM.Rand g (Matrix, Matrix)
he (r, c) = do
let b = LA.konst 0 (1, r)
eps = sqrt (2/(fromIntegral $ r + c))
w <- getRandomRMatrixM r c (-eps, eps)
return (b, w)