前向传播和反向传播

2019-01-30  本文已影响0人  yi_cloud

在求出前向传播和反向传播前要先确定参数和输入输出符号的表达形式

最普通的DNN就可以看做是一个多层感知机MLP,感知机的输出其实就是对输入的加权求和:z=\sum w_ix_i+b,再经过一个非线性激活函数\sigma(z)

首先来定义权值矩阵W,按照下图规则,w_{24}^3表示的是第3层第2个神经元和第2层第4个神经元之间连线(连线就代表权重,可以看成是w_{24}^{32}的省略写法)。那么为什么不写成w_{42}^3呢,形式上是允许的,但是如果这样写的话,第3层神经元的输入就要通过w^Tx+b来计算,而前者只需要计算wx+b,省略了矩阵转置的额外工作量。

偏置项b的定义也是类似,b_3^2表示第2层第3个神经元的偏置。

再定义a_j^i,z_j^i分别表示第i层第j个神经元的输出和输入,并假设\sigma(z)是我们选择的激活函数。

前向传播过程

三层DNN,输入层-隐藏层-输出层

对于第2层第1个节点的输出a_1^2有:a_1^2=\sigma(z_1^2) = \sigma(w_{11}^2x_1 + w_{12}^2x_2 + w_{13}^2x_3 + b_1^{2})

对于第3层第1个节点的输出a_1^3有:a_1^3=\sigma(z_1^3) = \sigma(w_{11}^3a_1^2 + w_{12}^3a_2^2 + w_{13}^3a_3^2 + b_1^{3})

一般化的,假设l-1层有m个神经元,对于a_j^l有:

a_j^l=\sigma(z_j^l)=\sigma(\sum_{k=1}^m w_{jk}^la_k^{l-1}+b_j^l)

也就是第l层第j个神经元的输入为与它相连的上一层每个神经元的输出加权求和后加上该神经元对应的偏置,该神经元所做的工作只是把这个结果做一个非线性激活。

反向传播过程

当通过前向传播得到由任意一组随机参数W和b计算出的网络预测结果后,我们可以利用损失函数相对于每个参数的梯度来对他们进行修正。事实上神经网络的训练就是这样一个不停的前向-反向传播的过程,直到网络的预测能力达到我们的预期。

假设选择最简单的均方误差和作为损失函数:J(W,b,x,y)=\frac {1}{2}||a^L-y||_2^2

下面就根据这个损失函数更新每一层的w,b

根据前向传播的公式,输出层L的输出a^L=\sigma(z^L)=\sigma(w^La^{L-1}+b^L)

带入到损失函数中,有J(W,b,x,y)=\frac {1}{2}||\sigma (w^La^{L-1}+b^L)-y||_2^2

根据复合函数链式求导法则,L层参数W^L,b^L的梯度容易求得:

\delta w^L=\frac{\partial J(W,b,x,y)}{\partial W^L}=\frac {\partial J(W,b,x,y)}{\partial z^L}\cdot \frac{\partial z^L}{\partial W^L}=(a^L-y)\odot \sigma^{(1)}(z^L)(a^{L-1})^T

\delta b^L=\frac{\partial J(W,b,x,y)}{\partial b^L} = \frac{\partial J(W,b,x,y)}{\partial z^L}\frac{\partial z^L}{\partial b^L} =(a^L-y)\odot \sigma^{(1)}(z^L)

显然,两式有一部分是重叠的,将这部分记做\delta^L\delta^L=\frac{\partial J(W,b,x,y)}{\partial b^L} =(a^L-y)\odot \sigma^{(1)}(z^L)

这一规律同样适用在非输出层的隐藏层L-1,L-2,...l,...1,我们只需要求出损失函数相对l层非激活输出z^l的导数,再根据前向传播公式z^l=w^la^{l-1}+b^l便可以轻易的求得W^L,b^l

同样,根据链式求导法则,

\delta^l =\frac{\partial J(W,b,x,y)}{\partial z^l} = \frac{\partial J(W,b,x,y)}{\partial z^L}\frac{\partial z^L}{\partial z^{L-1}}\frac{\partial z^{L-1}}{\partial z^{L-2}}...\frac{\partial z^{l+1}}{\partial z^{l}}

\frac{\partial J(W,b,x,y)}{\partial W^l} = \frac{\partial J(W,b,x,y)}{\partial z^l} \frac{\partial z^l}{\partial W^l} = \delta^{l}(a^{l-1})^T

至此,问题的关键转化成如何求解\delta^l,既然是反向传播,在求第l层参数时,\delta^L,...,\delta^{l+1}都是已知的,还是根据链式求导法则:

\delta^{l} = \frac{\partial J(W,b,x,y)}{\partial z^l} = \frac{\partial J(W,b,x,y)}{\partial z^{l+1}}\frac{\partial z^{l+1}}{\partial z^{l}} = \delta^{l+1}\frac{\partial z^{l+1}}{\partial z^{l}}

显然,问题的关键在于求解\frac{\partial z^{l+1}}{\partial z^{l}},再根据前向传播公式,

上一篇下一篇

猜你喜欢

热点阅读