追着幸福跑|为什么深度神经网络这么难训练?| 赠书( 三 )


最终的分类准确率为96.48%(也可能不同 , 每次运行实际上都会有一点点偏差) , 这和前面的结果相似 。
接下来增加另外一个隐藏层 , 它也包含30个神经元 , 并使用相同的超参数进行训练:
>>> net = network2.Network([784, 30, 30, 10])
>>> net.SGD(training_data, 30, 10, 0.1, lmbda=5.0,
... evaluation_data=http://kandian.youth.cn/index/validation_data, monitor_evaluation_accuracy=True)
分类准确率稍有提升 , 到了96.90% , 这说明增加深度有效果 , 那就再增加一个隐藏层 , 它同样有30个神经元:
>>> net = network2.Network([784, 30, 30, 30, 10])
>>> net.SGD(training_data, 30, 10, 0.1, lmbda=5.0,
... evaluation_data=http://kandian.youth.cn/index/validation_data, monitor_evaluation_accuracy=True)
结果分类准确率不仅没有提升 , 反而下降到了96.57% , 这与最初的浅层神经网络相差无几 。 尝试再增加一层:
>>> net = network2.Network([784, 30, 30, 30, 30, 10])
>>> net.SGD(training_data, 30, 10, 0.1, lmbda=5.0,
... evaluation_data=http://kandian.youth.cn/index/validation_data, monitor_evaluation_accuracy=True)
分类准确率继续下降 , 变为96.53% 。 虽然这从统计角度看算不上显著下降 , 但释放出了不好的信号 。
这种现象非常奇怪 。 根据常理判断 , 额外的隐藏层能让神经网络学到更加复杂的分类函数 , 然后在分类时表现得更好 。 按理说不应该变差 , 有了额外的神经元层 , 再糟糕也不过是没有作用 , 然而情况并非如此 。
这究竟是为什么呢?理论上 , 额外的隐藏层的确能够起作用 , 然而学习算法没有找到正确的权重和偏置 。 下面研究学习算法本身出了什么问题 , 以及如何改进 。
为了直观理解这个问题 , 可以将神经网络的学习过程可视化 。 图5-5展示了[784,30,30,10]神经网络的一部分——两个隐藏层 , 每层各有30个神经元 。 图中每个神经元都有一个条形统计图 , 表示在神经网络学习时该神经元改变的速度 , 长条代表权重和偏置变化迅速 , 反之则代表变化缓慢 。 确切地说 , 这些条代表每个神经元上的
追着幸福跑|为什么深度神经网络这么难训练?| 赠书 , 即代价关于神经元偏置的变化速率 。 第2章讲过 , 这个梯度量不仅控制着学习过程中偏置改变的速度 , 也控制着输入到神经元的权重的改变速度 。 遗忘了这些细节也不要紧 , 这里只需要记住这些条表示每个神经元权重和偏置在神经网络学习时的变化速率 。
简单起见 , 图5-5只展示了每个隐藏层最上方的6个神经元 。 之所以没有展示输入神经元 , 是因为它们没有需要学习的权重或偏置;之所以没有展示输出神经元 , 是因为这里进行的是层与层的比较 , 而比较神经元数量相同的两层更为合理 。 神经网络初始化后立即得到了训练前期的结果 , 如图5-5所示 。
追着幸福跑|为什么深度神经网络这么难训练?| 赠书该神经网络是随机初始化的 , 因此神经元的学习速度其实相差较大 , 而且隐藏层2上的条基本上要比隐藏层1上的条长 , 所以隐藏层2的神经元学习得更快 。 这仅仅是一个巧合吗?这能否说明第2个隐藏层的神经元一般会比第1个隐藏层的神经元学习得更快呢?
追着幸福跑|为什么深度神经网络这么难训练?| 赠书借助以上定义 , 在和图5-5相同的配置下 ,


推荐阅读