我正在阅读《神经网络和深度学习》(前两章),我正在尝试跟随并构建自己的 ANN 来对 MNIST 数据集中的数字进行分类。
几天来我一直在摸不着头脑,因为我的实现在 10 个 epoch 后对来自测试集(约 5734/10000)的数字进行分类时达到了约 57% 的准确率(训练集的准确度在第 10 个 epoch 之后停滞不前,并且测试集的准确性可能会因为过度拟合而下降)。
我使用的配置与书中几乎相同:2 层前馈 ANN(784-30-10),所有层都完全连接;标准 sigmoid 激活函数;二次成本函数;权重以相同的方式初始化(取自均值为 0 和标准差为 1 的高斯分布)唯一的区别是我使用在线训练而不是批量/小批量训练,并且学习率为 1.0 而不是 3.0(我已经尝试过小批量训练 + 3.0 的学习率)
然而,我的实现在一堆 epochs 之后没有通过 60% 的百分位数,正如书中所说,ANN 在第一个 epoch 之后以几乎完全相同的配置超过 %90 。起初我搞砸了反向传播算法的实现,但是在以不同的方式重新实现反向传播 3 次之后,每次重新实现的结果完全相同,我难住了......
反向传播算法产生的结果示例:
使用具有上述相同配置的更简单的前馈网络(在线训练 + 学习率为 1.0):3 个输入神经元、2 个隐藏神经元和 1 个输出神经元。
初始权重初始化如下:
Layer #0 (3 neurons)
Layer #1 (2 neurons)
- Neuron #1: weights=[0.1, 0.15, 0.2] bias=0.25
- Neuron #2: weights=[0.3, 0.35, 0.4] bias=0.45
Layer #2 (1 neuron)
- Neuron #1: weights=[0.5, 0.55] bias=0.6
给定输入 [0.0, 0.5, 1.0],输出为 0.78900331。对相同的输入进行反向传播,期望输出为 1.0,得到以下偏导数(dw = 导数 wrt 权重,db = 导数 wrt 偏差):
Layer #0 (3 neurons)
Layer #1 (2 neurons)
- Neuron #1: dw=[0, 0.0066968054, 0.013393611] db=0.013393611
- Neuron #2: dw=[0, 0.0061298212, 0.012259642] db=0.012259642
Layer #2 (1 neuron)
- Neuron #1: dw=[0.072069918, 0.084415339] db=0.11470326
使用这些偏导数更新网络会产生 0.74862305 的校正输出值。
如果有人愿意确认上述结果,那将极大地帮助我,因为我几乎排除了反向传播错误是问题的原因。
有没有人处理 MNIST 问题遇到过这个问题?甚至对我应该检查的事情的建议也会有所帮助,因为我真的迷路了。