上篇文章介绍了多层前馈神经网络,那么这种网络是怎样训练生成的呢,BP算法就是其中一种生成多层神经网络的算法 ,又称为反向传播算法,下面来了解一下BP算法。
举例:
下图中是根据一个手写数字辨识的神经网络简单结构,假设输入是一个图片,将图片读入转变成一个多维向量,即左边的多个输入值,根据多层神经网络,计算权重,并不断调整权值,使其更精确,最终通过
s
o
f
t
m
a
x
softmax
softmax函数一作用,将神经元值就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们就可以将它理解成概率,在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,转变成十个数字类别中的一个输出(分类问题,比较是哪一个数字的概率最大)。(在神经网络中经常用到
s
o
f
t
m
a
x
softmax
softmax函数。)
首先了解一下数学中的链式求导法则,后续将会用到:
y
=
g
(
x
)
z
=
h
(
y
)
Δ
x
→
Δ
y
→
Δ
z
d
z
d
x
=
d
z
d
y
d
y
d
x
y=g(x) \quad z=h(y)\\ \quad \Delta x \rightarrow \Delta y \rightarrow \Delta z \quad \frac{d z}{d x}=\frac{d z}{d y} \frac{d y}{d x}
y=g(x)z=h(y)Δx→Δy→Δzdxdz=dydzdxdy
x
=
g
(
s
)
y
=
h
(
s
)
z
=
k
(
x
,
y
)
d
z
d
s
=
∂
z
∂
x
d
x
d
s
+
∂
z
∂
y
d
y
d
s
x=g(s) \quad y=h(s) \quad z=k(x, y)\\ \frac{d z}{d s}=\frac{\partial z}{\partial x} \frac{d x}{d s}+\frac{\partial z}{\partial y} \frac{d y}{d s}
x=g(s)y=h(s)z=k(x,y)dsdz=∂x∂zdsdx+∂y∂zdsdy
神经网络一般有三个部分构成,输入层,隐层,输出层
下图可看出输入层
x
\bm x
x是一个样本数据的多个属性,输出层是输出输入的数据时属于哪个类别
输出层和输入层之间的部分称之为隐层,有多层和多个神经元构成。
构建神经网络的过程是一个不断迭代的过程,
如下图,我们可以看到最终的输出结果
y
y
y,可以通过不断的迭代,推到输入层
x
\bm x
x,其中这里的
σ
\bm \sigma
σ表示激活函数,由神经网络的特点可以知道,隐层中每个神经元都有激活函数,每一层的输入都是前一层的输出。(详细了解神经网络的特点可参考前面初识神经网络初识神经网络的文章)。
一个简单的神经网络运算如下,可以写成矩阵形式,进行矩阵操作。
由于神经网络的构成是前一层和后一层两两相连,前一层输出(各值之和)是后一层的输入。在某一个神经元上,我们就可以用梯度下降法来调整参数
w
i
以
及
偏
置
b
(
又
称
阙
值
θ
)
w_i以及偏置b(又称阙值\theta)
wi以及偏置b(又称阙值θ),梯度下降法要知道各个点的梯度,来确定调整参数的方向,因问题转变为我们需要求解各点的偏导数。
假设,
l
n
(
θ
)
l^n(\theta)
ln(θ)表示第n个样本值训练的损失函数,
L
(
θ
)
L(\theta)
L(θ)是所有样本值的损失函数之和,反向传播算法是训练每一个样本值的属性对应的权重和阙值,一个训练集有N个训练样本。(这里的
θ
\theta
θ代表损失函数中的多个未知数)
L
(
θ
)
=
∑
n
=
1
N
l
n
(
θ
)
⟶
∂
L
(
θ
)
∂
w
=
∑
n
=
1
N
∂
l
n
(
θ
)
∂
w
L(\theta)=\sum_{n=1}^{N} l^{n}(\theta) \quad \longrightarrow \frac{\partial L(\theta)}{\partial w}=\sum_{n=1}^{N} \frac{\partial l^{n}(\theta)}{\partial w}
L(θ)=n=1∑Nln(θ)⟶∂w∂L(θ)=n=1∑N∂w∂ln(θ)
注:一般
l
l
l可设为
1
2
∑
i
=
1
n
(
y
^
i
−
y
)
\frac{1}{2}\sum_{i=1}^{n}(\hat y_i-y)
21∑i=1n(y^i−y),即误差函数,
l
=
1
2
∑
i
=
1
n
(
y
^
i
−
y
)
l=\frac{1}{2}\sum_{i=1}^{n}(\hat y_i-y)
l=21∑i=1n(y^i−y),
1
2
\frac{1}{2}
21是为了求导方便。
即求得每一个训练样本的损失函数,将其相加就是训练集的损失函数(误差函数)。因此我们要计算
∂
L
(
θ
)
∂
w
=
∑
n
=
1
N
∂
l
n
(
θ
)
∂
w
\frac{\partial L(\theta)}{\partial w}=\sum_{n=1}^{N} \frac{\partial l^{n}(\theta)}{\partial w}
∂w∂L(θ)=n=1∑N∂w∂ln(θ)
那我们应该思考怎样计算
∂
l
∂
w
\frac{\partial l}{\partial w}
∂w∂l。
首先来看输入层:
假设某数据有两个属性,取样本点
x
\bm{x}
x有属性值
(
x
1
,
x
2
)
,
输
出
(
y
1
,
y
2
)
(x_1,x_2),输出(y_1,y_2)
(x1,x2),输出(y1,y2),
一个样本输入神经元和隐层连接如下图:
则:
∂
l
∂
w
=
∂
l
∂
z
∂
z
∂
w
\frac{\partial l}{\partial w}=\frac{\partial l}{\partial z}\frac{\partial z}{\partial w}
∂w∂l=∂z∂l∂w∂z
其中由
z
=
x
1
w
1
+
x
2
w
2
+
b
z=x_{1} w_{1}+x_{2} w_{2}+b
z=x1w1+x2w2+b可以看出:
∂
z
∂
w
1
=
x
1
,
∂
z
∂
w
2
=
x
2
\frac{\partial z}{\partial w_1}=x_1,\frac{\partial z}{\partial w_2}=x_2
∂w1∂z=x1,∂w2∂z=x2即偏导数等于前向传播中的输出值
x
x
x,在这里相当于参数,很容易得到,因为样本值
x
x
x已知,由输入向输出计算即可推得。
如图(注;
z
⟶
s
i
g
m
o
i
d
激
活
函
数
⟶
0.12
,
z \longrightarrow sigmoid激活函数 \longrightarrow 0.12,\quad
z⟶sigmoid激活函数⟶0.12,每个神经元都有激活函数):
接下来就是求
∂
l
∂
z
\bm {\frac{\partial l}{\partial z}}
∂z∂l,
首先应该确定
z
\bm z
z和
l
\bm l
l的决定关系,因为:
由链式求导法则得:
∂
l
∂
z
=
∂
l
∂
a
∂
a
∂
z
\frac{\partial l}{\partial z}=\frac{\partial l}{\partial a}\frac{\partial a}{\partial z}
∂z∂l=∂a∂l∂z∂a
因
为
a
=
σ
(
z
)
(
激
活
函
数
已
知
)
,
所
以
∂
a
∂
z
=
σ
′
(
z
)
;
\\ 因为a=\sigma(z)(激活函数已知),所以\frac{\partial a}{\partial z} =\sigma^{\prime}(z);
因为a=σ(z)(激活函数已知),所以∂z∂a=σ′(z);
即现在要求
∂
l
∂
a
\quad \frac{\partial l}{\partial a}
∂a∂l:
∂
l
∂
a
=
∂
l
∂
z
′
∂
z
′
∂
a
+
∂
l
∂
z
′
′
∂
z
′
′
∂
a
\quad \frac{\partial l}{\partial a}= \frac{\partial l}{{\partial} z^{\prime}}\frac{\partial z^{\prime}}{\partial a}+ \frac{\partial l}{\partial z^{\prime \prime}}\frac{\partial z^{\prime \prime}}{\partial a}
∂a∂l=∂z′∂l∂a∂z′+∂z′′∂l∂a∂z′′
由图中可以容易看出
a
⟶
z
′
,
a
⟶
z
′
′
,
(
前
一
个
a
是
后
一
个
z
的
输
入
)
a \longrightarrow z\prime ,a \longrightarrow z\prime\prime,(前一个a是后一个z的输入)
a⟶z′,a⟶z′′,(前一个a是后一个z的输入)
所以:
∂
z
′
∂
a
=
w
3
\frac{\partial z^{\prime}}{\partial a}=w_3
∂a∂z′=w3
∂
z
′
′
∂
a
=
w
4
\frac{\partial z^{\prime\prime}}{\partial a}=w_4
∂a∂z′′=w4
所以;
∂
l
∂
z
=
σ
′
(
z
)
[
w
3
∂
l
∂
z
′
+
w
4
∂
l
∂
z
′
′
]
\bm{\frac{\partial l}{\partial z}=\sigma^{\prime}(z)\left[w_{3} \frac{\partial l}{\partial z^{\prime}}+w_{4} \frac{\partial l}{\partial z^{\prime \prime}}\right]}
∂z∂l=σ′(z)[w3∂z′∂l+w4∂z′′∂l]
上面的式子可以看出下面的形式(反向传播):
要求
∂
l
∂
z
\frac{\partial l}{\partial z}
∂z∂l,现在问题转变成求
∂
l
∂
z
′
,
∂
l
∂
z
′
′
\frac{\partial l}{\partial z^{\prime}},\frac{\partial l}{\partial z^{\prime\prime}}
∂z′∂l,∂z′′∂l
在这里可以看出求
∂
l
∂
z
′
,
∂
l
∂
z
′
′
\frac{\partial l}{\partial z^{\prime}},\frac{\partial l}{\partial z^{\prime\prime}}
∂z′∂l,∂z′′∂l的过程和求
∂
l
∂
z
\frac{\partial l}{\partial z}
∂z∂l的过程很相似,需要继续求得
z
′
,
z
′
′
z\prime,z\prime\prime
z′,z′′后面的关于
l
l
l的偏导数。
- 假设是
z
′
,
z
′
′
z\prime,z\prime\prime
z′,z′′在输出层:
∂ l ∂ z ′ = ∂ l ∂ y 1 ∂ y 1 ∂ z ′ ∂ l ∂ z ′ ′ = ∂ l ∂ y 2 ∂ y 2 ∂ z ′ ′ \frac{\partial l}{\partial z^{\prime}}= \frac{\partial l}{\partial y_{1}} \frac{\partial y_{1}}{\partial z^{\prime}}\quad \frac{\partial l}{\partial z^{\prime \prime}}= \frac{\partial l}{\partial y_{2}}\frac{\partial y_{2}}{\partial z^{\prime \prime}} ∂z′∂l=∂y1∂l∂z′∂y1∂z′′∂l=∂y2∂l∂z′′∂y2 -
z
′
,
z
′
′
z\prime,z\prime\prime
z′,z′′在隐层中,我们需要继续先求后面的
∂
l
∂
z
a
\frac{\partial l}{\partial z_{a}}
∂za∂l,
∂
l
∂
z
b
\frac{\partial l}{\partial z_{b}}
∂zb∂l,然后再求
∂
l
∂
z
′
\frac{\partial l}{\partial z^{\prime}}
∂z′∂l,
∂
l
∂
z
′
′
\frac{\partial l}{\partial z^{\prime\prime}}
∂z′′∂l:
上面的前向传播的过程是递归的过程即每算一个偏导数需要先求得下一个偏导数,直到递归到输出层偏导数已知,然后回溯计算当前偏导数,计算较为繁琐;由于已知输出值,现在我们从输出层开始,从后往前求得偏导数,即反向传播:
先算出: ∂ l ∂ z 5 \frac{\partial l}{\partial z_{5}} ∂z5∂l, ∂ l ∂ z 6 \frac{\partial l}{\partial z_{6}} ∂z6∂l,再计算 ∂ l ∂ z 3 \frac{\partial l}{\partial z_{3}} ∂z3∂l,
根据前面的公式可得:
∂ l ∂ z 3 = σ ′ ( z 3 ) [ w 3 ∂ l ∂ z 5 + w 4 ∂ l ∂ z 6 ] {\frac{\partial l}{\partial z_3}=\sigma^{\prime}(z_3)\left[w_{3} \frac{\partial l}{\partial z_5}+w_{4} \frac{\partial l}{\partial z_6}\right]} ∂z3∂l=σ′(z3)[w3∂z5∂l+w4∂z6∂l]以此类推。这是一个不断迭代的过程。
现在回到最初我们要求的是某个神经元 ∂ l ∂ w \bm{ \frac{\partial l}{\partial w}} ∂w∂l,然后根据偏导数求得梯度,进行梯度下降求使得损失函数最小的 w w w,第k+1次更新:
w k + 1 ⟵ w k − η ∗ g k w^{k+1}\longleftarrow w^k-\eta*g^k wk+1⟵wk−η∗gk
由前向和后向传播可得到 ∂ l ∂ w , ( g k ) \bm{ \frac{\partial l}{\partial w}},(g^k) ∂w∂l,(gk)。
因此,神经网络求参的过程就迎刃而解了。