文章目录
局部极小值(Local Minima)与鞍点(Saddle Point)
Critical Point:梯度(gradient)为0的点
- local minima:局部极小值
如果卡在local minima,那可能就没有路可以走了。 - saddle point:鞍点
如果卡在saddle point,saddle point旁边还是有路可以走的。
判断
如何判断?
- 考察 θ \theta θ附近Loss的梯度→泰勒展开→海塞矩阵 H H H
- 第一项中, L ( θ ′ ) L(\theta') L(θ′),当 θ \theta θ跟 θ ′ \theta' θ′很近的时候, L L L很靠近。
- 第二项中, g g g代表梯度(一阶导数),可以弥补 L ( θ ′ ) L(\theta') L(θ′)与 L ( θ ) L(\theta) L(θ)之间的差距。 g i g_i gi表示 g g g的第 i i i个component,就是 θ θ θ的第 i i i个component对 L L L的微分。
- 第三项中, H H H表示海塞矩阵,是 L L L的二阶导数。
在Critical point附近时:第二项为0,根据第三项来判断→则只需考察H的特征值。
- 如果所有eigen value(特征值)都是正的,H是positive definite(正定矩阵),此时就是local minima
- 如果所有eigen value都是负的,H是negative definite,此时是local maxima
- 如果eigen value有正有负,那就代表是saddle point
例:
如果走到鞍点,可以利用H的特征向量确定参数的更新方向。
- 令特征值小于0,得到对应的特征向量 u u u,在 θ ′ \theta' θ′的位置加上 u u u,沿着 u u u的方向做update得到 θ \theta θ,就可以让loss变小。
- Local Minima比Saddle Point少
Loss在一个维度很高的空间中时,往往只会遇到鞍点而几乎不会遇到局部极小值点⇒从上图可以看出,正特征值的数目最多只占所有特征值的60%,这就说明剩余40%-50%的维度都仍然“有路可走”。
批次(Batch)与动量(Momentum)
Optimization with Batch
-
根据计算梯度的样本个数,可分为批量梯度下降(全部样本,batch size=N)、小批量梯度下降(分为batch个数的样本)、随机梯度下降(单个样本,batch size=1)。
-
所有的 batch 经过一遍,叫做一个epoch。
Small Batch v.s. Large Batch
- 左边蓄力时间长,但是精准有效
- 右边冷却时间短,但是比较noisy(其实noisy的gradient反而可以帮助 training)
如果考虑“并行计算”,large batch size的梯度下降并不一定时间比较长。
现象:
- batch size从1到1000,each update所需要的时间几乎是一样的。
- 增加到 10000,乃至增加到60000的时候,一个batch(一次update)所要耗费的时间,确实随着batch size的增加而逐渐增长。
原因:
- 有GPU可以做并行运算。
- GPU并行运算的能力还是有极限的,当batch size非常非常巨大的时候,GPU在跑完一个 batch计算出gradient所花费的时间,还是会随着batch size的增加而逐渐增长。
对总时间的影响
- for one update:small batch size更快
- for one epoch:large batch size更快(因为有GPU可以做并行运算)
small batch size的优势
small batch size优势1:在更新参数时会有noisy⇒有利于训练
- 不同的batch求得的Loss略有差异,有时候可以避免局部极小值“卡住”
small batch size优势2:可以避免Overfitting⇒有利于测试(Testing)
对于一个Flat Minima来说,在 Training和Testing上面的结果不会差太多;对于一个Sharp Minima来说,一差就可以天差地远。
large batch size每次顺着规定update,容易陷入Sharp Minima。
small batch size由于每次update的方向可能不太一样,比较容易跳出Sharp Minima。
Batch总结
- batch size是一个需要调整的参数,它会影响训练速度与优化效果。
Optimization with Momentum
Vanilla Gradient Descent(普通梯度下降)
- 只考虑梯度的方向,向反方向移动。
Gradient Descent+Momentum(考虑动量)
- 综合梯度+上一步的方向。
所谓的Momentum,update 的方向不是只考虑现在的gradient,而是考虑过去所有gradient的总和。
到达Critical Point时,“惯性”会推着小球继续运动。
自动调整学习速率(Learning Rate)
- 问题1:training stuck ≠ small gradient⇒Loss不再下降时,未必说明此时到达Critical Point,梯度可能还很大。
- 问题2:如果使用“固定的”学习率,即使是在“凸面体”的优化,都会让优化的过程非常困难⇒需要客制化“学习率” ⇒不同的参数需要不同的学习率。
- 较大的学习率:Loss在山谷的两端震荡而不会下降。
- 较小的学习率:梯度较小时几乎难以移动。
客制化“学习率”
根据参数此时的实际情况,调整
σ
i
t
\sigma^t_i
σit的大小,实现对参数
θ
i
\theta_i
θi的更新。
- 基本原则:
- 某一个方向上gradient的值很小,非常平坦⇒learning rate调大一点,
- 某一个方向上非常陡峭,坡度很大⇒learning rate可以设得小一点
- 求取 σ \sigma σ的方式:Root Mean Square(均方根)
Adagrad(自适应学习率梯度下降)
- 考虑之前所有的梯度大小⇒对本次及之前计算出的所有梯度求均方根,然后每个参数的学习率都除上该均方根。
普通梯度下降为:
g
t
=
∂
L
(
θ
t
)
∂
w
g^t =\frac{\partial L(\theta^t)}{\partial w}
gt=∂w∂L(θt)
η
t
=
η
t
t
+
1
\eta^t =\frac{\eta^t}{\sqrt{t+1}}
ηt=t+1ηt
w
t
+
1
←
w
t
−
η
t
g
t
w^{t+1} \leftarrow w^t -η^tg^t
wt+1←wt−ηtgt
- w w w 是一个参数
Adagrad可以做的更好:
w
t
+
1
←
w
t
−
η
t
σ
t
g
t
w^{t+1} \leftarrow w^t -\frac{η^t}{\sigma^t}g^t
wt+1←wt−σtηtgt
-
σ
t
\sigma^t
σt :对本次及之前所有梯度求得的均方根。对于每个参数都是不一样的。
- 矛盾:在 Adagrad 中,当梯度越大的时候,步伐应该越大,但下面分母又导致当梯度越大的时候,步伐会越小。
- 缺陷:不能“实时”考虑梯度的变化情况。
RMSProp
- 调整当前梯度与历史梯度的权重。
添加参数 α \alpha α:
- α设很小趋近于0,就代表这一步算出的 g i g_i gi相较于之前所算出来的gradient而言比较重要。
- α设很大趋近于1,就代表现在算出来的
g
i
g_i
gi比较不重要,之前算出来的gradient比较重要。
最常用的策略:Adam=RMSProp+Momentum
Learning Rate Scheduling⇒让Learning Rate与 “训练时间”有关
- Learning Rate Decay:随着时间不断进行,随着参数不断update, η η η越来越小
- 黑科技:Warm Up⇒让learning rate先变大后变小。
解释: σ \sigma σ指示某一个方向它到底有多陡/多平滑,这个统计的结果,要看足够多的数据以后才精准,所以一开始我们的统计是不精准的。一开始learning rate比较小,是让它探索收集一些有关error surface的情报,在这一阶段使用较小的learning rate,限制参数不会走得离初始的地方太远。等到 σ \sigma σ统计得比较精准以后再让learning rate慢慢爬升。
- 补充:RAdam
将Error Surface“铲平”⇒Batch Normalization(批次标准化)
- 不同的参数发生变化,引起Loss变化的程度不同。
- x 1 x_1 x1的值很小时,当参数 w 1 w_1 w1有一个很小的变化,对 y y y的影响很小,从而对Loss的影响也比较小。
- x 2 x_2 x2的值很大时,当参数 w 2 w_2 w2有一个同样大小的变化,对 y y y的影响则大得多,从而对Loss的影响也比较大。
标准化:类似于标准正态分布过程,将这组数据处理成均值为0,方差为1。。
x
i
r
~
=
x
i
r
−
m
i
σ
i
\tilde{x^r_i} = \frac{x^r_i-m_i}{\sigma_i}
xir~=σixir−mi
- 在深度学习中,每一层都需要一次Normalization。
x ~ \tilde{x} x~经过 W 1 W_1 W1矩阵后, a a a, z z z数值的各维度分布仍然有很大的差异,要train第二层的参数 W 2 W_2 W2也会有困难。所以需要对 a a a或者 z z z进行Normalization。
- 如果选择的是 Sigmoid,那可能比较推荐对 z z z做Feature Normalization,因为Sigmoid在0附近斜率比较大,所以如果你对 z z z做Feature Normalization,把所有的值都挪到0附近算gradient的时候,算出来的值会比较大。
- 通常而言,Normalization放在activation function之前或之后都是可以的。
Batch Normalization:实际上做Normalization时,只能考虑有限数量的数据⇒考虑一个Batch内的数据⇒近似整个数据集。
-
Batch Normalization适用于batch size比较大时。其中data可以认为足以表示整个数据集的分布,从而,将对整个数据集做Feature Normalization这件事情,改成只在一个batch中做Feature Normalization作为近似。
-
“还原”:引入向量 γ , β \gamma,\beta γ,β,将原本被标准化到 m = 0 , σ = 1 m=0,\sigma=1 m=0,σ=1的各维度数据恢复到某一分布。
-
做Normalization以后 z ~ \tilde{z} z~平均就一定是 0,可以视作是给network一些限制,也许这个限制会带来什么负面的影响,因而进行“还原”操作,让模型自己学习 γ \gamma γ, β \beta β。
-
训练时:初始将 γ \gamma γ设为全为1的向量, β \beta β设为全为0的向量。在一开始训练的时候,让每一个dimension的分布比较接近。训练够长的一段时间后,已经找到一个比较好的error surface,走到一个比较好的地方以后,再把 γ \gamma γ, β \beta β 慢慢加进去。
问题:Testing开始的时候没有足够的数据,无法得到
μ
\mu
μ,
σ
\sigma
σ,也就无法进行Normalization。
解决:在training的时候,每一个 batch 计算出来的
μ
\mu
μ和
σ
\sigma
σ 都拿出来算moving average,最后以training得到的
μ
ˉ
\bar{\mu}
μˉ,
σ
ˉ
\bar{\sigma}
σˉ代替testing中的
μ
\mu
μ,
σ
\sigma
σ去进行Normalization。
Loss of Classification
Classification as Regression
Regression就是输入一个向量,然后输出一个数值,我们希望输出的数值跟对应的label,也就是我们要学习的目标,越接近越好。
- 有一个可能,我们其实可以把Classification当作是Regression来看。
- 这个方法只适合定序数据,即数字可以表示个体在有序状态中所处的位置,比如此时的假设意味着class1跟class2比较像,跟class3比较不像。但不适合定类数据,即数字仅用于区分类别,没有序次关系。
Class as one-hot vector
- 在做分类问题的时候,比较常见的做法是把Class用one-hot vector来表示。
- 其中,任何两个分类的距离都相同。
产生多个数值
- 怎么产生多个数值呢?⇒把本来output一个数值的方法重复多次。
Classification with softmax
- 我们的目标只有0和1,而 y y y有任何值,我们就使用softmax先把它Normalize到0到1之间,这样才好跟label计算相似度。
经过计算后:
- 输出值变成0到1之间。
- 输出值的和为1。
- 原本大的值和小的值之间的差距更大。
如果只有两个class⇒既可以直接套用softmax这个function,但更常用的是sigmoid(这两件事情是等价的)。
Loss of Classifacation
- MSE,Cross-entropy都可以减小 y ^ \hat{y} y^和 y ′ y' y′之间的差距 e e e。
- Cross-entropy比MSE更加适用于分类问题。
- 在Pytorch中,softmax被内建在Cross-enrtopy损失函数中(捆绑使用)。
从优化角度出发进行讨论:
- 使用MSE时,左上角的位置虽然Loss很大,但梯度平坦(趋近于0),就无法用gradient descent顺利走到右下角,难以优化。
- 而Cross-entropy则更易收敛⇒改变Loss函数,可以影响训练的过程,改变optimization的难度。