反向传播
Back Propagation(梯度反向传播)实例讲解 - 马索萌的文章 - 知乎 https://zhuanlan.zhihu.com/p/40378224
BP的目的
首先我们要搞清楚两个问题
- 为什么要求梯度?
- 求关于谁的梯度?
上图展示了一个神经网络。神经网络可以看作是一个函数 ,
是输入,
是输出,
是
的参数。
的真实值是我们的目标,但我们有的只是一些
和与之对应的真实的
的值,所以我们要用到这两个值去估计
的真实值。这个问题可以看成下面的优化问题(优化问题即求函数最小值)
其中我们令 ,并称之为误差项。我们的目标就是求一组
使得
最小。求解这类问题有个经典的方法叫做梯度下降法(SGD, Stochastic Gradient Descent),这个算法一开始先随机生成一个
,然后用下面的公式不断更新
的值,最终能够逼近真实结果。
其中 是当前的误差
关于
的梯度,它的物理意义是当
变化的时候
随之变化的幅度,
叫做学习率,通常在
以下,用来控制更新的步长(防止步子太大扯到蛋哈哈)。所以,开头的两个问题答案就有了:求梯度的原因是我们需要它来估算真实的
,求的是误差项
关于参数
的梯度。
链式法则—BP的基础
在正式推导BP之前,我们首先需要回忆一下求导数的链式法则,这个是BP的基础和核心。假设 ,那么
。我们知道
,那么如何求
对
的导数
呢?这个时候链式法则就出场了,根据微积分的知识
,即复合函数的求导可以使用乘法法则,也称为链式法则,待会儿我们会用到。上面给出的是单变量的情况,多变量同样适用。
Back Propagation By Example
现在我们用一个例子来讲解BP,如下图所示,我们选取的例子是最简单的feed forward neural network,它有两层,输入层有两个神经元 ,隐藏层有两个神经元
,最终输出只有一个神经元
,各个神经元之间全连接。为了直观起见,我们给各个参数赋上具体的数值。我们令
,然后我们令
的真实值分别是
,令
的真实值是
。这样我们可以算出
的真实目标值是
。
网络结构示意图,一个简单的两层Feed Forward Netowrk
那么为了模拟一个Back Propagation的过程,我们假设我们只知道 ,以及对应的目标
。我们不知道
的真实值,现在我们需要随机为他们初始化值,假设我们的随机化结果是
。下面我们就开始来一步步进行Back Propagation吧。
首先,在计算反向传播之前我们需要计算Feed Forward Pass,也即是预测的 和误差项
,其中
。根据网络结构示意图,各个变量的计算公式为:
现在Feed Forward Pass算完了,我们来计算Backward Pass。 是神经网络预测的值,真实的输出是
。那么,要更新
的值我们就要算
,根据链式法则有
因为 ,所以
而 ,所以
把上面两项相乘我们得到
运用之前梯度下降法的公式更新 ,得到新的
。其中我们假设
(并且后面所有的
都等于
)
同理,我们可以按照相同的步骤计算 的更新公式
下面我们再来看 ,由于这四个参数在同一层,所以求梯度的方法是相同的,因此我们这里仅展示对
的推导。根据链式法则
其中 在求
的时候已经求过了。而根据
我们可以得到
又根据 我们可以得到
因此我们有下面的公式
现在我们代入数字并使用梯度下降法更新
然后重复这个步骤更新
Great!现在我们已经更新了所有的梯度,完成了一次梯度下降法。我们用得到的新的 再来预测一次网络输出值,根据Feed Forward Pass得到
,那么新的误差是
,相比于之前的
确实是下降了呢,说明我们的模型预测稍微准了一点。只要重复这个步骤,不断更新网络参数我们就能学习到更准确的模型啦。
如果你看到了这里,那么恭喜你,你已经学会Back Propagation了。这么看下来,Back Propagation是不是很简单呢?