It’s Only Natural: An Excessively Deep Dive Into Natural Gradient Optimization

我要讲一个故事:你以前几乎肯定听过的故事,但与你习惯的重点不同。

对于第一(阶)近似,所有现代深度学习模型都使用梯度下降进行训练。在梯度下降的每个步骤中,您的参数值从某个起始点开始,然后将它们移动到最大损失减少的方向。你可以通过从你的整个参数向量中获取损失的导数来实现这一点,否则称为雅可比行列式。然而,这只是你损失的第一个衍生物,并没有告诉你关于曲率的任何信息,或者你的一阶导数改变的速度。由于您可能位于一个导数的局部近似可能不会远离该估计点(例如,在巨大的山丘之前的向下曲线)的区域中,您通常需要谨慎,并且不要太过大踏步。因此,为了谨慎起见,我们用下面的等式中的步长α控制我们的前进进度。

It’s Only Natural: An Excessively Deep Dive Into Natural Gradient Optimization

这个步长正在做一些有趣的事情:它限制了你要在渐变方向上更新每个参数的距离,并按固定的数量这样做。在这个算法的最简单版本中,我们采用一个标量,alpha,让我们想象的是0.1,并将其乘以梯度相对于损失。记住,我们的梯度实际上是一个向量 - 相对于模型中每个参数的损失梯度 - 因此当我们将它乘以标量时,我们将沿着每个参数轴的更新按照相同的固定量按比例放大。欧几里德参数距离。而且,在最基本的梯度下降版本中,我们在学习过程中使用相同的步长。

但是…这真的有意义吗?具有较小学习率的前提是我们知道梯度的单个局部估计可能仅在该估计周围的小局部区域中有效。但是,参数可以存在于不同的尺度上,并且可以对学习的条件分布产生不同程度的影响。而且,这种程度的影响可能会在培训过程中波动。从这个角度来看,欧几里德参数空间中固定的全局半径定义安全气泡看起来并不像是一件特别明智或有意义的事情。
It’s Only Natural: An Excessively Deep Dive Into Natural Gradient Optimization

由自然梯度的支持者隐含地提出的反建议是,不是根据参数空间中的距离来定义我们的安全窗口,而是应该根据分布空间中的距离来定义它。因此,不是“我将遵循我当前的渐变,而是将参数向量保持在当前向量的epsilon距离内”,而是说“我将遵循我当前的渐变,但要保持分布,我的模型是预测在之前预测的分布的epsilon距离内“。这里的概念是分布之间的距离对于任何缩放或移位或一般的重新参数化是不变的。例如,可以使用方差参数或比例参数(1 /方差)来参数化相同的高斯分布;如果你查看参数空间,根据它们是使用方差还是比例进行参数化,两个分布将是不同的距离。但是如果你在原始概率空间中定义了一个距离,它就会是一致的。

本文的其余部分将尝试建立一种更强大,更直观的理解方法,称为自然梯度学习,这是一种概念上优雅的想法,旨在纠正参数空间中缩放的任意性。我将深入探讨它是如何工作的,如何在构成它的不同数学思想之间建立桥梁,并最终讨论它是否以及在何处实际有用。但是,首先:计算分布之间的距离意味着什么?

  • Licensed to KL

KL分歧,或者更确切地说是Kullback-Leibler分歧,在技术上并不是分布之间的距离度量(数学家对于所谓的度量或适当的距离是挑剔的),但这是一个非常接近的想法。

It’s Only Natural: An Excessively Deep Dive Into Natural Gradient Optimization

在数学上,它是通过计算从一个分布或另一个分布采样的x的值取得的对数概率(即,概率值的原始差异)的比率的预期值来获得的。这个事实是,期望取自其中一个分布或另一个分布使得它成为非对称度量,其中KL(P || Q)!= KL(Q || P)。但是,在许多其他方面,KL分歧映射到我们关于概率距离应该是什么样的概念:它直接根据概率密度函数的定义来衡量,也就是说,在一堆点上的密度值的差异,分配是定义的。这有一个非常实用的方面,当分布对于广泛的X系列的“X的概率是多少”的问题有更远的答案时,分布被视为更加不同。

在自然梯度的背景下,KL分歧被用作衡量我们的模型预测的输出分布变化的一种方式。如果我们正在解决多向分类问题,那么我们模型的输出将是softmax,可以看作是多项分布,每个类都有不同的概率。当我们谈论由当前参数值定义的条件概率函数时,这就是我们所讨论的概率分布。如果我们使用KL散度作为缩放我们的梯度步骤的方式,这意味着我们在这个空间中看到两个参数配置为“更远”,如果它们会导致预测的类别分布在KL分歧方面非常不同,对于给定的输入特征集。

  • The Fisher Thing

到目前为止,我们已经讨论过为什么在参数空间中缩放更新步骤的距离是令人不满意的,并建议一个不那么随意的替代方案:缩放我们的步骤,使得最多只能在KL发散方面与 我们的模型以前一直在预测的类分布。 对我来说,理解自然梯度最困难的部分是下一部分:KL Divergence和Fisher信息矩阵之间的联系。

从故事的结尾开始,Natural Gradient就像这样实现:
It’s Only Natural: An Excessively Deep Dive Into Natural Gradient Optimization

def等于等号意味着右边的内容是左边符号的定义。右手术语由两部分组成。首先,关于参数存在损失函数的梯度(这是在更正常的梯度下降步骤中使用的相同梯度)。 “自然”位来自第二个分量:对数概率函数的平方梯度的预期值,取自z。我们采用整个对象,称为Fisher信息矩阵,并将我们的损耗梯度乘以其逆。

p-theta(z)项是由我们的模型定义的条件概率分布,也就是说:神经网络末端的softmax。我们正在研究所有p-theta项的梯度,因为我们关心的是我们预测的类概率因参数变化而变化的量。预测概率的变化越大,我们的更新前和更新后的预测分布之间的KL差异越大。

使自然梯度优化混淆的部分原因在于,当您正在阅读或思考它时,您必须理解和争论两个不同的梯度对象,这意味着不同的事物。顺便说一句,这对于杂草来说是不可避免的,特别是在讨论可能性时,并没有必要掌握整体直觉;如果您不喜欢浏览所有血腥细节,请随时跳到下一部分。

  • Gradient with respect to loss

It’s Only Natural: An Excessively Deep Dive Into Natural Gradient Optimization

通常,您的分类损失是一个交叉熵函数,但更广泛地说,它是一些函数,它将您的模型的预测概率分布和真实目标值作为输入,并且当您的分布远离目标时具有更高的值。 这个对象的梯度是梯度下降学习的核心面包和黄油; 它表示如果将每个参数移动一个单位,您的损失将会发生变化。

  • The gradient of the log likelihood

It’s Only Natural: An Excessively Deep Dive Into Natural Gradient Optimization

对于我来说,这是学习自然渐变最令人困惑的部分。因为,如果您阅读有关Fisher信息矩阵的内容,您将获得许多链接,说明它与模型的对数似然的梯度有关。我之前对似然函数的理解是,它代表了你的模型对某些数据集的可能性有多大;特别是,您需要目标值来计算它,因为您的目标是计算模型分配给真实目标的概率,当您对输入要素进行调节时。在讨论可能性的大多数情况下,例如非常常见的最大似然技术,您关心对数似然的梯度,因为您的可能性越高,您的模型分配从真实分布中采样的值的概率越高,我们都越快乐是。实际上,这看起来像计算p(class | x)渐变的期望值,其中概率在数据中的实际类分布中得出。

但是,您也可以用另一种方式评估可能性,而不是根据真实目标值计算您的可能性(您可能希望具有非零梯度,因为它可能会推动您的参数增加概率对于真正的目标,您可以使用从条件分布本身中提取的概率来计算您的期望。也就是说,如果您的网络导致softmax,而不是基于给定观察的数据中的真实等级,以0/1概率取得logp(z)的期望,请使用该模型的估计概率作为其权重在期待中。这将导致整体预期梯度为0,因为我们将模型的当前信念作为基本事实,但我们仍然可以得到梯度方差的估计(即梯度平方),这是所需要的在我们的Fisher矩阵中(隐含地)计算预测类空间中的KL散度。

  • So… Does It Help?

这篇文章花了很多时间谈论力学:这个东西究竟是什么叫做自然梯度估计,以及关于它如何以及为什么起作用的更好的直觉。但是,如果我不回答这个问题,我觉得自己会失职:这件事真的能提供价值吗?

简短的回答是:实际上,它并没有为大多数深度学习应用程序提供足够引人注目的价值。有证据表明自然梯度导致收敛发生的步骤较少,但正如我稍后将讨论的那样,这是一个复杂的比较。对于因参数空间中的缩放更新步骤的随意性而受挫的人来说,自然渐变的想法是优雅的并且令人满意。但是,除了优雅之外,我不清楚它是否提供了无法通过更多启发手段提供的价值。

据我所知,自然梯度提供了两个关键的价值来源:

它提供有关曲率的信息
它提供了一种直接控制模型在预测分布空间中移动的方法,与模型在损失空间中的移动分开

  • Curvature

现代梯度下降的一大奇迹是它通过一阶方法完成。一阶方法是仅计算与要更新的参数相关的导数而不是二阶导数的方法。使用一阶导数,您所知道的是(特定尺寸版本)曲线在特定点处的切线。您不知道切线的变化速度有多快:二阶导数,或者更具描述性,您的函数在任何给定方向上的曲率水平。曲率是一个有用的东西要知道,因为在高曲率区域,渐变从一点到另一点急剧变化,你可能需要谨慎迈出一大步,以免你攀登陡峭山峰的本地信号误导你跳下去悬崖就在眼前。 A(不可否认,它更具启发性而不是严谨)我喜欢这样思考的方法是,如果你处于一个点到点的渐变变化很大的地区(也就是说:高变化),那么你的迷你世界估计梯度在某种意义上更加不确定。相比之下,如果渐变在给定点几乎没有变化,那么下一步就不需要谨慎了。二阶导数信息非常有用,因为它可以根据曲率水平缩放步数。

实际上,机械地做的自然梯度是将参数更新除以梯度的二阶导数。梯度相对于给定参数方向变化越大,Fisher信息矩阵中的值越高,并且该方向上的更新步骤越低。这里讨论的梯度是批次中各点的经验可能性的梯度。这与损失方面的梯度不同。但是,直观地说,可能性的巨大变化与损失函数的剧烈变化并不相符。因此,通过捕获关于给定点处的对数似然导数空间的曲率的信息,自然梯度也给出了我们真实的潜在损失空间中的曲率的良好信号。有一个非常有力的论据,当自然梯度已被证明可以加速收敛(至少在所需梯度步骤的数量方面),这就是利益的来源。

然而。请注意,我说自然梯度显示在梯度步骤方面加速收敛。这种精确度来自于自然梯度的每个单独步骤需要更长时间,因为它需要计算Fisher信息矩阵,记住,这是一个存在于n_parameters²空间中的数量。事实上,这种急剧放缓类似于通过计算真实损失函数的二阶导数引起的减速。虽然可能是这种情况,但我还没有看到它表明计算自然梯度Fisher矩阵比计算相关损失的二阶导数更快。以此为假设,与对损失本身进行直接二阶优化的(也可能是同样的,代价高昂的)方法相比,很难看出自然梯度提供的边际值是多少。

现代神经网络能够在理论预测只有一阶方法失败的情况下取得成功的原因很多,深度学习从业者已经找到了一堆巧妙的技巧来基本上凭经验逼近所包含的信息。在分析二阶导数矩阵中。

  • Momentum (动力)
    作为优化策略的工作原理是保持过去梯度值的运行指数加权平均值,并将任何给定的梯度更新偏向该过去的移动平均值。这有助于解决在梯度值变化很大的空间的一部分问题:如果你经常得到相互矛盾的梯度更新,他们会平均不会有这样或那样的强烈意见,类似于减慢你的速度学习率。而且,相比之下,如果你反复得到相同方向的梯度估计值,那就是低曲率区域的指示,并建议采用更大步长的方法,Momentum遵循这一步骤。
  • RMSProp,
    好笑的是,Geoff Hinton在课程中期发明的,是对以前存在的称为Adagrad的算法的温和修改。 RMSProp通过获取过去平方梯度值的指数加权移动平均值,或者换句话说,过去的渐变方差,并将更新步骤除以该值来工作。这可以大致被认为是梯度的二阶导数的经验估计。
  • Adam(自适应矩估计),
    基本上结合了这两种方法,估计梯度的运行平均值和运行方差。它是当今最常见,也是最常用的优化策略之一,主要是因为它具有平滑掉这个嘈杂的一阶梯度信号的效果。
    有趣的是,并且还值得一提的是,除了通常根据功能曲率缩放更新步骤之外,它们还根据这些特定方向上的曲率量不同地缩放不同的更新方向。这得到了我们之前讨论的内容,关于如何按相同的数量扩展所有参数可能不是一件明智的事情。您甚至可以根据距离来考虑这一点:如果方向上的曲率很高,那么相同数量的欧几里德参数空间中的一步将使我们在梯度值的预期变化方面进一步移动。

因此,虽然在定义参数更新的连贯方向方面不具备自然渐变的优雅,但它确实检查了大多数相同的框:能够在方向和时间点调整更新步骤, 曲率不同的地方,并且,从概念上讲,给定尺寸的参数步骤具有不同程度的实际影响。

  • 直接分配控制
    好吧,所以,最后一节论述:如果我们的目标是使用对数似然的分析曲率估计作为损失曲率估计的替代,为什么我们不做后者,或接近后者,因为 分析N²计算似乎都是非常耗时的。 但是,如果您处于这样一种情况,即您实际上是在关注预测类别分布的变化,而不仅仅是作为损失变化的代理? 这种情况甚至会是什么样的?

It’s Only Natural: An Excessively Deep Dive Into Natural Gradient Optimization

这种情况的一个例子,可能并非巧合,是当前自然梯度方法的主要领域之一:强化学习领域的信任区域政策优化。 TRPO的基本直觉包含在灾难性失败或灾难性崩溃的想法中。在策略渐变设置中,您在模型结束时预测的分布是动作分布,以某些输入状态为条件。而且,如果您正在学习政策,从您的模型当前预测的政策中收集下一轮培训的数据,则可以将您的政策更新为您无法再收集有趣数据以了解您的政策出路(例如,围成一圈的政策,这不太可能让你学到有用的奖励信号)。这就是政策遭受灾难性崩溃的意义所在。为了避免这种情况,我们要谨慎行事,而不是做可以显着改变我们政策的梯度更新(根据我们对给定方案中的不同操作的概率)。如果我们在预测概率发生变化的过程中保持谨慎和渐进,那就会限制我们突然跳到不可行的政权的能力。

这就是自然梯度的一个更强有力的案例:在这里,我们关心控制的实际情况是在新参数配置下不同行为的预测概率变化了多少。我们关心它本身,而不仅仅是损失函数的代理。