自然梯度

什么是自然梯度

首先,我们必须理解标准梯度下降。

假设我们有一个神经网络,由一些参数向量参数化。我们想要调整这个网络的参数,所以网络的输出在某种程度上发生了变化。在大多数情况下,我们会有一个损失函数来告诉我们的网络它的输出应该如何变化。

利用反向传播,我们计算每个参数对损失函数的导数。这些导数代表了我们可以更新参数以得到损失函数中最大变化的方向,我们称之为梯度。

然后我们可以调整梯度方向上的参数,通过一小段距离,以训练我们的网络。

在我们如何定义“小距离”时出现了一个小问题。

在标准梯度下降法中,距离是指参数空间中的欧氏距离。

#for example, with two parameters (a, b)
distance = sqrt(a^2 + b^2)  

然而,根据调整参数的多少来定义“距离”并不总是正确的。为了形象化,我们来看两对高斯分布。

两个分布中,均值都从-1变化到1,距离都是2。然而,很明显,第一个分布的变化比第二个大得多。

这就引出了一个关键的观点:我们的梯度测量的是改变参数对输出的影响程度。但是,必须在上下文中看到这对输出的影响:第一个分布中+2的移位比第二个分布中+2的移位意味着更多。

自然梯度的作用是重新定义我们更新参数的“小距离”。并非所有参数都相等。与其平等地对待每个参数的变化,我们需要根据每个参数的变化对我们网络的整个输出分布的影响程度来衡量它。

怎么做

首先,我们定义一种新的距离形式,它对应于基于KL散度的距离,KL散度是一种衡量新分布和旧分布差异的度量。

我们通过定义一个度量矩阵来实现这一点,它允许我们根据一些定制的度量来计算向量的距离。

对于一个有5个参数的网络,我们的度量矩阵是5x5。为了用metric计算参数delta变化的距离,我们使用下面的方法

totaldistance = 0  
for i in xrange(5):  
    for j in xrange(5):
        totaldistance += delta[i] * delta[i] * metric[i][j]

如果我们的度规矩阵是单位矩阵,这个距离和我们用欧几里得距离是一样的。

然而,大多数时候我们的度规不是单位矩阵。有了度量,我们对距离的测量就可以考虑各种参数之间的关系。

结果是,我们可以用费雪信息矩阵作为度规,它可以用KL散度来度量delta距离。

费雪信息矩阵是KL散度的二阶导数

现在我们有了一个度量矩阵,它根据给定参数变化时的KL散度来度量距离。

这样,我们就可以计算出标准梯度应该如何缩放。

natural_grad = inverse(fisher) * standard_grad  

证明过程

总结

参考

https://wiseodd.github.io/techblog/2018/03/14/natural-gradient/
http://kvfrans.com/what-is-the-natural-gradient-and-where-does-it-appear-in-trust-region-policy-optimization/

你可能感兴趣的:(自然梯度)