最近在(第 N 次)学习强化学习,这次从 TRPO 论文着手,结果还没到代码实现层面,就先被论文中的数学推导拦住了,主要是卡在了几个不熟悉的数学概念上面。
于是决定挨个学习一遍,现在的大模型让自学门槛真的下降了太多太多,话不多说,今天先从 Fisher Information Matrix 开始,发车!
作者:basicv8vc
https://zhuanlan.zhihu.com/p/2073916531818361431
从参数估计问题说起
我们先从经典的统计任务出发:
已知一组观测数据 x_{1:n}=(x_1,x_2,\ldots,x_n),假设数据来自概率分布 p_\theta,我们希望推断出未知参数 \theta。
先说下符号约定:大写 X 表示随机变量,代表一次随机观测,小写 x 表示 X 的一条观测值(或者称为采样值),多条观测值记为 x_{1:n}=(x_1,\ldots,x_n)。
举个例子 🌰,假设抛一次硬币的结果服从伯努利分布:
参数 \theta 表示硬币正面朝上的概率。然后我们连续抛 n 次硬币,观察到 x_{1:n}=(x_1,\ldots,x_n),其中有 k 次正面朝上,整组观测数据的联合概率为
数据 x_{1:n} 一旦确定,k 和 n 也随之确定,未知的只有参数 \theta。
于是,上式就成了关于 \theta 的函数,这便引出了**似然函数(likelihood function)**的概念:
- 从概率论角度看 p_\theta(x_{1:n}):参数 \theta 和概率分布 p_\theta 已知,我们关心的是观测数据 x_{1:n} 的生成概率
- 从统计学角度:则是已知观测值 x_{1:n},并且假定分布族 p_\theta 的形式已知(例如假定观测值服从伯努利分布),但参数 \theta 未知,我们关心的是如何利用观测数据估计 \theta
最大似然估计
有了似然函数,就可以解决我们最关注的问题:参数 \theta 是多少?或者说哪个 \theta 值最能解释观测到的数据 x_{1:n}?
最常用的方法莫过于最大似然估计法,求解出似然函数最大值对应的 \hat{\theta}_{\mathrm{MLE}},把它作为真实参数的估计值:
为了计算简便(把乘法转为加法),定义对数似然函数:
由于对数函数单调递增,最大似然和最大对数似然得到的参数估计值相同,因此后面都用对数似然函数求解 \hat{\theta}_{\mathrm{MLE}}:
这里稍微区分一下:\hat{\theta}_{\mathrm{MLE}} 是使似然函数取得最大值的参数值,L_n(\hat{\theta}_{\mathrm{MLE}};x_{1:n}) 是似然函数的最大值,但有时候拗口,我会统称为最大值,希望不要引起误会。
score function
当得到估计值 \hat{\theta}_{\mathrm{MLE}} 后,下一个问题自然就是:这个估计值准吗?
可惜现实中我们往往不知道真正的参数 \theta^\star,否则也就不需要估计了,所以无法评估 \hat{\theta}_{\mathrm{MLE}} 是否等于 \theta^\star。
Fisher 换了一个角度去思考:为什么有些参数能够估得很准,有些估计的不准,是什么决定了参数能否被准确地估计出来?
我们这样思考:对于真实参数 \theta^\star,它对应的概率分布是 p_{\theta^\star},有个离 \theta^\star 非常近的参数 \theta^\star+\Delta\theta,它对应另一个概率分布 p_{\theta^\star+\Delta\theta}。
- 如果 p_{\theta^\star} \approx p_{\theta^\star+\Delta\theta},两个概率分布几乎相同,那么它们采样出来的观测值也会很类似,此时面对观测数据 x_{1:n},我们是不是很难判断 x_{1:n} 究竟是来自 p_{\theta^\star} 还是 p_{\theta^\star+\Delta\theta}?换句话说,我们很难区分 p_{\theta^\star} 和 p_{\theta^\star+\Delta\theta},也就意味着难以区分参数是 \theta^\star 还是 \theta^\star+\Delta\theta。
- 反过来,如果 p_{\theta^\star} 和 p_{\theta^\star+\Delta\theta} 差异很大,那么两个概率分布采样的观测数据可能也会有很大差异,此时面对观测数据 x_{1:n},我们会更容易判断 x_{1:n} 究竟是来自 p_{\theta^\star} 还是 p_{\theta^\star+\Delta\theta},换句话说,容易区分 p_{\theta^\star} 和 p_{\theta^\star+\Delta\theta},也就意味着容易区分参数是 \theta^\star 还是 \theta^\star+\Delta\theta。
因此,我们似乎可以得到这样一个 insight:
如果你认可这个 insight,那么接下来要思考的问题就是:如何衡量一份观测数据 x_{1:n} 对两个邻近参数 \theta^\star 和 \theta^\star+\Delta\theta 的区分能力呢?
为了便于理解问题本质,我们简化问题,用一个观测值 x 代替 x_{1:n},这并不会影响结论。
一种方法是比较 x 在两个参数下的似然 p_{\theta^\star}(x) 和 p_{\theta^\star+\Delta\theta}(x),更具体一点,比较它们的似然 ratio:
注意,虽然这里写成 p_\theta^\star(x),但由于观测值 x 已经固定,它其实是似然函数,至于为什么不写 L,原因是 p_\theta(x) 很灵活:固定 \theta 它是概率密度函数,固定 x 它又是似然函数。
如果比值接近 1,说明对于 x 来说,两个邻近参数几乎没有区别;如果它明显偏离 1,说明这份数据比较容易区分它们。
为了方便分析,对似然 ratio 取对数:
由于 \Delta\theta 非常小,对 \log p_{\theta^\star+\Delta\theta}(x) 在 \theta^\star 附近做一阶泰勒展开:
于是:
wow,现在又多了一个选择,可以用 \frac{\partial}{\partial\theta} \log p_\theta(x) 解释两个邻近参数是否容易被区分。
而它在统计学里有一个专门的名字,叫做得分函数(score function):
我们看 score 是啥?它是对数似然函数对参数 \theta 的导数!导数的含义是函数值相对于自变量的变化快慢。
- 如果 |s_\theta(x)| 很大,那么参数稍微改变一点,对数似然值就会发生明显变化,那么观测数据 x 就容易区分 \theta 和它邻近参数
- 如果 |s_\theta(x)| 很小,那么参数稍微改变一点,对数似然值几乎不变,这份观测数据就不太容易区分 \theta 和它的临近参数
Fisher Information
到目前为止,我们讨论的都是一个固定的观测数据 x,如果 |s_\theta(x)| 很大,只能说明:对于这一次观测 x,在参数 \theta 附近,邻近参数比较容易区分。
但一次观测显然具有随机性,如果换成另一次观测 x',得到的 s_\theta(x') 可能完全不同。
所以我们更好奇的是:如果不断重复采样,得到不同的观测值然后计算 score,这些 score 的平均值会是多少?
这其实就是在计算随机变量 s_\theta(X) 的期望。
先简单解释下为什么 s_\theta(X) 是随机变量:前面讨论似然函数时,我们是固定观测值 x,让参数 \theta 变化;现在则是把参数 \theta 固定,然后不断重复实验 X \sim p_\theta,每一次实验都可能得到不同的观测 x_1,x_2,x_3,\ldots,于是也会得到不同的 score s_\theta(x_1),s_\theta(x_2),s_\theta(x_3),\ldots。因此,当 X 是随机变量时,s_\theta(X) 也成为了一个随机变量。
OK,我们就来看下随机变量 s_\theta(X) 的期望是多少,假设 X 服从离散分布:
Oh!score 期望是 0,如何去理解它的物理含义呢?
前面我们只关注 |s_\theta(x)| 的大小,绝对值越大,意味着观测值 x 越容易区分 \theta 和邻近参数,我们还没讨论过 score 的正负是什么含义。
固定参数 \theta,不断从 p_\theta 中采样,有些观测得到正的 score:从几何角度看,对数似然函数斜率为正,那么增大 \theta,对数似然函数的值也增大,意味着 x 支持我们取更大一些的 \theta;如果得到负 score,对数似然函数斜率为负,那么减小 \theta 对数似然函数的值是增大的,意味着 x 支持我们取稍小一些的 \theta。而观测数据 x 来自 p_\theta,所以平均来看,这些向左和向右的"信号"恰好可以抵消掉。
既然 score 期望为 0,似乎对我们理解 score 没有帮助,那么继续看方差:
而这个量,就是 Fisher Information:
下标 1 表示一次随机观测所包含的 Fisher Information
如何理解 Fisher Information 呢,为什么名字中要包含"information"?归根到底还是对 |s_\theta(x)| 大小的解释,这个上一节已经解释过,再来一遍加深印象。
- 如果 I(\theta) 很大,说明 |s_\theta(x)| 普遍比较大,而它的含义是对数似然的导数,那么参数 \theta 稍微改变一点,对数似然值就会发生明显变化,那么观测数据 x 就容易区分 \theta 和它邻近参数,进而参数 \theta 就更容易被精确估计。
- 反过来,如果 I(\theta) 很小,\theta 附近很多参数产生的对数似然差不多,难区分 \theta 和它的临近参数,自然也就很难精确估计 \theta。
也就是这样去理解:
于是 I(\theta) 和参数 \theta 能否被准确估计之间「存在某种关联」,说它蕴含了 \theta 的信息(information)似乎也就可以接受了。
为什么"邻近参数容易区分"意味着"参数估计得更精确"?
前面的解释更多还是一种直觉,其实统计学家已经给出了严格的证明,当样本量 n 足够大时,\hat\theta_{\mathrm{MLE}} 满足渐近正态性(Asymptotic Normality of the MLE):
近似成:
由于独立样本的 Fisher information 可以相加 I_n(\theta^\star)=nI_1(\theta^\star),因此 \operatorname{Var} \left( \hat\theta_{\mathrm{MLE}} \right) \approx \frac{1}{I_n(\theta^\star)},也就是说 I_n(\theta^\star)\uparrow 意味着 \operatorname{Var} \left( \hat\theta_{\mathrm{MLE}} \right) \downarrow。
总的来说可以这样理解:
从 Fisher Information 到 Fisher Information Matrix
前面为了便于理解,一直假设 \theta 是一个标量,但在机器学习领域,参数通常是向量形式:
这时 score 自然也是向量:
其中第 i 个分量表示:如果固定其他参数,只让参数 \theta_i 移动一点,对数似然函数变化得有多快。
标量情况下,我们用 score 方差作为 Fisher Information:I_1(\theta)=\mathbb E_{X\sim p_\theta} \left[ s_\theta(X)^2 \right]=\operatorname{Var}_{X\sim p_\theta} [s_\theta(X)]。
现在 score 变成了随机向量,因此自然把"方差"推广成随机向量的协方差矩阵,再加上 \mathbb E[s_\theta(X)]=0,于是
这就是 Fisher Information Matrix(FIM)。
对角线上的元素 \mathbb E[s_i^2] 描述每个参数方向上的 score 波动大小,非对角线元素 \mathbb E[s_is_j] 描述不同参数方向上的 score 如何一起变化。
Fisher Information Matrix、Hessian 矩阵和对数似然函数的平均曲率
上一节从 score 的协方差出发,给出了 Fisher Information Matrix (FIM) 的定义:
FIM 还有另一种看起来完全不同的形式。为了容易理解下面的推导,我们先回到标量参数 \theta。
如下图所示,两个对数似然函数都是在 \hat\theta=0 处取得最大值,并且最大值还相同,但是蓝色曲线在 0 点比较平缓,而黑色曲线则比较尖锐,简单说就是蓝色显胖,黑色显瘦。(原文配图:两条对数似然曲线的"胖瘦"对比)

如何去量化曲线在某个点的胖和瘦呢?用导数可以吗?
显然一阶导数不行,因为在最大值点 \hat\theta=0,一阶导数为 0,那就用二阶导数,物理含义是曲率(curvature),描述了对数似然函数在 \theta 处弯曲得有多厉害。
由于在最大值处,二阶导数通常是负数,因此我们通常在前面加一个负号将其转为正数 -\frac{\partial^2}{\partial\theta^2} \log p_\theta(x)。
和前面分析 score function 一样,我们关注的是:如果不断从 p_\theta(x) 重复采样,得到不同的观测值然后计算曲率,这些曲率的平均值 -\mathbb E_{X\sim p_\theta} \left[ \frac{\partial^2}{\partial\theta^2} \log p_\theta(X) \right] 会是多少?
还记得 \mathbb E_{X\sim p_\theta}[s_\theta(X)]=0 吗?也就是 \sum_{x\in\mathcal X} p_\theta(x)s_\theta(x)=0。
神奇的事情来了:
左边不是 Fisher Information 嘛!
如果 \theta 是向量,二阶导数自然推广成 Hessian 矩阵,于是:
这就是 FIM 的第二种形式:对数似然函数的平均负曲率。
所以目前我们已经有 FIM 的两种形式:
- 第一种形式从 score 的协方差理解 Fisher Information(对数似然函数一阶导的协方差)
- 第二种形式则从对数似然函数的平均曲率理解 Fisher Information,并且引出了 Hessian 矩阵(对数似然函数二阶导的期望)
Fisher Information Matrix 和 KL 散度
回到最开始的问题:如何衡量 \theta 和 \theta+\Delta\theta 是否容易被区分呢?
前面我们通过 score function 和对数似然函数的曲率两种形式,回答了这个问题。
但还有一个更加直接的角度:两个参数 \theta 和 \theta+\Delta\theta,分别对应概率分布 p_\theta 和 p_{\theta+\Delta\theta},我们是否可以直接比较这两个概率分布的差异呢?不就可以知道它们是否容易被区分了吗?
如何衡量两个概率分布差异,用统计距离啊!其中最经典的就是 KL 散度:
如果两个分布非常接近:
说明即使参数发生微小变化,但概率分布几乎不变,那么用观测数据就很难区分参数 \theta 和 \theta+\Delta\theta。
反过来,如果 KL 散度很大,说明参数的微小变化会导致概率分布发生明显变化,邻近参数就容易区分。
虽然 KL 散度可以衡量邻近参数的可区分性,但是注意,KL 散度仍然依赖某个具体的参数变化 \Delta\theta,例如 2\Delta\theta 比 \Delta\theta 对应更大的参数移动,KL 散度通常也会更大。
而 Fisher Information 想描述的是更加普遍性的问题:在当前参数 \theta 附近,参数移动一点点,会导致 KL 散度发生多大的变化?
这和前面从 score function 得到 Fisher Information 的思路类似:单个观测下的 score s_\theta(x) 只描述具体观测值 x 的情况,为了得到与具体观测无关的通用结论,用随机变量 X 研究 score 的平均变化 \mathbb E[s_\theta(X)^2]。
同样地,现在我们希望弄清楚当 \theta \rightarrow \theta+\Delta\theta 时,KL 散度会如何变化?
借助泰勒二阶展开:
将其代入 KL 散度:
观察第一项 \mathbb E_{X\sim p_\theta}[s_\theta(X)]=0,因此一阶项消失:
利用前面得到的 FIM 第二种形式:
得到:
由此可见 F(\theta) 就是 KL 散度的二阶项系数,得到 FIM 第三种形式:
如何理解物理含义呢?前面提过二阶导表示曲率,因此 FIM 是 KL 散度在两个概率分布重合位置的曲率。
总结
我们本来想分析问题
- 1:估计值 \hat{\theta}_{\mathrm{MLE}} 是否准确,但是缺乏 ground truth \theta^\star 遂作罢,于是我们思考问题
- 2:什么决定了参数 \theta^\star 能否精确估计?不过我们也没有直接去回答这个问题,而是转头回答另一个问题
- 3:能否利用观测数据 x 区分 \theta^\star 和临近参数?
幸运的是,如果问题 3 的答案是容易区分 \theta^\star 和临近参数,那么也就间接回答了问题 2:参数 \theta^\star 能被精确估计。
那么问题 3 的答案是什么?综合全文,我们知道是 Fisher Information:Fisher Information 越大,临近参数越容易区分。这也回答了问题 2:到底什么决定了参数 \theta^\star 能否精确估计?是 Fisher Information。
再来回顾 Fisher Information Matrix 的三种形式:
score(对数似然函数一阶导)的协方差
对数似然函数二阶导的期望,平均曲率
KL 散度在两个概率分布重合位置的曲率