一:消失的gradient问题 (vanishing gradient problem)
>>> import mnist_loader
>>> training_data, validation_data, test_data = \
... mnist_loader.load_data_wrapper()
>>> import network2
>>> net = network2.Network([784, 30, 10])
>>> net.SGD(training_data, 30, 10, 0.1, lmbda=5.0,
... evaluation_data=validation_data, monitor_evaluation_accuracy=True)
结果: 96.48%
加入一个隐藏层:
>>> net = network2.Network([784, 30, 30, 10])
>>> net.SGD(training_data, 30, 10, 0.1, lmbda=5.0,
... evaluation_data=validation_data, monitor_evaluation_accuracy=True)
结果: 96.9%
再加入一个隐藏层:
>>> net = network2.Network([784, 30, 30, 30, 10])
>>> net.SGD(training_data, 30, 10, 0.1, lmbda=5.0,
... evaluation_data=validation_data, monitor_evaluation_accuracy=True)
结果: 96.57%
为什么加入一层反而降低了准确率?
条形区域长度代表∂C/∂b, Cost对于bias的变化率(这个地方的推导没怎么看懂)
二:学习速率
再增加一层:
[784,30,30,30,30,10]
可以看出, 第一个隐藏层比第四个几乎要慢100
这种现象普遍存在于神经网络之中, 叫做: vanishing gradient problem
另外一种情况是内层的梯度被外层大很多, 叫做exploding gradient problem
所以说神经网络算法用gradient之类的算法学习存在不稳定性
训练深度神经网络, 需要解决vanishing gradient problem
三:造成vanishing gradient problem的原因
每层的学习速率会由于一个固定的比值越来越大或越来越小,但是为什么会造成vanishing gradient problem(估计就是这样定义的)