配分函数

  2019-10-18 


本文为 Deep Learning Ch.18 学习后总结的笔记

配分函数

配分函数是统计物理学中常使用的概念,在前面深度学习的结构化概率模型中出现了配分函数:$p(x)=\frac{1}{Z}\hat{p}(\vec x)$

$x$为模型中的所有参数组成的向量,记为:

为归一化此式子我们需要等比缩放,将$\hat{p}(x)$缩放到1,即:

对其求对数似然梯度:

前半部分分为正相,后半部分称为负相

正相很好解决,对于一个mini-batch中的样本直接计算即可

负相就非常难或者无法计算了,可以看到$\int \hat{p}(x;\theta)dx$实际上就是对概率图网络中的所有可能出现的$\vec x$求积分

MCMC求负相

从离散表达式开始推导

显然$e^{\log \hat{p}(x;\theta)}=\hat{p}(x;\theta)$,这里要这样变换的目的是为了凑出$\mathbb{E}_{x~p(x)}=\int p(x)f(x)$形式,以使用MCMC算法来模拟

这样就可以用MCMC方法对一个mini-batch的数据运用MCMC算法来求$\nabla_\theta \log Z$了,连续情况同理

在深度学习中,经常采用能量函数$p(x)=e^{-E(x)}$来参数化$p(x)$,这种情况下正相可以解释为压低训练样本的能量,负相可以解释为提高模型抽取出的样本的能量。确切地说就是正相推高了数据点未归一化的概率,负相压低了数据点未归一化的概率,当数据分布和模型分布相等时,正相推高数据点和负相压低数据点的机会相等,这时候就不会有任何梯度了,训练停止。

于是就可以求得$\nabla_\theta \log \hat{p}(x;\theta)$然后使用梯度算法更新模型参数$\theta$

随机最大似然和对比散度

如果对每个batch都做MCMC算法直到马尔科夫过程收敛才开始采样,磨合过程太花时间。

以下两种算法都是基于一个思想:初始化马尔科夫链为一个非常接近模型分布的分布,从而大大减小磨合过程

对比散度(contrastive divergence):在每个步骤中初始化马尔科夫链为采样自数据分布中的样本(具有$k$个Gibbs步骤的叫CD-$k$)。在开始的时候随着正相学习到模型的概率越来越精准,负相也会相应有所提高。

随机最大似然(stochastic maximum likelihood)也叫 持续对比发散(persistent contrastive divergence):在每个梯度步骤中初始化马尔科夫链为先前梯度步骤的状态值(每个更新中具有$k$个Gibbs步骤的叫PCD-$k$)

一般来说PCD的方法好于CD

以下几种方法是绕过了对配分函数进行求值

伪似然

无向图模型是非贝叶斯网络,所以在计算中会出现$\frac{p(a)}{p(b)}=\frac{\frac{1}{Z}\hat{p}(a)}{\frac{1}{Z}\hat{p}(b)}=\frac{\hat{p}(a)}{\hat{p}(b)}$形式,抵消掉了配分函数

假设$x=\{a,b,c\}$,$a$包含想要的条件分布变量,$b$包含所有想要条件化的变量,$c$包含除此之外的变量。于是根据贝叶斯公式,$p(a|b)$可以表示为概率相除的形式:

最理想的情况是$a=1,c=0$,这样计算起来就洒洒水了。但实际在计算对数似然$\log p(x)$的时候,即使使$a$足够小,$c$依然可非常以大。那么一个假设就是将$c$移动到$b$中以减少计算代价。Marlin and de Freitas(2011)证得了这种方法的有效性。

得分匹配

在前面的文章Autoencoder中用到过

定义得分(score):$\nabla_x\log p(x)$

训练策略是最小化模型对数密度和数据对数密度关于输入的导数之间的平方差期望

这样就可以避免了$Z$带来的问题,因为$Z$不是$x$的函数,所以$\nabla_xZ=0$

$L(x,\theta)=\frac{1}{2}||\nabla_x\log p_{model}(x;\theta)-\nabla_x\log p_{data}(x)||_2^2$

$J(\theta)=\frac{1}{2}\mathbb{E}_{p_{data(x)}}L(x;\theta)$

$\theta^*=\min_{\theta}J(\theta)$

比率匹配

将得分匹配推广到离散情况,主要运用在二元模型

$f(x,j)$为$j$处位置取反的$x$

配分函数会在两个概率的比例中被抵消

比例匹配还可以作为处理高维稀疏数据的基础(如词计数向量)

噪声对比估计

Noise Contrastive Estimation, NCE

思路:用一个变量来代替负相

$c$作为模型训练学习的参数之一,问题在于如何训练

不能使用最大似然估计方法了,因为$c$会被无限扩大。于是将问题转化为一个概率二分类器的监督学习问题,通俗地说就是通过训练可以让模型分得清噪声和数据。

引入等概率二值分布$p_{noise}$,使得$p_{joint}(x|y=1)=p_{model}(x),p_{joint}(x|y=0)=p_{noise}(x)$

可以看到实际上是最大化模型与噪声分布之间的对数概率之差,也就是使得真实数据与噪声之间的差异最大,这便是好的模型,也是GAN的基本思想

估计配分函数

在评估模型相对性能的时候,可能需要计算$\sum_i\log p_A(\vec x;\theta_A)>\sum_i\log p_B(\vec x;\theta_B)$是否成立,如果成立则A更优,这时候经过变化可以求得一个比值,求得该比值就可以判断谁大谁小。于是如果知道配分函数的比值,就可以判断该式子的大小关系。

如何获得配分函数的值?根据重要采样,使用提议分布$p(x)=\frac{1}{Z_0}\hat{p}_0(x)$

$Z_1=\int\hat{p}_1(x)dx$

$=\int\frac{p_0(x)}{p_0(x)}\hat{p}_1(x)dx$

$=Z_0\int p_0(x)\frac{\hat{p}_1(x)}{\hat{p}_0(x)}dx$

于是使用蒙特卡罗方法:

可以计算得到配分函数比值为$\frac{1}{K}\sum^K_{k=1}\frac{\hat{p}_1(x^{(k)})}{\hat{p}_0(x^{(k)})}$

当$KL(p_0||p_1)$较小的时候,可以有效估计出比值。但实际情况是 但实际情况中$p_1$通常是高维空间的复杂分布,很难找到一个简单的分布$p_0$既易于评估又接近$p_1$的分布,如果$p_0$与$p_1$不接近,那么$p_0$的大多数采样将在$p_1$中出现的概率较低,此时由于$\frac{\hat{p}_1(x^{(k)})}{\hat{p}_0(x^{(k)})}$很大,导致方差很大,导致估计结果很差(方差大,采样欠估计)。

退火重要采样(Annealed Importance Sampling AIS)

目前是估计无向概率模型的配分函数的最常用方法

思想是引入中间分布来缩小$p_0$与$p_1$的差距

考虑分布序列$p_{\eta_0},\cdots,p_{\eta_n},0=\eta_0<\eta_1<\cdots<\eta_{n-1}<\eta_n=1$

$\therefore \frac{Z_1}{Z_0}=\frac{Z_1}{Z_0}\frac{Z_{\eta_1}}{Z_{\eta_1}}\cdots\frac{Z_{\eta_{n-1}}}{Z_{\eta_{n-1}}}$

$=\frac{Z_{\eta_{1}}}{Z_0}\frac{Z_{\eta_{2}}}{Z_{\eta_{1}}}\cdots\frac{Z_{\eta_{n-1}}}{Z_{\eta_{n-2}}}\frac{Z_{\eta_{1}}}{Z_{\eta_{n-1}}}$

$=\prod^{n-1}_{j=0}\frac{Z_{\eta_{j+1}}}{Z_{\eta_j}}$

只要保证每个中间$p$之间足够近,就可以用低方差的重要采样来求得每一个$\frac{Z_{\eta_{j+1}}}{Z_{\eta_j}}$,上式也就求解了。

通用的流行选择是用目标分布$p_1$的加权几何平均,$p_0$为$p_{\eta_j}∝p_1^{\eta_j}p_0^{1-\eta_j}$

桥式采样(Bridge Sampling)

相比AIS,只使用一个中间分布$p$

最优的桥为$p_*^{(opt)}(x)∝\frac{\hat{p}_0(x)\hat{p}_1(x)}{r\hat{p}_0(x)+\hat{p}_1(x)}$

$r=\frac{Z_1}{Z_2}$

我们可以从粗糙的$r$开始迭代来估计最好的$r$


本章各种五花八门的方法真是复杂,看得我眼花缭乱….


且听风吟