【发布时间】:2016-03-22 02:43:09
【问题描述】:
我正在阅读Neural Networks and Deep Learning(前两章),我正在尝试跟随并构建自己的 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 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 问题的人是否遇到过这个问题? 甚至对我应该检查的事情的建议也会有所帮助,因为我真的迷路了。
【问题讨论】:
标签: neural-network artificial-intelligence backpropagation mnist feed-forward