梯度下降
具体的梯度下降的理论和公式推导,部分博客已经解释的很详尽了,本文更多的在于梯度下降的拓展问题。
为什么使用梯度下降?
现有结果表明,在处理复杂任务上,深度网络比浅层的网络有更好的效果。但是,目前优化神经网络的方法都是基于反向传播的思想,即根据损失函数计算的误差通过梯度反向传播的方式,指导深度网络权值的更新优化。这样做的原因在于:
深层网络由许多非线性层堆叠而来,每一层非线性层都可以视为一个非线性函数,因此整个深度网络可以看成是一个复合的非线性多元函数。
F
(
x
)
=
f
n
(
.
.
.
f
3
(
f
2
(
f
1
(
x
)
∗
θ
1
+
b
)
∗
θ
2
+
b
)
.
.
.
)
F(x) = f_n (...f_3 (f_2 (f_1 (x) * \theta_1 + b) * \theta_2 + b)...)
F(x)=fn(...f3(f2(f1(x)∗θ1+b)∗θ2+b)...)
我们最终的目的是希望整个多元函数可以很好的完成输入到输出之间的映射。假设不同的输入,输出的最优解是
g
(
x
)
g(x)
g(x),那么,优化深度网络就是为了寻找到合适的权值,满足
L
o
s
s
=
L
(
g
(
x
)
,
F
(
c
)
)
Loss = L(g(x), F(c))
Loss=L(g(x),F(c))取得极小值点,比如最简单的损失函数
L
o
s
s
=
∣
∣
g
(
x
)
−
f
(
x
)
∣
∣
2
2
Loss = ||g(x) - f(x)||_2^2
Loss=∣∣g(x)−f(x)∣∣22
梯度消失和梯度爆炸
1. 定义
深度神经网络训练的时候,采用的是反向传播方式,该方式使用链式求导,计算每层梯度的时候回涉及连乘操作,因此如果网络过深:
(1) 如果连乘的因子大部分小于1,连乘之后会趋近于0,后面的网络层的参数不发生变化,即梯度消失。
(2) 如果连乘的因子大部分大于1,连乘之后会趋近于无穷,即梯度爆炸。
2. 如何防止梯度消失?
sigmoid:
f
(
x
)
=
1
1
+
e
x
p
(
−
z
)
f(x) = \frac{1}{1 + exp(-z)}
f(x)=1+exp(−z)1
ReLU:
f
(
x
)
=
m
a
x
(
0
,
x
)
f(x) = max(0, x)
f(x)=max(0,x)
sigmoid容易发生梯度消失,可以将激活函数替换为ReLU。
3. 如何确定是否出现梯度爆炸?
(1) 模型无法从训练数据中获得更新(如低损失)。
(2) 模型不稳定,导致更新过程中的损失出现显著变化。
(3) 训练过程中,模型损失变成NaN
3. 如何防止梯度爆炸?
(1) 预训练+微调
Hinton在2006年发表论文,提出无监督逐层训练方法。基本思想是每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,次过程称为“预训练”(pre-training);预训练完成后,再对整个网络进行“微调”(fine-tunning)。Hinton在训练深度信念网络(Deep Belief Networks中,使用了这个方法,在各层预训练完成后,再利用BP算法对整个网络进行训练。此思想相当于是先寻找局部最优,然后整合起来寻找全局最优,此方法有一定的好处,但是目前应用的不是很多了。
(2) 设置梯度剪切阈值
梯度剪切这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,直接将梯度置为该值。
(3) 使用relu,leakrelu, elu等代替sigmoid激活函数
relu的表达式具体见上。如果激活函数的导数为1,则不存在梯度爆炸的问题,例如relu函数替代sigmoid和tanh。
(4) 设置batch normalization
Batchnorm全名是batch normalization,简称BN,即批规范化,通过规范化操作将输出信号x规范化保证网络的稳定性。
(5) 残差结构
详见参考1
(6) LSTM,长短期记忆网络(long-short term memory networks)
详见参考1和4
梯度检验
只用于调试中,不可用于训练过程。
参考