现在的深度学习模型都使用梯度下降法来进行训练。在梯度下降法的每个步骤中,参数值通常是从某个点开始,然后逐步将它们移动到模型最大损失减少的方向。我们通常可以通过从整个参数向量中计算损失的导数来实现这一点,也称为雅可比行列式。然而,这只是损失函数的一阶导数,它没有任何关于曲率的信息,换言之就是一阶导数改变的速度。由于该点可能位于一阶导数的局部近似区域中,并且它可能离极值点并不远(例如,在巨大的山峰之前的向下曲线),这时我们需要更加谨慎,并且不要以较大步长向下降低。因此,我们通常会采用下面等式中的步长 α 来控制我们的前馈速度。

散度的散度公式_散度公式_散度的运算公式

这个步长正在做这样一些事情:它以一个固定的值约束了你要在渐变方向上更新每个参数的距离。在这个算法的最简单版本中,我们采用一个标量,alpha,假设其值为 0.1,并将其乘以对损失函数求的梯度。注意,我们的梯度实际上是一个向量,也就是相对于模型中每个参数的损失梯度。因此当我们将它乘以标量时,实际上我们将沿着每个参数轴按照相同的固定量散度公式,按比例更新一个欧几里德参数距离。而且,在最基本的梯度下降版本中,我们在训练过程中使用的是相同步长。

但是……这样做真的有意义吗?使用较小学习率的前提是我们知道单个梯度的局部估计值可能仅在该估计周围的小局部区域中有效。但是,参数可以存在于不同的尺度上,并且可以对学习的条件分布产生不同程度的影响。而且散度公式,这种程度的影响可能会在训练过程中波动。从这个角度来看,在欧几里德参数空间中去固定一个全局范围看起来并不像是一件特别明智或有意义的事情

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

散度的散度公式_散度的运算公式_散度公式

接下来,本文将尝试建立一种更强大,更直观的理解方法,称为自然梯度学习,这是一种在概念上很优雅的想法,是为了纠正参数空间中尺度的任意性。我将深入探讨它是如何工作的,如何在不同数学思想之间构建起桥梁,并在最后讨论它是否以及在何处实际有用。

所以,第一个问题是:计算分布之间的距离有什么用?

KL散度赋能

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

散度的散度公式_散度公式_散度的运算公式

在数学上,它是通过计算从一个分布或另一个分布采样的 x 值取得的对数概率的比率的期望值(即,概率值的原始差异)来获得的。于是,取自其中一个分布或另一个分布的期望使得它成为了一个非对称度量,其中 KL(P || Q)!= KL(Q || P)。但是,在许多其他方面,KL 散度带给我们关于概率距离是这样的概念:它是直接根据概率密度函数的定义来衡量,也就是说,在定义的分布上的一堆点的密度值的差异。这有一个非常实用的地方,对于“X的概率是多少”这样的一个问题,当X没限定范围时,可以有各种不同的分布。

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

相关的费舍尔理论

到目前为止,我们已经讨论过为什么在参数空间中缩放更新每一步的距离是令人不满意的项目加盟,并给出了一个不那么随意的替代方案:也就是我们模型预测的类分布最多只能在一个 KL 散度范围内,去更新我们的每一步距离。对我来说,理解自然梯度最困难的部分是另一部分:KL 散度和 Fisher 信息矩阵之间的联系。

先讲故事的结尾,自然梯度是像下面公式这样实现的:

在等号上面的 def 意思是右边的内容是左边符号的定义。右边是由两部分组成,首先,是参数关于损失函数的梯度(这是与正常梯度下降步骤中使用的一样的梯度)。“自然”位来自第二个部分:Z 的对数概率函数的平方梯度的期望值。我们将这整个部分,称为 Fisher 信息矩阵,然后将损失梯度乘以其逆。

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

对自然梯度优化感到困扰的部分原因在于,当你正在阅读或思考它时,你必须理解两个不同的梯度对象,也就是两个不同的事物。顺便说一句,这对于想要深入了解它是不可避免的一步,特别是在讨论概率时。我们没有必要去抓住这样的一个直觉; 如果您不喜欢浏览所有的细节,请随时跳到下一部分

关于损失函数的梯度

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

散度的运算公式_散度的散度公式_散度公式

对数似然的梯度

散度公式_散度的运算公式_散度的散度公式

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

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

所以……它有帮助吗?

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

简短的回答是:实际上,它并没有为大多数深度学习应用程序提供足够引人注目的价值。 有证据表明自然梯度仅需要很少的步骤就能让模型收敛,但正如本文稍后将讨论的那样,这是一个复杂的比较过程。对于那些被参数空间中随意更新步骤的方法困扰的人来说,自然梯度的想法是优雅并且令人满意的。但是,除了优雅之外,我不清楚它是否提供了更多的价值。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注