文章目录
- 🚩学习目标
- 🚩学习内容
- 🚩 Task1.1
- 🎯为什么优化会失败
- 📌因非信息梯度导致的失败
- 🎯局部极小值与鞍点
- 🎯临界点及其种类
- 🎯如何判断临界值种类
- 🎯H 怎么告诉我们怎么更新参数呢?
- 🎯如何逃离鞍点
- 🚩 Task1.2
- 🎯什么是批量和动量
- 📌批量大小对梯度下降法的影响
- 🎈批量梯度下降法(Batch Gradient Descent,BGD)
- 🎈随机梯度下降法(Stochastic Gradient Descent,SGD),也称为增量梯度下降法
- 🎈批量大小与计算时间的关系
- 🎯什么是动量法
- 📌对比一般的梯度下降法和动量法
- 🎈动量法的主要优点
- 🎈动量法也存在一些缺点。
- 🚩Task 2.1
- 🎯什么是自适应学习率
🚩学习目标
- Task 1.1 《深度学习详解》- 3.1 局部极小值与鞍点
- Task 1.2 《深度学习详解》- 3.2 批量和动量
- Task 2.1 《深度学习详解》- 3.3&4&5 自适应学习率
- Task 2.2 《深度学习详解》- 3.6 分类
- Task 2.3 (实践任务):HW3(CNN)
- Task 3.1 《深度学习详解》- 3.7 批量归一化
- Task 3.2 《深度学习详解》- 4.1&2&3&4 卷积神经网络-上
- Task 3.3 《深度学习详解》- 3.5&6&7&8 卷积神经网络-下
- (选修)《深度学习详解》- 6.1&2 自注意力机制的原理
- (选修实践任务):HW4(Attention)
- (选修)《深度学习详解》19-ChatGPT
🚩学习内容
欢迎去大家各大电商平台选购纸质版苹果书《深度学习详解》
基于上述书籍拓展
引用内容为书本原话 图片基本上来源于书中
我以自问自答的方式输出内容
🚩 Task1.1
🎯为什么优化会失败
收敛在局部极限值与鞍点会导致优化失败。
隐藏任务①:搜索资料,找到一个优化失败的案例,尝试用自己的话描述一遍情况~
深度学习并非万能,遇到这些问题会失败 | 机器之心
📌因非信息梯度导致的失败
原因:如果梯度中的信息很少,使用它来进行学习就无法成功。
例如,研究者从学习随机奇偶校验的简单问题开始,在大约d=30这个程度之后,经过合理时间后也没有观察到优于随机的表现。
研究者使用两个定理对此进行了详细的分析,得出了结论:基于梯度的方法确实不能学会随机奇偶校验和线性周期函数。 此外,不管我们使用哪一类预测算法,只要使用了基于梯度的方法来进行训练,这个结果都成立。
🎯局部极小值与鞍点
我们在做优化的时候经常会发现,随着参数不断更新,训练的损失不会再下降, 但是我们对这个损失仍然不满意。’
达到了临界点
🎯临界点及其种类
过去常见的一个猜想是我们优化到某个地方,这个地方参数对损失的微分为零,如图 3.1所示。图 3.1 中的两条曲线对应两个神经网络训练的过程。当参数对损失微分为零的时候,梯度下降就不能再更新参数了,训练就停下来了,损失不再下降了。
提到梯度为零的时候,大家最先想到的可能就是局部极小值(local minimum)
所以经常有人说,做深度学习时使用梯度下降会收敛在局部极小值,梯度下降不起作用。 但其实损失不是只在局部极小值的梯度是零,还有其他可能会让梯度是零的点,比如鞍点(saddle point) 。鞍点其实就是梯度是零且区别于局部极小值和局部极大值(localmaximum)的点。图 3.2b 红色的点在 y 轴方向是比较高的,在 x 轴方向是比较低的,这就是一个鞍点。鞍点的叫法是因为其形状像马鞍。 鞍点的梯度为零,但它不是局部极小值。 我们把梯度为零的点统称为临界点(critical point)。 损失没有办法再下降,也许是因为收敛在了临界点,但不一定收敛在局部极小值,因为鞍点也是梯度为零的点。
局部较小值点和鞍点都会使得梯度为零,所以梯度为零的点,临界点不一定是局部极小值。
🎯如何判断临界值种类
判断一个临界点到底是局部极小值还是鞍点需要知道损失函数的形状。
虽然无法完整知道整个损失函数的样子,但是如果给定某一组参数,比如 θ ′ θ^{'} θ′, θ ′ θ^{'} θ′ 附近的 L ( θ ) L(θ) L(θ) 可近似为
L ( θ ) ≈ L ( θ ′ ) + ( θ − θ ′ ) T ∗ g + 1 2 ( θ − θ ′ ) T ∗ H ( θ − θ ′ ) . ( 3.1 ) L(θ) ≈ L(θ^{'})+(θ − θ^{′})^T*g +\frac{1}{2}(θ − θ^{′})^T * H(θ − θ^{′}) . (3.1) L(θ)≈L(θ′)+(θ−θ′)T∗g+21(θ−θ′)T∗H(θ−θ′).(3.1)
式 (3.1) 是泰勒级数近似(Tayler series appoximation)。 其中,第一项
L
(
θ
)
L(θ)
L(θ)′ 告诉我们,当 θ 跟
θ
′
θ^{′}
θ′很近的时候,
L
(
θ
)
L(θ)
L(θ) 应该跟还蛮靠近的;第二项
(
θ
−
θ
′
)
T
∗
g
(θ − θ^{′})^T*g
(θ−θ′)T∗g中,g 代表梯度,它是一个向量,可以弥补
L
(
θ
′
)
L(θ^{′})
L(θ′)跟
L
(
θ
)
L(θ)
L(θ) 之间的差距。有时候梯度 g 会写成
∇
L
(
θ
′
)
∇L(θ^{′})
∇L(θ′)。
g
i
g_i
gi是向量 g 的第 i 个元素,就是 L 关于 θ 的第 i 个元素的微分,即
g
i
=
∂
L
(
θ
′
)
∂
θ
i
.
(
3.2
)
g_i =\frac{∂L(θ^{′})}{∂θ_i}.(3.2)
gi=∂θi∂L(θ′).(3.2)
光看 g 还是没有办法完整地描述 ,还要看式 (3.1) 的第三项 1 2 ( θ − θ ′ ) T ∗ H ( θ − θ ′ ) \frac{1}{2}(θ − θ^{′})^T * H(θ − θ^{′}) 21(θ−θ′)T∗H(θ−θ′)。第三项跟海森矩阵(Hessian matrix)H 有关 。
H 里面放的是 L 的二次微分,它第 i 行,第 j 列的值 H i j H_{ij} Hij 就是把 θ 的第 i 个元素对 L ( θ ′ ) L(θ^{′}) L(θ′)作微分,再把 θ 的第 j 个元素对 ∂ L ( θ ′ ) ∂ θ i \frac{∂L(θ^{′})}{∂θ_i} ∂θi∂L(θ′)作微分后的结果,即
H i j = ∂ 2 L ( θ ′ ) ∂ θ i ∂ θ j . ( 3.3 ) H_{ij} =\frac{∂^2L(θ^{′})}{∂θ_i∂θ_j}. (3.3) Hij=∂θi∂θj∂2L(θ′).(3.3)
在临界点,梯度 g 为零,因此 θ − θ′Tg 为零。所以在临界点的附近,损失函数可被近似为
L ( θ ) ≈ L ( θ ′ ) + 1 2 ( θ − θ ′ ) T ∗ H ( θ − θ ′ ) . ( 3.1 ) L(θ) ≈ L(θ^{'}) +\frac{1}{2}(θ − θ^{′})^T * H(θ − θ^{′}) . (3.1) L(θ)≈L(θ′)+21(θ−θ′)T∗H(θ−θ′).(3.1)
我们可以根据 1 2 ( θ − θ ′ ) T ∗ H ( θ − θ ′ ) \frac{1}{2}(θ − θ^{′})^T * H(θ − θ^{′}) 21(θ−θ′)T∗H(θ−θ′)来判断在 θ ′ θ^{′} θ′附近的误差表面(error surface) 到底长什么样子。
知道误差表面的“地貌”,我们就可以判断 L(θ′) 是局部极小值、局部极大值,还是鞍点。
上述我们通过一系列的转化把损失函数近似的写了出来,可以根据误差表面来判断临界点。
我们用向量 v 来表示 θ − θ ′ , ( θ − θ ′ ) T ∗ H ( θ − θ ′ ) θ − θ^{′} ,(θ − θ^{′})^T * H(θ − θ^{′}) θ−θ′,(θ−θ′)T∗H(θ−θ′)可改写为 v T H v v^TH_v vTHv,有如下三种情况。
- 如果对所有 v, v T H v > 0 v^TH_v> 0 vTHv>0 . 这意味着对任意 θ,L(θ) > L(θ′). 只要 θ 在 θ′ 附近,L(θ) 都大于 L(θ′). 这代表 L(θ′) 是附近的一个最低点,所以它是局部极小值。
- 如果对所有 v, v T H v < 0 v^TH_v< 0 vTHv<0 . 这意味着对任意 θ,L(θ) < L(θ′),θ′ 是附近最高的一个点,L(θ′) 是局部极大值。
- 如果对于 v, v T H v v^TH_v vTHv 有时候大于零,有时候小于零。 这意味着在 θ′ 附近,有时候L(θ) > L(θ′),有时候 L(θ) < L(θ′). 因此在 θ′ 附近,L(θ′) 既不是局部极大值,也不是局部极小值,而 是鞍点。
📌更简便的方法来判断 v T H v v^TH_v vTHv 的正负。
只要看 H的特征值。
- 若 H 的所有特征值都是正的,H 为正定矩阵,则 v T H v v^TH_v vTHv > 0,临界点是局部极小值。
- 若 H 的所有特征值都是负的,H 为负定矩阵,则 v T H v v^TH_v vTHv < 0,临界点是局部极大值。
- 若 H 的特征值有正有负,临界点是鞍点。
🎯H 怎么告诉我们怎么更新参数呢?
设 λ 为 H 的一个特征值 λ,u 为其对应的特征向量。对于我们的优化问题,可令 u = θ − θ ′ u =θ − θ^{′} u=θ−θ′,则
u T H u = u T ( λ u ) = λ ∥ u ∥ 2 . u^{T}Hu = uT(λu) = λ∥u∥^{2}. uTHu=uT(λu)=λ∥u∥2.
若 λ < 0,则 λ ∥ u ∥ 2 λ∥u∥^{2} λ∥u∥2 < 0。所以 1 2 ( θ − θ ′ ) T ∗ H ( θ − θ ′ ) \frac{1}{2}(θ − θ^{′})^T * H(θ − θ^{′}) 21(θ−θ′)T∗H(θ−θ′) < 0。此时,L(θ) < L(θ′),且沿着 u 的方向更新 θ,损失就会变小。
只要 θ = θ′ + u,沿着特征向量 u 的方向去更新参数,损失就会变小,所以虽然临界点的梯度为零,如果我们是在一个鞍点,只要找出负的特征值,再找出这个特征值对应的特征向量。将其与 θ′ 相加,就可以找到一个损失更低的点。
我们其实只要顺着 u 的方向去更新参数,就可以找到一个比鞍点的损失还要更低的点。
🎯如何逃离鞍点
我们常常会遇到两种情况:损失仍然很高,却遇到了临界点而不再下降;或者损失降得很低,才遇到临界点。
在图 3.6 所示的例子中,最小值比例(=正特征值数量/总特征值数量)最大也不过处于 0.5 ~ 0.6 的范围,代表只有约一半的特征值为正,另一半的特征值为负,代表在所有的维度里面有约一半的路可以让损失上升,还有约一半的路可以让损失下降。
所以从经验上看起来,局部极小值并没有那么常见。 多数的时候,我们训练到一个梯度很小的地方,参数不再更新,往往只是遇到了鞍点。
🚩 Task1.2
🎯什么是批量和动量
实际计算梯度的过程中,我们将数据分成多个批次(batch),每个批次大小为B,即包含B个数据样本。
每次更新参数时,从批次中选取数据计算损失和梯度,并更新参数。完成一次遍历所有批次的过程称为一个回合(epoch)。
为了增加样本的随机性,我们会在划分批次时进行随机打乱(shuffle)。常见的一种做法是在每个回合开始之前重新划分批次,使得每个回合的批次数据都不同。
📌批量大小对梯度下降法的影响
🎈批量梯度下降法(Batch Gradient Descent,BGD)
使用全批量(fullbatch)的数据来更新参数的方法即批量梯度下降法(Batch Gradient Descent,BGD)。
此时模型必须把 20 笔训练数据都看完,才能够计算损失和梯度,参数才能够更新一次。
🎈随机梯度下降法(Stochastic Gradient Descent,SGD),也称为增量梯度下降法
批量大小等于 1,此时使用的方法即随机梯度下降法(Stochastic Gradient Descent,SGD),也称为增量梯度下降法。
批量大小等于 1 意味着只要取出一笔数据即可计算损失、更新一次参数。
如果总共有 20 笔数据,那么在每一个回合里面,参数会更新 20 次。
用一笔数据算出来的损失相对带有更多噪声,因此其更新的方向如图 3.8 所示,是曲曲折折的 。
🎈批量大小与计算时间的关系
当批量大小增加到10000,甚至增加到 60000 的时候,GPU 计算梯度并更新参数所耗费的时间确实随着批量大小的增加而逐渐增长。
大的批量更新比较稳定,小的批量的梯度的方向是比较有噪声的(noisy)。
同一个模型,大的批量大小往往在训练的时候,结果比较差。 这个是优化的问题,大的批量大小优化可能会有问题,小的批量大小优化的结果反而是比较好的。
一个可能的解释如图 3.12 所示,批量梯度下降在更新参数的时候,沿着一个损失函数来更新参数,走到一个局部最小值或鞍点显然就停下来了。
梯度是零,如果不看海森矩阵,梯度下降就无法再更新参数了 。
但小批量梯度下降法(mini-batch gradient descent)每次是挑一个批量计算损失,所以每一次更新参数的时候所使用的损失函数是有差异的。
这种有噪声的更新方式反而对训练其实是有帮助的。其实小的批量也对测试有帮助。
在模型训练的适合小批量梯度下降法的噪声反而使得梯度不容易落在临界点,而且更方便测试。
大的批量跟小的批量的训练准确率(accuracy) 差不多,但就算是在训练的时候结果差不多,测试的时候,大的批量比小的批量差,代表过拟合。
大的批量大小会让我们倾向于走到“峡谷”里面,而小的批量大小倾向于让我们走到“盆地”里面。 小的批量有很多的损失,其更新方向比较随机,其每次更新的方向都不太一样。即使“峡谷”非常窄,它也可以跳出去,之后如果有一个非常宽的“盆地”,它才会停下来。
而小的批量更新的方向比较有噪声的,大的批量更新的方向比较稳定。但是有噪声的更新方向反而在优化的时候有优势,而且在测试的时候也会有优势。
所以大的批量跟小的批量各有优缺点,批量大小是需要去调整的超参数。
🎯什么是动量法
动量法(momentum method)是另外一个可以对抗鞍点或局部最小值的方法。
但是在物理的世界里,一个球如果从高处滚下来,就算滚到鞍点或鞍点,因为惯性的关系它还是会继续往前走。因此在物理的世界里面,一个球从高处滚下来的时候,它并不一定会被鞍点或局部最小值卡住,如果将其应用到梯度下降中,这就是动量。
📌对比一般的梯度下降法和动量法
引入动量后,每次在移动参数的时候,不是只往梯度的反方向来移动参数,而是根据梯度的反方向加上前一步移动的方向决定移动方向。
图 3.16 中红色虚线方向是梯度的反方向,蓝色虚线方向是前一次更新的方向,蓝色实线的方向是下一步要移动的方向。 把前一步指示的方向跟梯度指示的方向相加就是下一步的移动方向。
动量法引入了动量的概念,通过累积之前的梯度信息来加速学习过程。动量法在更新参数时不仅考虑当前的梯度,还考虑了之前累积的梯度。
🎈动量法的主要优点
可以加速收敛速度,特别是在目标函数存在高度非均向性的情况下。
可以帮助跳出局部最小值,并具有一定的平滑效果。
🎈动量法也存在一些缺点。
动量法引入了额外的超参数,需要人工调整。
如果动量系数设置过大,可能会导致震荡;如果设置过小,则可能会导致收敛速度变慢。
动量的简单例子如图 3.17 所示。红色表示负梯度方向,蓝色虚线表示前一步的方向,蓝色实线表示真实的移动量。 一开始没有前一次更新的方向,完全按照梯度给指示往右移动参数。负梯度方向跟前一步移动的方向加起来,得到往右走的方向。一般梯度下降走到一个局部最小值或鞍点时,就被困住了。但有动量还是有办法继续走下去,因为动量不是只看梯度,还看前一步的方向。即使梯度方向往左走,但如果前一步的影响力比梯度要大,球还是有可能继续往右走,甚至翻过一个小丘,也许可以走到更好的局部最小值,这就是动量有可能带来的好处 。
🚩Task 2.1
🎯什么是自适应学习率
临界点其实不一定是在训练一个网络的时候会遇到的最大的障碍。
图 3.18中的横坐标代表参数更新的次数,竖坐标表示损失。
一般在训练一个网络的时候,损失原来很大,随着参数不断的更新,损失会越来越小,最后就卡住了,损失不再下降。
我们走到临界点的时候,意味着梯度非常小,但损失不再下降的时候,梯度并没有真的变得很小,图 3.19 给出了示例。
图 3.19 中横轴是迭代次数,竖轴是梯度的范数(norm),即梯度这个向量的长度。
随着迭代次数增多,虽然损失不再下降,但是梯度的范数并没有真的变得很小。
图 3.20是误差表面,梯度在山谷的两个谷壁间,不断地来回“震荡”,这个时候损失不会再下降,它不是真的卡到了临界点,卡到了鞍点或局部最小值。
在局部最小值或鞍点,只是单纯的损失无法再下降。
但它的梯度仍然很大,只是损失不一定再减小了。
我们可以试着把学习率设小一点
调学习率从 10−2 调到 10−7 的结果如图 3.22(b)所示,参数不再“震荡”了。参数会滑到山谷底后左转,但是这个训练永远走不到终点,因为学习率已经太小了。
AB段的坡度很陡,梯度的值很大,还能够前进一点。左拐以后,BC 段的坡度已经非常平坦了,这种小的学习率无法再让训练前进。
事实上在 BC 段有 10 万个点(10 万次更新),但都无法靠近局部最小值,所以显然就算是一个凸的误差表面,梯度下降也很难训练。
在梯度下降里面,所有的参数都是设同样的学习率,这显然是不够的,应该要为每一个参数定制化学习率,即引入自适应学习率(adaptive learning rate) 的方法,给每一个参数不同的学习率。
待续