机器学习笔记总结二
一.感知器(单层神经网络)
1.感知器算法的起源
狐仙提示:之所以称为MP模型,是取自二者名字的首字母。
下面进行一些简单的介绍
神经元生理模型:
外部的刺激通过树突传递给神经元细胞核,经过细胞核加工后,作为输出,传递给突触。
神经元数学模型:
MP模型是将外部刺激模拟为一串数字
x
1
,
x
2
一
直
到
x
m
x_1,x_2一直到x_m
x1,x2一直到xm的输入,将每个树突对输入的刺激加工过程模拟为以某个权重对输入进行加权,将细胞核对输入的处理模拟为带有偏置的求和过程,最后的输出是用激活函数对求和的结果进行非线性变换得出。如下图所示:
现在我们来分析一个经典问题:
首先我们假设输入的训练样本表示为
(
X
i
,
y
i
)
,
(X_i,y_i),
(Xi,yi),
i
i
i=1~N,
这是一个二分类问题,
X
i
X_i
Xi是训练数据,
y
i
=
±
1
y_i=\pm1
yi=±1,分别代表相应的类别。
满足上图中的(1)(2),我们就说这个数据获得了平衡。
同理,不平衡也有两种情况,如下图:
我们在前面已经学习过,当且仅当在训练数据集线性可分的情况下,才能找到 w 和 b w和b w和b满足使所有的 n n n个训练样本都达到平衡。
而感知器算法寻找
w
和
b
w和b
w和b的做法如下:
我们来分析一下这个算法:
第一种情况:
因为
∣
∣
x
∣
∣
⩾
0
||x||\geqslant0
∣∣x∣∣⩾0,这样我们改变
w
和
b
w和b
w和b后,使得
x
x
x距离平衡状态至少近了一点。
第二种情况:
因此,改变
w
和
b
w和b
w和b之后,我们也使这种情况下
x
x
x离平衡状态近了一点点。
总结:感知器算法大致过程其实如下图:
也就是说,当所有训练样本满足达到平衡状态时,算法就停了下来。
思考:算法真的能停下来吗?
这里ROSENBLATT给出了解释,只要训练数据线性可分,感知器算法就一定可以停下来。
因文章篇幅有限,这里我把证明链接放在下面了,
感知器算法证明
2.感知器算法的意义
感知器算法首先提出了一套机器学习算法的框架,如下图:
注意:
f
f
f的形式是人为指定的,而
θ
\theta
θ是待求的参数
一旦 θ \theta θ求出来,我们利用预测函数可以求出 y y y
由前面知识可得:
这个框架包含了所有的分类和回归问题,也包含强化学习,无监督学习等机器学习的其他领域问题,这是一个相当广泛的算法框架。
下面讲述一下对这个框架一些直观的感觉和认识,即对预测函数和训练数据复杂度匹配性方面做一些初步探讨。
先看下面的图片:
对于第一张图片,训练数据的分布相对复杂,但
f
f
f却是一个简单的线性函数,那么,我们无论算出的
θ
\theta
θ等于多少,都不可能全面的模拟训练数据的分布。
我们把这种情况称为模型欠拟合。
第二张图片是训练数据和预测函数的复杂度相适应的情况,这时模型的预测能力是比较好的
对于第三张图片,训练数据的复杂度低于预测函数的复杂度,其结果将会是预测函数能相当精确的拟合训练数据,但是在没有训练数据的区域,预测函数也会人为的制造出复杂的函数值的分布。
我们把这种情况称为模型过拟合。
一般来说,现实生活中的机器学习问题训练数据的分布是非常复杂的。
因此,我们要设计复杂的预测函数
f
f
f,使它与训练函数的复杂程度相适应。在复杂的预测函数中,待求的变量
θ
\theta
θ的维度会非常的高,因此计算起来就会复杂。
但是,感知器算法依旧是机器学习算法的先驱,具有重要的历史地位。
二.人工神经网络(上)
上面我们介绍了感知器,也就是单层神经网络。但是感知器只能解决线性可分的问题,而现实生活中大多数分类问题都是线性不可分的。这也导致了人工智能在一段时间内毫无进展。
但是我们接下面所讲的神经网络解决了这一问题
先来看一下多层神经网络的结构
X
是
输
入
向
量
,
有
两
个
分
量
X
1
,
X
2
,
输
出
y
是
一
个
数
值
X是输入向量,有两个分量X1,X2,输出y是一个数值
X是输入向量,有两个分量X1,X2,输出y是一个数值
下面我们逐层写出从输入到输出之间的关系:
然后我们可以得出输入与输出的关系:
接下来我们对其进行一些谈论
1.可以不加非线性函数吗?
不可以,因为不加非线性函数的话,我们得到输入与输出的关系就如下:
可以看出,输入与输出的关系仍为线性函数
即多层神经网络将和单层神经网络是同一个模型。
2.加入的非线性函数是什么?
为什么要用阶跃函数作为非线性函数呢?
因为我们有个定理:如果非线性函数采用阶跃函数,那么三层神经网络可以模拟任意的非线性函数。
3.实例分析
1.二层神经网络例子
在特征空间上,有一个三角形,规定在三角形内部的区域属于一类,三角形外部的区域属于另一类。那么我们怎么实现这一分类呢?
我们要用多层神经网络来构建一个函数,使得
如果
x
在
三
角
形
里
面
,
则
输
出
y
大
于
0
x在三角形里面,则输出y大于0
x在三角形里面,则输出y大于0,
如果
x
在
三
角
形
外
面
,
则
输
出
y
小
于
0
x在三角形外面,则输出y小于0
x在三角形外面,则输出y小于0。
同时我们假定上面三个方程中在朝向三角形的一侧方程的值大于0,而在远离三角形的一侧方程的值小于0。这是一定可以做到的,因为做不到的话我们只需要将
w
和
b
w和b
w和b取相反数即可。
现在我们用一个二层神经网络来完成这个任务,构造如下图所示的神经网络:
其中输入与输出的关系如下图
1.若
X
的
分
向
量
X
1
和
X
2
X的分向量X1和X2
X的分向量X1和X2在三角形内部,则得到的
a
1
,
a
2
,
a
3
a_1,a_2,a_3
a1,a2,a3一定都大于0,经过阶跃函数后得到的
Z
1
,
Z
2
,
Z
3
Z1,Z2,Z3
Z1,Z2,Z3一定都大于1,最后得到的
y
y
y也大于0。
2.若
X
的
分
向
量
X
1
和
X
2
X的分向量X1和X2
X的分向量X1和X2在三角形外部,则得到的
a
1
,
a
2
,
a
3
a_1,a_2,a_3
a1,a2,a3至少有一个小于0,经过阶跃函数后得到的
Z
1
,
Z
2
,
Z
3
Z1,Z2,Z3
Z1,Z2,Z3至少有一个为0,最后得到的
y
y
y也小于0。
下图是我手工解释为什么2中得到的
y
y
y会小于0.
2.三层神经网络例子
在特征空间上,有两个三角形,规定在任意一个三角形内部的区域属于一类,在两个三角形外部的区域属于另一类。那么我们怎么实现这一分类呢?
首先,我们构造一个三层神经网络,如下图所示:
1.若
X
的
分
向
量
X
1
和
X
2
X的分向量X1和X2
X的分向量X1和X2在第一个三角形内部,那么
C
1
=
1
,
C
2
=
0
C1=1,C2=0
C1=1,C2=0
2.若
X
的
分
向
量
X
1
和
X
2
X的分向量X1和X2
X的分向量X1和X2在在第二个三角形内部,那么
C
1
=
0
,
C
2
=
1
C1=0,C2=1
C1=0,C2=1
3.若
X
的
分
向
量
X
1
和
X
2
X的分向量X1和X2
X的分向量X1和X2在三角形外部,那么
C
1
=
0
,
C
2
=
0
C1=0,C2=0
C1=0,C2=0
最后将两个权重都设置为1,偏置设置为-0.5,即可区分。
4.神经网络的训练策略
在实际问题中,我们并不知道决策函数是什么,而是只知道特征空间中一些训练样本和这些训练样本的标签,由于我们不知道决策函数的具体形式,因此我们也无法知道表征决策函数的神经网络的结构。我们只能采取另一种思路:
但是这种思路也涉及很多复杂因素,下面我们来进行分解
首先假定神经网络的结构中就涉及到
1.网络有多少层?
2.每层神经元的个数是多少?
这里我们引进设计网络结构的两个准则
我们设计的神经网络层数可以少一些,神经元个数也可以少一些。
我们设计的神经网络层数可以多一些,神经元个数也可以多一些。
注意:网络结构设计与训练样本的数量也有很强的相关性。
而我们现在要做的是在神经网络设置已经确定的前提下,如何优化网络中待求的参数?
这里我们举两层神经网络的例子
我们需要使得小
y
y
y和标签大
Y
Y
Y尽可能接近
因此可以定义目标函数为:
E
(
w
,
b
)
=
E
(
X
,
Y
)
[
(
Y
−
y
)
2
]
E(w,b)=E_{(X,Y)}[(Y-y)^{2}]
E(w,b)=E(X,Y)[(Y−y)2]
其中的
E
(
X
,
Y
)
E_{(X,Y)}
E(X,Y)可以理解为遍历训练样本及标签的数学期望。
这里我们利用梯度下降法求解局部极小值
(可能有些小伙伴不了解梯度下降,这里我放了一个链接给大家)
梯度下降讲解
我们把
α
\alpha
α叫做学习率,这是人工神经网络中最重要的超参数,而
α
\alpha
α的设置也需要恰到好处。
当
α
\alpha
α很大时,很容易错过局部极值点,当
α
\alpha
α很小时,会导致很久都不能收敛到局部极值点。
三.人工神经网络(下)
上面的部分是对人工神经网络的简单介绍,接下来我们开始讲解人工神经网络中较难的一部分。
1.后向传播算法(上)
主要步骤:
我们先来看下面这个简单的神经网络
我们需要估计的参数有9个
而
y
y
y的计算如上图所示。除此之外,我们还要计算以下9个偏导数。
直接计算显得很呆,而且计算量大,比较费时间。
这时候我们就要用到后向传播算法了,而后向传播算法的核心就是这九个偏导数之间是相互关联的。根据偏导数的链式求导法则,可以根据已经算出来的偏导数来算出未算出的偏导数。
而在这个网络中,我们需要先算出红圈标记的三个点处的偏导数,这三个点是整个网络的枢纽,其他的偏导数可以很容易通过这三个红圈的点算出。
下面我们来计算偏导数
因为
E
=
1
2
(
y
−
Y
)
2
E=\frac{1}{2}(y-Y)^2
E=21(y−Y)2
所以
∂
E
∂
y
=
y
−
Y
\frac{\partial E}{\partial y}=y-Y
∂y∂E=y−Y
根据偏导数的链式法则可以得出
∂
E
∂
a
1
=
∂
E
∂
y
∂
y
∂
a
1
\frac{\partial E}{\partial a_1}=\frac{\partial E}{\partial y}\frac{\partial y}{\partial a_1}
∂a1∂E=∂y∂E∂a1∂y
∂
y
∂
a
1
=
∂
y
∂
z
1
∂
z
1
∂
a
1
\frac{\partial y}{\partial a_1}=\frac{\partial y}{\partial z_1}\frac{\partial z_1}{\partial a_1}
∂a1∂y=∂z1∂y∂a1∂z1
综合上面两个式子可以得出
∂
E
∂
a
1
=
∂
E
∂
y
∂
y
∂
z
1
∂
z
1
∂
a
1
\frac{\partial E}{\partial a_1}=\frac{\partial E}{\partial y}\frac{\partial y}{\partial z_1}\frac{\partial z_1}{\partial a_1}
∂a1∂E=∂y∂E∂z1∂y∂a1∂z1
又因为
∂
E
∂
y
=
y
−
Y
\frac{\partial E}{\partial y}=y-Y
∂y∂E=y−Y
y
=
w
1
z
1
+
w
2
z
2
+
b
3
y=w_1z_1+w_2z_2+b_3
y=w1z1+w2z2+b3
所以
∂
y
∂
z
1
=
w
1
\frac{\partial y}{\partial z_1}=w_1
∂z1∂y=w1
因为
z
1
=
φ
′
(
a
1
)
z_1=\varphi \prime(a_1)
z1=φ′(a1)
所以
d
z
1
d
a
1
=
φ
′
(
a
1
)
\frac{d z_1}{d a_1}= \varphi \prime(a_1)
da1dz1=φ′(a1)
综合起来
∂
E
∂
a
1
=
w
1
(
y
−
Y
)
φ
′
(
a
1
)
\frac{\partial E}{\partial a_1}=w_1(y-Y)\varphi \prime(a_1)
∂a1∂E=w1(y−Y)φ′(a1)
同理可得
∂
E
∂
a
2
=
w
2
(
y
−
Y
)
φ
′
(
a
2
)
\frac{\partial E}{\partial a_2}=w_2(y-Y)\varphi \prime(a_2)
∂a2∂E=w2(y−Y)φ′(a2)
因为
y
=
w
1
z
1
+
w
2
z
2
+
b
3
y=w_1z_1+w_2z_2+b_3
y=w1z1+w2z2+b3
可以得出
∂
E
∂
w
1
=
∂
E
∂
y
∂
y
∂
w
1
=
(
y
−
Y
)
z
1
\frac{\partial E}{\partial w_1}=\frac{\partial E}{\partial y}\frac{\partial y}{\partial w_1}=(y-Y)z_1
∂w1∂E=∂y∂E∂w1∂y=(y−Y)z1
∂ E ∂ w 2 = ∂ E ∂ y ∂ y ∂ w 2 = ( y − Y ) z 2 \frac{\partial E}{\partial w_2}=\frac{\partial E}{\partial y}\frac{\partial y}{\partial w_2}=(y-Y)z_2 ∂w2∂E=∂y∂E∂w2∂y=(y−Y)z2
∂
E
∂
b
3
=
∂
E
∂
y
∂
y
∂
b
3
=
(
y
−
Y
)
\frac{\partial E}{\partial b_3}=\frac{\partial E}{\partial y}\frac{\partial y}{\partial b_3}=(y-Y)
∂b3∂E=∂y∂E∂b3∂y=(y−Y)
因为
a
1
=
w
11
x
1
+
w
12
x
2
+
b
1
a_1=w_{11}x_1+w_{12}x_2+b_1
a1=w11x1+w12x2+b1
可以得出
∂
E
∂
w
11
=
∂
E
∂
a
1
∂
a
1
∂
w
11
=
w
1
(
y
−
Y
)
φ
′
(
a
1
)
x
1
\frac{\partial E}{\partial w_{11}}=\frac{\partial E}{\partial a_1}\frac{\partial a_1}{\partial w_{11}}=w_1(y-Y)\varphi \prime(a_1)x_1
∂w11∂E=∂a1∂E∂w11∂a1=w1(y−Y)φ′(a1)x1
∂ E ∂ w 12 = ∂ E ∂ a 1 ∂ a 1 ∂ w 12 = w 1 ( y − Y ) φ ′ ( a 1 ) x 2 \frac{\partial E}{\partial w_{12}}=\frac{\partial E}{\partial a_1}\frac{\partial a_1}{\partial w_{12}}=w_1(y-Y)\varphi \prime(a_1)x_2 ∂w12∂E=∂a1∂E∂w12∂a1=w1(y−Y)φ′(a1)x2
∂
E
∂
b
1
=
∂
E
∂
a
1
∂
a
1
∂
b
1
=
w
1
(
y
−
Y
)
φ
′
(
a
1
)
\frac{\partial E}{\partial b_1}=\frac{\partial E}{\partial a_1}\frac{\partial a_1}{\partial b_1}=w_1(y-Y)\varphi \prime(a_1)
∂b1∂E=∂a1∂E∂b1∂a1=w1(y−Y)φ′(a1)
同理因为
a
2
=
w
21
x
1
+
w
22
x
2
+
b
2
a_2=w_{21}x_1+w_{22}x_2+b_2
a2=w21x1+w22x2+b2
可以得出
∂
E
∂
w
21
=
∂
E
∂
a
2
∂
a
2
∂
w
21
=
w
2
(
y
−
Y
)
φ
′
(
a
2
)
x
1
\frac{\partial E}{\partial w_{21}}=\frac{\partial E}{\partial a_2}\frac{\partial a_2}{\partial w_{21}}=w_2(y-Y)\varphi \prime(a_2)x_1
∂w21∂E=∂a2∂E∂w21∂a2=w2(y−Y)φ′(a2)x1
∂ E ∂ w 22 = ∂ E ∂ a 2 ∂ a 2 ∂ w 22 = w 2 ( y − Y ) φ ′ ( a 2 ) x 2 \frac{\partial E}{\partial w_{22}}=\frac{\partial E}{\partial a_2}\frac{\partial a_2}{\partial w_{22}}=w_2(y-Y)\varphi \prime(a_2)x_2 ∂w22∂E=∂a2∂E∂w22∂a2=w2(y−Y)φ′(a2)x2
∂ E ∂ b 2 = ∂ E ∂ a 2 ∂ a 2 ∂ b 2 = w 2 ( y − Y ) φ ′ ( a 2 ) \frac{\partial E}{\partial b_2}=\frac{\partial E}{\partial a_2}\frac{\partial a_2}{\partial b_2}=w_2(y-Y)\varphi \prime(a_2) ∂b2∂E=∂a2∂E∂b2∂a2=w2(y−Y)φ′(a2)
而这种算法之所以称为后向传播算法,是因为它的整个过程是从输出往输入推,即从后往前推。
2.后向传播算法(下)
在上节内容中,我们基于一个简单的神经网络讲解了如何用后向传播算法更新神经网络的参数完成神经网络的训练。
在本节内容中,我们将后向传播算法推广到更一般的神经网络。即不限制神经网络的层数以及每一层神经元的个数来推导后向传播算法。
主要步骤:
下图是一般的神经网络结构:
对于上图的神经网络结构,我们可以用矩阵的形式表示
下面我们进行一些说明
假设对于一个输入的向量X,其标签为Y,则设置目标函数为E=
1
2
∣
∣
y
−
Y
∣
∣
2
\frac{1}{2}||y-Y||^2
21∣∣y−Y∣∣2.
和上一节内容一样,在推导后向传播算法时,我们先推导E对枢纽变量的偏导数,再根据对枢纽的偏导数推导对所有 w 和 b w和b w和b的偏导数。
我们设置枢纽变量为
δ
i
(
m
)
=
∂
E
∂
z
i
(
m
)
\delta_i^{(m)}=\frac{\partial E}{\partial z_i^{(m)}}
δi(m)=∂zi(m)∂E
最后一层,即第L层
δ
i
(
l
)
=
∂
E
∂
z
i
(
l
)
=
∂
E
∂
y
i
∂
y
i
∂
z
i
(
l
)
=
(
y
i
−
Y
i
)
φ
′
(
z
i
(
l
)
)
\delta_i^{(l)}=\frac{\partial E}{\partial z_i^{(l)}}=\frac{\partial E}{\partial y_i}\frac{\partial y_i}{\partial z_i^{(l)}}=(y_i-Y_i)\varphi \prime(z_i^{(l)})
δi(l)=∂zi(l)∂E=∂yi∂E∂zi(l)∂yi=(yi−Yi)φ′(zi(l))
接下来我们如何通过第
m
+
1
m+1
m+1层推导第
m
m
m层
δ
i
(
m
)
=
∂
E
∂
z
i
(
m
)
=
∑
j
=
1
S
m
+
1
∂
E
∂
z
j
(
m
+
1
)
∂
z
j
(
m
+
1
)
∂
z
i
(
m
)
=
∑
j
=
1
S
m
+
1
δ
i
(
m
+
1
)
∂
z
j
(
m
+
1
)
∂
z
i
(
m
)
\delta_i^{(m)}=\frac{\partial E}{\partial z_i^{(m)}}=\sum_{j=1}^{S_{m+1}}\frac{\partial E}{\partial z_j^{(m+1)}}\frac{\partial z_j^{(m+1)}}{\partial z_i^{(m)}}=\sum_{j=1}^{S_{m+1}}\delta_i^{(m+1)}\frac{\partial z_j^{(m+1)}}{\partial z_i^{(m)}}
δi(m)=∂zi(m)∂E=∑j=1Sm+1∂zj(m+1)∂E∂zi(m)∂zj(m+1)=∑j=1Sm+1δi(m+1)∂zi(m)∂zj(m+1)
这里的
S
m
+
1
S_{m+1}
Sm+1为第
m
+
1
m+1
m+1层神经元个数
为了推导第二项
∂
z
j
(
m
+
1
)
∂
z
i
(
m
)
\frac{\partial z_j^{(m+1)}}{\partial z_i^{(m)}}
∂zi(m)∂zj(m+1)
我们在这里详细的画出第
m
m
m层的向量
z
z
z与第
m
+
1
m+1
m+1层的向量
z
z
z的关系
根据上面的关系,我们能够得出
∂
z
j
(
m
+
1
)
∂
z
i
(
m
)
=
∂
z
j
(
m
+
1
)
∂
a
i
(
m
)
∂
a
j
(
m
)
∂
z
i
(
m
)
=
W
j
i
(
m
+
1
)
φ
′
(
z
i
(
m
)
)
\frac{\partial z_j^{(m+1)}}{\partial z_i^{(m)}}=\frac{\partial z_j^{(m+1)}}{\partial a_i^{(m)}}\frac{\partial a_j^{(m)}}{\partial z_i^{(m)}}=W_{ji}^{(m+1)}\varphi\prime(z_i^{(m)})
∂zi(m)∂zj(m+1)=∂ai(m)∂zj(m+1)∂zi(m)∂aj(m)=Wji(m+1)φ′(zi(m))
代入上式可以获得
δ
i
(
m
)
=
[
∑
j
=
1
S
m
+
1
δ
j
(
m
+
1
)
W
j
i
(
m
+
1
)
]
φ
′
(
z
i
(
m
)
)
\delta_i^{(m)}=[\sum_{j=1}^{S_{m+1}}\delta_j^{(m+1)}W_{ji}^{(m+1)}]\varphi\prime(z_i^{(m)})
δi(m)=[∑j=1Sm+1δj(m+1)Wji(m+1)]φ′(zi(m))
由此,可由
δ
i
(
l
)
\delta_i^{(l)}
δi(l)逐层向前递推
δ
i
(
m
)
\delta_i^{(m)}
δi(m)
易求出:
∂
E
∂
W
j
i
(
m
)
=
δ
j
(
m
)
a
i
(
m
−
1
)
\frac{\partial E}{\partial W_{ji}^{(m)}}=\delta_j^{(m)}a_i^{(m-1)}
∂Wji(m)∂E=δj(m)ai(m−1)
∂
E
∂
b
i
(
m
)
=
δ
i
(
m
)
\frac{\partial E}{\partial b_{i}^{(m)}}=\delta_i^{(m)}
∂bi(m)∂E=δi(m)
3.神经网络的改进
在实际的应用中,我们往往需要对神经网络进行改进,以更好的解决实际问题。
1.非线性函数的改进
之前的非线性函数:
在后向传播算法中,我们需要对非线性函数求导,而阶跃函数在
x
=
0
x=0
x=0时没有导数,也可以说阶跃函数在
x
=
0
x=0
x=0这个点处的导数无限大。因此我们需要改变非线性函数。
改进的非线性函数:
可以采用SIGMOID函数
我们也可以采用双曲正切函数作为非线性函数
以上两个函数的求导都非常方便。
2.目标函数的改进
之前的目标函数:
改进后的目标函数:
假设多层神经网络的最后一层输出为向量
z
z
z,它有
k
k
k个分量,将它通过
s
o
f
t
m
a
x
softmax
softmax层,得到向量
y
y
y,
y
y
y的各个分量为
y
1
到
y
k
y_1到y_k
y1到yk
如果采用
s
o
f
t
m
a
x
softmax
softmax函数加交叉熵的目标函数,后向传播算法的求偏导数也是很容易的。
3.梯度下降法的改进
之前的梯度下降法:
首先,每次输入一个训练样本,我们就要更新所有的参数,这样会导致训练的速度变得非常慢;
其次,如果梯度的更新只是依赖一个训练数据,那么这个训练数据带来的误差将会传导到每一个参数中去,单一数据带来的随机性是非常大的,这样会使算法收敛变得非常慢。
因为我们需要改进原来的梯度下降
采用随机梯度下降算法(SGD):
1.不用每输入一个样本就去更新参数,而是输入一批样本(叫做一个BATCH或MINI—BATCH),求出这些样本的梯度平均值后,根据这个平均值改变参数。在神经网络训练中,BATCH的样本数(BATCH SIZE)大致设置为50—200不等。
2.对于所有的训练数据,根据(BATCH SIZE)分割为各个不同的BATCH。
例如:有10000个训练数据,BATCH SIZE =100,那么我们可以分为10000/100=100个BATCH。
按照BATCH遍历所有训练样本一次,我们称为一个EPOCH。
4.神经网络的参数设置
1.首先给出三个训练神经网络的建议
2.训练神经网络的各种经验
我们的优化不仅是要让原来的目标函数尽可能的小,同时也要让所有
w
w
w的模尽可能的小,这样可以防止一些权值绝对值过大造成的过拟合现象。
我们要做训练数据的归一化,从而保证训练数据的维度落在一个相对固定的区间里,我们的建议是做均值和方差的归一化。
随机梯度下降法中第一步是随机的取所有的(W,b),这样有可能导致梯度消失问题
这两个函数有个共同的特点,就是在绝对值很大的时候梯度都很小,因此如果一开始
W
T
X
+
b
W^TX+b
WTX+b绝对值很大,那么梯度将趋近于0,因此通过后向传播后,与前面相关的梯度也将趋近于0,从而导致训练缓慢,因此我们要使
W
T
X
+
b
W^TX+b
WTX+b一开始落在0的附近。
在上图中我们对每一层的输入
x
x
x进行减去均值,除与方差的归一化操作。
(5)参数的更新策略
我们之前采用的更新策略是随机梯度下降(SGD)
但是SGD存在两个问题
一个是梯度绝对值分量的不平衡,一个是梯度方向的随机性
1.SGD中梯度绝对值分量不平衡
(W,b)的每一个分量获得的梯度绝对值有大有小,一些情况下,将会迫使优化路径变成Z字形状
如下图所示
在这个例子中,由于垂直方向的梯度方向变化比水平方向的梯度变化的绝对值大,使优化的路径变成了u字形,需要耗费很长的时间才能达到局部极值。
我们用ADAGRAD方法来解决这个问题
其核心思想是将梯度的平方不断累计,用归一化因子来规范最终的结果。
2.SGD求梯度的策略过于随机
由于在训练过程中,上一次数据和下一次数据我们用的是完全不同BATCH的数据,会导致出现优化方向随机化的现象。
如下图所示,由于每次选取的BATCH统计特性差别较大,因此使优化方向出现随机游走的状态。
为了解决这一问题
我们可以引入动量,其每一次更新时不仅要考虑梯度的方向,还要考虑上一次更新的方向,将这两个方向以人为规定的比例加权求和,获得最终的更新方向。
如下图所示,用这种方法,可以使搜素路径变得光滑,降低搜索路径的随机性
注:笔记来源于浙江大学机器学习课程,胡浩基老师讲解的,非常通俗易懂!