自然梯度(一):Fisher信息矩阵作为黎曼度量

在一般的梯度下降中,我们认为目标函数梯度的负方向可以最小化一步更新后的目标函数值,这里隐含地假设了参数空间是欧氏空间,且参数构成了一组正交归一的坐标系统。在很多情况下,这一假设是不成立的,作为结果,优化过程的收敛效率可能受到影响。 作为解决这一问题的一种思路,自然梯度使用Fisher信息矩阵(的逆)作为梯度的pre-conditioner来矫正梯度的方向。本文将分为两篇,在第一篇中,我们从Fisher信息矩阵(FIM)的定义出发,推导出Fisher矩阵与KL散度的关系,并建立如下结论:FIM可以作为概率模型的参数空间的一种黎曼度量。在第二篇中,我们推导自然梯度中为何引入FIM来修正梯度方向,以及自然梯度的一些性质。 Score function与FIM 假设我们有一个由$\theta$参数化的概率模型,模型分布为$p(x|\theta)$,记对数似然函数为$\ell(\theta|x):=\log p(x|\theta)$。与对数似然函数相关的有两个定义,score function和fisher information。 定义1(score function):score function $s(\theta|x)$被定义为对数似然函数关于参数$\theta$的梯度 $$ s(\theta|x)=\nabla_\theta \ell(\theta|x) $$ 一些文章会提到score function是用来为参数的好坏打分(score),这是不严谨的。score function中的「score」其实不是为参数打分,而是在Fisher研究的遗传统计问题中给基因异常家庭的「打分」(参见:Interpretation of “score”)。因此,score function只是约定俗成的一种名称,其实质就是似然函数的梯度,描述的是似然函数对于参数变化的敏感程度。 性质1:Score function期望为0 $$ \mathbb{E}_{p(x|\theta)}[s(\theta|x)]=\boldsymbol{0} $$ proof ...

2025-02-05 · Tianyang Lin

关于语言建模中的Tied Embeddings的一点探讨

Tied embeddings,即将语言模型中的输入Embeddings权重与输出分类器的权重两组参数共享的操作,一度是语言建模和机器翻译任务的标准配置。在语言模型大规模化之后,这种设计在开源模型中愈发少见了。前几天看到@苏剑林 之前的一篇博客语言模型输出端共享Embedding的重新探索,为tied embeddings的消失提供了一种视角,但也还有值得商榷的地方,本文想从这篇文章出发做一点探讨。 初始Loss的视角 这里先简要概括一下苏老师文章中的阐述框架1。在使用Transformer做语言建模的时候,可能会使用类似DeepNorm等初始化手段,从而使每一个Transformer Block接近于一个恒等映射2,同时由于词元表征是0均值的,因此LayerNorm可以看做与RMSNorm等价3。所以,假设每个残差分支都初始化为0,假设输入中某个位置的初始embedding是$\boldsymbol{w}_i$(对应词表中的第$i$个词,维度是$d$),那么最终得到的表征满足 $$ \frac{\boldsymbol{w}_i}{\Vert\boldsymbol{w}_i\Vert \big/\sqrt{d}} \approx \frac{\boldsymbol{w}_i}{\sigma} $$ 假设在该位置的真实标签是词元$j$,则损失函数可以由如下逼近 $$ \begin{align}\mathcal{L}\triangleq -\log p(j|i) &= \log \sum\limits_k e^{\boldsymbol{w}_i\cdot \boldsymbol{w}_k / \sigma} - \boldsymbol{w}_i\cdot \boldsymbol{w}_j \big/ \sigma \\ &\approx \log \sum_k e^{\boldsymbol{w}_i\cdot \boldsymbol{w}_k / \sigma}\\ &=\log \left(e^{\boldsymbol{w}_i\cdot \boldsymbol{w}_i / \sigma} + \sum\limits_{k|k\neq i} e^{\boldsymbol{w}_i\cdot \boldsymbol{w}_k / \sigma}\right)\\ &\approx\log \left({\color[rgb]{0, 0.5, 0.8}e^{d \sigma}} + (n-1)\right) \end{align} $$ 其中$|n|$是词表大小。在常见的模型维度下,这里的第一项${\color[rgb]{0, 0.5, 0.8}e^{d \sigma}}$是比较大的。我们可以代入几个维度值看下第一项的大小,这里我们假设词表大小是32k,并考虑两种$\sigma$取法,一种是比较常见的初始化超参数$\sigma=0.02$,一种是取$\sigma=1/\sqrt{d}$。可以看到无论是哪种初始化方法,对应的${\color[rgb]{0, 0.5, 0.8}e^{d \sigma}}$都已经远远超过词表大小,响应地初始损失值也处于比较高的水平(按均匀分布的交叉熵是$\log(n)\approx 10.37$)。 不同设定下的「初始损失值」 以上是苏文中给出的关于语言建模中不再共享embedding的一个视角——tied embeddings会使语言模型的初始损失值很大。 ...

2025-01-18 · Tianyang Lin