1. 前言
网上关于神经网络的浅显介绍已经很多了,本文不再赘述,重点是神经网络的前后向传播过程的理论推导。
2. 模型基本情况说明
2.1 网络结构
在上图所示的网络结构中,每个节点都有一个编号,输入层共有三个特征分别为:x1,x2,x3以及一个偏置项bias(图中未画出),隐藏层有四个神经元,第j个神经元与第i个特征连接的权重记为wji,隐藏层中每个神经元的输出分别记为a4,a5,a6,a7,同样的,输出层为2个节点,第k个节点与第j个隐藏层的权重记为wkj。
2.2 **函数
输入层与隐藏层,隐藏层与输出层的**函数均采用
sigmoid(x)=1+e−x1f()(2.1)
- 函数图像
- 导数性质
y=sigmoid(x)y′=y(1−y)
2.3 损失函数
取网络所有输出层节点的误差平方和作为目标函数:
E=21i∈outputs∑(ti−yi)2(2.3)
ti是第i个节点的模拟值,yi是第i个节点的真实值。
为什么优化公式(3.4)需要使用梯度下降算法?
神经网络的非线性导致大多数我们感兴趣的代价函数变的非凸,意味着神经网络的训练通常使用迭代的基于梯度的优化,并不能保证全局收敛。
3. 算法流程
3.1 前向传播
-
普通形式
a4a5a6a7=sigmoid(wT⋅x)=sigmoid(w41x1+w42x2+w43x3+w4b)=sigmoid(w51x1+w52x2+w53x3+w5b)=sigmoid(w61x1+w62x2+w63x3+w6b)=sigmoid(w71x1+w72x2+w73x3+w7b)
输出层节点计算结果分别为:
y1y2=sigmoid(w84a4+w85a5+w86a6+w87a7+w8b)=sigmoid(w94a4+w95a5+w96a6+w97a7+w9b)
-
矩阵形式
xw4Tw5Tw6Tw7Tf=⎣⎢⎢⎡x1x2x31⎦⎥⎥⎤=[w41,w42,w43,w4b]=[w51,w52,w53,w5b]=[w61,w62,w63,w6b]=[w71,w72,w73,w7b]=sigmoid
则隐藏层的输出值可以表示为:
a4a5a6a7=f(w4T⋅x)=f(w5T⋅x)=f(w6T⋅x)=f(w7T⋅x)
则有:
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)...⎦⎥⎥⎥⎥⎥⎥⎤
a=f(W⋅x)
3.2 反向传播
3.2.1 结论
-
对于输出层节点
δi=y^i(1−y^i)(yi−y^i)(3.1)
其中,δi是节点的误差项,y^i是节点的输出值,yi是样本对应于节点i的目标值(真实值)。举个例子,根据上图,对于输出层节点8来说,它的输出值是y^1,而样本的目标值是y1,带入上面的公式得到节点8的误差项δ8应该是:
δ8=y^1(1−y^1)(y1−y^1)
-
对于隐藏层节点
δi=ai(1−ai)k∈outputs∑wkiδk(3.2)
其中,ai是节点的输出值,wki是节点i到它的下一层节点k的连接的权重,deltak是节点i的下一层节点k的误差项。例如,对于隐藏层节点4来说,计算方法如下:
δ4=a4(1−a4)(w84δ8+w94δ9)
-
权重的更新
wji←wji+ηδjxji(3.3)
其中,wji是节点i到节点j的权重,η是一个成为学习速率的常数,δj是节点j的误差项,xji是节点i传递给节点j的输入。例如,
- 输出层:权重w84的更新方法如下:
w84←w84+ηδ8a4δ8=y^1(1−y^1)(y1−y^1)
- 隐藏层:权重w41的更新方法如下:
w41←w41+ηδ4x1δ4=a4(1−a4)(w84δ8+w94δ9)
3.2.2 推导过程
观察网络结构可知,权重wji净能够通过节点j的输入来影响整个网络的其他部分,假设j节点的加权输入记为netj,则有:
netj=wj⋅x=i∑wjixji(3.4)
例如:
net4==w41∗x41+w42∗x42+w43∗x43+w4b∗biasi=1∑4w4ixji
上式中,xji是节点j传递给节点i的输入值,也就是节点i的输出值,其实,xji=xi。即有x41=x51=x61=x71=x1。
损失函数E是netj的函数,netj是wji的函数,根据链式求导法则,有:
∂wji∂E=∂netj∂E∂wji∂netj=∂netj∂E∂wji∂∑iwjixji=∂netj∂Exji(3.5)
对于∂netj∂E的推导,需要区分输出层和隐藏层两种情况。
3.2.2.1 输出层
对于输出层来说,netj仅能通过节点j的输出值y^j来影响网络其它部分,也就是说E是y^j的函数,而y^j是netj的函数,其中。所以我们可以再次使用链式求导法则:
∂netj∂Ed=∂y^j∂E∂netj∂y^j(3.6)
所以,有:
∂y^j∂E=∂y^j∂21i∈outputs∑(yi−y^i)2=∂y^j∂21(yj−y^j)2=−(yj−y^j)(3.7)
借助公式(2.3)有
∂netj∂y^j=y^j(1−y^j)
所以:
∂netj∂E=−(yj−y^j)y^j(1−y^j)(3.8)
因为方向是沿梯度的负方向,所以令δj=−∂netj∂Ed,所以第j个节点的误差项为:
δj=(yj−y^j)y^j(1−y^j)(3.9)
结合公式(3.5)和公式(3.9),则节点i与节点j之间的权重更新为:
wji←wji−η∂wji∂E=wji+η(tj−yj)yj(1−yj)xji=wji+ηδjxji(3.10)
w84←w84+ηδ8a4
3.2.2.2 隐藏层
首先,我们需要定义节点的所有直接下游节点的集合Downstream(j)。例如,对于节点4来说,它的直接下游节点是节点8、节点9。可以看到net4只能通过8,9影响再影响E。设netk:a84,a94是节点j:(4)的下游节点(8, 9)的输入,则E是的netk函数,而netk是netj的函数。因为有多个netk,我们应用全导数公式,可以做出如下推导:
∂netj∂E=k∈Downstream(j)∑∂netk∂E∂netj∂netk=k∈Downstream(j)∑−δk∂netj∂netk=k∈Downstream(j)∑−δk∂aj∂netk∂netj∂aj=k∈Downstream(j)∑−δkwkj∂netj∂aj=k∈Downstream(j)∑−δkwkjaj(1−aj)=−aj(1−aj)k∈Downstream(j)∑δkwkj
以权重w41为例:
w41←w41+ηδ4x1δ4=a4(1−a4)(w84δ8+w94δ9)
4. 参考文献