深度神经网络(DNN)的反向传播

105 阅读2分钟
原文链接: zhuanlan.zhihu.com

DNN前向传播

前向传播是利用神经网络模型的过程,而反向传播是根据已知的输入输出关系,确定模型参数的过程。

l-1层向l层的前向传递过程

在前向传播的过程中,值从一个节点传递到后面是通过函数关系实现的。一般网络的传递关系如上图所示。 a^{l-1}l-1 层的 m 个节点的值,即 a^{l-1}_{m \times 1}=(a^{l-1}_1,a^{l-1}_2,...,a^{l-1}_m)^T

z^{l}_{n \times 1}=W^l_{n \times m} a^{l-1}_{m \times 1}+b^l_{n \times 1} 为线性变换后的结果。 \sigma(\cdot)激活函数,至于激活函数有哪几种分别有什么功能咱们后面再说,可以先理解为激活函数就是一个可导的函数或者默认为sigmoid函数

一、从期望的输出获取信息

我们知道,只要一个网络结构固定好,里面的参数随机生成,给一个已知的输入就会有一个相应的输出。那么这个输出和我们期望的输出之间会有一个差别。我们用损失函数来描述这个差别。损失函数的设定也有很多种,方便起见我们这里用平方损失函数,由输出层与期望输出的均方差值获得。(二范数

J(W,b,X,Y)=\frac{1}{2} || a^L-Y ||_2^2=\frac{1}{2} || \sigma{( z^L )}-Y ||_2^2=\frac{1}{2} || \sigma{( W^La^{ L-1}+b^{ L })}-Y ||_2^2

我们希望通过不断优化 Wb 最小化损失函数 J ,优化方法我们选择梯度下降法。

首先,我们关注第L层即输出层的 Wb与损失函数之间的梯度:

\frac { \partial{J}}{ \partial{ W^{L}}}=\frac{ \partial{J}}{ \partial{z^{L}}} \frac{ \partial{ z^{L} } }{ \partial { W^{L}} } = (a^{L} - Y) \odot \sigma^{'} (z^L )(a^{L-1})^T

\frac {\partial{J}}{\partial{ b ^{L}}}=\frac{\partial{J}}{\partial{z^{L}}} \frac{ \partial{ z^{L} } }{ \partial { b ^{L}} } = (a^{L} - Y)\odot \sigma^{'} (z^L )

从矩阵求导维数不变原理可以推导出 \frac {\partial{ z_{ n\times1}^{L} }}{\partial{ W_{ n \times m}^{L}} } = (a_{m \times 1}^{L-1})^T ,但具体是为什么当时卡了我很久,所以我最后能理解到的位置是先看 z_1=\sum_{j=1}^{m}w_{1j}a_j+b_1\frac { \partial{ z_{1 \times {1}}^{L} }}{ \partial{W_{ 1 \times m}^{L}} } = (a_{ m \times 1}^{ L-1})^T。当n=2的时候这个式子还是成立,那么就这样吧哈哈。


一般地,我们看一下第 lW^l,b^l 与损失函数的梯度:

\frac { \partial{J}}{\partial{W^{l}}}=\frac{\partial{J}}{\partial{z^{l}}} \frac{ \partial{ z^{l} } }{ \partial { W^{ l}} } =\frac{ \partial{J}}{\partial{z^{L }}} \frac{ \partial{z ^ {L}}}{ \partial{z^{L - 1 }}} ... \frac{ \partial{ z^{ l} } }{ \partial { b^{ l}} }

\frac { \partial{J}}{\partial{ b^{ l}}}=\frac{\partial{J}}{\partial{z^{l}}} \frac{ \partial{ z^{l} } }{ \partial { b^{ l}} } =\frac{\partial{J}}{\partial{z^{L }}} \frac{\partial{z^{ L}}}{\partial{z^{L - 1 }}} ... \frac{ \partial{ z^{ l} } }{ \partial { b^{ l}} }

同时 z^{l}_{n \times 1}=W^l_{n \times m} a^{l-1}_{m \times 1}+b^l_{n \times 1} ,那么仔细看看就会发现,我们不知道的只有一系列

\frac{\partial{z^{ L}}}{\partial{z^{ L - 1 }}} , \frac{ \partial{z^{ L-1 }}}{ \partial{ z^{ L - 2}}} ,..., \frac{ \partial { z^{ l }}}{\partial{z^{ l -1 }}},...。

其实这个也很简单,由于 z^{l}_{n \times 1}=W^l_{n \times m} \sigma(z^{l-1}_{m \times 1})+b^l_{n \times 1} ,则 \frac{ \partial{z^{ l }}}{ \partial{z^{ l - 1 }}}=(W^l)^T \odot \sigma^{'}(z^{l-1})


敲黑板!

重点,我们令灵敏度 \delta ^l = \frac { \partial{ J } }{ \partial{ z^l }} ,存在递推关系

也就是说所有层的灵敏度都可以通过递推关系求出,则

\frac { \partial{J}}{\partial{ W^{l}}}=\delta^l \frac{ \partial{ z^{l} } }{ \partial { W^{ l }} } =\delta^l (a^{l-1})^T可以轻易的求出。

梯度求出来了,剩下的事情是梯度下降法的部分了。大家可以看看关于这方面的内容,这里不再赘述。