深度学习——以图读懂反向传播

  • Post author:
  • Post category:其他


献上台大李宏毅老师的讲解:


http://speech.ee.ntu.edu.tw/~tlkagk/courses/MLDS_2015_2/Lecture/DNN%20backprop.ecm.mp4/index.html


1 问题的引入(背景)

深度学习属于机器学习,机器学习的三个步骤就是:模型,策略和计算方法。比如LR,模型使用的LR模型(LR是基于伯努利假设,伯努利属于指数分布族,指数分布族属于广义线性模型),策略使用的是联合概率分布最大,计算方法是梯度下降法或拟牛顿法等。

深度学习的模型是神经网络,如下图:

策略就是我们说的损失函数,cost function,反映了模型的预测误差,如交叉熵、均方误差等。给定N个训练数据集:

{(x^{1},\widehat{y}^{1}),(x^{2},\widehat{y}^{2}),...,(x^{N},\widehat{y}^{N})}

基于训练集找到一组最佳的参数
\theta ^{*}
使得C(θ)最小;

C(\theta )=\frac{1}{N}\sum _{r}C^{r}(\theta )=\frac{1}{N}\sum _{r}||f(x^{r};\theta )-\widehat{y}^{r}||

\bigtriangledown C(\theta )=\frac{1}{N}\sum _{r} \bigtriangledown C^{r}(\theta )

\bigtriangledown C^{r}(\theta )
具体表示方法是什么?这就需要明白神经网络模型如何表示的,如下图所示,对于l层来说:

第l层的第i个神经元的输入Zi,它是上一层所有神经元的输入之和:

z^{l}_{i} = \sum_{j}\omega^{l} _{ij} a_{j}^{l-1} + b_{i}^{l}

第l层的第i个神经元的输出ai,是zi经过非线性变化(我们称为激活函数,如ReLu,sigmoid等):

a_{i}^{l} = \sigma (z^{l}_{i} )

因此,我们说的θ就是所有的
\{([\omega^{1}]^{T},[b^{1}]^{T}), ...,([\omega^{l}]^{T},[b^{l}]^{T})\}
,则损失函数的偏导
\bigtriangledown C^{r}(\theta )
就是求出所有的
\frac{\partial C^{r}}{\partial \omega _{ij}^{l}}

\frac{\partial C^{r}}{\partial b_{i}^{l}}

一般地,我们求出
\frac{\partial C^{r}}{\partial \omega _{ij}^{l}}

\frac{\partial C^{r}}{\partial b_{i}^{l}}
,会更新参数,即
\omega _{ij}^{l} := \omega _{ij}^{l}-\frac{\partial C^{r}}{\partial \omega _{ij}^{l}}
。但神经网络的参数非常多,比如很简单的alexnet的参数个数在千万级别,一个一个地求是不切实际的,所以,这里需要用到反向传播:back propagation!


2 反向传播优化模型参数

\frac{\partial C^{r}}{\partial \omega _{ij}^{l}}
求解之前,需要了解一下链式法则,就是g(f(x))对x的求导,会等于 g对f的求导 乘 f对x的求导。由于z是w的函数,所以:

\frac{\partial C^{r}}{\partial \omega _{ij}^{l}} = \frac{\partial C^{r}}{\partial z_{i}^{l}} \frac{\partial z_{i}^{l}}{\partial \omega _{ij}^{l}}

\frac{\partial z_{i}^{l}}{\partial \omega _{ij}^{l}}=\frac{\partial (\sum _{j} \omega _{ij}^{l}a_{j}^{l-1}+b_{i}^{l})}{\partial \omega _{ij}^{l}}=a_{j}^{l-1}

a_{j}^{l-1}
可以通过前向传播求出(即,是已知的不用求)

接下来求解
\frac{\partial C^{r}}{\partial z_{i}^{l}}
。令
\delta _{i}^{l}
表示
\frac{\partial C^{r}}{\partial z_{i}^{l}}
,(不表示也可以,它有对应的实际的意义,不知道实际的意义也没关系,因为这是我们一步一步推导下来的)。求解
\delta _{i}^{l}
会比较困难,因为
\delta _{i}^{l}
–>
\delta ^{l+1}
–>…–>
\delta ^{L}
。这是层层传递下去的。

如果,我们能够知道如何层层传递,即l层第i个神经元
\delta _{i}^{l}
和l+1层
\delta ^{l+1}
(会影响所有神经元)的关系,然后又能算出最后一层L的
\delta ^{L}
,是不是就可以了?所以,我们需要解决2个问题:

(1)最后一层L的
\delta ^{L}
如何计算?

(2)
\delta _{i}^{l}

\delta ^{l+1}
的关系?

(盗个李老师视频中的图)

对于问题(1),
\delta ^{L}
是一个向量,我们看看如何求其中一个值n,

\delta_{n} ^{L}=\frac{\partial C^{r}}{\partial z_{n}^{l}} = \frac{\partial C^{r}}{\partial a_{n}^{L}}\frac{\partial a_{n}^{L}}{\partial z_{n}^{L}}
,  而
a_{n}^{L}
就是最后的输出值
y_{n}^{r}
(对于多分类问题,比如分10类,最后一层的节点数是10个,激活函数是softmax)

\frac{\partial y_{n}^{r}}{\partial z_{n}^{L}} = \sigma '(z_{n}^{L})
,
\sigma
为最后一层采用的激活函数(多分类一般是softmax),
\sigma'
是激活函数的一级导数。
\frac{\partial C^{r}}{\partial y_{n}^{r}}
取决于采用的损失函数,如果采用的是均方误差,则
\frac{\partial C^{r}}{\partial y_{n}^{r}}=\frac{2}{N}| \widehat{y}^{r} - y_{n}^{r} |
(能够直接得到)

综上:

\delta^{L} =[\delta_{1} ^{L},..., \delta_{n} ^{L}]
可以求得。

对于问题(2),第l层的第i个神经元是如何影响到l+1层所有的神经元呢?

\delta _{i}^{l}= \frac{\partial C^{r}}{\partial a_{i}^{l}}\frac{\partial a_{i}^{l}}{\partial z_{i}^{l}}

\frac{\partial a_{i}^{l}}{\partial z_{i}^{l}} = \sigma '(z_{i}^{l})

\sigma
为激活函数(一般是ReLu),
\sigma'
是激活函数的一级导数,可以直接求得。

\frac{\partial C^{r}}{\partial a_{i}^{l}}
如何求?可以这么理解,
a_{i}^{l}
会影响[
z_{1}^{l+1},z_{2}^{l+1},...,z_{k}^{l+1}
],而[
z_{1}^{l+1},z_{2}^{l+1},...,z_{k}^{l+1}
]影响C(θ)。

\frac{\partial C^{r}}{\partial a_{i}^{l}}=\sum _{k}\frac{\partial C^{r}}{\partial z_{k}^{l+1}}\frac{\partial z_{k}^{l+1}}{\partial a_{i}^{l}}


\frac{\partial z_{k}^{l+1}}{\partial a_{i}^{l}} = \frac{\partial \sum _{i} (\omega _{ki}^{l+1}a_{i}^{l}+b_{i}^{l+1})}{\partial a_{i}^{l}} = \omega _{ki}^{l+1}

综上:

\delta _{i}^{l}= \sigma '(z_{i}^{l})\sum _{k}w_{ki}^{l+1}\delta ^{l+1}_{k}



3 总结

额?辛苦码的那么多,不知道怎么没了,好吧,再打一遍吧~

神经网络的训练说白了就是给你N个训练集,然后让你选择一组参数θ使得在这N个训练集上的损失C(θ)最小。如果找到这组参数呢?用梯度下降法找到这些参数。

梯度下降法就是随机取一组参数,然后每次迭代都朝下降最快的方向更新,即:

\theta := \theta - \bigtriangledown C(\theta ) = \theta - \sum _{r}\bigtriangledown C^{r}(\theta )

有因为θ其实是由很多的参数组成,这些参数分别是权重w和偏差b,权重
\omega _{ij}^{l}
表示第l-1层的第j个神经元的输出,对第l层的第i个神经元的输入的贡献。

\omega_{ij}^{l} :=\omega_{ij}^{l} - \frac{\partial C(\theta )}{\partial \omega_{ij}^{l} } = \omega_{ij}^{l} - \frac{\partial \sum _{r}C^{r}(\theta )}{\partial \omega_{ij}^{l} }

\frac{\partial C^{r}(\theta )}{\partial \omega_{ij}^{l} } = \frac{\partial C^{r}(\theta )}{\partial z_{i}^{l} }\frac{\partial z_{i}^{l}}{\partial \omega_{ij}^{l} }

根据推导,前者等于
\frac{\partial C^{r}(\theta )}{\partial z_{i}^{l} } = \sigma' (z_{i}^{l})\sum _{k}\omega _{ki}^{l+1}\frac{\partial C^{r}(\theta )}{\partial z^{l+1} }
,可通过反向传递求得,后者等于
a_{j}^{l-1}
后者通过前向传播求得,如下图所示: