下面内容主要来自西瓜书的第五章《神经网络》5.1~5.3节。
1、神经元模型
这一节简单,讲了两个概念,神经元模型以及激活函数。先来看神经元模型吧。 因此,第
j
j
j 个神经元的输出为
y
j
=
f
(
Σ
i
=
1
n
w
i
j
x
i
−
θ
)
=
f
(
Σ
i
=
0
n
w
i
j
x
i
)
y_j=f(\Sigma_{i=1}^n w_{ij}x_i-\theta)=f(\Sigma_{i=0}^n w_{ij}x_i)
y j = f ( Σ i = 1 n w i j x i − θ ) = f ( Σ i = 0 n w i j x i ) 其中
x
i
x_i
x i 为第
i
i
i 个输入,
w
i
,
j
w_{i,j}
w i , j 为第
j
j
j 个神经元第
i
i
i 个输入的权重,
θ
\theta
θ 为门限,且
x
0
=
−
1
,
w
0
j
=
θ
x_0=-1,w_{0j}=\theta
x 0 = − 1 , w 0 j = θ 。 上面图和式子里面的
f
(
⋅
)
f(\cdot)
f ( ⋅ ) 为激活函数。引用网上博客说明为何要采用激活函数:
如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层节点的输入都是上层输出的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了,那么网络的逼近能力就相当有限。正因为上面的原因,我们决定引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。
作者:StevenSun2014 来源:CSDN 原文:https://blog.csdn.net/tyhj_sf/article/details/79932893 版权声明:本文为博主原创文章,转载请附上博文链接!
同一篇博客里面指出,早期研究神经网络主要采用sigmoid函数或者tanh函数,输出有界,很容易充当下一层的输入。 近些年Relu函数及其改进型(如Leaky-ReLU、P-ReLU、R-ReLU等)在多层神经网络中应用比较多。这里先只看sigmoid函数吧。 上面是函数图形,其表达式为
s
i
g
m
o
i
d
(
x
)
=
1
1
+
e
x
.
{\rm sigmoid}(x)=\frac{1}{1+e^x}.
s i g m o i d ( x ) = 1 + e x 1 .
2、感知机与多层网络
这个部分,我觉得可以跟花书上面6.1《实例:学习XOR》结合起来理解。先按照西瓜书上的表达,我们看如何用包含两层神经元的感知机来完成两个输入的逻辑运算。两层神经元感知机的结构示意图如下: 这里我们假定激活函数为符号函数,即
y
=
s
g
n
(
x
T
w
)
y={\rm sgn}({\bf x}^{\rm T}{\bf w} )
y = s g n ( x T w ) 。下面我们两个输入神经元分别为
x
1
,
x
2
x_1,x_2
x 1 , x 2 ,而
x
0
=
−
1
x_0=-1
x 0 = − 1 ,
w
0
w_0
w 0 为门限,即
x
=
[
−
1
x
1
x
2
]
T
{\bf x}=[-1 \ x_1\ x_2]^{\rm T}
x = [ − 1 x 1 x 2 ] T 以及
w
=
[
θ
w
1
w
2
]
T
{\bf w}=[\theta \ w_1\ w_2]^{\rm T}
w = [ θ w 1 w 2 ] T 。 下面我们来实现逻辑运算:
“and”:
w
=
[
2
,
1
,
1
]
T
{\bf w}=[2,1,1]^{\rm T}
w = [ 2 , 1 , 1 ] T
“or” :
w
=
[
0.5
,
1
,
1
]
T
{\bf w}=[0.5,1,1]^{\rm T}
w = [ 0 . 5 , 1 , 1 ] T
“not” :
w
=
[
0.5
,
−
1.2
,
0
]
T
{\bf w}=[0.5, -1.2, 0]^{\rm T}
w = [ 0 . 5 , − 1 . 2 , 0 ] T
到目前为止,都很顺利。事实上,学习的过程就是逐步调整权重系数向量
w
\bf w
w 的过程。对于训练样例
(
x
,
y
)
({\bf x},y)
( x , y ) ,若当前感知机的输出为
y
^
\hat y
y ^ ,则如下来调整感知机权重:
w
i
←
w
i
+
Δ
w
i
w_i\leftarrow w_i+\Delta w_i
w i ← w i + Δ w i
Δ
w
i
=
η
(
y
−
y
^
)
x
i
.
\Delta w_i=\eta(y-\hat y)x_i.
Δ w i = η ( y − y ^ ) x i . 西瓜书上谈到,这种只拥有一层功能神经元(即只有输出层神经元进行激活函数处理)的感知机,学习能力非常有限。对于异或运算这类简单的“非线性可分问题”,这样的感知机也没法解决。下面我们切换到花书上,看看《6.1 实例:学习XOR》。
XOR函数提供了我们想要学习的目标函数
y
=
f
∗
(
x
)
y=f^*(x)
y = f ∗ ( x ) 。我们的模型给出了一个函数
y
=
f
(
x
;
θ
)
y=f(\bf x;\bm \theta)
y = f ( x ; θ ) ,并且我们的学习算法会不断调整参数
θ
\bm \theta
θ 来使得
f
f
f 尽可能接近
f
∗
f^*
f ∗ 。尽管对于二进制而言,MSE并不是一个合适的代价函数,我们还是先从MSE开始(anyway, we need to start):
J
(
w
)
=
1
4
Σ
x
∈
X
[
f
∗
(
x
)
−
f
(
x
;
θ
)
]
2
J({\bf w})=\frac{1}{4}\Sigma_{x\in \mathbb X}[f^*({\bf x})-f({\bf x; \bm \theta})]^2
J ( w ) = 4 1 Σ x ∈ X [ f ∗ ( x ) − f ( x ; θ ) ] 2 下面我们来确定
f
(
x
;
θ
)
f(\bf x;\bm \theta)
f ( x ; θ ) 的形式。我们选用线性模型,即
f
(
x
;
w
,
b
)
=
x
T
w
+
b
.
f({\bf x;w},b)={\bf x}^{\rm T}{\bf w}+b.
f ( x ; w , b ) = x T w + b . 跟上面一样,这个模型没法学习XOR,不过用的方法不一样。西瓜书里面画了超平面,花书里面是这样说明的:如果
x
1
=
0
x_1=0
x 1 = 0 ,那么输出是随着
x
2
x_2
x 2 的增大而增大;但如果
x
1
=
1
x_1=1
x 1 = 1 ,那么输出是随着
x
2
x_2
x 2 的增大而减小。可是
x
2
x_2
x 2 的系数是固定的,线性模型不能随着
x
1
x_1
x 1 的改变来改变
x
2
x_2
x 2 的系数,所以这个问题就搞不定了。
所以书中指出,如果从下面这个空间里面去学习,是能够学出来的。下面的问题就是如何把原来空间变换成这个空间。
下面我们来学习XOR。我们引入一个非常简单的前馈神经网络,如下图所示。 因此有两个函数:
h
=
f
(
1
)
(
x
;
W
,
c
)
{\bf h}=f^{(1)}({\bf x};{\bf W,c})
h = f ( 1 ) ( x ; W , c ) 与
y
=
f
(
2
)
(
h
;
w
,
b
)
y=f^{(2)}({\bf h};{\bf w},b)
y = f ( 2 ) ( h ; w , b ) 下面采用激活函数,定义
h
=
g
(
W
T
x
+
c
)
,
{\bf h}=g({\bf W^{\rm T}x+c}),
h = g ( W T x + c ) , 且采用激活函数为
g
(
z
)
=
max
{
0
,
z
}
g(z)=\max\{0,z\}
g ( z ) = max { 0 , z } (ReLU函数,整流线性单元)。由此得到整个网络为
f
(
x
;
W
,
c
,
w
,
b
)
=
w
T
max
{
0
,
W
T
x
+
c
}
+
b
f({\bf x;W,c,w},b)={\bf w}^{\rm T}\max\{0,W^{\rm T}{\bf x+c}\}+b
f ( x ; W , c , w , b ) = w T max { 0 , W T x + c } + b 书中最后给出了一组解。总之,因为我们用了两层网络,第一次用了非线性的函数,所以能够对这类非线性问题进行学习了。
3、误差逆传播(error back propagation,BP)算法
BP算法是一种非常成功的算法,应用也非常广泛。不过当我们说"BP网络“的时候,指的是多层前馈网络。
我们先从标准BP算法的流程开始。
输入: 训练集
D
=
{
(
x
k
,
y
k
)
}
k
=
1
m
D=\{({\bf x}_k,{\bf y}_k)\}_{k=1}^{m}
D = { ( x k , y k ) } k = 1 m ,
x
k
∈
R
d
{\bf x}_k\in \mathbb{R}^d
x k ∈ R d ,
y
k
∈
R
l
{\bf y}_k\in \mathbb{R}^l
y k ∈ R l ; 学习率
η
\eta
η . 过程: 1:在(0,1)范围内随机初始化网络中所有连接权和阈值 2:repeat 3: for all
(
x
k
,
y
k
)
∈
D
({\bf x}_k,{\bf y}_k)\in D
( x k , y k ) ∈ D do 4: 根据当前参数和式(5.3)计算当前样本的输出
y
^
k
\hat {\bf y}_k
y ^ k ; 5: 根据式(5.10)计算输出层神经元的梯度项
g
j
g_j
g j ; 6: 根据式(5.15)计算隐层神经元的梯度项
e
h
e_h
e h ; 7: 根据式(5.11)-(5.14)更新连接权
w
h
j
,
v
i
h
w_{hj},v_{ih}
w h j , v i h 与阈值
θ
j
\theta_j
θ j ,
γ
h
\gamma_h
γ h 8: end for 9:until 达到停止条件 输出: 连接权与阈值确定的多层前馈神经网络
下面我们先来看看多层前馈网络的结构,下图为西瓜书图5.7。显然,该网络有
d
d
d 个输入神经元,
l
l
l 个输出神经元,
q
q
q 个隐层神经元。输入层第
i
i
i 个神经元与隐层第
h
h
h 个神经元之间的连接权值为
v
i
h
v_{ih}
v i h ,隐层第
h
h
h 个神经元与输出层第
j
j
j 个神经元之间的连接权值为
w
h
j
w_{hj}
w h j 。此外,隐层第
h
h
h 个神经元的阈值为
γ
h
\gamma _h
γ h ,输出层第
j
j
j 个神经元的阈值为
θ
j
\theta_j
θ j 。 显然,我们可以得到第
h
h
h 个隐层神经元的输入为
α
h
=
Σ
i
=
1
d
v
i
h
x
i
,
\alpha_h=\Sigma_{i=1}^{d}v_{ih}x_i,
α h = Σ i = 1 d v i h x i , 第
j
j
j 个输出层神经元的输入为
β
j
=
Σ
h
=
1
q
w
h
j
b
h
.
\beta_j=\Sigma_{h=1}^{q}w_{hj}b_h.
β j = Σ h = 1 q w h j b h . 下面我们来看学习的过程,即如何更新参数。注意这里需要更新的参数,包括连接权值
v
,
w
\bf v,w
v , w 以及阈值
γ
,
θ
\bm \gamma,\theta
γ , θ 。对于训练样本
(
x
k
,
y
k
)
({\bf x}_k,{\bf y}_k)
( x k , y k ) ,若神经网络输出为
y
^
k
=
(
y
^
1
k
,
y
^
2
k
,
…
,
y
^
l
k
)
\hat{\bf y}_k=(\hat y_1^k,\hat y_2^k,\ldots,\hat y_l^k)
y ^ k = ( y ^ 1 k , y ^ 2 k , … , y ^ l k ) ,则有
y
^
j
k
=
f
(
β
j
−
θ
j
)
,
(
5.3
)
\hat y_j^k=f(\beta_j-\theta_j),\ \ \ \ \ (5.3)
y ^ j k = f ( β j − θ j ) , ( 5 . 3 ) 则网络在
(
x
k
,
y
k
)
({\bf x}_k,{\bf y}_k)
( x k , y k ) 上的均方误差为
E
k
=
1
2
Σ
j
=
1
l
(
y
^
j
k
−
y
j
k
)
2
.
(
5.4
)
{\rm E}_k=\frac{1}{2}\Sigma_{j=1}^{l}(\hat y_j^k-y_j^k)^2.\ \ \ (5.4)
E k = 2 1 Σ j = 1 l ( y ^ j k − y j k ) 2 . ( 5 . 4 ) 我们来看看需要确定的参数个数。权值
v
\bf v
v 有
d
q
dq
d q 个,权值
w
\bf w
w 有
l
q
lq
l q 个,阈值
γ
\bm \gamma
γ 有
q
q
q 个,阈值
θ
\bm \theta
θ 有
l
l
l 个,因此一共有
(
d
+
l
+
1
)
q
+
l
(d+l+1)q+l
( d + l + 1 ) q + l 个。BP算法是个迭代学习的过程,任意参数
v
v
v 的更新估计式为
v
←
v
+
Δ
v
.
v\leftarrow v+\Delta v.
v ← v + Δ v .
下面以
w
h
j
w_{hj}
w h j 为例来进行推导。BP算法基于梯度下降策略。由于要最小化均方误差
E
k
{\rm E}_k
E k ,因此给定学习率
η
\eta
η ,有
Δ
w
h
j
=
−
η
∂
E
k
∂
w
h
j
.
\Delta w_{hj}=-\eta\frac{\partial{\rm E}_k}{\partial w_{hj}}.
Δ w h j = − η ∂ w h j ∂ E k . 注意到
w
h
j
w_{hj}
w h j 先影响到第
j
j
j 个输出神经元的输入值
β
j
\beta_j
β j ,再影响到它的输出值
y
^
j
k
\hat y_j^k
y ^ j k ,然后影响到
E
k
{\rm E}_k
E k ,有
∂
E
k
∂
w
h
j
=
∂
E
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
β
j
⋅
∂
β
j
∂
w
h
j
.
\frac{\partial{\rm E}_k}{\partial w_{hj}}=\frac{\partial{\rm E}_k}{\partial \hat y^k_j}\cdot \frac{\partial \hat y^k_j}{\partial \beta_{j}}\cdot \frac{\partial \beta_j}{\partial w_{hj}} .
∂ w h j ∂ E k = ∂ y ^ j k ∂ E k ⋅ ∂ β j ∂ y ^ j k ⋅ ∂ w h j ∂ β j . 由于
β
j
=
Σ
h
=
1
q
w
h
j
b
h
\beta_j=\Sigma_{h=1}^{q}w_{hj}b_h
β j = Σ h = 1 q w h j b h ,因此
∂
β
j
∂
w
h
j
=
b
h
\frac{\partial \beta_j}{\partial w_{hj}}=b_h
∂ w h j ∂ β j = b h 。 进一步,我们设
g
j
=
−
∂
E
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
β
j
,
g_j=-\frac{\partial{\rm E}_k}{\partial \hat y^k_j}\cdot \frac{\partial \hat y^k_j}{\partial \beta_{j}} ,
g j = − ∂ y ^ j k ∂ E k ⋅ ∂ β j ∂ y ^ j k , 即
Δ
w
h
j
=
η
g
j
b
h
.
\Delta w_{hj}=\eta g_j b_h.
Δ w h j = η g j b h . 根据式(5.4)可以得到
g
j
=
−
(
y
^
j
k
−
y
j
k
)
⋅
f
′
(
β
j
−
θ
j
)
.
g_j=-(\hat y_j^k-y_j^k)\cdot f'(\beta_j-\theta_j).
g j = − ( y ^ j k − y j k ) ⋅ f ′ ( β j − θ j ) . 又由于如果采用Sigmoid函数,存在一个很好的性质
f
′
(
x
)
=
f
(
x
)
(
1
−
f
(
x
)
)
f'(x)=f(x)(1-f(x))
f ′ ( x ) = f ( x ) ( 1 − f ( x ) ) ,因此计算流程图里的step-5:
g
j
=
(
y
j
k
−
y
^
j
k
)
⋅
y
^
j
k
⋅
(
1
−
y
^
j
k
)
.
(
5.10
)
g_j=(y_j^k-\hat y_j^k)\cdot \hat y_j^k\cdot(1-\hat y_j^k).\ \ \ (5.10)
g j = ( y j k − y ^ j k ) ⋅ y ^ j k ⋅ ( 1 − y ^ j k ) . ( 5 . 1 0 )
同样可以得到其它参数的更新算法
Δ
θ
j
=
−
η
g
j
,
(
5.12
)
\Delta \theta_j=-\eta g_j,\qquad (5.12)
Δ θ j = − η g j , ( 5 . 1 2 )
Δ
v
i
h
=
η
e
h
x
i
,
(
5.13
)
\Delta v_{ih}=\eta e_h x_i,\qquad (5.13)
Δ v i h = η e h x i , ( 5 . 1 3 )
Δ
γ
h
=
−
η
e
h
,
(
5.14
)
\Delta \gamma_h=-\eta e_h,\qquad (5.14)
Δ γ h = − η e h , ( 5 . 1 4 ) 其中
e
h
=
b
h
(
1
−
b
h
)
Σ
w
h
j
g
j
.
(
5.15
)
e_h=b_h(1-b_h)\Sigma w_{hj}g_j.\qquad (5.15)
e h = b h ( 1 − b h ) Σ w h j g j . ( 5 . 1 5 )
下面我们来推导下上面的结果,设
Δ
θ
j
=
−
η
∂
E
k
∂
θ
j
,
\Delta \theta_j=-\eta \frac{\partial {\rm E}_k}{\partial \theta_j},
Δ θ j = − η ∂ θ j ∂ E k , 由于
θ
j
\theta_j
θ j 为第
j
j
j 个输出层神经元的阈值,因此它直接影响输出值
y
^
j
k
\hat y_j^k
y ^ j k ,即
∂
E
k
∂
θ
j
=
∂
E
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
θ
j
,
\frac{\partial {\rm E}_k}{\partial \theta_j}=\frac{\partial {\rm E}_k}{\partial \hat y_j^k}\cdot \frac{\partial \hat y_j^k}{\partial \theta_j},
∂ θ j ∂ E k = ∂ y ^ j k ∂ E k ⋅ ∂ θ j ∂ y ^ j k , 由(5.3)可知,
∂
E
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
θ
j
=
−
∂
E
k
∂
y
^
j
k
⋅
∂
y
^
j
k
∂
β
j
=
g
j
,
\frac{\partial {\rm E}_k}{\partial \hat y_j^k}\cdot \frac{\partial \hat y_j^k}{\partial \theta_j}=- \frac{\partial {\rm E}_k}{\partial \hat y_j^k}\cdot \frac{\partial \hat y_j^k}{\partial \beta_j}=g_j,
∂ y ^ j k ∂ E k ⋅ ∂ θ j ∂ y ^ j k = − ∂ y ^ j k ∂ E k ⋅ ∂ β j ∂ y ^ j k = g j , 即可得(5.12)。进一步,由于
Δ
v
i
h
=
−
η
∂
E
k
∂
v
i
h
,
\Delta v_{ih}=-\eta \frac{\partial {\rm E}_k}{\partial v_{ih}},
Δ v i h = − η ∂ v i h ∂ E k , 注意到
v
i
h
v_{ih}
v i h 先影响到第
h
h
h 个隐层神经元的输入
α
h
\alpha_h
α h ,随后影响到第
h
h
h 个隐层神经元的输出
b
h
b_h
b h 进一步影响所有
l
l
l 个输出层神经元的输入以及输出,故可以得到
∂
E
k
∂
v
i
h
=
[
∑
j
=
1
l
∂
E
k
∂
y
^
j
⋅
∂
y
^
j
∂
β
j
⋅
∂
β
j
∂
b
h
]
⋅
∂
b
h
∂
α
h
⋅
∂
α
h
∂
v
i
h
\frac{\partial {\rm E}_k}{\partial v_{ih}}= [\sum_{j=1}^l\frac{\partial {\rm E}_k}{\partial \hat y_j}\cdot\frac{\partial \hat y_j}{\partial \beta_j}\cdot\frac{\partial \beta_j}{\partial b_h}]\cdot\frac{\partial b_h}{\partial \alpha_h}\cdot\frac{\partial \alpha_h}{\partial v_{ih}}
∂ v i h ∂ E k = [ j = 1 ∑ l ∂ y ^ j ∂ E k ⋅ ∂ β j ∂ y ^ j ⋅ ∂ b h ∂ β j ] ⋅ ∂ α h ∂ b h ⋅ ∂ v i h ∂ α h 由于
∂
E
k
∂
y
^
j
⋅
∂
y
^
j
∂
β
j
=
−
g
j
,
\frac{\partial {\rm E}_k}{\partial \hat y_j}\cdot\frac{\partial \hat y_j}{\partial \beta_j}=-g_j,
∂ y ^ j ∂ E k ⋅ ∂ β j ∂ y ^ j = − g j ,
∂
β
j
∂
b
h
=
w
i
h
,
\frac{\partial \beta_j}{\partial b_h}=w_{ih},
∂ b h ∂ β j = w i h ,
∂
b
h
∂
α
h
=
f
′
(
α
h
−
γ
h
)
,
\frac{\partial b_h}{\partial \alpha_h}=f'(\alpha_h-\gamma_h),
∂ α h ∂ b h = f ′ ( α h − γ h ) ,
∂
α
h
∂
v
i
h
=
x
i
,
\frac{\partial \alpha_h}{\partial v_{ih}}=x_i,
∂ v i h ∂ α h = x i , 有
e
h
=
−
∂
E
k
∂
b
h
⋅
∂
b
h
∂
α
h
=
∑
j
=
1
l
g
j
w
i
h
f
′
(
α
h
−
γ
h
)
,
,
e_h=-\frac{\partial{\rm E}_k}{\partial b_h}\cdot \frac{\partial b_h}{\partial \alpha_h}=\sum_{j=1}^lg_jw_{ih}f'(\alpha_h-\gamma_h), ,
e h = − ∂ b h ∂ E k ⋅ ∂ α h ∂ b h = j = 1 ∑ l g j w i h f ′ ( α h − γ h ) , , 进一步考虑Sigmoid函数,有
e
h
=
b
h
(
1
−
b
h
)
∑
j
=
1
l
w
i
h
g
j
.
e_h=b_h(1-b_h)\sum_{j=1}^lw_{ih}g_j.
e h = b h ( 1 − b h ) j = 1 ∑ l w i h g j .
上面介绍的“标准BP算法”每次仅仅针对一个训练样本更新参数,即基于单个
E
k
{\rm E}_k
E k 来更新。如果基于累积误差
E
=
1
m
∑
k
=
1
m
E
k
{\rm E}=\frac{1}{m}\sum_{k=1}^m {\rm E}_k
E = m 1 k = 1 ∑ m E k 来进行更新,就得到了累积BP算法。 由于具有强大的表示能力,因此BP网络经常遭遇过拟合,即训练误差持续降低,但测试误差却可能上升。两种缓和的策略包括:1)早停;2)正则化。
参考文献 [1] 周志华,《机器学习》,清华大学出版社。 [2] Ian Goodfellow等,《深度学习》,人民邮电出版社。