专栏中《零神经网络实战》系列持续更新介绍神经元怎么工作,最后使用python从0到1不调用任何依赖神经网络框架(不使用tensorflow等框架)来实现神经网络,梯度下降、反向传播、卷积神经网络CNN、循环神经网络RNN。从0基础角度进行神经网络实战。 上一篇: 零基础神经网络实战(1):单个神经元+随机梯度下降学习逻辑与规则
作者:
实例介绍反向传播,为何说深度学习离不开反向传播?
我们专栏之前介绍了单个神经元如何利用随机梯度下降自己调节权重。深度学习指的是数以百千层的层数很深的神经网络,每层又有数以百千个神经元。那么深度学习是否也可以使用这种形式的梯度下降来进行调节权重呢?答:很难。为什么?主要原因是太深了。为何“深”用梯度下降解会有问题呢?主要是因为链式法则导致计算损失函数对前面层权重的导数时,损失函数对后面层权重的导数总是被重复计算,反向传播就是将那些计算的值保存减少重复计算。不明白?那这篇文章就看对了。接下来将解释这个重复计算过程。反向传播就是梯度下降中的求导环节,它从后往前计算导数重复利用计算过的导数而已。。梯度下降不懂或者神经网络不懂请先阅读这个文章单个神经元+随机梯度下降学习逻辑与规则。
文章结构:
- 为何要使用反向传播?
- 反向传播优化神经网络权重参数实践。
为何要使用反向传播?
我们用一个最简单的三层神经网络(无激活函数)来进行解释为何需要使用反向传播,所使用的三层神经网络如下所示:
我们神经网络是可以用公式表示。对于整个网络而言,是输入,
是输出。对于神经网络的各层而言,第一层神经网络的输入是
输出是
。那么其用公式表示就是:
.第二层神经网络用公式表示就是:
。第三层用公式表示是:
。假设
是真实值,那么损失函数
可以写成这样:
。
这个1/2 只是为了抵消二次方求导所产生的2。其实可以不写的。
这里我们有三个要优化的参数:。
我们先用传统的梯度下降方法来看看哪些地方重复计算了,而反向传播就是将这些重复计算的地方计算结果保存,并且向前面层传播这个值以减少运算复杂度。梯度下降不懂或者神经网络不懂请先阅读这个文章单个神经元+随机梯度下降学习逻辑与规则。梯度下降需要先得求损失函数对的导数,然后根据导数来不断迭代更新
的值。
- 第1层:求损失函数
对
的导数(更规范的讲是偏导数)。
我们先看看损失函数和
之间的关系是什么。
所以这是个复合函数的求导。根据高中学习到的复合函数求导法则(也是大家可能经常听到的链式法则),复合函数求导等于各级复合函数导数的乘积,也就是这样。
- 第2层:求损失函数
对
的导数。
我们再看看损失函数和
之间的关系是什么。
根据复合函数求导可得:。
- 第3层:求损失函数