到目前为止, 我们例子中使用的神经网络一共只有3层 (一个隐藏层):
消失的gradient问题 (vanishing gradient problem):
>>>importmnist_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,10]
再增加一层:
[784,30,30,30,30,10]
这种现象普遍存在于神经网络之中, 叫做: vanishing gradient problem
另外一种情况是内层的梯度被外层大很多, 叫做exploding gradient problem
所以说神经网络算法用gradient之类的算法学习存在不稳定性
训练深度神经网络, 需要解决vanishing gradient problem
造成vanishing gradient problem的原因:
假设每层只有一个神经元
按照平时随机从正太分部(0,1)中随机产生权重的方法, 大部分|w| < 1