训练神经网络中出现极小的NaN值
我正在尝试在Haskell中实现神经网络架构,并在MNIST上使用它。 我正在使用hmatrix线性代数软件包。我的培训框架是使用pipes软件包构建的。 我的代码可以编译,并且不会崩溃。但是问题是,层大小(例如1000),最小批大小和学习率的某些组合会导致NaN计算中的值。经过一番检查,我发现极小的值(的顺序1e-100)最终出现在激活中。但是,即使这种情况没有发生,培训仍然无法进行。它的损失或准确性没有任何改善。 我检查并重新检查了我的代码,但对于问题的根源,我一无所知。 这是反向传播训练,它计算每一层的增量: backward lf n (out,tar) das = do let δout = tr (derivate lf (tar, out)) -- dE/dy deltas = scanr (\(l, a') δ -> let w = weights l in (tr a') * (w <> δ)) δout (zip (tail $ toList n) das) return (deltas) …