神经网络基础(三)—— 反向传播算法

1. 前言

网上关于神经网络的浅显介绍已经很多了,本文不再赘述,重点是神经网络的前后向传播过程的理论推导。

2. 模型基本情况说明

2.1 网络结构

神经网络基础(三)—— 反向传播算法
在上图所示的网络结构中,每个节点都有一个编号,输入层共有三个特征分别为:x1,x2,x3x_1,x_2,x_3以及一个偏置项bias(图中未画出),隐藏层有四个神经元,第jj个神经元与第ii个特征连接的权重记为wjiw_{ji},隐藏层中每个神经元的输出分别记为a4,a5,a6,a7a_4,a_5,a_6,a_7,同样的,输出层为2个节点,第kk个节点与第jj个隐藏层的权重记为wkjw_{kj}

2.2 **函数

输入层与隐藏层,隐藏层与输出层的**函数均采用
sigmoid(x)=11+exf()(2.1) sigmoid(x)=\frac{1}{1+e^{-x}}f() \tag{2.1}

  • 函数图像
    神经网络基础(三)—— 反向传播算法
  • 导数性质
    y=sigmoid(x)y=y(1y) y=sigmoid(x)\\ y'=y(1-y)

2.3 损失函数

取网络所有输出层节点的误差平方和作为目标函数:
E=12ioutputs(tiyi)2(2.3) E=\frac{1}{2}\sum_{i\in outputs}(t_i-y_i)^2 \tag{2.3}
tit_i是第ii个节点的模拟值,yiy_i是第ii个节点的真实值。

为什么优化公式(3.4)需要使用梯度下降算法?
神经网络的非线性导致大多数我们感兴趣的代价函数变的非凸,意味着神经网络的训练通常使用迭代的基于梯度的优化,并不能保证全局收敛。


3. 算法流程

3.1 前向传播

  • 普通形式
    a4=sigmoid(wTx)=sigmoid(w41x1+w42x2+w43x3+w4b)a5=sigmoid(w51x1+w52x2+w53x3+w5b)a6=sigmoid(w61x1+w62x2+w63x3+w6b)a7=sigmoid(w71x1+w72x2+w73x3+w7b) \begin{aligned} a_4&=sigmoid(\bold{w}^T\centerdot\bold{x})\\ &=sigmoid(w_{41}x_1+w_{42}x_2+w_{43}x_3+w_{4b})\\ a_5&=sigmoid(w_{51}x_1+w_{52}x_2+w_{53}x_3+w_{5b})\\ a_6&=sigmoid(w_{61}x_1+w_{62}x_2+w_{63}x_3+w_{6b})\\ a_7&=sigmoid(w_{71}x_1+w_{72}x_2+w_{73}x_3+w_{7b})\\ \end{aligned}
    输出层节点计算结果分别为:
    y1=sigmoid(w84a4+w85a5+w86a6+w87a7+w8b)y2=sigmoid(w94a4+w95a5+w96a6+w97a7+w9b) \begin{aligned} y_1&=sigmoid(w_{84}a_4+w_{85}a_5+w_{86}a_6+w_{87}a_7+w_{8b})\\ y_2&=sigmoid(w_{94}a_4+w_{95}a_5+w_{96}a_6+w_{97}a_7+w_{9b})\\ \end{aligned}

  • 矩阵形式
    x=[x1x2x31]w4T=[w41,w42,w43,w4b]w5T=[w51,w52,w53,w5b]w6T=[w61,w62,w63,w6b]w7T=[w71,w72,w73,w7b]f=sigmoid \begin{aligned} \bold{x}&=\begin{bmatrix}x_1\\x_2\\x_3\\1\end{bmatrix}\\ \bold{w}_4^T&=[w_{41},w_{42},w_{43},w_{4b}]\\ \bold{w}_5^T&=[w_{51},w_{52},w_{53},w_{5b}]\\ \bold{w}_6^T&=[w_{61},w_{62},w_{63},w_{6b}]\\ \bold{w}_7^T&=[w_{71},w_{72},w_{73},w_{7b}]\\ f&=sigmoid \end{aligned}
    则隐藏层的输出值可以表示为:
    a4=f(w4Tx)a5=f(w5Tx)a6=f(w6Tx)a7=f(w7Tx) \begin{aligned} a_4&=f(\bold{w_4}^T\centerdot\bold{x})\\ a_5&=f(\bold{w_5}^T\centerdot\bold{x})\\ a_6&=f(\bold{w_6}^T\centerdot\bold{x})\\ a_7&=f(\bold{w_7}^T\centerdot\bold{x}) \end{aligned}
    则有:
    a=[a4a5a6a7],W=[w4Tw5Tw6Tw7T]=[w41,w42,w43,w4bw51,w52,w53,w5bw61,w62,w63,w6bw71,w72,w73,w7b],f([x1x2x3...])=[f(x1)f(x2)f(x3)...] \bold{a}= \begin{bmatrix} a_4 \\ a_5 \\ a_6 \\ a_7 \\ \end{bmatrix}, \qquad \bold{W}= \begin{bmatrix} \bold{w}_4^T \\ \bold{w}_5^T \\ \bold{w}_6^T \\ \bold{w}_7^T \\ \end{bmatrix}= \begin{bmatrix} w_{41},w_{42},w_{43},w_{4b} \\ w_{51},w_{52},w_{53},w_{5b} \\ w_{61},w_{62},w_{63},w_{6b} \\ w_{71},w_{72},w_{73},w_{7b} \\ \end{bmatrix} ,\qquad f( \begin{bmatrix} x_1\\ x_2\\ x_3\\ .\\ .\\ .\\ \end{bmatrix})= \begin{bmatrix} f(x_1)\\ f(x_2)\\ f(x_3)\\ .\\ .\\ .\\ \end{bmatrix}
    a=f(Wx) \bold{a}=f(\bold{W}\centerdot \bold{x})

3.2 反向传播

3.2.1 结论

  • 对于输出层节点
    δi=y^i(1y^i)(yiy^i)(3.1) \delta_i=\hat{y}_i(1-\hat{y}_i)(y_i-\hat{y}_i) \tag{3.1}
    其中,δi\delta_i是节点的误差项,y^i\hat{y}_i是节点的输出值,yiy_i是样本对应于节点ii的目标值(真实值)。举个例子,根据上图,对于输出层节点8来说,它的输出值是y^1\hat{y}_1,而样本的目标值是y1y_1,带入上面的公式得到节点8的误差项δ8\delta_8应该是:
    δ8=y^1(1y^1)(y1y^1) \delta_8=\hat{y}_1(1-\hat{y}_1)(y_1-\hat{y}_1)

  • 对于隐藏层节点
    δi=ai(1ai)koutputswkiδk(3.2) \delta_i=a_i(1-a_i)\sum_{k\in{outputs}}w_{ki}\delta_k \tag{3.2}
    其中,aia_i是节点的输出值,wkiw_{ki}是节点ii到它的下一层节点kk的连接的权重,deltakdelta_k是节点ii的下一层节点kk的误差项。例如,对于隐藏层节点4来说,计算方法如下:
    δ4=a4(1a4)(w84δ8+w94δ9) \delta_4=a_4(1-a_4)(w_{84}\delta_8+w_{94}\delta_9)

  • 权重的更新
    wjiwji+ηδjxji(3.3) w_{ji}\gets w_{ji}+\eta\delta_jx_{ji} \tag{3.3}
    其中,wjiw_{ji}是节点ii到节点jj的权重,η\eta是一个成为学习速率的常数,δj\delta_j是节点jj的误差项,xjix_{ji}是节点ii传递给节点jj的输入。例如,

    • 输出层:权重w84w_{84}的更新方法如下:
      w84w84+ηδ8a4δ8=y^1(1y^1)(y1y^1) w_{84}\gets w_{84}+\eta\delta_8 a_4\\ \delta_8=\hat{y}_1(1-\hat{y}_1)(y_1-\hat{y}_1)
    • 隐藏层:权重w41w_{41}的更新方法如下:
      w41w41+ηδ4x1δ4=a4(1a4)(w84δ8+w94δ9) w_{41}\gets w_{41}+\eta\delta_4 x_1\\ \delta_4=a_4(1-a_4)(w_{84}\delta_8+w_{94}\delta_9)

3.2.2 推导过程

神经网络基础(三)—— 反向传播算法
观察网络结构可知,权重wjiw_{ji}净能够通过节点jj的输入来影响整个网络的其他部分,假设jj节点的加权输入记为netjnet_j,则有:
netj=wjx=iwjixji(3.4) \begin{aligned} net_j&=\bold{w_j}\centerdot\bold{x}\\ &=\sum_{i}{w_{ji}}x_{ji} \end{aligned} \tag{3.4}
例如:
net4=w41x41+w42x42+w43x43+w4bbias=i=14w4ixji \begin{aligned} net_4 =&w_{41}*x_{41}+w_{42}*x_{42}+w_{43}*x_{43}+w_{4b}*bias\\ =&\sum_{i=1}^4w_{4i}x_{ji} \end{aligned}
上式中,xjix_{ji}是节点jj传递给节点ii的输入值,也就是节点ii的输出值,其实,xji=xix_{ji}=x_i。即有x41=x51=x61=x71=x1x_{41}=x_{51}=x_{61}=x_{71}=x_1

损失函数EEnetjnet_j的函数,netjnet_jwjiw_{ji}的函数,根据链式求导法则,有:
Ewji=Enetjnetjwji=Enetjiwjixjiwji=Enetjxji(3.5) \begin{aligned} \frac{\partial{E}}{\partial{w_{ji}}}&=\frac{\partial{E}}{\partial{net_j}}\frac{\partial{net_j}}{\partial{w_{ji}}}\\ &=\frac{\partial{E}}{\partial{net_j}}\frac{\partial{\sum_{i}{w_{ji}}x_{ji}}}{\partial{w_{ji}}}\\ &=\frac{\partial{E}}{\partial{net_j}}x_{ji} \end{aligned} \tag{3.5}

对于Enetj\frac{\partial{E}}{\partial{net_j}}的推导,需要区分输出层和隐藏层两种情况。

3.2.2.1 输出层

神经网络基础(三)—— 反向传播算法
对于输出层来说,netjnet_j仅能通过节点jj的输出值y^j\hat{y}_j来影响网络其它部分,也就是说EEy^j\hat{y}_j的函数,而y^j\hat{y}_jnetjnet_j的函数,其中。所以我们可以再次使用链式求导法则:
Ednetj=Ey^jy^jnetj(3.6) \begin{aligned} \frac{\partial{E_d}}{\partial{net_j}}&=\frac{\partial{E}}{\partial{\hat{y}_j}}\frac{\partial{\hat{y}_j}}{\partial{net_j}}\\ \end{aligned} \tag{3.6}
所以,有:
Ey^j=y^j12ioutputs(yiy^i)2=y^j12(yjy^j)2=(yjy^j)(3.7) \begin{aligned} \frac{\partial{E}}{\partial{\hat{y}_j}}&=\frac{\partial}{\partial{\hat{y}_j}}\frac{1}{2}\sum_{i\in outputs}(y_i-\hat{y}_i)^2\\ &=\frac{\partial}{\partial{\hat{y}_j}}\frac{1}{2}(y_j-\hat{y}_j)^2\\ &=-(y_j-\hat{y}_j) \end{aligned} \tag{3.7}
借助公式(2.3)有
y^jnetj=y^j(1y^j) \begin{aligned} \frac{\partial{\hat{y}_j}}{\partial{net_j}}&=\hat{y}_j(1-\hat{y}_j)\\ \end{aligned}
所以:
Enetj=(yjy^j)y^j(1y^j)(3.8) \frac{\partial{E}}{\partial{net_j}}=-(y_j-\hat{y}_j)\hat{y}_j(1-\hat{y}_j) \tag{3.8}
因为方向是沿梯度的负方向,所以令δj=Ednetj\delta_j=-\frac{\partial{E_d}}{\partial{net_j}},所以第jj个节点的误差项为:
δj=(yjy^j)y^j(1y^j)(3.9) \delta_j=(y_j-\hat{y}_j)\hat{y}_j(1-\hat{y}_j) \tag{3.9}
结合公式(3.5)和公式(3.9),则节点ii与节点jj之间的权重更新为:
wjiwjiηEwji=wji+η(tjyj)yj(1yj)xji=wji+ηδjxji(3.10) \begin{aligned} w_{ji}&\gets w_{ji}-\eta\frac{\partial{E}}{\partial{w_{ji}}}\\ &=w_{ji}+\eta(t_j-y_j)y_j(1-y_j)x_{ji}\\ &=w_{ji}+\eta\delta_jx_{ji} \end{aligned} \tag{3.10}
w84w84+ηδ8a4 w_{84}\gets w_{84}+\eta\delta_8 a_4

3.2.2.2 隐藏层

神经网络基础(三)—— 反向传播算法
首先,我们需要定义节点的所有直接下游节点的集合Downstream(j)Downstream(j)。例如,对于节点4来说,它的直接下游节点是节点8、节点9。可以看到net4net_4只能通过8,9影响再影响EE。设netknet_ka84,a94a_{84}, a_{94}是节点jj:(4)的下游节点(8, 9)的输入,则EE是的netknet_k函数,而netknet_knetjnet_j的函数。因为有多个netknet_k,我们应用全导数公式,可以做出如下推导:
Enetj=kDownstream(j)Enetknetknetj=kDownstream(j)δknetknetj=kDownstream(j)δknetkajajnetj=kDownstream(j)δkwkjajnetj=kDownstream(j)δkwkjaj(1aj)=aj(1aj)kDownstream(j)δkwkj \begin{aligned} \frac{\partial{E}}{\partial{net_j}}&=\sum_{k\in Downstream(j)}\frac{\partial{E}}{\partial{net_k}}\frac{\partial{net_k}}{\partial{net_j}}\\ &=\sum_{k\in Downstream(j)}-\delta_k\frac{\partial{net_k}}{\partial{net_j}}\\ &=\sum_{k\in Downstream(j)}-\delta_k\frac{\partial{net_k}}{\partial{a_j}}\frac{\partial{a_j}}{\partial{net_j}}\\ &=\sum_{k\in Downstream(j)}-\delta_kw_{kj}\frac{\partial{a_j}}{\partial{net_j}}\\ &=\sum_{k\in Downstream(j)}-\delta_kw_{kj}a_j(1-a_j)\\ &=-a_j(1-a_j)\sum_{k\in Downstream(j)}\delta_kw_{kj} \end{aligned}
以权重w41w_{41}为例:
w41w41+ηδ4x1δ4=a4(1a4)(w84δ8+w94δ9) w_{41}\gets w_{41}+\eta\delta_4 x_1\\ \delta_4=a_4(1-a_4)(w_{84}\delta_8+w_{94}\delta_9)


4. 参考文献

  • 西瓜书
  • 零基础入门深度学习
  • 深度学习
  • 模式识别