很大程度上,深度学习其实是在解决大量烦人的优化问题。神经网络只是一个非常复杂的函数,具有数百万个代表问题数学解决方案的参数。以图像分类为例,AlexNet是一个数学函数,它将表示图像的RGB值数组作为输入,并产生一组分类分数的输出。本质上,通过训练神经网络,我们正在最小化损失函数。此损失函数的值衡量我们的网络在给定数据集上的性能与完美程度的接近程度。1.损失函数为了简单起见,假设我们的网络只有两个参数。实际上,这个数字大约是十亿,但我们将在这篇文章中坚持使用双参数示例,以免在尝试进行一些可视化时把自己逼疯。一个伟大的损失函数的轮廓可能看起来像这样。1.损失函数的轮廓为什么说这是一个很棒的损失函数?因为像圣诞老人一样具有这种轮廓的损失函数是不存在的。然而,它仍然是一个很好的教学工具,可以很好地概述有关梯度下降的一些最重要的思想。那么,让我们从这里开始吧。x轴和y轴分别代表两个权重,z轴代表给定两个特定权重的损失函数的值。我们的目标是找到损失最小的特定权重,这个点称为损失函数的最小点。您最初随机初始化了权重,因此您的神经网络可能表现得像您喝醉了一样,并将猫的图片分类为人。这样的情况对应损失函数曲线中的A点,这里的网络性能很差,所以loss也很高。我们需要想办法导航到损失函数值最小的“谷”点B。那么我们该怎么做呢?2.当梯度下降初始化权重时,我们在损失函数图中的A点。首先要做的是查看x-y平面中所有可能的方向,看看损失函数值在哪个方向下降得最陡。这是我们要移动的方向,正好是梯度的相反方向。梯度是高维导数的另一种说法,它给出了最陡峭的上升方向。要理解这个概念,请看下图。在曲面上的任何一点,我们都可以定义一个与其相切的平面。在更高的维度中,我们总是可以定义一个超平面,但这里我们坚持使用3维空间。那么,这个平面上就有无数个方向。其中,准确的说只有一个方向使函数上升最快,由梯度给定,相反的方向是下降最快的方向。这就是算法名称的由来,我们沿梯度的方向下降,因此称为梯度下降。现在,既然我们有了前进的方向,我们就必须决定我们需要采取的步数的大小,而控制下降步数大小的参数就是学习率。为了保证一个最小值,我们必须谨慎选择学习率。如果我们移动得太快,我们可能会越过最小值,沿着“山谷”的山脊弹跳,永远不会到达最小值。如果移动太慢,训练时间可能会太长而不可行,而且学习率太慢也很容易使算法陷入最小值,我们将在本文后面讨论。一旦我们有了梯度和学习率,我们就会开始运行,然后在我们结束的任何地方重新计算梯度,并重复这个过程。梯度的方向告诉我们哪个方向上升最快,它的大小告诉我们最陡的上升/下降有多陡。因此,至少,表面轮廓几乎是平坦的,我们预计梯度几乎为零。事实上,最小点处的梯度为0。梯度下降过程使用了太大的学习率。在实践中,我们可能永远无法精确地达到最小值,但我们能够在最小值附近的平坦区域中振荡。当我们在这个区域震荡时,损失值几乎就是我们能达到的最小值,不会有太大的变化,因为我们是在真正的最小值附近跳动。通常,当损失值在预定次数(例如10或20次迭代)内没有改善时,我们会停止迭代。当发生这种情况时,我们说训练已经收敛,或者已经实现收敛。二、常见错误让我稍微离题一下。如果您搜索梯度下降的可视化,您可能会看到一条轨迹,它从一个点开始并在一个最小点结束,就像上一个动画中显示的那样。然而,这种对梯度下降的描述并不准确。我们得到的轨迹完全局限于包含权重的x-y平面。如上动画所示,梯度下降不涉及z轴方向的移动。因为仅由x轴和y轴方向描述的权重是自由参数。得到的实际轨迹定义在x-y平面,如下图:实际梯度下降轨迹的x-y平面中的每个点代表一个唯一的权重组合,我们希望有一组由最小值描述的权重价值。3.基本方程描述梯度下降更新规则的基本方程为:更新在每次迭代中进行。这里,w是权重向量,位于x-y平面上。我们从这个向量中减去学习率α乘以损失函数相对于权重的梯度。梯度是一个向量,给出了损失函数上升最快的方向。最快下降的方向恰好与梯度方向相反,这就是为什么要从权重向量中减去梯度向量的原因。如果想象向量对您来说有点困难,那么几乎相同的更新规则同时适用于网络中的每个权重。唯一的变化是我们现在对每个权重单独执行更新,并且上述等式中的梯度被梯度向量沿权重特定方向的投影所取代。对所有权重同时执行更新。在做减法之前,我们将学习率乘以梯度向量。这是我们之前讨论的步骤。请注意,即使我们保持学习率不变,步长也会因梯度大小而变化,即损失函数曲线的陡度。当我们接近最小点时,梯度将趋近于0,并且我们将以越来越小的步长接近最小点。从理论上讲,这很好,因为我们希望算法在接近最小值时采取更小的步骤。太大的步长有跳过最小值和在最小值脊柱之间来回弹跳的风险。梯度下降中的一种常用技术是使用可变学习率而不是固定学习率。最初,我们可以使用更大的学习率。但稍后,当我们接近最低点时,我们需要放慢速度。实施此策略的一种方法是模拟退火,这是一种衰减的学习率。在这种情况下,学习率会在尽可能多的迭代中逐渐降低。4.梯度下降的挑战之一:局部最小值到目前为止,梯度下降的故事听起来确实不错。现在,让我揭开它的面纱。还记得我之前说过有好的损失??函数和不存在的损失函数吗?它们真的不存在。首先,神经网络是复杂的函数,我们在假设的函数中引入了大量的非线性变换。生成的损失函数看起来不太好,同样只有一个我们可以收敛的最小点。事实上,这种理想的损失函数被称为“凸函数”(总是向上弯曲的函数),而深度网络的损失函数几乎不是凸函数。事实上,它们很可能是这样的:在上图中,存在梯度为0的局部极小点。然而,我们想要实现的全局极小点却无法实现。现在,如果你在A点初始化权重,那么你将收敛到一个局部最小点,一旦你收敛到这个最小点,梯度下降将无法让你离开这里。梯度下降是由梯度驱动的,梯度在任何最小点处都为0。局部最小值之所以称为局部最小值,是因为此时损失函数的值是局部区域的最小值。全局最小值之所以称为全局最小值,是因为损失函数在该点的值是整个区域中最小的。更糟糕的是,由于我们考虑的3D损失函数配置文件在实践中从未出现过,因此损失函数配置文件可能更复杂。在实践中,我们的神经网络将有大约10亿个权重,给我们一个大约(10亿+1)维的函数。事实上,很难想象具有这么多维度的函数会是什么样子。然而,深度学习领域现在人才济济,人们已经找到了将损失函数的轮廓可视化为3D的方法。最近的一篇论文提出了一种称为“过滤器归一化”的技术,它解释了超出本文范围的内容。然而,它确实让我们看到了我们正在处理的损失函数的潜在复杂性。例如,下图是VGG-56在CIFAR-10数据集上构建的损失函数的3D架构。复杂的损失函数图。如您所见,到处都有局部最小值。5.梯度下降挑战2:鞍点关于梯度下降的局限性,我们学到的基本教训是,一旦到达梯度为0的区域,无论最小点的质量如何,都几乎无法逃脱.我们面临的另一种问题是鞍点,它们具有以下形状:Saddlepoint您还可以在上图中看到两个峰相交的鞍点。鞍点因其形似马鞍而得名。虽然在x方向是极小点,但在另一个方向是局部极大点,而且,如果沿x方向变平坦,梯度下降会在x轴震荡,无法继续按照y-轴往下走,会给我们一种已经收敛到最小点的错觉。6.救援的随机性那么我们如何在试图收敛到全局最优值的同时摆脱局部最小值和鞍点呢?答案是使用随机梯度下降。到目前为止,我们一直在使用通过对训练集上所有可能示例的损失值求和而获得的损失函数来执行梯度下降。如果我们进入局部最小值或鞍点,我们就会陷入困境。帮助梯度下降摆脱这些困境的一种方法是随机梯度下降。在随机梯度下降中,我们不是通过对所有损失函数求和来计算损失函数的梯度,而是通过计算随机采样(无替换)示例的损失梯度来采取步骤。随机梯度下降中的每个样本都是随机选择的,这与早期在一批中处理所有样本的方法形成对比,因此称为批梯度下降。更新规则也相应更改。这意味着我们在每一步使用的损失函数与实际损失函数(它是每个样本的损失函数之和)不同。这个“单样本损失函数”在特定点的梯度实际上可能指向与“所有样本损失函数”的梯度略有不同的方向。也就是说,虽然“全样本损失函数”的梯度可能会将我们推向局部最小值,或者将我们困在鞍点,但这个“单样本损失函数”的梯度可能指向不同的方向,并且可能帮助我们避免这些情况。还应考虑“全样本损失函数”的局部最小值点。如果我们使用批量梯度下降,那么我们就会卡在这里,因为这里的梯度会一直指向局部最小值点。但是,如果我们使用随机梯度下降,这个点可能不在“onesamplelossfunction”轮廓的局部最小值附近,这使得我们远离局部最小值点。即使我们卡在了“onesamplelossfunction”的一个局部极小点,“onesamplelossfunction”在下一个随机采样点的损失情况可能不一样,让我们??继续前进。当它收敛时,它会收敛到几乎所有“单样本损失函数”的最小值。经验还表明,鞍点极不稳定,轻轻一推就可以移动。那么,这是否意味着这种单样本随机梯度下降应该在实践中使用呢?7.批量大小答案是否定的。虽然理论上随机梯度下降可能会给我们最好的结果,但在计算上它不是一个非常可行的选择。当我们使用将所有个体损失函数相加得到的函数进行梯度下降时,可以并行计算所有个体损失函数的梯度,而当使用随机梯度下降时,梯度的计算必须逐一进行。所以我们所做的是一种平衡行为。我们使用固定数量的样本(例如16、32或128)来形成一个小批量来构建损失函数,而不是使用整个数据集或单个样本。该术语与一次处理所有样本形成对比,后者通常称为批量梯度下降。选择小批量的大小是为了确保我们有足够的随机性来摆脱局部最小值,同时利用足够的并行计算能力。8.重新审视局部最小值:它们并不像您想象的那么糟糕不要急于反对局部最小值,最近的研究表明局部最小值不一定是坏的。在神经网络的损失情况下,极小值太多了,一个好的局部极小值可能和全局极小值一样好。我为什么说好?因为你仍然会陷入由不稳定的训练样本引起的局部最小值。良好的局部最小值,或文献中提到的最佳局部最小值,也可能在给定神经网络的高维损失函数中很丰富。您可能还会注意到许多神经网络执行分类任务。如果局部最小值对应的正确标签分数为0.7-0.8,而全局最小值对应的正确标签分数为0.95-0.98,则两个输出的预测标签结果将相同。最小值的一个理想特性是它应该在平坦的一侧。为什么?因为平坦的最小值很容易收敛到并且不太可能越过最小值或在最小值的脊柱之间跳跃。更重要的是,我们希望测试集的损失面与我们训练的训练集的损失面略有不同。对于平坦而宽的最小值,损失不会因这种变化而改变太多,但对于相对较窄的最小值则不会。我们想说明的一点是,更平坦的最小值可以更好地泛化,因此是可取的。9.重新审视学习率最近,关于损失函数次优最小值的学习率调度的研究激增。即使学习率降低,也有可能陷入局部最小值。传统上,训练要么在固定次数的迭代后完成,要么在损失值没有改善的情况下在固定次数(比如10)的迭代后停止。这种情况在文献中被称为earlystopping。使用更快的学习率也有助于我们在训练的早期跳过一些局部最小值。人们还将提前停止与学习率衰减结合起来,如果损失函数没有改善,学习率在10次迭代后开始衰减,最后在学习率低于某个特定阈值时停止。近些年开始流行循环学习率,学习率先缓慢上升再缓慢下降,在一个连续的循环中。LeslieN.Smith的Triangular和Triangular2循环学习率方法。左边的最大学习率和最小学习率保持不变。右边的区别是学习率在每个epoch后减半。资料来源:HafidzZulkifli所谓的热重启随机梯度下降,基本上是将学习率退火到一个下限,然后将学习率恢复到初始值。对于学习率如何下降,我们也有不同的计划,例如,从指数衰减到余弦衰减。余弦退火与重启相结合最近的一篇论文介绍了一种称为“随机加权平均”的技术。作者提出了一种方法,首先收敛到最小值,缓存权重,然后将学习率恢复到更高的值。然后,这种更高的学习率将算法从最小值推向损失曲面中的随机点。然后使算法再次收敛到另一个最小值。这会重复几次,最后,他们对所有缓存权重集的预测进行平均以产生最终预测。随机加权平均技术十。结论因此,这是一篇关于梯度下降的介绍性文章,梯度下降是深度学习优化工作背后的驱动力,因为关于逆向训练的开创性论文表明神经网络可以通过计算梯度来训练。然而,我们在这篇文章中没有涉及到关于梯度下降的缺失部分,那就是解决病态曲率问题。经典随机梯度下降的扩展,例如Momentum、RMSProp和Adam,用于克服这个关键问题。原文链接:https://blog.paperspace.com/intro-to-optimization-in-deep-learning-gradient-descent/心(id:almosthuman2014)》】点此阅读本作者更多好文
