Adaptive Learning rate
损失越来越小,直到稳定,意味着梯度也会很小,但是有时并没有,梯度保持在一个范围震荡。
可能就是在一个Sharp minima旁边(山谷),学习率相对太大,不能正常更新进入Local minima了,而梯度却无法下降,就是Loss却保持稳定了。
如果一个Error Surface中,横轴梯度很小,纵轴梯度很大:
- 学习率很大:就会一直在纵轴方向震荡,而横轴方向几乎不动,很难到临界点。
- 学习率很小:就会步长很短,难以靠近Local minima
所以,不同的地方需要不同的学习率
AdaGrad(Adaptive Gradient)
AdaGrad能够根据梯度大小调整学习率:
- 梯度大 ⟹ \implies ⟹ 学习率减小
- 梯度小 ⟹ \implies ⟹ 学习率增大
RMS(Root Mean Square)
梯度下降更新某个参数
θ
i
\theta_i
θi 的过程为:
θ
i
t
+
1
←
θ
i
t
−
η
g
i
t
(3.14)
\theta_i^{t+1} \leftarrow \theta_i^t - \eta g_i^t \tag{3.14}
θit+1←θit−ηgit(3.14)
θ i t \theta_i^t θit 在第 t t t 个迭代的值域中在第 t t t 个迭代参数 i i i 算出来的梯度
g i t = ∂ L ∂ θ i ∣ θ = θ t (3.15) g_i^t = \frac{\partial L}{\partial \theta_i} \Bigg|_{\theta = \theta^t} \tag{3.15} git=∂θi∂L θ=θt(3.15)
g i t g_i^t git 代表在第 t t t 迭代时,参数 θ i \theta_i θi 对损失 L L L 的偏导,学习率 η \eta η 是固定的。
现在要有一个随着参数决定动态化的学习率,即把原来学习率 η \eta η 改成 η σ i t \frac{\eta}{\sigma_i^t} σitη。
θ i t + 1 ← θ i t − η σ i t g i t (3.16) \theta_i^{t+1} \leftarrow \theta_i^t - \frac{\eta}{\sigma_i^t} g_i^t \tag{3.16} θit+1←θit−σitηgit(3.16)
σ i t \sigma_i^t σit 的上标 t t t,这代表参数 σ i \sigma_i σi 与 i i i 相关,不同的参数 θ i \theta_i θi 的不同。 σ i t \sigma_i^t σit 的下标 t t t,这代表参数 σ i \sigma_i σi 与迭代 t t t 相关,不同的迭代也会有不同的 σ i t \sigma_i^t σit。学习率从 η \eta η 改成 η σ i t \frac{\eta}{\sigma_i^t} σitη 的时候,学习率就变得参数相关(parameter dependent)。
参数相关的一个常见的类型是算梯度的均方根(root mean square,RMS)。参数的更新过程为:
θ i t + 1 ← θ i t − η σ i t g i t (3.17) \theta_i^{t+1} \leftarrow \theta_i^t - \frac{\eta}{\sigma_i^t} g_i^t \tag{3.17} θit+1←θit−σitηgit(3.17)
其中 θ i 0 \theta_i^0 θi0 是初始化参数。而 σ i 0 \sigma_i^0 σi0 的计算过程为:
σ i 0 = ( g i 0 ) 2 = ∣ g i 0 ∣ (3.18) \sigma_i^0 = \sqrt{(g_i^0)^2} = |g_i^0| \tag{3.18} σi0=(gi0)2=∣gi0∣(3.18)
其中 g i 0 g_i^0 gi0 是梯度。将 σ i 0 \sigma_i^0 σi0 的值代入更新的公式可以知道, g i 0 g_i^0 gi0 的值是 + 1 +1 +1 或 − 1 -1 −1。第一次在更新参数,从 θ i 0 \theta_i^0 θi0 更新到 θ i 1 \theta_i^1 θi1 的时候,要么是加上 η \eta η,要么是减掉 η \eta η,跟梯度的大小无关,这个是第一步的情况。
第二次更新参数过程为:
θ i t + 1 ← θ i t − η σ i 1 g i t (3.19) \theta_i^{t+1} \leftarrow \theta_i^t - \frac{\eta}{\sigma_i^1} g_i^t \tag{3.19} θit+1←θit−σi1ηgit(3.19)
其中 σ i 1 \sigma_i^1 σi1 是过去所有计算出来的梯度的平方的平均再开根号,即均方根,如式(3.20)所示:
σ i 1 = 1 2 ( ( g i 0 ) 2 + ( g i 1 ) 2 ) (3.20) \sigma_i^1 = \sqrt{\frac{1}{2} \left( (g_i^0)^2 + (g_i^1)^2 \right)} \tag{3.20} σi1=21((gi0)2+(gi1)2)(3.20)
同样的操作反复继续下去,如式(3.21)所示。
θ i 3 ← θ i 2 − η σ i 2 g i 2 σ i 2 = 1 3 ( ( g i 0 ) 2 + ( g i 1 ) 2 + ( g i 2 ) 2 ) (3.21) \theta_i^3 \leftarrow \theta_i^2 - \frac{\eta}{\sigma_i^2} g_i^2 \quad \sigma_i^2 = \sqrt{\frac{1}{3} \left( (g_i^0)^2 + (g_i^1)^2 + (g_i^2)^2 \right)} \tag{3.21} θi3←θi2−σi2ηgi2σi2=31((gi0)2+(gi1)2+(gi2)2)(3.21)
第 t + 1 t + 1 t+1 次更新参数的时候,即
θ i t + 1 ← θ i t − η σ i t g i t σ i t = 1 t + 1 ∑ i = 0 t ( g i t ) 2 (3.22) \theta_i^{t+1} \leftarrow \theta_i^t - \frac{\eta}{\sigma_i^t} g_i^t \quad \sigma_i^t = \sqrt{\frac{1}{t+1} \sum_{i=0}^t (g_i^t)^2} \tag{3.22} θit+1←θit−σitηgitσit=t+11i=0∑t(git)2(3.22)
η σ i t \frac{\eta}{\sigma_i^t} σitη 当作是新的学习率来更新参数。
RMSProp(Root Mean Square Propagation)
与RMS大致相同,区别在于增加了一个超参数 α \alpha α,可以动态调整。
第二步更新过程为
θ
i
2
←
θ
i
1
−
η
σ
i
1
g
i
1
,
σ
i
1
=
α
(
σ
i
0
)
2
+
(
1
−
α
)
(
g
i
1
)
2
\theta_i^2 \leftarrow \theta_i^1 - \frac{\eta}{\sigma_i^1} g_i^1, \quad \sigma_i^1 = \sqrt{\alpha \left( \sigma_i^0 \right)^2 + \left(1 - \alpha\right) \left(g_i^1\right)^2}
θi2←θi1−σi1ηgi1,σi1=α(σi0)2+(1−α)(gi1)2
其中 0 < α < 1 0 < \alpha < 1 0<α<1,其是一个可以调整的超参数。计算 θ i 1 \theta_i^1 θi1 的方法跟 AdaGrad 算均方根不一样,在算均方根的时候,每一个梯度都有同等的重要性,但在 RMSprop 里面,可以自己调整现在的这个梯度的重要性。如果 α \alpha α 设得小趋近于 0 0 0,代表 g i 1 g_i^1 gi1 相较于之前算出来的梯度而言,比较重要;如果 α \alpha α 设得大趋近于 1 1 1,代表 g i 1 g_i^1 gi1 比较不重要,之前算出来的梯度比较重要。
同样的过程就反复继续下去,如下:
θ
i
+
1
←
θ
i
−
η
σ
i
t
g
i
t
,
σ
i
t
=
α
(
σ
i
t
−
1
)
2
+
(
1
−
α
)
(
g
i
t
)
2
\theta_{i+1} \leftarrow \theta_i - \frac{\eta}{\sigma_i^t} g_i^t, \quad \sigma_i^t = \sqrt{\alpha \left( \sigma_i^{t-1} \right)^2 + \left(1 - \alpha\right) \left(g_i^t\right)^2}
θi+1←θi−σitηgit,σit=α(σit−1)2+(1−α)(git)2
RMSProp 通过 α \alpha α 可以决定, g i t g_i^t git 相较于之前存在于 σ i t − 1 \sigma_i^{t-1} σit−1 里面的 g i 1 , g i 2 , … , g i t − 1 g_i^1, g_i^2, \ldots, g_i^{t-1} gi1,gi2,…,git−1 的重要性有多大。如果使用 RMSprop,就可以动态调整 σ i t \sigma_i^t σit 这一项。图 3.26 中黑线是误差表面,球就从 A 走到 B,AB 段的路很平坦, g g g 很小,更新参数的时候,我们会走比较大的步伐。走动 BC 段后梯度变大了,AdaGrad 反应比较慢,而 RMSprop 会把 α \alpha α 设小一点,让新的、刚看到的梯度的影响比较大, 很快地让 σ i t \sigma_i^t σit 的值变大,很快地让步伐变小,RMSprop 可以很快地“踩刹车”。如果走到 CD 段,CD 段是平坦的地方,可以调整 α \alpha α,让其比较看重最近算出来的梯度,梯度一变小, σ i t \sigma_i^t σit 的值就变小了,走的步伐就变大了。
Adam(Adaptive moment estimation)
结合RMSProp和Momentum
Learning rate scheduling
加上AdaGrad之后训练依然存在问题,一开始很顺利,但是到横轴方向却发生了“爆炸”。
原因在于
σ
t
i
\sigma^i_t
σti 是拿过去的梯度取平均。AB段梯度很大,但是BC段纵轴梯度很小,导致累计的
σ
t
i
\sigma^i_t
σti 很小,
η
σ
t
i
\frac{\eta}{\sigma^i_t}
σtiη 很大,步伐就会很大,又到了纵轴梯度大的地方,
σ
t
i
\sigma^i_t
σti 又变大,步伐也会慢慢变小。
所以需要学习率调度 (Learning rate scheduling)
Learning rate decay
学习率衰减 (Learning rate decay) ,也叫学习率退火 (Learning rate annealing) 随着梯度不断更新,让 η \eta η 越来越小,正好适用于上图的问题
分类
回归与分类
回归是输入一个向量 x x x,输出 y ^ \hat{y} y^,我们希望 y ^ \hat{y} y^ 跟某一个标签 y y y 越接近越好, y y y 是要学习的目标。而分类可当作回归来看,输入 x x x 后,输出仍然是一个标量 y ^ \hat{y} y^,要让它跟正确答案的那个类越接近越好。
带softmax的分类
根据上述的设定,分类实际过程是:输入 x x x,乘上 W W W,加上 b b b,通过激活函数 σ \sigma σ,乘上 W ′ W' W′,再加上 b ′ b' b′ 得到向量 y ^ \hat{y} y^。但实际上做分类的时候,往往会把 y ^ \hat{y} y^ 通过 softmax 函数得到 y ′ y' y′,才去计算 y ′ y' y′ 与 y y y 之间的距离。
但是,数字可能存在问题,如果用数字表示类别(如类1表示为1,类2表示为2,类3表示为3),模型可能会错误地认为这些数字之间有顺序关系。这在类别之间没有顺序关系的情况下是不合适的。例如,在预测学生的年级时(1年级、2年级、3年级),使用数字表示可能会让模型误以为2年级比1年级“更接近”,而与3年级“更远”,这与实际情况不符。
所以,引入独热向量表示类别,每个类都独立,没有顺序关系,类两两之间距离也是一样。
[!note]
Q: 为什么分类过程中要加上 softmax 函数?
A: 一个比较简单的解释是, y y y 是独热向量,所以其里面的值只有 0 跟 1,但是 y ^ \hat{y} y^ 里面有任何值。既然目标 y y y 只有 0 跟 1,但 y ^ \hat{y} y^ 有任何值,可以先把它归一化到 0 到 1 之间,这样才能跟标签的计算相似度。
softmax计算公式:
y
^
i
=
exp
(
y
i
)
∑
i
exp
(
y
i
)
\hat{y}_i = \frac{\exp(y_i)}{\sum_i \exp(y_i)}
y^i=∑iexp(yi)exp(yi)
这样可以进行归一化,并让较大和较小值之间差距更大。
[!note]
如果又三个类需要套softmax,如果只有两个,直接取sigmoid即可
分类损失
当我们把 x x x 输入到一个网络里面产生 y ^ \hat{y} y^ 后,通过 softmax 得到 y ′ y' y′,再去计算 y ′ y' y′ 跟 y y y 之间的距离 e e e.
计算距离 e e e 有多种做法:
-
Mean Squared Error, MSE 均方误差
e = ∑ i ( y i − y i ′ ) 2 e = \sum_{i} (y_i - y'_i)^2 e=i∑(yi−yi′)2 -
cross-entropy, 交叉熵,当 y y y 和 y ′ y' y′ 相同时,可以最小化交叉熵的值,此时均方误差也是最小的。最小化交叉熵其实就是最大化似然估计 (maximize likelihood)
e = − ∑ i y i ln y i ′ e = - \sum_{i} y_i \ln y'_i e=−i∑yilnyi′
交叉熵更优,更常用