Backpropagation
1 Introduction
撰写本文的目的是清晰,完整而不是简洁。如果您只是想“即插即用”,请随时跳至“公式”部分。如果您熟悉符号表示法和神经网络的基础知识,但想逐步进行推导,只需阅读Derivation部分。不要被本文的篇幅或方程式的数量所吓倒!之所以很长,是因为它甚至包含了最简单的细节。
2 Specification
我们首先指定网络参数。前馈神经网络(NNs)是由输入层,隐藏层,输出层组成。只有一层输入层和一层输出层,但是隐藏层的数量是无限的。网络是“前馈”的,因为特定层中的节点仅连接到与其直接相连接的下层中的节点。以便输入层中的节点仅激活后续隐藏层中的节点,而后者又仅激活下一个隐藏层中的节点,依此类推,直到输出层。这种安排在图1中很好地说明了。注意,在图1中,特定层的每个节点都连接到后续层的每个节点,但这不是必需的。
关于本文中一些符号的定义:如果网络某一层有 J ∈ N J \in N J∈N个节点,那么该层第 j j j 个节点表示为 j t h j^{th} jth,其中 j ∈ { 0 , 1 , . . . , J } j\in\{0,1,...,J\} j∈{0,1,...,J} 。类似的, i t h i^{th} ith 表示第 I I I 层的第 i i i 个节点, k t h k^{th} kth 表示第 K K K 层第 k k k 个节点。
由于层与层之间并非总是全连接的。因此,影响第 j j j 层的节点 j t h j^{th} jth 的可能只是来自第 k k k 层一部分节点,也就是第 k k k 层的子集。我们定义从第 k k k 层到第 j j j 层的这部分节点为 K j K_j Kj。同理,我们可以定义从第 j j j 层到第 i i i 层的第 j j j 层节点的子集节点为 J i J_i Ji,反向传播中从第 i i i 层到第 j j j 层的第 j j j 个节点 ( j t h ) (j^{th}) (jth)可以表示为 I j I_j Ij。(注意对 K j , J i , I j K_j,J_i,I_j Kj,Ji,Ij 的理解)。
3 Neuron
如图2,通过通常是非线性的函数将其输入的加权总和经过激活函数,得到输出。这里可以分成两部分:(1)加权求和。(2)激活函数。
x
j
=
∑
k
∈
K
j
w
k
j
y
k
(1)
x_j = \sum_{k \in {K_j}}w_{kj}y_k \tag{1}
xj=k∈Kj∑wkjyk(1)
其中
K
j
K_j
Kj是来自第
k
k
k 层连接到
j
t
h
j^{th}
jth 的节点集合。
y
j
=
f
(
x
j
)
(2)
y_j = f(x_j) \tag{2}
yj=f(xj)(2)
我们考虑以下几种激活函数, f ( ⋅ ) f(·) f(⋅), l i n e a r , t h r e s h o l d , s i g m o i d , G a u s s i a n linear,threshold,sigmoid,Gaussian linear,threshold,sigmoid,Gaussian 分别如下公式(3),(4),(5) ,(6)。
f
(
z
)
=
β
z
(3)
f(z) = \beta z \tag{3}
f(z)=βz(3)
f
(
z
)
=
{
1
,
x
≥
θ
0
,
x
<
θ
(4)
f(z) = \left\{\begin{array}{cc} 1, & x \geq \theta\\ 0, & x < \theta \end{array}\right. \tag{4}
f(z)={1,0,x≥θx<θ(4)
f
(
z
)
=
1
1
+
e
−
γ
z
(5)
f(z) = \frac{1}{1+e^{-{\gamma z}}} \tag{5}
f(z)=1+e−γz1(5)
f
(
z
)
=
e
x
p
{
−
(
z
−
u
)
2
σ
2
}
(6)
f(z) = exp\{-\frac{(z-u)^2}{\sigma^2}\} \tag{6}
f(z)=exp{−σ2(z−u)2}(6)
其中 β , θ , γ , δ , μ \beta,\theta,\gamma,\delta,\mu β,θ,γ,δ,μ 是激活函数 f ( ⋅ ) f(·) f(⋅) 的参数用于控制激活函数"shape"。
4 The sigmoid and its Derivative
在下面介绍的Backpropagation算法中,我们将使用
s
i
g
m
o
i
d
sigmoid
sigmoid函数作为激活函数。使用
s
i
g
m
o
i
d
sigmoid
sigmoid的主要原因是
s
i
g
m
o
i
d
sigmoid
sigmoid 函数有很多好的数学特性。简单起见,我们把公式(5)中的
γ
\gamma
γ 设置为 1,并对其进行求导。
d
f
(
z
)
d
z
=
0
⋅
(
1
−
e
−
z
)
−
(
−
e
−
z
)
(
1
+
e
−
z
)
2
=
1
1
+
e
−
z
(
e
−
z
1
+
e
−
z
)
=
1
1
+
e
−
z
(
1
−
1
1
+
e
−
z
)
=
f
(
z
)
(
1
−
f
(
z
)
)
(7)
\begin{aligned} \frac{df(z)}{dz} &= \frac{0\cdot(1-e^{-z})-(-e^{-z})}{(1+e^{-z})^2} \\ &= \frac{1}{1+e^{-z}}(\frac{e^{-z}}{1+e^{-z}}) \\ &= \frac{1}{1+e^{-z}}(1-\frac{1}{1+e^{-z}}) \\ &=f(z)(1-f(z)) \end{aligned} \tag{7}
dzdf(z)=(1+e−z)20⋅(1−e−z)−(−e−z)=1+e−z1(1+e−ze−z)=1+e−z1(1−1+e−z1)=f(z)(1−f(z))(7)
这样简洁的求导结果将简化下面的推导过程。
5 Interpretation of the Algorithm
监督学习算法试图通过改变网络参数值来最小化输出 ( o u t p u t ) (output) (output)与目标 ( t a r g e t ) (target) (target)之间的误差。Backprop是一种迭代算法,这意味着我们不会一次更改所有权重,而是逐步更改权重,我们应该改变多少重量?一个自然的答案是:与对误差的影响成正比;权重 w m w_m wm的影响越大,通过改变权重 w m w_m wm导致的误差减少得越大,因此我们的学习算法应该对该权重进行更大的改变。当然,这种影响都不尽相同:更改任何特定的权重通常都会或多或少的影响其他权重,包括我们已更改的权重。
6 Derivation
在准备推导算法时,我们需要定义一个误差度量。直观上,误差是输出节点的实际激活值(
y
j
y_j
yj)与该节点的期望(“目标”)激活(
t
j
t_j
tj)之间的差异。总误差是每个输出节点的这些误差的总和。此外,由于我们希望负误差和正误差不会互相抵消,因此我们在求和之前对这些差异求平方。为了下面求导方便,我们在误差项前乘上常量因子
1
2
\frac{1}{2}
21 :
E
:
=
1
2
∑
j
=
1
J
(
t
j
−
y
j
)
2
(8)
E:=\frac{1}{2}\sum_{j=1}^{J}(t_j-y_j)^2 \tag{8}
E:=21j=1∑J(tj−yj)2(8)
注意:上述公式是假设第 j j j层为输出层时才成立的(误差是在输出层计算)。
我们希望通过求出损失函数
E
E
E 对某个连接参数
w
k
j
w_{kj}
wkj的微分,以便根据
G
r
a
d
i
e
n
t
D
e
s
c
e
n
t
Gradient \ Descent
Gradient Descent 对该参数进行更新。该过程可以用如下公式表示:
△
w
k
j
=
−
α
⋅
∂
E
∂
w
k
j
(9)
\bigtriangleup w_{kj} = -\alpha \cdot \frac{\partial E}{\partial w_{kj}} \tag{9}
△wkj=−α⋅∂wkj∂E(9) 其中
α
\alpha
α 是学习率,负号表示权重变化是朝着减少误差的方向。求出梯度后即可根据(10)进行参数更新
w
k
j
=
w
k
j
−
α
⋅
∂
E
∂
w
k
j
(10)
w_{kj} = w_{kj} -\alpha \cdot \frac{\partial E}{\partial w_{kj}} \tag{10}
wkj=wkj−α⋅∂wkj∂E(10)
据链式求导法则
c
h
a
i
n
r
u
l
e
chain \ rule
chain rule,我们可以得到:
∂
E
∂
w
k
j
=
∂
E
∂
y
j
∂
y
j
∂
x
j
∂
x
j
∂
w
k
j
(11)
\frac{\partial E}{\partial w_{kj}} = \frac{\partial E}{\partial y_j} \frac{\partial y_j}{\partial x_j} \frac{\partial x_j}{\partial w_{kj}} \tag{11}
∂wkj∂E=∂yj∂E∂xj∂yj∂wkj∂xj(11)
由
E
q
.
(
1
)
Eq.\ (1)
Eq. (1) 可以得到:
∂
x
j
∂
w
k
j
=
y
k
(12)
\frac{\partial x_j}{\partial w_{kj}} = y_k \tag{12}
∂wkj∂xj=yk(12)
我们使用
s
i
g
m
o
i
d
sigmoid
sigmoid 函数作为激活函数,因此有:
∂
y
j
∂
x
j
=
f
(
x
j
)
⋅
(
1
−
f
(
x
j
)
)
=
y
j
(
1
−
y
j
)
(13)
\frac{\partial y_j}{\partial x_j} = f(x_j)\cdot(1-f(x_j))=y_j(1-y_j) \tag{13}
∂xj∂yj=f(xj)⋅(1−f(xj))=yj(1−yj)(13)
比较麻烦的地方在于求 ∂ E ∂ y j {\frac{\partial E}{\partial y_j}} ∂yj∂E,我们需要分成两种情况来讨论:
(1)当第
j
j
j 层是输出层时: 此时可以之间根据
E
q
.
8
Eq.\ 8
Eq. 8得到:
∂
E
∂
y
j
=
−
(
t
j
−
y
j
)
(14)
\frac{\partial E}{\partial y_j} = -(t_j-y_j) \tag{14}
∂yj∂E=−(tj−yj)(14)
结合
E
q
s
Eqs
Eqs (12),(13),(14)。我们可以得到
E
q
.
11
Eq. \ 11
Eq. 11的结果如下:
∂
E
∂
w
k
j
=
−
(
t
j
−
y
j
)
y
j
(
1
−
y
j
)
y
k
(15)
\frac{\partial E}{\partial w_{kj}}=-(t_j-y_j)y_j(1-y_j)y_k \tag{15}
∂wkj∂E=−(tj−yj)yj(1−yj)yk(15)
(2)当第
j
j
j 层是隐藏层时:此时我们需要考虑误差是如何通过第
j
j
j 层传播到下一层,即第
i
i
i 层的。这里我们需要用到多变量的链式求导法则(
m
u
l
t
i
−
v
a
r
i
a
b
l
e
c
a
l
c
u
l
u
s
multi-variable \ calculus
multi−variable calculus)。为了求出
∂
E
∂
w
k
j
\frac{\partial E}{\partial w_{kj}}
∂wkj∂E(
E
q
.
11
Eq. 11
Eq.11),我们只需要求出
∂
E
∂
y
j
\frac{\partial E}{\partial y_j}
∂yj∂E。我们可以把
∂
E
∂
y
j
\frac{\partial E}{\partial y_j}
∂yj∂E通过下一层(第
i
i
i 层)表示出来:
∂
E
∂
y
j
=
∑
i
∈
I
j
∂
E
∂
y
i
∂
y
i
∂
x
i
∂
x
i
∂
y
j
(16)
\frac{\partial E}{\partial y_j} = \sum_{i \in I_j}\frac{\partial E}{\partial y_i}\frac{\partial y_i}{\partial x_i}\frac{\partial x_i}{\partial y_j} \tag{16}
∂yj∂E=i∈Ij∑∂yi∂E∂xi∂yi∂yj∂xi(16)
其中
I
j
I_j
Ij 表示第
i
i
i 层中与第
j
j
j 层的第
j
j
j 个节点 (
j
t
h
j^{th}
jth)相关连的节点。可以看出,
∂
E
∂
y
j
\frac{\partial E}{\partial y_j}
∂yj∂E是通过下一层的节点求出的(如果下一层是输出层,则直接根据
E
q
.
8
Eq. \ 8
Eq. 8求出结果,否则按照上述方式递归进行,直到输出层),这正是Backpropagation的核心所在。
由
E
q
.
1
Eq. \ 1
Eq. 1:
∂
x
i
∂
y
j
=
w
j
i
(17)
\frac{\partial x_i}{\partial y_j} = w_{ji} \tag{17}
∂yj∂xi=wji(17)
注: w j i w_{ji} wji 表示节点 j j j 到节点 i i i 连边权重。
为了简化表述,我们用
δ
j
\delta_j
δj表示下式:
δ
j
:
=
∂
E
∂
y
j
∂
y
j
∂
x
j
(18)
\delta_j := \frac{\partial E}{\partial y_j}\frac{\partial y_j}{\partial x_j} \tag{18}
δj:=∂yj∂E∂xj∂yj(18)
那么我们可以根据
E
q
s
.
Eqs.
Eqs.(17),(18) 把
E
q
.
16
Eq. \ 16
Eq. 16表示如下:
∂
E
∂
y
j
=
∑
i
∈
I
j
δ
i
w
j
i
(19)
\frac{\partial E}{\partial y_j} = \sum_{i \in I_j}\delta_i w_{ji} \tag{19}
∂yj∂E=i∈Ij∑δiwji(19)
至此,我们已经把
∂
E
∂
y
j
\frac{\partial E}{\partial y_j}
∂yj∂E表示出来,那么我们的目标
∂
E
∂
w
k
j
\frac{\partial E}{\partial w_{kj}}
∂wkj∂E,也就是
E
q
.
11
Eq . \ 11
Eq. 11就可以表示如下:
∂
E
∂
w
k
j
=
∂
E
∂
y
j
∂
y
j
∂
x
j
∂
x
j
∂
w
k
j
=
∂
E
∂
y
j
⋅
y
j
(
1
−
y
j
)
y
k
=
∑
i
∈
I
j
(
δ
i
w
j
i
)
⋅
y
j
(
1
−
y
j
)
y
k
(20)
\begin{aligned} \frac{\partial E}{\partial w_{kj}} &= \frac{\partial E}{\partial y_j} \frac{\partial y_j}{\partial x_j} \frac{\partial x_j}{\partial w_{kj}} \\ &=\frac{\partial E}{\partial y_j}\cdot y_j(1-y_j)y_k \\ &= \sum_{i \in I_j}(\delta_i w_{ji})\cdot y_j(1-y_j)y_k \end{aligned} \tag{20}
∂wkj∂E=∂yj∂E∂xj∂yj∂wkj∂xj=∂yj∂E⋅yj(1−yj)yk=i∈Ij∑(δiwji)⋅yj(1−yj)yk(20)
注意: E q . 20 Eq. \ 20 Eq. 20 是当第 j j j 层不是输出层时候的表示方式。
我们也可以把第
j
j
j 层是输出层时(情况1)用
δ
j
\delta_j
δj 表示:
∂
E
∂
w
k
j
=
δ
j
y
k
(21)
\frac{\partial E}{\partial w_{kj}} = \delta_jy_k \tag{21}
∂wkj∂E=δjyk(21)
7 Summary
对于
∂
E
∂
w
k
j
\frac{\partial E}{\partial w_{kj}}
∂wkj∂E,我们的核心问题是求出
∂
E
∂
y
j
\frac{\partial E}{\partial y_j}
∂yj∂E。
当第
j
j
j 层是输出层时:
δ
j
:
=
−
(
t
j
−
y
j
)
y
j
(
1
−
y
j
)
(22)
\delta_j:=-(t_j-y_j)y_j(1-y_j) \tag{22}
δj:=−(tj−yj)yj(1−yj)(22)
当第
j
j
j 层不是输出层时:
δ
j
=
(
∑
i
∈
I
j
δ
i
w
j
i
)
y
j
(
1
−
y
j
)
(23)
\delta_j = (\sum_{i \in I_j}\delta_iw_{ji})y_j(1-y_j) \tag{23}
δj=(i∈Ij∑δiwji)yj(1−yj)(23)
注:其中
δ
j
\delta_j
δj 可以看作误差项。
我从 E q . 23 Eq. \ 23 Eq. 23 我们可以看出,计算隐藏层节点误差项 δ j \delta_j δj时,需要提前计算出下一层节点的误差项 δ i \delta_i δi,这一过程将持续到输出层,输出层误差项可以用 E q . 22 Eq. \ 22 Eq. 22 计算。因此,整个计算过程必须使用反向传播算法( B a c k p o r p a g a t i o n Backporpagation Backporpagation),从输出层开始,到第一个隐藏层结束。正是这种误差项的向后传播,才有反向传播算法的名称。
8 Supplement
下面是关于
c
h
a
i
n
r
u
l
e
chain \ rule
chain rule (链式求导法则)的补充(cite from:Hung-yi Lee)
其中的
z
z
z等价于上述的
E
E
E,
s
s
s 等价于上述的
y
j
y_j
yj,而
x
,
y
x,y
x,y 则可以等价于上述的
∑
i
∈
I
j
\sum_{i\in I_j}
∑i∈Ij 中的
y
i
y_i
yi。
Reference
Latex:link
Latex极简手册:link
Latex换行对齐问题:link
Latex符号表示:link
参考文献:[pdf]