Critical Point
定义:梯度(Gradient)为0的点。
Loss没有办法再下降,可能卡在了Critical Point:局部最小值(local minima)或鞍点(saddle point)。
局部最小值(local minima)
卡在局部最小,则没有路可以走了。
鞍点(saddle point)
卡在鞍点,则旁边还是有路可以走。
判断标准
考察
θ
\theta
θ附近损失函数的梯度
→
\rightarrow
→ 泰勒展开
→
\rightarrow
→ 海塞矩阵
H
H
H
概念
第一项中,当
θ
\theta
θ和
θ
′
\theta^{'}
θ′很接近的时候,
L
(
θ
′
)
L(\theta^{'})
L(θ′)和
L
(
θ
)
L(\theta)
L(θ)很接近。
第二项中,
g
g
g是一个向量,代表梯度(一阶导数),可以弥补
L
(
θ
′
)
L(\theta^{'})
L(θ′)和
L
(
θ
)
L(\theta)
L(θ)之间的差距;
g
g
g的第
i
i
i个component,就是
θ
\theta
θ的第
i
i
i个component对
L
L
L的微分。
第三项中,
H
H
H表示海塞矩阵,是
L
L
L的二次微分/二阶导。
在Critical Point附近时,需考察
H
H
H的特征值
第二项为0,需要根据第三项来判断,考察
H
H
H的特征值。
- 当所有的eigen value都是正的,
H
H
H是正定矩阵(positive definite),此时是局部最小值。
- 当所有eigen value都是负的,
H
H
H是negative definite,此时是局部最小值。
- 当eigen value有正有负,那就是鞍点。
实例1
方法一:倒搜所有参数,得到所有loss的值,画出的Error Surface。
方法二:直接计算出一个点是局部最小还是鞍点。
-
一阶导为0
→
\rightarrow
→ 确定critical point -
计算Hessian矩阵
- 观察
H
H
H的特征值正负
卡在鞍点时,
g
g
g为0,可以利用
H
H
H的特征向量确定参数更新方向
步骤:
- 找出负的特征值(eigen value)。
- 找出对应的特征向量(eigen vector)
u
u
u。
- 把特征向量
u
u
u加上
θ
′
\theta^{'}
θ′,即沿着
u
u
u的方向更新,就可以找到一个新的点
θ
\theta
θ,这个点的loss比原来还要低。
实例2
注意:该方法需要算Hessian矩阵,计算量大,实际操作中很少用到。
局部最小值(Local Minima)比鞍点(Saddle Point)少得多
Loss在一个高维空间中,往往只会遇到鞍点,几乎不会遇到局部最小值点
→
\rightarrow
→ 从上图中可见,正特征值的数目最多只占所有特征值的60%,说明剩余40%的维度都仍然“有路可走”,可以让loss下降。
批次(Batch)与动量(Momentun)
总结:Small Batch size and momentum can help escape critical points.
Review:Optimization with Batch (Task2 05)
- 在更新参数时,我们拿 大B项样本数据 ,计算Loss和Gradient。
- 所有的Batch看过一遍,叫做一个Epoch。
- Shuffle:每个Epoch开始前会重新分一次batch,每一个Epoch的batch都不一样。
Small Batch v.s. Large Batch
基本现象
时间性能
考虑并行计算(Parallel computing)时,Large Batch花费的时间不一定比较长。除非batch size过于庞大。
现象
- Batch Size从1到1000所需时间几乎一致。
- 增加到10000,乃至60000时,一个Batch所需时间随着Batch Size的增加而增长。
原因
- GPU可以做并行运算,所以1000个样本数据所需时间,并不是一个样本的1000倍。
- GPU平行运算能力有极限,当Batch Size真的非常巨大时,GPU跑完一个Batch计算出Gradient所需时间,还是会随Batch Size的增加而增长。
对总时间的影响
因为有平行运算的能力,所以当 Batch Size 小 的时候, 跑完一个Epoch花的时间比大的Batch Size还要多 ;反之, 大的Batch Size情况下,跑完一个Epoch花的时间反而少 。
那么Large Batch威力大,有了并行计算的加持后,运行时间又少,是不是百利无一害呢?
答案不然。我们看以下两张图,可以发现在Large Batch的情况下,预测精确度会随着Batch Size增大而降低。
- Smaller batch size has better performance.
- “Noisy” update is better for traning.
- What’s wrong with large batch size? Optimization issue.
结论
结论1: 使用较小的Batch Size,在更新参数时会有Noisy
→
\rightarrow
→ 有利于训练
? 使用Small Batch时,不同的Batch求得的Loss略有差异,当L1落入局部最小值卡住时,L2可以继续训练。
结论2:使用较小的Batch Size,可以避免Overfitting
→
\rightarrow
→ 有利于测试(Testing)
[On Large-Batch Training For Deep Learning,Generalization Gap And Sharp Minima] (https://arxiv.org/abs/1609.04836) 这篇 Paper 的实验结果
Training的时候都很好,Testing的时候,大的Batch对应的Testing结果差 ,代表 Overfitting 。
一种解释(尚待研究)
一个“峡谷里”的Local Minima是坏的极小值,而“平原上的”Local Minima是好的极小值。
把Training的Loss往右平移,对于一个在 平原上的minima 来说,它在Training和Testing上面的结果不会 差太多 ;对于在 峡谷里的minima 来说, 差别甚远 。
Large Batch会倾向于走入峡谷极小值,而Small Batch会倾向于走入平原极小值。
Large Batch顺着规定的方向更新参数,很有可能走入比较小的峡谷里。而Small Batch有多个Loss Function,每次更新方向不一样,如果峡谷很窄,可能会跳出这个峡谷最小值。
结论 3: BatchSize是一个需要调整的参数,它会影响训练速度与优化效果。
案例:综合考虑Large Batch的“高速”优势,和“较差”的优化结果。(鱼与熊掌)
动量(Momentum)
物理世界的动量,小球会有惯性越过critical point。
Vanilla Gradient Descent(一般的梯度下降):只考虑梯度的方向,向反方向移动。
Gradient Descent + Momentum
理解:Momentum是一种改进梯度下降方向的策略,防止落入局部最小值。
综合梯度方向+前一步的方向
不是只看gradient的方向,而是会结合之前移动的方向来调整参数,相当于考虑之前所有梯度的总和。
|