Datawhale X 李宏毅苹果书 AI夏令营——深度学习(进阶)
吴彦祖也爱AI 2024-09-06 11:01:02 阅读 95
Datawhale X 李宏毅苹果书 AI夏令营——深度学习(进阶)
深度学习苹果书链接
Task-1
一、局部最小值与鞍点
在做优化的时候经常会发现,随着参数不断更新,训练的损失不会再下降, 但是对这个损失仍然不满意。把深层网络(deep network)、线性模型和浅层网络(shallow network)做比较,可以发现深层网络没有做得更好——深层网络没有发挥出它完整的力量,所以优化是有问题的。但有时候,模型一开始就训练不起来,不管我们怎么更新参数,损失都降不下去。
1.临界点及其种类
过去常见的一个猜想是优化到某个地方,这个地方参数对损失的微分为零,如下图所示。图中的两条曲线对应两个神经网络训练的过程。当参数对损失微分为零的时候,梯度下降就不能再更新参数了,训练就停下来了,损失不再下降了。
提到梯度为零的时候,大家最先想到的可能就是局部极小值(local minimum),如下图左图所示。所以经常有人说,做深度学习时使用梯度下降会收敛在局部极小值,梯度下降不起作用。但其实损失不是只在局部极小值的梯度是零,还有其他可能会让梯度是零的点,比如鞍点(saddle point)。鞍点其实就是梯度是零且区别于局部极小值和局部极大值(localmaximum)的点。下图右图红色的点在 y 轴方向是比较高的,在 x 轴方向是比较低的,这就是一个鞍点。鞍点的叫法是因为其形状像马鞍。鞍点的梯度为零,但它不是局部极小值。我们把梯度为零的点统称为临界点(critical point)。损失没有办法再下降,也许是因为收敛在了临界点,但不一定收敛在局部极小值,因为鞍点也是梯度为零的点。但是如果一个点的梯度真的很接近零,我们走到临界点的时候,这个临界点到底是局部极小值还是鞍点,是一个值得去探讨的问题。因为如果损失收敛在局部极小值,我们所在的位置已经是损失最低的点了,往四周走损失都会比较高,就没有路可以走了。但鞍点没有这个问题,旁边还是有路可以让损失更低的。只要逃离鞍点,就有可能让损失更低。
2.判断临界值种类的方法
判断一个临界点到底是局部极小值还是鞍点需要知道损失函数的形状。可是怎么知道损失函数的形状?网络本身很复杂,用复杂网络算出来的损失函数显然也很复杂。虽然无法完整知道整个损失函数的样子,但是如果给定某一组参数,比如 θ′,在 θ′ 附近的损失函数是有办法写出来的——虽然 L(θ) 完整的样子写不出来。θ′ 附近的 L(θ) 可近似为
上图是泰勒级数近似(Tayler series appoximation)。其中,第一项 L(θ)′ 告诉我们,当 θ 跟 θ′ 很近的时候,L(θ) 应该跟 L(θ′) 还蛮靠近的;第二项 (θ − θ′)Tg 中,g 代表梯度,它是一个向量,可以弥补 L(θ′) 跟 L(θ) 之间的差距。有时候梯度 g 会写成 ∇L(θ′)。gi 是向量 g 的第 i 个元素,就是 L 关于 θ 的第 i 个元素的微分,即
光看 g 还是没有办法完整地描述 L(θ),还要看上式(第一个)的第三项 1/2(θ − θ′)TH(θ − θ′)。第三项跟海森矩阵(Hessian matrix)H 有关。H 里面放的是 L 的二次微分,它第 i 行,第 j 列的值 Hij 就是把 θ 的第 i 个元素对 L(θ′) 作微分,再把 θ 的第 j 个元素对 ∂L(θ′) / ∂θi 作微分后的结果,即
(3.1)式就是第一个公式。
举个例子,我们有一个简单的神经网络,它只有两个神经元,而且这个神经元还没有激活函数和偏置。输入 x,x 乘上 w1 以后输出,然后再乘上 w2,接着再输出,最终得到的数据就是 y。
还有一个简单的训练数据集,这个数据集只有一组数据 (1,1),也就是 x = 1 的标签是 1。所以输入 1 进去,我们希望最终的输出跟 1 越接近越好,如下图所示。
可以直接画出这个神经网络的误差表面,如下图所示,可以取 [−2,2] 之间的 w1 跟 w2的数值,算出这个范围内 w1, w2 数值所带来的损失,四个角落的损失是高的。我们用黑色的点来表示临界点,原点 (0,0) 是临界点,另外两排点是临界点。我们可以进一步地判断这些临界点是鞍点还是局部极小值。原点是鞍点,因为我们往某个方向走,损失可能会变大,也可能会变小。而另外两排临界点都是局部极小值,这是我们取 [−2,2] 之间的参数得到的损失函数以后,得到的损失的值后,画出误差表面后得到的结论。
除了尝试取所有可能的损失,我们还有其他的方法,比如把损失的函数写出来。对于上图所示的神经网络,损失函数 L 是正确答案 y 减掉模型的输出 yˆ = w1w2x 后取平方误差(squareerror),这里只有一组数据,因此不会对所有的训练数据进行加和。令 x = 1, y = 1,损失函数为
什么时候梯度会为零(也就是到一个临界点)呢?比如,在原点时,w1 = 0, w2 = 0,此时的梯度为零,原点就是一个临界点,但通过海森矩阵才能判断它是哪种临界点。刚才我们通过取 [−2,2] 之间的 w1 和 w2 来判断出原点是一个鞍点,但是假设我们还没有取所有可能的损失,我们要看看能不能够用海森矩阵来判断原点是什么临界点。海森矩阵 H 收集了 L 的二次微分:
通过海森矩阵来判断原点是局部极小值还是鞍点,要看它的特征值,这个矩阵有两个特征值:2 和 −2,特征值有正有负,因此原点是鞍点。
如果我们当前处于鞍点,就不用那么害怕了。H 不只可以帮助我们判断是不是在一个鞍点,还指出了参数可以更新的方向。之前我们参数更新的时候,都是看梯度 g,但是我们走到某个地方以后发现 g 变成 0 了,就不能再看 g 了,g 不见了。但如果临界点是一个鞍点,还可以再看 H,怎么再看 H 呢,H 怎么告诉我们怎么更新参数呢?
设 λ 为 H 的一个特征值 λ,u 为其对应的特征向量。对于我们的优化问题,可令 u =θ − θ′,则
沿着 u 的方向更新 θ,损失就会变小。因为根据上式 1 和式 2,只要 θ = θ′ + u,沿着特征向量 u 的方向去更新参数,损失就会变小,所以虽然临界点的梯度为零,如果我们是在一个鞍点,只要找出负的特征值,再找出这个特征值对应的特征向量。将其与 θ′ 相加,就可以找到一个损失更低的点。
在前面的例子中,原点是一个临界点,此时的海森矩阵如上图中 H 所示,该海森矩阵有一个负的特征值:−2,特征值 −2 对应的特征向量有无穷多个。不妨取 u = [1, 1]T,作为 −2 对应的特征向量。我们其实只要顺着 u 的方向去更新参数,就可以找到一个比鞍点的损失还要更低的点。以这个例子来看,原点是鞍点,其梯度为零,所以梯度不会告诉我们要怎么更新参数。但海森矩阵的特征向量告诉我们只要往 [1, 1]T 的方向更新。损失就会变得更小,就可以逃离鞍点。
所以从这个角度来看,鞍点似乎并没有那么可怕。但实际上,我们几乎不会真的把海森矩阵算出来,因为海森矩阵需要算二次微分,计算这个矩阵的运算量非常大,还要把它的特征值跟特征向量找出来,所以几乎没有人用这个方法来逃离鞍点。还有一些其他逃离鞍点的方法的运算量都比要算海森矩阵小很多。
3.逃离鞍点的方法
鞍点跟局部极小值谁比较常见?鞍点其实并没有很可怕,如果我们经常遇到的是鞍点,比较少遇到局部极小值,那就太好了。科幻小说《三体 III:死神永生》中有这样一个情节:东罗马帝国的国王君士坦丁十一世为对抗土耳其人,找来了具有神秘力量的狄奥伦娜。狄奥伦娜可以于万军丛中取上将首级,但大家不相信她有这么厉害,想要狄奥伦娜先展示下她的力量。于是狄奥伦娜拿出了一个圣杯,大家看到圣杯大吃一惊,因为这个圣杯本来是放在圣索菲亚大教堂地下室的一个石棺里面,而且石棺是密封的,没有人可以打开。狄奥伦娜不仅取得了圣杯,还自称在石棺中放了一串葡萄。于是君士坦丁十一世带人撬开了石棺,发现圣杯真的被拿走了,而是棺中真的有一串新鲜的葡萄,为什么迪奥伦娜可以做到这些事呢?是因为狄奥伦娜可以进入四维的空间。从三维的空间来看这个石棺是封闭的,没有任何路可以进去,但从高维的空间来看,这个石棺并不是封闭的,是有路可以进去的。误差表面会不会也一样呢。
如下图 (第一个图中的 a) 所示的一维空间中的误差表面,有一个局部极小值。但是在二维空间(如下图 (第一个图中的 b)所示),这个点就可能只是一个鞍点。常常会有人画类似下图 c (第一个图中的 c) 这样的图来告诉我们深度学习的训练是非常复杂的。如果我们移动某两个参数,误差表面的变化非常的复杂,有非常多局部极小值。低维度空间中的局部极小值点,在更高维的空间中,实际是鞍点。同样地,如果在二维的空间中没有路可以走,会不会在更高维的空间中,其实有路可以走?更高的维度难以视化它,但我们在训练一个网络的时候,参数数量动辄达百万千万级,所以误差表面其实有非常高的维度—— 参数的数量代表了误差表面的维度。既然维度这么高,会不会其实就有非常多的路可以走呢?既然有非常多的路可以走,会不会其实局部极小值就很少呢?而经验上,我们如果自己做一些实验,会发现实际情况也支持这个假说。下图(第二个图)是训练某不同神经网络的结果,每个点对应一个神经网络。纵轴代表训练网络时,损失收敛到临界点,损失没法下降时的损失。我们常常会遇到两种情况:损失仍然很高,却遇到了临界点而不再下降;或者损失降得很低,才遇到临界点。下图(第二个图)中,横轴代表最小值比例(minimum ratio),最小值比例定义为
实际上,我们几乎找不到所有特征值都为正的临界点。在下图(第二个图)所示的例子中,最小值比例最大也不过处于 0.5 ~ 0.6 的范围,代表只有约一半的特征值为正,另一半的特征值为负,代表在所有的维度里面有约一半的路可以让损失上升,还有约一半的路可以让损失下降。虽然在这个图上,越靠近右侧代表临界点“看起来越像”局部极小值,但是这些点都不是真正的局部极小值。所以从经验上看起来,局部极小值并没有那么常见。多数的时候,我们训练到一个梯度很小的地方,参数不再更新,往往只是遇到了鞍点。
二、批量和动量
实际上在计算梯度的时候,并不是对所有数据的损失 L 计算梯度,而是把所有的数据分成一个一个的批量(batch),如下图所示。每个批量的大小是 B ,即带有 B 笔数据。每次在更新参数的时候,会去取出 B 笔数据用来计算出损失和梯度更新参数。遍历所有批量的过程称为一个回合(epoch)。事实上,在把数据分为批量的时候,我们还会进行随机打乱(shuffle)。随机打乱有很多不同的做法,一个常见的做法是在每一个回合开始之前重新划分批量,也就是说,每个回合的批量的数据都不一样。
1.批量大小对梯度下降法的影响
假设现在我们有 20 笔训练数据,先看下两个最极端的情况,如下图所示。
下图(a)的情况是没有用批量,批量大小为训练数据的大小,这种使用全批量(fullbatch)的数据来更新参数的方法即批量梯度下降法(Batch Gradient Descent,BGD)。此时模型必须把 20 笔训练数据都看完,才能够计算损失和梯度,参数才能够更新一次下图(b)中,批量大小等于 1,此时使用的方法即随机梯度下降法(Stochastic Gradient Descent,SGD),也称为增量梯度下降法。批量大小等于 1 意味着只要取出一笔数据即可计算损失、更新一次参数。如果总共有 20 笔数据,那么在每一个回合里面,参数会更新 20 次。用一笔数据算出来的损失相对带有更多噪声,因此其更新的方向如下图所示,是曲曲折折的 。
实际上,批量梯度下降并没有“划分批量”:要把所有的数据都看过一遍,才能够更新一次参数,因此其每次迭代的计算量大。但相比随机梯度下降,批量梯度下降每次更新更稳定、更准确。
考虑并行运算,批量梯度下降花费的时间不一定更长;对于比较大的批量,计算损失和梯度花费的时间不一定比使用小批量的计算时间长 。使用 Tesla V100 GPU 在 MNIST数据集得到的实验结果如下图所示。下图中横坐标表示批量大小,纵坐标表示给定批量大小的批量,计算梯度并更新参数所耗费的时间。批量大小从 1 到 1000,需要耗费的时间几乎是一样的,因为在实际上 GPU 可以做并行运算,这 1000 笔数据是并行处理的,所以 1000笔数据所花的时间并不是一笔数据的 1000 倍。当然 GPU 并行计算的能力还是存在极限的,当批量大小很大的时候,时间还是会增加的。 当批量大小非常大的时候,GPU 在“跑”完一个批量,计算出梯度所花费的时间还是会随着批量大小的增加而逐渐增长 。当批量大小增加到10000,甚至增加到 60000 的时候,GPU 计算梯度并更新参数所耗费的时间确实随着批量大小的增加而逐渐增长。
但是因为有并行计算的能力,因此实际上当批量大小小的时候,要“跑”完一个回合,花的时间是比大的。假设训练数据只有 60000 笔,批量大小设 1,要 60000 个更新才能“跑”完一个回合;如果批量大小等于 1000,60 个更新才能“跑”完一个回合,计算梯度的时间差不多。但60000 次更新跟 60 次更新比起来,其时间的差距量就非常大了。下图 (a) 是用一个批量计算梯度并更新一次参数所需的时间。假设批量大小为 1,“跑”完一个回合,要更新 60000 次参数,其时间是非常大的。但假设批量大小是 1000,更新 60 次参数就会“跑”完一个回合。下图 (b)是“跑”完一个完整的回合需要花的时间。如果批量大小为 1000 或 60000,其时间比批量大小设 1 还要短 。下图 (a) 和下图 (b) 的趋势正好是相反的。因此实际上,在有考虑并行计算的时候,大的批量大小反而是较有效率的,一个回合大的批量花的时间反而是比较少的。
大的批量更新比较稳定,小的批量的梯度的方向是比较有噪声的(noisy)。但实际上有噪声的的梯度反而可以帮助训练,如果拿不同的批量来训练模型来做图像识别问题,实验结果如下图所示,横轴是批量大小,纵轴是正确率。下图 (a) 是 MNIST 数据集上的结果,下图 (b) 是 CIFAR-10 数据集上的结果。批量大小越大,验证集准确率越差。但这不是过拟合,因为批量大小越大,训练准确率也是越低。因为用的是同一个模型,所以这不是模型偏见的问题。 但大的批量大小往往在训练的时候,结果比较差。这个是优化的问题,大的批量大小优化可能会有问题,小的批量大小优化的结果反而是比较好的。
一个可能的解释如下图所示,批量梯度下降在更新参数的时候,沿着一个损失函数来更新参数,走到一个局部最小值或鞍点显然就停下来了。梯度是零,如果不看海森矩阵,梯度下降就无法再更新参数了 。但小批量梯度下降法(mini-batch gradient descent)每次是挑一个批量计算损失,所以每一次更新参数的时候所使用的损失函数是有差异的。选到第一个批量的时候,用 L1 计算梯度;选到第二个批量的时候,用 L2 计算梯度。假设用 L1 算梯度的时候,梯度是零,就会卡住。但 L2 的函数跟 L1 又不一样,L2 不一定会卡住,可以换下个批量的损失 L2 计算梯度,模型还是可以训练,还是有办法让损失变小,所以这种有噪声的更新方式反而对训练其实是有帮助的。
其实小的批量也对测试有帮助。假设有一些方法(比如调大的批量的学习率)可以把大的批量跟小的批量训练得一样好。实验结果发现小的批量在测试的时候会是比较好的。在论文“On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima”中,作者在不同数据集上训练了六个网络(包括全连接网络、不同的卷积神经网络),在很多不同的情况都观察到一样的结果。在小的批量,一个批量里面有 256 笔样本。在大的批量中,批量大小等于数据集样本数乘 0.1。比如数据集有 60000 笔数据,则一个批量里面有 6000 笔数据。大的批量跟小的批量的训练准确率(accuracy)差不多,但就算是在训练的时候结果差不多,测试的时候,大的批量比小的批量差,代表过拟合。
这篇论文给出了一个解释,如下图所示,训练损失上面有多个局部最小值,这些局部最小值的损失都很低,其损失可能都趋近于 0。但是局部最小值有好最小值跟坏最小值之分,如果局部最小值在一个“峡谷”里面,它是坏的最小值;如果局部最小值在一个平原上,它是好的最小值。训练的损失跟测试的损失函数是不一样的,这有两种可能。一种可能是本来训练跟测试的分布就不一样;另一种可能是因为训练跟测试都是从采样的数据算出来的,训练跟测试采样到的数据可能不一样,所以它们计算出的损失是有一点差距。 对在一个“盆地”里面的最小值,其在训练跟测试上面的结果不会差太多,只差了一点点。但对在右边在“峡谷”里面的最小值,一差就可以天差地远 。虽然它在训练集上的损失很低,但训练跟测试之间的损失函数不一样,因此测试时,损失函数一变,计算出的损失就变得很大。
大的批量大小会让我们倾向于走到“峡谷”里面,而小的批量大小倾向于让我们走到“盆地”里面。小的批量有很多的损失,其更新方向比较随机,其每次更新的方向都不太一样。即使“峡谷”非常窄,它也可以跳出去,之后如果有一个非常宽的“盆地”,它才会停下来。
大的批量跟小的批量的对比结果如下表所示。在有并行计算的情况下,小的批量跟大的批量运算的时间并没有太大的差距。除非大的批量非常大,才会显示出差距。但是一个回合需要的时间,小的批量比较长,大的批量反而是比较快的,所以从一个回合需要的时间来看,大的批量是较有优势的。 而小的批量更新的方向比较有噪声的,大的批量更新的方向比较稳定。但是有噪声的更新方向反而在优化的时候有优势,而且在测试的时候也会有优势。所以大的批量跟小的批量各有优缺点,批量大小是需要去调整的超参数。
其实用大的批量大小来做训练,用并行计算的能力来增加训练的效率,并且训练出的结果很好是可以做到的。比如 76 分钟训练 BERT,15 分钟训练 ResNet,一分钟训练ImageNet 等等。这些论文批量大小很大,比如论文“Large Batch Optimization for DeepLearning: Training BERT in 76 minutes ”中批量大小为三万。批量大小很大可以算得很快,这些论文有一些特别的方法来解决批量大小可能会带来的劣势。
2.动量法
动量法(momentum method)是另外一个可以对抗鞍点或局部最小值的方法。如下图所示,假设误差表面就是真正的斜坡,参数是一个球,把球从斜坡上滚下来,如果使用梯度下降,球走到局部最小值或鞍点就停住了。 但是在物理的世界里,一个球如果从高处滚下来,就算滚到鞍点或鞍点,因为惯性的关系它还是会继续往前走。如果球的动量足够大,其甚至翻过小坡继续往前走。 因此在物理的世界里面,一个球从高处滚下来的时候,它并不一定会被鞍点或局部最小值卡住,如果将其应用到梯度下降中,这就是动量。
一般的梯度下降(vanilla gradient descent),如下图所示。初始参数为 θ0,计算一下梯度,计算完梯度后,往梯度的反方向去更新参数 θ1 = θ0 − ηg0。有了新的参数 θ1 后,再计算一次梯度,再往梯度的反方向,再更新一次参数,到了新的位置以后再计算一次梯度,再往梯度的反方向去更新参数。
引入动量后,每次在移动参数的时候,不是只往梯度的反方向来移动参数,而是根据梯度的反方向加上前一步移动的方向决定移动方向。 下图中红色虚线方向是梯度的反方向,蓝色虚线方向是前一次更新的方向,蓝色实线的方向是下一步要移动的方向。把前一步指示的方向跟梯度指示的方向相加就是下一步的移动方向。如下图所示,初始的参数值为 θ0 = 0,前一步的参数的更新量为 m0 = 0。接下来在 θ0 的地方,计算梯度的方向 g0。下一步的方向是梯度的方向加上前一步的方向,不过因为前一步正好是 0,所以更新的方向跟原来的梯度下降是相同的。但从第二步开始就不太一样了。从第二步开始,计算 g1,接下来更新的方向为 m2 = λm1 − ηg1,参数更新为 θ2 ,接下来就反复进行同样的过程。
每一步的移动都用 m 来表示。m 其实可以写成之前所有计算的梯度的加权和,如下式所示。其中 η 是学习率,λ 是前一个方向的权重参数,也是需要调的。引入动量后,可以从两个角度来理解动量法。一个角度是动量是梯度的负反方向加上前一次移动的方向。另外一个角度是当加上动量的时候,更新的方向不是只考虑现在的梯度,而是考虑过去所有梯度的总和。
动量的简单例子如下图所示。红色表示负梯度方向,蓝色虚线表示前一步的方向,蓝色实线表示真实的移动量。一开始没有前一次更新的方向,完全按照梯度给指示往右移动参数。负梯度方向跟前一步移动的方向加起来,得到往右走的方向。一般梯度下降走到一个局部最小值或鞍点时,就被困住了。但有动量还是有办法继续走下去,因为动量不是只看梯度,还看前一步的方向。即使梯度方向往左走,但如果前一步的影响力比梯度要大,球还是有可能继续往右走,甚至翻过一个小丘,也许可以走到更好的局部最小值,这就是动量有可能带来的好处 。
3.自适应学习率
临界点其实不一定是在训练一个网络的时候会遇到的最大的障碍。下图(1)中的横坐标代表参数更新的次数,竖坐标表示损失。一般在训练一个网络的时候,损失原来很大,随着参数不断的更新,损失会越来越小,最后就卡住了,损失不再下降。当我们走到临界点的时候,意味着梯度非常小,但损失不再下降的时候,梯度并没有真的变得很小,下图(2)给出了示例。下图(2)中横轴是迭代次数,竖轴是梯度的范数(norm),即梯度这个向量的长度。随着迭代次数增多,虽然损失不再下降,但是梯度的范数并没有真的变得很小。
下图是误差表面,梯度在山谷的两个谷壁间,不断地来回“震荡”,这个时候损失不会再下降,它不是真的卡到了临界点,卡到了鞍点或局部最小值。但它的梯度仍然很大,只是损失不一定再减小了。所以训练一个网络,训练到后来发现损失不再下降的时候,有时候不是卡在局部最小值或鞍点,只是单纯的损失无法再下降。
我们现在训练一个网络,训练到现在参数在临界点附近,再根据特征值的正负号判断该临界点是鞍点还是局部最小值。实际上在训练的时候,要走到鞍点或局部最小值,是一件困难的事情。一般的梯度下降,其实是做不到的。用一般的梯度下降训练,往往会在梯度还很大的时候,损失就已经降了下去,这个是需要特别方法训练的。要走到一个临界点其实是比较困难的,多数时候训练在还没有走到临界点的时候就已经停止了。举个例子,我们有两个参数 w 和 b,这两个参数值不一样的时候,损失值也不一样,得到了下图所示的误差表面,该误差表面的最低点在叉号处。事实上,该误差表面是凸的形状。凸的误差表面的等高线是椭圆形的,椭圆的长轴非常长,短轴相比之下比较短,其在横轴的方向梯度非常小,坡度的变化非常小,非常平坦;其在纵轴的方向梯度变化非常大,误差表面的坡度非常陡峭。现在我们要从黑点(初始点)来做梯度下降。
学习率 η = 10−2 的结果如下图 (a) 所示。参数在峡谷的两端,参数在山壁的两端不断第“震荡”,损失降不下去,但是梯度仍然是很大的。我们可以试着把学习率设小一点,学习率决定了更新参数的时候的步伐,学习率设太大,步伐太大就无法慢慢地滑到山谷里面。调学习率从 10−2 调到 10−7 的结果如下图 (b) 所示,参数不再“震荡”了。参数会滑到山谷底后左转,但是这个训练永远走不到终点,因为学习率已经太小了。AB 段的坡度很陡,梯度的值很大,还能够前进一点。左拐以后,BC 段的坡度已经非常平坦了,这种小的学习率无法再让训练前进。事实上在 BC 段有 10 万个点(10 万次更新),但都无法靠近局部最小值,所以显然就算是一个凸的误差表面,梯度下降也很难训练。
最原始的梯度下降连简单的误差表面都做不好,因此需要更好的梯度下降的版本。在梯度下降里面,所有的参数都是设同样的学习率,这显然是不够的,应该要为每一个参数定制化学习率,即引入自适应学习率(adaptive learning rate)的方法,给每一个参数不同的学习率。如下图所示,如果在某一个方向上,梯度的值很小,非常平坦,我们会希望学习率调大一点;如果在某一个方向上非常陡峭,坡度很大,我们会希望学习率可以设得小一点。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。