自适应学习率
我们为什么需要自适应学习率?
- 提高收敛速度:在训练初期使用较大的学习率,在收敛时使用较小的学习率,有助于加快收敛速度并提高稳定性。
- 解决震荡问题:书中有言,就算是一个凸的误差表面,梯度下降也很难训练。使用自适应学习率,可以让我们在陡峭和平坦区域调整学习率,减少参数更新的震荡行为。
- 处理稀疏数据:在稀疏数据很多的情况,自适应学习率方法特别是类似AdaGrad能够合理分配学习率,提高训练效果。
3.3 自适应学习率
自适应学习率方法根据梯度大小自动调整学习率,解决固定学习率的问题。
3.3.1 AdaGrad(Adaptive Gradient)
特点:能够根据梯度大小自动调整学习率梯度大时,学习率减小;梯度小时,学习率增大。
适用范围:稀疏数据(类比稀疏矩阵,矩阵中的元素与数据中的数据多数都是缺失值或者零)。
公式:
参数更新:(其中
t
t
t是迭代次数)
θ
i
t
+
1
←
θ
i
t
−
η
σ
i
t
g
i
t
\theta_{i}^{t+1} \leftarrow \theta_{i}^{t} - \frac{\eta}{\sigma_{i}^{t}} g_{i}^{t}
θit+1←θit−σitηgit
- 其中
σ
i
t
\sigma_{i}^{t}
σit是均方根,计算公式:
σ i t = 1 t + 1 ∑ j = 0 t ( g i j ) 2 \sigma_{i}^{t} = \sqrt{\frac{1}{t+1} \sum_{j=0}^{t} (g_{i}^{j})^2} σit=t+11j=0∑t(gij)2
3.3.2 RMSProp(Root Mean Squared propagation)
特点:通过人为调整每步计算中梯度的重要性 α \alpha α,解决 AdaGrad 的学习率过小问题。
公式:
参数更新:
θ
i
t
+
1
←
θ
i
t
−
η
σ
i
t
g
i
t
\theta_{i}^{t+1} \leftarrow \theta_{i}^{t} - \frac{\eta}{\sigma_{i}^{t}} g_{i}^{t}
θit+1←θit−σitηgit
均方根:
σ
i
t
=
α
σ
i
t
−
1
+
(
1
−
α
)
(
g
i
t
)
2
\sigma_{i}^{t} = \sqrt{\alpha \sigma_{i}^{t-1} + (1-\alpha)(g_{i}^{t})^2}
σit=ασit−1+(1−α)(git)2
3.3.3 Adam(Adaptive moment estimation)
特点:
1.结合 RMSProp 和动量法。
2.自适应调整学习率,使用动量更新方向。
书中有言,目前该算法已在框架如 PyTorch 中实现,编库者给的默认参数通常表现良好。
3.4 学习率调度
自适应学习率可能有梯度病态(突然剧烈的增加减少)的问题。
于是学习率调度(learning rate scheduling) 被提出。
最常见策略如下:
- 学习率衰减:
随着训练进程减少学习率。
优点:有助于稳定收敛,防止震荡。
可以使用指数衰减或分段恒定衰减,根据实验效果选择。
公式如下:
θ i t + 1 ← θ i t − η t σ i t g i t \theta_{i}^{t+1} \leftarrow \theta_{i}^{t} - \frac{\eta_t}{\sigma_{i}^{t}} g_{i}^{t} θit+1←θit−σitηtgit
随着参数不断更新, η \eta η会越来越小。 - 预热(Warm-up):
初期使用较小学习率,逐渐增大,然后再减小。
优点:帮助收集误差表面信息,提高初期稳定性。
特别是在使用复杂模型如 Transformer 时,预热非常有用。
个人猜想(尚未实践):
在模型训练初期,使用预热来防止学习率过大导致的梯度爆炸,一定程度(不知道什么程度)后,逐渐减小学习率,确保能够稳定收敛。
3.6 分类,回归
- 分类与回归是深度学习中常见的问题类型。
- 分类问题的目标是将输入映射到离散的类别标签。
3.6.1 分类与回归的关系
回归:输入向量
x
x
x,输出标量
y
^
\hat{y}
y^,目标是使
y
^
\hat{y}
y^接近真实标签
y
y
y。
分类:可以视作特殊的回归问题。用独热向量表示类别,避免类之间的距离误解。
3.6.2 带有 Softmax 的分类
Softmax 函数:
函数功能:将网络输出转换为概率分布,使输出和为 1。
公式:
y
i
′
=
exp
(
y
i
)
∑
j
exp
(
y
j
)
y'_i = \frac{\exp(y_i)}{\sum\limits_j \exp(y_j)}
yi′=j∑exp(yj)exp(yi)
将每个输出值取指数,然后归一化。
作用:
1.将任意实数转换为 (0, 1) 之间的值。
2.通过加权后归一化的办法,强调最大的那个类(
max
y
j
\max y_j
maxyj),使其概率更接近 1。
应用位置:在输出层使用Softmax,将输出变为概率向量。
个人感想:
对于二元分类,考虑使用Sigmoid代替Softmax。
注:
二元分类问题:对一个事实判断,是A还是B?此时可使用sigmoid来输出一个值代表物品属于A类的概率
P
A
P_A
PA(或是B的概率
P
B
P_B
PB)
多元分类问题:类别数大于二(至少是三)的分类,A、B、C……,多分类世界中,某个物品可能是A、可能是B,也可能是C……。此时,不能再简单地输出一个概率值来判断类别(因为类别一多,在截断误差后很可能出现概率相同的情况),而是需要通过得到每个类别的概率(这样可以体现概率的相对性,比如A相对B更多,B相对C更少),以此进行分类,
3.6.3 分类损失
损失函数的选择:
- 均方误差(MSE):
公式:
e = ∑ i ( y i − y i ′ ) 2 e = \sum_i (y_i - y'_i)^2 e=i∑(yi−yi′)2 - 交叉熵损失:
公式:
e = − ∑ i y i ln y i ′ e = -\sum_i y_i \ln y'_i e=−i∑yilnyi′
对比:
交叉熵在误差较大时提供明显的梯度,便于优化。
均方误差在误差大时容易陷入平坦区域,优化困难。
个人建议:
1.确保使用合适的激活函数与损失函数匹配。
2.如果遇到优化困难,检查损失函数的选择是否合适。