Deep Learning
深度学习(英语:deep learning)是机器学习的分支,是一种以人工神经网络为架构,对数据进行表征学习的算法。[1]
主要内容:神经元、激活函数、梯度下降、学习率、过拟合
1. 基础知识
1.1 神经元
神经网络中,神经元模型如下:
其中,
[
a
1
,
.
.
.
,
a
k
,
.
.
.
,
a
K
]
[a_1, ..., a_k, ...,a_K]
[a1,...,ak,...,aK]为神经元输入,
[
w
1
,
.
.
.
,
w
k
,
.
.
.
w
K
]
[w_1, ..., w_k, ...w_K]
[w1,...,wk,...wK]为每个输入对应的权重,b为偏置,
σ
(
z
)
\sigma(z)
σ(z)为激活函数,
a
a
a为神经元输出。
1.2 神经网络基本结构
![](https://i-blog.csdnimg.cn/blog_migrate/1182b995e7f15c7054547b02d7149904.png)
上图是一个典型的全连接神经网络结构,主要由输入层、隐含层和输出层构成。
其中, x = { x 1 , x 2 , . . . , x k } \boldsymbol x=\{x_1, x_2, ..., x_k\} x={x1,x2,...,xk}为输入特征矢量,是神经网络的输入; y = { y 1 , y 2 , . . . , y d } \boldsymbol y=\{y_1, y_2, ..., y_d\} y={y1,y2,...,yd}为神经网络的输出矢量; Θ = { W , b } \Theta = \{W, b\} Θ={W,b}为神经网络的参数,是神经网络训练过程所训练的对象。
1.3 激活函数
激活函数的作用是使神经网络具备分层的非线性映射学习能力。
常用的激活函数
(1)Sigmoid激活函数
f
(
x
)
=
1
1
+
e
−
x
f(x)=\frac{1}{1+e^{-x}}
f(x)=1+e−x1
Sigmoid激活函数是最早采用的一类激活函数,具有指数函数的形状,它将实数映射到
[
0
,
1
]
[0, 1]
[0,1]范围内。
Sigmoid函数求导:
f
′
(
x
)
=
e
−
x
(
1
+
e
−
x
)
2
=
1
1
+
e
−
x
(
1
−
1
1
+
e
−
x
)
=
f
(
x
)
(
1
−
f
(
x
)
)
f'(x)=\frac{e^{-x}}{(1+e^{-x})^2}=\frac{1}{1+e^{-x}}(1-\frac{1}{1+e^{-x}})=f(x)(1-f(x))
f′(x)=(1+e−x)2e−x=1+e−x1(1−1+e−x1)=f(x)(1−f(x))它们的函数图像如下:
从图像可以看出,Sigmoid在定义域内处处可导,且两侧导数逐渐趋于0,即
lim
x
→
∞
f
′
(
x
)
=
0
\lim_{x\rightarrow\infty}f'(x)=0
x→∞limf′(x)=0说明Sigmoid函数是一种软饱和函数(梯度渐近趋于零)。
缺点1: 当
x
x
x的值较大或较小时,函数的导数趋于0,会导致梯度消失的现象。
缺点2: 输出非零均值,会导致模型训练收敛速度变慢。
(2)tanh激活函数(正切三角函数)
f
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
=
2
∗
S
i
g
m
o
i
d
(
2
x
)
−
1
f(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}=2*Sigmoid(2x)-1
f(x)=ex+e−xex−e−x=2∗Sigmoid(2x)−1
tanh是Sigmoid函数的变体,它将实数映射到
[
−
1
,
1
]
[-1, 1]
[−1,1]范围内,因此输出为零均值,模型收敛速度会更快。
tanh以及导数图像如下:
![](https://i-blog.csdnimg.cn/blog_migrate/83ab32accf7ce6bd04defc7487b30078.png)
缺点: tanh也存在梯度消失问题。
(3)Relu(修正线性单元)
f
(
x
)
=
max
(
0
,
x
)
f(x)=\max(0, x)
f(x)=max(0,x)
特点: 导数简单,无指数或除法运算。
Relu导数:
f
(
x
)
=
{
0
x
<
0
1
x
≥
0
f(x)=\begin{cases} 0&x\lt0 \\1 &x\ge0 \end{cases}
f(x)={01x<0x≥0
函数图像:
优点1: 缓解梯度消失问题(
x
>
0
x\gt0
x>0)。
优点2: 计算速度快。
优点3: 收敛速度快。
优点4: Relu会使一部分神经元的输出为0,即网络变得稀疏,可以一定程度上缓解过拟合。
神经元死亡
随着训练的推进,部分输入会落入硬饱和区(负半轴),导致对应权重无法更新。这种现象称为神经元死亡。
权值更新过程:
w
=
w
−
α
∂
L
∂
w
w=w-\alpha\frac{\partial{L}}{\partial{w}}
w=w−α∂w∂L当
∂
L
∂
w
\frac{ \partial{L}}{\partial{w}}
∂w∂L很大时,更新权重后该神经元可能落入硬饱和区,此时该神经元的输出为0,梯度也为0,对应权值无法再更新,这个神经元就再也无法激活。
为了解决这个问题,提出了多个Relu的变体。
(4)Leaky Relu
f
(
x
)
=
max
(
σ
x
,
x
)
f(x)=\max(\sigma x, x)
f(x)=max(σx,x)其中,
σ
\sigma
σ是一个很小的正常数。这样既修正了数据分布,又保留了负轴的一些值,使得负轴信息不全部丢失。
Leaky Relu及其导数图像如下:
基于LeakyRelu,有Randomized Relu和Parameterized Relu两个变体,前者首先随机选择
σ
\sigma
σ的值,然后在测试过程中进行修正;后者将
σ
\sigma
σ作为神经元的参数进行训练;
(5)ELU(Exponential Linear Units)
f
(
x
)
=
{
x
x
<
0
α
(
e
x
−
1
)
x
≥
0
f(x)=\begin{cases} x&x\lt0 \\\alpha (e^x-1) &x\ge0 \end{cases}
f(x)={xα(ex−1)x<0x≥0
ELU及其导数图像如下:
ELU融合了Sigmoid和Relu的特点,左侧具有软饱和性,右侧无饱和性。
优点: 左侧软饱和使得ELU对输入变化或噪声更加鲁棒,右侧无饱和使得ELU能够有效缓解梯度消失问题。此外,ELU的零均值输出使得其收敛速度更快。
(6)MAXOUT
f
(
x
)
=
max
(
w
1
T
x
+
b
1
,
w
2
T
x
+
b
2
,
.
.
.
,
w
k
T
x
+
b
k
)
f(x)=\max(w_1^Tx+b1, w_2^Tx+b2, ... , w_k^Tx+bk)
f(x)=max(w1Tx+b1,w2Tx+b2,...,wkTx+bk)
MAXOUT相当于在中间增加了含k个神经元的“隐隐含层”,输出为k个神经元中输出的最大值,如下图所示:
优点1: MAXOUT的拟合能力非常强,可以拟合任意的凸函数。(当
w
2
=
0
,
b
2
=
0
,
.
.
.
,
w
k
=
0
,
b
k
=
0
w_2=0, b_2=0, ..., w_k=0, b_k=0
w2=0,b2=0,...,wk=0,bk=0时,退化为Relu。)
优点2: MAXOUT能够缓解梯度消失问题;由于不会陷入硬饱和区,可以规避神经元死亡的缺点;
缺点: 增加了参数数量和计算量。
如何选择激活函数
- 通常来说,很少会把各种激活函数串在一个网络中使用
- 如果使用Relu, 一定要小心设置学习率,预防出现过多的“神经元死亡”问题。
- 可以选择LeakyRelu、PRelu或者maxout解决神经元死亡问题。
- 最好不要使用Sigmoid、可以尝试使用tanh,但效果通常不会有Relu或maxout好。
2. 梯度下降法
2.1 损失函数(lose function)
损失函数用于评估算法的优劣,表现了经过模型后输出与实际输出的差距程度,损失函数越小表示模型的效果越好。
常用损失函数:均方误差、交叉熵
均
方
误
差
:
1
2
∑
i
=
1
n
(
y
i
−
y
^
i
)
2
交
叉
熵
:
−
∑
i
=
1
n
y
^
i
ln
y
i
均方误差:\frac{1}{2}\sum_{i=1}^{n}(y_i-\hat{y}_i)^2\space\space 交叉熵:-\sum_{i=1}^{n}\hat{y}_i\ln y_i
均方误差:21i=1∑n(yi−y^i)2 交叉熵:−i=1∑ny^ilnyi深度学习的学习过程就是寻找使得损失函数最小的网络参量:
θ
=
{
w
1
,
w
2
,
.
.
.
,
b
1
,
b
2
,
.
.
.
}
\theta = \{w_1, w_2, ..., b_1, b_2, ...\}
θ={w1,w2,...,b1,b2,...}
2.2 梯度下降
深度学习的学习过程实际上是一个最优化的问题,梯度下降法利用输出后的误差来估计输出层前一层的误差,再利用这个误差估计更前一层的误差,如此一层一层的反向传递下去,从而获得所有其他各层的误差估计。
推导过程:
模型简化为右图所示,其中:
- 与输入层有关的变量和参数:下标 i i i
- 与隐含层层有关的变量和参数:下标 h h h
- 与输出层有关的变量和参数:下标 j j j
- 输入到隐含层: a h = ∑ i = 1 d w i h x i + θ h , z h = f ( a h ) \displaystyle a_h=\sum_{i=1}^{d}w_{ih}x_i+\theta_h, z_h=f(a_h) ah=i=1∑dwihxi+θh,zh=f(ah)
- 隐含层到输出层: a j = ∑ i = 1 n H w h j z h + θ j , z j = f ( a j ) \displaystyle a_j=\sum_{i=1}^{n_H}w_{hj}z_h+\theta_j, z_j=f(a_j) aj=i=1∑nHwhjzh+θj,zj=f(aj)
- 损失函数:
L
=
1
2
∑
j
(
t
j
−
z
j
)
2
\displaystyle L=\frac{1}{2}\sum_j(t_j-z_j)^2
L=21j∑(tj−zj)2,
t
j
t_j
tj为期望输出
于是参数更新的过程如下:
其中,参数
η
\eta
η为学习率,它决定了函数到达(局部)最小值的迭代次数。
在每次迭代中,对每个变量,按照损失函数在该变量梯度的相反方向更新对应的参数值。
可以理解为,在目标函数的超平面上,沿着斜率下降的方向前进,直到遇到了超平面构成的“谷底”(梯度接近零)。
2.3 梯度下降法变体
梯度下降法主要有三种变体:批量梯度下降法、随机梯度下降法、小批量梯度下降法
1. 批量梯度下降法(BGD)
① 对于给定的迭代次数,基于在整个数据集上求出的损失函数对输入的参数向量
w
w
w计算梯度向量。
②参数更新:
Δ
w
∗
=
−
η
∑
k
=
1
a
l
l
∂
J
∂
w
∗
w
∗
t
+
1
=
w
∗
t
+
Δ
w
∗
\Delta w_* = -\eta\sum_{k=1}^{all}\frac{\partial J}{\partial w_*}\\w_*^{t+1} = w_*^t+\Delta w_*
Δw∗=−ηk=1∑all∂w∗∂Jw∗t+1=w∗t+Δw∗
**缺点1:**每次更新需要在整个数据集上求出所有的偏导数,因此批量梯度下降法的速度比较慢。
**缺点2:**不能以“在线”的形式更新模型,也就是不能在运行中试试加入新的样本进行运算。
2. 随机梯度下降法(SGD)
相比批量梯度下降法,SGD的每次更新,是对数据集中的一个样本(x, y)求出损失函数,然后对其求响应偏导数,进行参数更新:
Δ
w
∗
=
−
η
∂
J
∂
w
∗
w
∗
t
+
1
=
w
∗
t
+
Δ
w
∗
\Delta w_* = -\eta\frac{\partial J}{\partial w_*}\\w_*^{t+1} = w_*^t + \Delta w_*
Δw∗=−η∂w∗∂Jw∗t+1=w∗t+Δw∗
优点1: 对于批量梯度下降,在每次更新前,需要对所有样本求解梯度值,因此会对相似样本求算梯度值,在较大数据集上的计算会出现冗余。而随机梯度下降每次仅对一个样本求梯度,去除了这种冗余情况。
优点2: 随机梯度下降的运行速度快,且能够“在线”学习。
优点3: 随机梯度下降中会使得目标函数剧烈的波动,从而使得目标函数可能从一个局部极小值点跳入另一个更小的极小值点。。
缺点1: 随机梯度下降的持续波动使得训练的过程难以停止下来。
缺点2: 每次正反向传播只计算一个样本,串行条明显,硬件利用率不高。
3. 小批量梯度下降法(Mini-Batch Gradient Descent)
集合了SGD和BGD的有点,在每次更新中,对n个样本构成的一批数据,计算损失函数,并对相应的参数求导,然后进行参数更新:
Δ
w
∗
=
−
η
∑
k
=
1
n
∂
J
∂
w
∗
w
∗
t
+
1
=
w
∗
t
+
Δ
w
∗
\Delta w_* = -\eta\sum_{k = 1}^{n}\frac{\partial J}{\partial w_*}\\w_*^{t+1} = w_*^t + \Delta w_*
Δw∗=−ηk=1∑n∂w∗∂Jw∗t+1=w∗t+Δw∗
优点1: 相比SGD,降低了更新参数的方差,收敛过程更为稳定。
优点2: 相比BGD,不用对整个数据集求损失函数,可减少计算冗余,加快收敛速度。
小批量梯度下降法通常是训练神经网络的首选算法。
2.4 学习率
学习率 η \eta η是深度学习中一个重要的参量,如何调整学习率是训练出好模型的关键要素之一。
学习率过大
学习率过大,则梯度更新过快,容易出现超调现象:在极值点两端不断发散,或是剧烈震荡。此时,随着迭代次数增大,损失函数没有减小的趋势。
学习率过小
学习率过小,则梯度更新太慢,会导致无法快速地找到好的下降的方向。此时,随着迭代次数增大,损失函数几乎不变。
学习率设置规则
- 小梯度,设置大的学习率,加快梯度更新。
- 大梯度,设置小的学习率,减缓剧烈震荡。
学习率调整方法
1. 基于经验的手动调整
\space\space\space\space
通过尝试不同的固定学习率,如0.1, 0.01, 0.001等,观察迭代次数和损失函数的变化关系,找到损失函数下降最快对应的学习率。
2. 基于策略的调整
(1)
η
=
1
1
+
d
e
c
a
y
r
a
t
e
∗
e
p
o
c
h
n
u
m
η
0
\eta = \frac{1}{1+decayrate*epochnum}\eta_0
η=1+decayrate∗epochnum1η0其中,
e
p
o
c
h
n
u
m
epochnum
epochnum表示遍历数据集的次数,
d
a
c
a
y
r
a
t
e
dacayrate
dacayrate为衰减率。随着迭代次数的增多,学习率会逐渐下降。
(2)指数衰减(exponentially decay)
η
=
0.9
5
e
p
o
c
h
n
u
m
η
0
\displaystyle \eta = 0.95^{epochnum}\eta_0
η=0.95epochnumη0
(3)其他
η
=
k
e
p
o
c
h
n
u
m
η
0
\eta = \frac{k}{\sqrt{epochnum}}\eta_0
η=epochnumkη0
2.5 梯度下降会遇到的问题
在进行梯度下降的过程中,会面临三种情况:
1. 平原问题: 在平原中,梯度变化非常的缓慢。
2. 鞍点: 梯度下降可能会停在鞍点位置。
3. 局部极值点: 梯度下降可能会停在局部极值点而非全局极值点。
下图展示了这三种情况:
上述三种情况的出现,使得选取不同初始点时,最终会收敛到不同的局部极值,得到不同的优化效果。
2.6 梯度下降优化算法
主要内容:Momenbum法(动量法)、Adagrad法(自适应梯度)、Nesterov加速梯度法(NAG)、Adadelta法、RMSprop法、适应性动量估计法(Adam)
1. Momentum法(动量法)
动量法在利用梯度时,不仅仅利用当前次迭代所计算出的梯度值,还使用之前一段时间的梯度值。
v
t
=
γ
v
t
−
1
+
η
∇
J
θ
t
=
θ
t
−
1
−
v
t
v_t = \gamma v_{t-1} + \eta\nabla J\\\theta^t = \theta^{t-1} - v_t
vt=γvt−1+η∇Jθt=θt−1−vt其中,
v
t
−
1
v_{t-1}
vt−1表示之前所有步骤所累积的动量和。
γ
\gamma
γ为动量因子,通常取0.9,使得早期梯度对当前梯度的影响越来越小。
γ
v
t
−
1
\gamma v_{t-1}
γvt−1为动量项,当前后梯度方向一致时,能够加速学习,前后方向不一致时,能够抑制震荡。
动量法就是一种犹如小球自动滚动下山的方法,它使得损失函数能够根据惯性越过平原、鞍点或局部极值点的位置。而动量因子的作用就类似于摩擦力的作用,使得结果不至于发散。
下图是使用动量法之后的情况:
下降初期: 梯度方向相同,加快下降速度。
平原阶段: 当前梯度为零,但累积的动量会使其顺利越过平原。
鞍点位置: 同样的,累积的动量会使得其越过鞍点位置。
局部极值点位置: 同样的,如果累积的动量足够大,可以使得其越过局部极值点位置。
全局极值点位置: 如果没有动量项,在学习率较大的情况下会使得损失函数在极值点位置来回“震荡”,而动量项可以减少“震荡”的幅度,从而加速收敛到全局极值点。
2. Nestetorv 加速梯度法(NAG)
加速梯度法是动量法的改进,是一种更加“聪明”的滚动下山的方式。动量法每一步需要将历史梯度和当前梯度进行合并,然后再进行梯度下降;而加速梯度法先按照历史梯度往前走一小步,然后与该位置的“超前”梯度进行合并,因此可以在这个超前的位置看到梯度,从而修正这一步的梯度。
v
t
=
γ
v
t
−
1
+
η
∇
J
(
θ
t
−
γ
v
t
−
1
)
θ
t
=
θ
t
−
1
−
v
t
v_t = \gamma v_{t-1} + \eta\nabla J(\theta_t - \gamma v_{t-1})\\\theta_t = \theta_{t-1}-v_t
vt=γvt−1+η∇J(θt−γvt−1)θt=θt−1−vt
其中,
∇
J
(
θ
t
−
γ
v
t
−
1
)
\nabla J(\theta_t - \gamma v_{t-1})
∇J(θt−γvt−1)作用是“预测”下次参数位置近似值,也就是告诉我们参数大致会变为多少,这种预更新方法能防止大幅震荡,且不会错过最小值,并对参数更新更加敏感。
这种基于预测的更新方法,可避免过快地前进,提高了算法响应能力。
3. Adagrad法(自适应梯度)
AdaGrad算法利用之前计算的梯度来自动变更学习率
e
t
a
eta
eta, 学习率的修正方式如下:
θ
t
=
θ
t
−
1
−
η
∑
r
=
1
t
−
1
(
∇
J
)
r
+
ϵ
(
∇
J
)
t
\theta_{t} = \theta_{t-1} - \frac{\eta}{\sqrt{\sum_{r=1}^{t-1}(\nabla J)_r+\epsilon}}(\nabla J)_t
θt=θt−1−∑r=1t−1(∇J)r+ϵη(∇J)t
其中,
ϵ
\epsilon
ϵ是一个平滑项,用于避免分母为0, 它的数量级通常在
1
0
−
7
10^{-7}
10−7。
优点
①每次迭代不需要手工调整学习率,能够实现学习率自动更新。
②大梯度对应小的学习率,小梯度对应大的学习率,从而加快收敛。
缺点
①学习率单调递减,训练后期学习率非常小,这使得网络更新能力越来越弱,最终梯度趋于零,使得训练提前结束。
②更新时,左右两边单位不一致。
③仍依赖于人工设置一个全局学习率
η
\eta
η。
4. Adadelta法
Adadelta法是Adagrad法的一个延伸,它旨在于解决Adagrad的是三个问题。
①第一个问题:仅利用Adagrad分母中累计项离当前时间点比较近的项。
Adagrad会累加之前所有的梯度平方,而Adadelta只累加固定大小的项(累积窗口限制到固定的尺寸w,即只取最近的w个状态。)
②第二、三个问题:改进为
θ
t
=
θ
t
−
1
−
R
M
S
[
Δ
θ
]
t
−
1
R
M
S
[
g
]
t
g
t
\theta_t = \theta_{t-1} -\frac{RMS[\Delta\theta]_{t-1}}{RMS[g]_t}g_t
θt=θt−1−RMS[g]tRMS[Δθ]t−1gt其中,
g
t
=
(
∇
J
)
t
R
M
S
[
Δ
θ
]
t
=
E
[
Δ
θ
2
]
t
+
ϵ
,
E
[
Δ
θ
2
]
t
=
γ
E
[
Δ
θ
2
]
t
−
1
+
(
1
−
γ
)
Δ
θ
t
2
,
R
M
S
[
g
]
t
=
E
[
g
2
]
t
+
ϵ
,
E
[
g
2
]
t
=
γ
E
[
g
2
]
t
−
1
+
(
1
−
γ
)
g
t
2
g_t = (\nabla J)_t\\RMS[\Delta\theta]_t = \sqrt{E[\Delta\theta^2]_t+\epsilon}, E[\Delta\theta^2]_t = \gamma E[\Delta\theta^2]_{t-1} + (1-\gamma)\Delta\theta_t^2,\\RMS[g]_t = \sqrt{E[g^2]_t+\epsilon}, E[g^2]_t = \gamma E[g^2]_{t-1} + (1-\gamma)g_t^2
gt=(∇J)tRMS[Δθ]t=E[Δθ2]t+ϵ,E[Δθ2]t=γE[Δθ2]t−1+(1−γ)Δθt2,RMS[g]t=E[g2]t+ϵ,E[g2]t=γE[g2]t−1+(1−γ)gt2
从上式可以看出,Adadelta法并不依赖于全局学习率。
5. RMSprop法(均方根传播)
RMSprop法和Adadelta法类似,也是Adagrad法的改进,相比于Adagrad历史梯度,RMSprop算法增加了一个衰减系数来控制历史信息的权重。
E
[
g
2
]
t
=
0.9
E
[
g
2
]
t
−
1
+
0.1
g
t
2
θ
t
+
1
=
θ
t
−
η
E
[
g
2
]
t
+
ϵ
g
t
E[g^2]_t = 0.9E[g^2]_{t-1} + 0.1g_t^2\\\theta_{t+1} = \theta_t-\frac{\eta}{\sqrt{E[g^2]_t+\epsilon}}g_t
E[g2]t=0.9E[g2]t−1+0.1gt2θt+1=θt−E[g2]t+ϵηgt
从本质上看,可认为RMSprop将不同方向梯度的方差考虑进来,对于波动大的(方差大),梯度给小一点,对于波动小的,梯度给大一点,这样整个下降路径就缓和很多,提高计算效率。
square表示在梯度那里使用了平方项,mean表示梯度的加权平均,root表示分母梯度平方再开方。
特点
① 仍然依赖于全局学习率
② 很好的解决了训练过程过早结束的问题
③ RMSprop适合处理非平稳目标(将不同方向梯度的方差考虑进来),对RNN效果很好。
6. Adam法(自适应动量估计法)
Adam算法结合了momentum和RMSprop,包含梯度平均和梯度方差的信息,将momentum和RMSprop的权重更新方法结合在一起。
Adam法本质上是带有动量项RMSprop,它利用梯度的一阶估计和二阶估计动态调整每个参数的学习率。
梯度的一阶矩:
m
t
=
β
1
m
t
−
1
+
(
1
−
β
1
)
g
t
m_t = \beta_1 m_{t-1} + (1-\beta_1)g_t
mt=β1mt−1+(1−β1)gt梯度的二阶矩:
v
t
=
β
2
v
t
−
1
+
(
1
−
β
2
)
g
t
2
v_t = \beta_2v_{t-1}+(1-\beta_2)g_t^2
vt=β2vt−1+(1−β2)gt2其中,
β
1
\beta_1
β1为momentum超参数,用来调试梯度平均方程;
β
2
\beta_2
β2为RMSprop超参数,用来调试计算梯度方差过程。
偏差校正:
m
^
t
=
m
t
1
−
β
1
t
v
^
t
=
v
t
1
−
β
2
t
\hat{m}_t = \frac{m_t}{1-\beta_1^t} \hat{v}_t = \frac{v_t}{1-\beta_2^t}
m^t=1−β1tmtv^t=1−β2tvt近似为对期望的无偏估计。
参数更新:
θ
t
+
1
=
θ
t
−
η
v
^
t
+
ϵ
m
^
t
\theta_{t+1} = \theta_t-\frac{\eta}{\sqrt{\hat{v}_t}+\epsilon}\hat{m}_t
θt+1=θt−v^t+ϵηm^t
各种优化方法对比
下图给出了不同梯度下降法损失平面等高线对比:
可以看到,Adagrad、Adadelta、RMSprop能够快速找到正确前进方向并以相似的速度很快收敛。而动量法和NAG法则找错了方向,让小球沿着梯度下降的方向前进,但NAG法能够往前看并对前面的情况作出相应,所有可以很快改正方向,向正确方向前进。
下图给出了不同梯度下降法在鞍点处的表现:
可以看到,SGD法、动量法、NAG法都很难打破“对称性”带来的壁垒,尽管最后两者设法逃脱了鞍点;Adagrad、Adadelta、RMSprop能够快速的沿着负斜率的方向前进。
优化器选择
① SGD通常训练时间长,且容易陷入鞍点,但在好的初始化和学习率调整策略的情况下可以得到更可靠的结果。
② 在网络较为复杂,且对收敛速度有要求的情况下,通常使用学习率自适应的优化方法(Adagrad法、Adadleta法、RMSprop法以及Adam法等)。
③ Adadelta, RMSprop, Adam是比较相近的算法,在一般情况下表现差不多。
3. 过拟合问题
出现过拟合的原因
① 过拟合一个可能的原因是模型特征维度过高,模型假设过于复杂,参数过多。
② 数据中的噪声过多,如果完全拟合的话,与真实情景差异更大。
③ 数据量有限,使得模型无法真正了解整个数据的真实分布。
④ 权值学习迭代次数足够多的,拟合了训练数据中的噪声和训练样例中没有代表性的特征。
过拟合使得模型过度的拟合了训练数据,而没有考虑到泛化能力。
防止过拟合的方法
(1)Early stoppping (早停法)
\space\space\space\space
早停法是一种用来避免模型在训练数据上过拟合的正则化方法:一旦训练过程中出现性能开始下降,可以停止训练与学习。
(2)Weight Decay (权值衰减法)
\space\space\space\space
权值衰减法是从我们大脑工作借鉴来的方法,我们的大脑会将一些无用的连接进行清除。
在机器学习中,引入L2范数正则化来衰减权重,在一定程度上减少模型过拟合的问题,因此权重衰减也叫L2正则化。
L2正则化的原理如下,在损失函数上增加L2范数惩罚项:
L
=
L
0
+
λ
2
n
∑
w
2
L=L_0+\frac{\lambda}{2n}\sum w^2
L=L0+2nλ∑w2
对加入L2正则化的损失函数求导:
∂
L
∂
w
=
∂
L
0
∂
w
+
λ
n
w
\frac{\partial L}{\partial w}=\frac{\partial L_0}{\partial w}+\frac{\lambda}{n}w
∂w∂L=∂w∂L0+nλw
权值更新过程:
w
=
w
−
η
(
∂
L
0
∂
w
+
λ
n
w
)
=
(
1
−
η
λ
n
)
w
−
η
∂
L
0
∂
w
w=w-\eta (\frac{\partial L_0}{\partial w}+\frac{\lambda}{n}w)=(1-\frac{\eta\lambda}{n})w-\eta\frac{\partial L_0}{\partial w}
w=w−η(∂w∂L0+nλw)=(1−nηλ)w−η∂w∂L0其中,
λ
\lambda
λ为正则项系数,也叫权重衰减系数;
w
w
w的系数
1
−
η
λ
n
<
0
\displaystyle1-\frac{\eta\lambda}{n}\lt 0
1−nηλ<0,即对权重进行了衰减。
(3)Dropout
2012年,Hinton在其论文《improving neural networks by preventing co-adaptation of feature detectors》提出Dropout,并在同年应用于Alexnet网络。
Dropout的基本思想在于减少部分神经元之间的联合适应性,从而提高神经网络的性能。因为神经元之间的协同作用(某些神经元必须依赖其他神经元才能发挥作用)造成了过拟合现象。大致做法为:在训练的时候,将部分神经元失活(在前向传播的时候,让某个神经元的激活值以一定的概率p停止工作,输出为零),阻断部分神经元之间的协同作用。
如上图所示,失活一定的神经元之后,网络的结构发生了变化,从而减少了冗余连接,防止过拟合。
Dropout的工作流程如下:
① 前向传播
通常的前向传播计算公式:
z
i
l
+
1
=
w
i
l
+
1
y
l
+
b
i
l
+
1
y
i
l
+
1
=
f
(
z
i
(
l
+
1
)
z_i^{l+1} = \boldsymbol w_i^{l+1}\boldsymbol y^l + b_i^{l+1}\\y_i^{l+1} = f(z_i^{(l+1)}
zil+1=wil+1yl+bil+1yil+1=f(zi(l+1)采用Dropout后:
r
j
(
l
)
∼
B
e
r
n
o
u
l
l
i
(
p
)
y
~
(
l
)
=
r
(
l
)
∗
y
(
l
)
r_j^(l)\sim Bernoulli(p)\\\tilde{y}^{(l)} = \boldsymbol r^{(l)} * \boldsymbol y^{(l)}
rj(l)∼Bernoulli(p)y~(l)=r(l)∗y(l)
参考文献
[1] https://wc.yooooo.us/d2lraS8lRTYlQjclQjElRTUlQkElQTYlRTUlQUQlQTYlRTQlQjklQTAhemg=
[2] https://en.wikipedia.org/wiki/Activation_function