过度深入研究自然梯度优化
一个故事
所有现代深度学习模型都使用梯度下降进行训练。 在梯度下降的每个步骤中,您的参数值从某个起始点开始,然后将它们移动到最大损失减少的方向。 你可以通过从你的整个参数向量中获取损失的导数来实现这一点,否则称为雅可比行列式。 然而,这只是损失的一阶导数,它没有告诉你曲率的任何信息,或者说,一阶导数变化的有多快。 由于您所处的区域中,您对一阶导数的局部近似可能不会从该估计值点(例如,在大山前的向下曲线)的区域中,您通常需要谨慎,并且不要太过大踏步。 因此,为了谨慎起见,我们用下面的等式中的步长α控制我们的前进速度。
![](http://n4.ikafan.com/assetsj/blank.gif)
这个步长做了一些有趣的事情:它限制了你要在梯度方向上更新每个参数的距离,并且这样做是固定的数量。在这个算法的最简单的版本中,我们取一个标量,假设是0.1,然后乘以关于损失的梯度。我们的梯度,记住,实际上是一个矢量-损失的梯度相对于模型中的每个参数向量-损失的梯度模型中,当我们将它乘以一个标量时,我们用欧几里得的方法,将沿每个参数轴的更新乘以相同的固定量。在梯度下降的最基本版本中,我们在学习过程中使用相同的步长。
但是,这真的有意义吗?有一个小学习率的前提是,我们知道一个单一的局部梯度估计只能在该估计周围的一个小的局部区域有效。但是,参数可以存在于不同的尺度上,并且可以对您所学的条件分布产生不同程度的影响。而且,这种程度的影响会在培训过程中波动。从这个角度来看,在欧几里得参数空间中,用一个固定的全局半径来定义一个安全波动似乎不是一件特别明智或有意义的事情。
![](http://n4.ikafan.com/assetsj/blank.gif)
梯度计算技术的微妙之处
自然梯度的支持者含蓄地提出了一个相反的建议,即我们不应该用参数空间中的距离来定义安全窗口,而是应该用分布空间中的距离来定义它。所以,与其说'我将遵循电流梯度,服从保持参数向量保持在电流向量的极小值的距离内',不如说'我将遵循我的电流梯度,服从保持分配我的模型是预测在之前预测的分布的极小值的距离内'。
这里的概念是分布之间的距离对于任何缩放、移动或一般的重新参数化都是不变的。例如,例如,相同的高斯可以使用方差参数或尺度参数(1/方差)进行参数化;两种分布之间的距离是不同的,这取决于它们是用方差还是尺度来进行参数化。但如果在原始概率空间中定义一个距离,它将是一致的。
本文的其余部分将尝试建立一种更强大,更直观的理解方法,称为自然梯度学习,这是一种概念上优雅的想法,旨在纠正参数空间中缩放的任意性。本文将深入探讨它是如何工作的,如何在构成它的不同数学思想之间建立桥梁,并最终讨论它是否以及在什么地方真正有用。但是,首先:计算分布之间的距离意味着什么?
获得KL
KL分歧,或者更确切地说是Kullback-Leibler分歧,在技术上并不是分布之间的距离度量(数学家对于所谓的度量或适当的距离是挑剔的),但它非常接近这个概念。
![](http://n4.ikafan.com/assetsj/blank.gif)
从数学上讲,它是通过计算从一个分布或另一个分布采样的x的值取得的对数概率(即,概率值的原始差异)的比率的预期值来获得的。这个事实是,期望取自其中一个分布或另一个分布使得它成为非对称度量,其中KL(P || Q)!= KL(Q || P)。但是,在许多其他方面,KL分歧映射到我们关于概率距离应该是什么样的概念:它直接根据概率密度函数的定义来衡量,也就是说,分配在一堆点上的密度值的差异来定义的。这有一个非常实用的方面,当分布对于广泛的X系列的'X的概率是多少'的问题有更远的答案时,分布被视为更加不同。
在自然梯度条件下,KL分歧被用作衡量我们的模型预测的输出分布变化的一种方式。如果我们正在解决多向分类问题,那么我们的模型的输出将是一个softmax,它可以被看作是一个多项式分布,每个类具有不同的概率。当我们谈论由当前参数值定义的条件概率函数时,这就是我们所讨论的概率分布。如果我们使用KL散度作为缩放梯度步长的方法,这意味着我们看到两个参数配置为'更远的距离',对于给定的输入特征集,如果它们会导致预测的类别分布在KL分歧方面非常不同。
Fisher的介绍
到目前为止,我们已经讨论过为什么在参数空间中缩放更新步骤的距离是令人不满意的,并建议一个不那么随意的替代方案:缩放我们的步骤,使得最多只能在KL分歧方面与我们的模型以前一直在预测的类分布。理解自然梯度最困难的部分是下一部分:KL Divergence和Fisher信息矩阵之间的联系。
从故事的结尾开始,Natural Gradient就像这样实现:
![](http://n4.ikafan.com/assetsj/blank.gif)
自然梯度定义
等号上的def表示右边的是左边符号的定义。右手项由两部分组成。首先,这是你的损失函数相对于参数的梯度(这是在更正常的梯度下降步骤中使用的相同梯度)。'自然'位来自第二个分量:取对数概率函数梯度的平方梯度的期望值(取自z)。我们将整个对象称为Fisher信息矩阵,用损失梯度乘以它的倒数。
p-theta(z)项是由我们的模型定义的条件概率分布,也就是说:神经网络末端的softmax。我们正在研究所有p-theta项的梯度,因为我们关心的是我们预测的类概率因参数变化而变化的量。预测概率的变化越大,我们的更新前和更新后的预测分布之间的KL差异越大。
使自然梯度优化混淆的部分原因在于,当您正在阅读或思考它时,您必须理解和争论两个不同的梯度对象,这意味着不同的事物。顺便说一句,这对于杂草来说是不可避免的,特别是在讨论可能性时,并没有必要掌握整体直觉; 如果您不喜欢浏览所有血淋淋的细节,请随时跳到下一部分。
关于损失的梯度
![](http://n4.ikafan.com/assetsj/blank.gif)
通常,您的分类损失是一个交叉熵函数,但更广泛地说,它是某种函数,它将模型的预测概率分布和真实目标值作为输入,并且当您的分布远离目标时具有更高的值。这个对象的梯度是梯度下降学习的核心面包和黄油; 它表示如果将每个参数移动一个单位,您的损失将会发生变化。
对数似然的梯度
![](http://n4.ikafan.com/assetsj/blank.gif)
这是我学习自然梯度中最令人困惑的部分。因此,如果您阅读有关Fisher信息矩阵的内容,您将获得许多链接,说明它与模型的对数似然的梯度有关。我之前对似然函数的理解是,它代表了你的模型对某些数据集的可能性有多大; 特别是,您需要目标值来计算它,因为您的目标是计算模型分配给真实目标的概率,当您对输入要素进行调节时。在讨论可能性的大多数情况下,例如非常常见的最大似然技术,您关心对数似然的梯度,因为您的可能性越高,您的模型分配从真实分布中采样的值的概率越高,我们都快乐。实际上,这看起来像计算p(class | x)渐变的期望值,其中概率在数据中的实际类分布中得出。
但是,您也可以用另一种方式评估可能性,而不是根据真实目标值计算您的可能性(您可能希望具有非零梯度,因为它可能会推动您的参数增加概率对于真正的目标,您可以使用从条件分布本身中提取的概率来计算您的期望。也就是说,如果您的网络导致softmax,而不是基于给定观察的数据中的真实等级,以0/1概率取得logp(z)的期望,请使用该模型的估计概率作为在它期望中的权重。这将导致整体预期梯度为0,因为我们将模型当前的信念作为基本事实,但我们仍然可以得到梯度的方差(即梯度平方),这是我们的Fisher矩阵中(隐含地)计算预测类空间中的KL分歧所需要的。
用武之地
这篇文章花了很多时间讨论力学:这个东西究竟是什么叫做自然梯度估计,以及关于它如何起作用以及为什么起作用具有更好的直觉。但是,如果我不回答这个问题,我觉得自己会失职:这东西真的有价值吗?
简短的回答是:实际上,它并没有为大多数深度学习应用程序提供足够引人注目的价值。有证据表明自然梯度导致收敛发生的步骤较少,但正如我稍后将讨论的那样,这是一个复杂的比较。对于因参数空间中的缩放更新步骤的随意性而受挫的人来说,自然渐变的想法是优雅的并且令人满意。但是,除了优雅之外,我不清楚它是否提供了无法通过更多启发手段提供的价值。
据我所知,自然梯度提供了两个关键的价值来源:
1. 它提供有关曲率的信息
2. 它提供了一种直接控制模型在预测分布空间中移动的方法,与模型在损失空间中的移动不同
曲率
现代梯度下降的一大奇迹是,它通过一阶方法完成。一阶方法是仅计算与要更新的参数相关的导数而不是二阶导数的方法。使用一阶导数,您所知道的是(特定尺寸版本)曲线在特定点处的切线。您不知道切线的变化速度有多快:二阶导数,或者更具描述性,您的函数在任何给定方向上的曲率水平。曲率是一个有用的东西要知道,因为在高曲率区域,梯度从一点到另一点急剧变化,你可能需要谨慎迈出一大步,以免你攀登陡峭山峰的本地信号误导你跳下去悬崖就在眼前。不可否认,它更具启发性而不是严谨,我喜欢这样思考的方法是,如果你处于一个点到点的梯度变化很大的地区(也就是说:高变化),那么你估计梯度在某种意义上更加不确定。相比之下,如果梯度在给定点几乎没有变化,那么下一步就不需要谨慎了。
二阶导数信息非常有用,因为它可以根据曲率水平缩放步数。采取下一步措施时需要小心谨慎。二阶导数信息非常有用,因为它可以根据曲率水平缩放步数。采取下一步措施时需要小心谨慎。二阶导数信息非常有用,因为它可以根据曲率水平缩放步数。
自然梯度实际上是机械地将你的参数更新除以梯度的二阶导数。梯度相对于给定参数方向变化越大,Fisher信息矩阵中的值越高,并且该方向上的更新步骤越低。这里讨论的梯度是批次中各点的经验可能性的梯度。那不是一回事作为关于损失的梯度。但是,直观地说,可能性的巨大变化与损失函数的剧烈变化并不相符。因此,通过捕获关于给定点处的对数似然导数空间的曲率的信息,自然梯度也给出了我们真实的潜在损失空间中的曲率的良好信号。有一个非常有力的论据,当自然梯度已被证明可以加速收敛(至少在所需梯度步骤的数量方面),这就是好处的来源。
然而,请注意,我说自然梯度显示在梯度步骤方面加速收敛。这种精确度来自于自然梯度的每个单独步骤需要更长时间,因为它需要计算Fisher信息矩阵,记住,这是一个存在于n_parameters²空间中的数量。事实上,这种急剧放缓类似于通过计算真实损失函数的二阶导数引起的减速。虽然可能是这种情况,但我还没有看到它表明计算自然梯度Fisher矩阵比计算相关损失的二阶导数更快。以此为假设,与对损失本身进行直接二阶优化的(也可能是同样的,代价高昂的)方法相比,很难看出自然梯度提供的边际值是多少。
现代神经网络能够在理论预测只有一阶方法失败的情况下取得成功的原因很多,深度学习从业者已经找到了一堆巧妙的技巧来基本上凭经验逼近所包含的信息。在分析二阶导数矩阵中:
- 动量优化策略通过保持过去梯度值的运行指数加权平均值并将任何给定梯度更新偏向该过去移动平均值来起作用。这有助于解决在梯度值变化很大的空间的一部分问题:如果你经常得到相互矛盾的梯度更新,他们会平均不会有这样或那样的强烈意见,类似于减慢你的速度学习率。而且,相比之下,如果你反复得到相同方向的梯度估计值,那就是低曲率区域的指示,并建议采用更大步长的方法,动量遵循这一步骤。
- 有趣的是,RMSProp是由Geoff Hinton在课程中期发明的,它是对以前存在的称为Adagrad的算法的轻微修改。RMSProp通过获取过去平方梯度值的指数加权移动平均值,或者换句话说,过去的渐变方差,并将更新步骤除以该值来工作。这可以大致被认为是梯度的二阶导数的经验估计。
- Adam(自适应矩估计)基本上结合了这两种方法,估计梯度的运行平均值和运行方差。它是当今最常见,也是常用的优化策略之一,主要是因为它具有平滑掉这个嘈杂的一阶梯度信号的效果。
有趣的是,并且还值得一提的是,除了通常根据功能曲率缩放更新步骤之外,它们还根据这些特定方向上的曲率量不同地缩放不同的更新方向。这得到了我们之前讨论的内容,关于如何按相同的数量扩展所有参数可能不是一件明智的事情。您甚至可以根据距离来考虑这一点:如果方向上的曲率很高,那么相同数量的欧几里德参数空间中的一步将使我们在梯度值的预期变化方面进一步移动。
因此,虽然在定义参数更新的连贯方向方面不具备自然渐变的优雅,但它确实检查了大多数相同的框:能够在方向和时间点调整更新步骤,曲率不同的地方,并且,从概念上讲,给定尺寸的参数步骤具有不同程度的实际影响。
直接分配控制
好吧,所以,最后一节论述:如果我们的目标是使用对数似然的分析曲率估计作为损失曲率估计的替代,为什么我们不做后者,或接近后者,因为分析N²计算似乎都是非常耗时的。但是,如果您处于这样一种情况,即您实际上是在关注预测类别分布的变化,而不仅仅是作为损失变化的代理?这种情况甚至会是什么样的?
![](http://n4.ikafan.com/assetsj/blank.gif)
这种情况的一个例子,可能不是巧合,是当前用于自然梯度方法的主要领域之一:信任区域策略优化在强化学习领域的应用。TRPO的基本直觉包含在灾难性失败或灾难性崩溃的想法中。在策略渐变设置中,您在模型结束时预测的分布是动作分布,以某些输入状态为条件。而且,如果您正在学习政策,从您的模型当前预测的政策中收集下一轮训练的数据,则可以将您的策略更新为您无法再收集有趣数据以了解您的政策出路(例如,围成一圈的策略,这不太可能让你学到有用的奖励信号)。这就是策略遭受灾难性崩溃的意义所在。为避免这种情况,我们要谨慎行事,而不是做大幅改变我们政策的梯度更新(就我们在给定场景中对不同行动的概率而言)。如果我们在预测概率发生变化的过程中保持谨慎和渐进,那就会限制我们突然跳到不可行的政权的能力。
这就是自然梯度的一个更强有力的案例:在这里,我们关心控制的实际情况是在新参数配置下不同行为的预测概率变化了多少。我们关心它本身,而不仅仅是损失函数的代理。