原理
误差反向传播算法是通过误差函数计算实际输出值与期望输出值之间的误差,把误差从最后的输出层依次传播到之前各层,最后通过调整各层连接权重与偏置达到减小误差的目的。而权重和偏置的调整一般使用梯度下降法。
推导前的准备
本文误差反向传播算法的推导以包含隐藏层的多层感知器为例,结构如下图所示:
这里,图中和推导过程中涉及的符号代表的含义分别为:
符号 | 含义 |
---|---|
x i x_i xi | 输入值 |
a j a_j aj | 隐藏层激活值 |
y k y_k yk | 实际输出值 |
r k r_k rk | 期望输出值 |
w 1 i j w_{1ij} w1ij | 网络输入层的第i个神经元和下一层网络第j个神经元之间的连接权重 |
w 2 j k w_{2jk} w2jk | 网络隐藏层的第j个神经元和下一层网络第k个神经元之间的连接权重 |
b j 2 b_j^2 bj2 | 网络隐藏层第j个神经元的偏置 |
b k 3 b_k^3 bk3 | 网络输出层第k个神经元的偏置 |
u 1 j u_{1j} u1j | 隐藏层第j个神经元的激活函数的加权输入 |
u 2 k u_{2k} u2k | 输出层第k个神经元的激活函数的加权输入 |
E E E | 误差函数 |
η \eta η | 学习率 |
这里,误差函数采用最小二乘误差函数,公式如下:
E
=
∑
n
=
1
N
∣
∣
r
n
−
y
n
∣
∣
2
E=\sum_{n=1}^N||r_n-y_n||^2
E=n=1∑N∣∣rn−yn∣∣2
激活函数使用sigmoid函数,公式如下:
f
(
u
)
=
1
1
+
e
−
u
f(u)=\frac{1}{1+e^{-u}}
f(u)=1+e−u1其中,
u
=
∑
i
=
1
N
w
i
x
i
+
b
u=\sum_{i=1}^Nw_ix_i+b
u=i=1∑Nwixi+b
开始推导
首先,再明确一下我们的目的是计算使用梯度下降法时神经网络各层间连接权重和偏差的变化值,即
Δ
w
1
i
j
,
Δ
w
2
j
k
,
Δ
b
j
2
\Delta w_{1ij},\Delta w_{2jk},\Delta b_j^2
Δw1ij,Δw2jk,Δbj2等值。
这里,计算过程以求解
Δ
w
1
i
j
\Delta w_{1ij}
Δw1ij为例,其它值类似,而
Δ
w
1
i
j
=
η
∂
E
∂
w
1
i
j
\Delta w_{1ij}=\eta\frac{\partial E}{\partial w_{1ij}}
Δw1ij=η∂w1ij∂E
根据链式求导得:
∂
E
∂
w
1
i
j
=
∑
k
=
1
q
(
∂
E
∂
y
k
∂
y
k
∂
u
2
k
∂
u
2
k
∂
a
j
∂
a
j
δ
u
1
j
∂
u
1
j
∂
w
1
i
j
)
\frac{\partial E}{\partial w_{1ij}}=\sum_{k=1}^q (\frac{\partial E}{\partial y_k} \frac{\partial y_k}{\partial u_{2k}} \frac{\partial u_{2k}}{\partial a_j} \frac{\partial a_j}{\delta u_{1j}} \frac{\partial u_{1j}}{\partial w_{1ij}})
∂w1ij∂E=k=1∑q(∂yk∂E∂u2k∂yk∂aj∂u2kδu1j∂aj∂w1ij∂u1j)
然后逐个对等式右侧各部分求解得:
∂
E
∂
y
k
=
−
(
r
k
−
y
k
)
\frac{\partial E}{\partial y_k}=-(r_k-y_k)
∂yk∂E=−(rk−yk)
∂
y
k
∂
u
2
k
=
f
(
u
2
k
)
(
1
−
f
(
u
2
k
)
)
=
y
k
(
1
−
y
k
)
\frac{\partial y_k}{\partial u_{2k}}=f(u_{2k})(1-f(u_{2k}))=y_k(1-y_k)
∂u2k∂yk=f(u2k)(1−f(u2k))=yk(1−yk)
∂
u
2
k
∂
a
j
=
w
2
j
k
\frac{\partial u_{2k}}{\partial a_j}=w_{2jk}
∂aj∂u2k=w2jk
∂
a
j
∂
u
1
j
=
a
j
(
1
−
a
j
)
\frac{\partial a_j}{\partial u_{1j}}=a_j(1-a_j)
∂u1j∂aj=aj(1−aj)
∂
u
1
j
∂
w
1
i
j
=
x
i
\frac{\partial u_{1j}}{\partial w_{1ij}}=x_i
∂w1ij∂u1j=xi
最后得:
∂
E
∂
w
1
i
j
=
−
∑
k
=
1
q
[
(
r
k
−
y
k
)
y
k
(
1
−
y
k
)
w
2
j
k
a
j
(
1
−
a
j
)
x
i
]
\frac{\partial E}{\partial w_{1ij}}=-\sum_{k=1}^q [(r_k-y_k) y_k(1-y_k) w_{2jk} a_j(1-a_j) x_i]
∂w1ij∂E=−k=1∑q[(rk−yk)yk(1−yk)w2jkaj(1−aj)xi]
因此,权重
w
1
i
j
w_{1ij}
w1ij得变化值为:
Δ
w
1
i
j
=
η
∑
k
=
1
q
[
(
r
k
−
y
k
)
y
k
(
1
−
y
k
)
w
2
j
k
a
j
(
1
−
a
j
)
x
i
]
\Delta w_{1ij}=\eta \sum_{k=1}^q [(r_k-y_k) y_k(1-y_k) w_{2jk} a_j(1-a_j) x_i]
Δw1ij=ηk=1∑q[(rk−yk)yk(1−yk)w2jkaj(1−aj)xi]
根据上述计算过程可以发现,权重的变化值的组成依次为:学习率、误差函数导数、激活函数导数、对应连接权重、激活函数导数和输入值,根据这个规律可以快速写出各层权重和偏差的变化值,例如:
Δ
w
2
j
k
=
η
∑
k
=
1
q
[
(
r
k
−
y
k
)
y
k
(
1
−
y
k
)
a
j
]
\Delta w_{2jk} = \eta \sum_{k=1}^q [(r_k-y_k)y_k(1-y_k)aj]
Δw2jk=ηk=1∑q[(rk−yk)yk(1−yk)aj]
Δ
b
j
2
=
η
∑
k
=
1
q
[
(
r
k
−
y
k
)
y
k
(
1
−
y
k
)
w
2
j
k
a
j
(
1
−
a
j
)
]
\Delta b_j^2 = \eta \sum_{k=1}^q[(r_k-y_k)y_k(1-y_k)w_{2jk}a_j(1-a_j)]
Δbj2=ηk=1∑q[(rk−yk)yk(1−yk)w2jkaj(1−aj)]
小结
误差反向传播算法会通过误差函数计算梯度,然后调整权重与偏置,经过反复迭代训练的调整,最终获得最优解。
本文在推导过程中使用的误差函数为最小二乘误差函数,除此以外还有很多其它函数用于计算误差,比如一般多分类问题中使用交叉熵误差函数:
E
=
−
∑
c
=
1
C
∑
n
=
1
N
r
c
n
l
n
y
c
n
E=-\sum_{c=1}^C \sum_{n=1}^N r_{cn}lny_{cn}
E=−c=1∑Cn=1∑Nrcnlnycn
二分类中的常用的误差函数为:
E
=
−
∑
n
=
1
N
[
r
n
l
n
y
n
+
(
1
−
r
n
)
l
n
(
1
−
y
n
)
]
E=-\sum_{n=1}^N [r_nlny_n+(1-r_n)ln(1-y_n)]
E=−n=1∑N[rnlnyn+(1−rn)ln(1−yn)]
同时,激活函数除sigmoid外还有tanh、ReLU等函数:
t
a
n
h
(
u
)
=
e
x
p
(
u
)
−
e
x
p
(
−
u
)
e
x
p
(
u
)
+
e
x
p
(
−
u
)
tanh(u)=\frac{exp(u)-exp(-u)}{exp(u)+exp(-u)}
tanh(u)=exp(u)+exp(−u)exp(u)−exp(−u)
R
e
L
U
(
u
)
=
m
a
x
(
u
,
0
)
ReLU(u)=max(u,0)
ReLU(u)=max(u,0)