概述
之前在《平均场变分推断:以混合高斯模型为例》一文中有简要提到变分推断,但只涉及到一些基本的理论知识,最近跟几位朋友讨论也觉得写的过于粗糙,知识点过于分散,加之以近期读到WWW2018和KDD2018上关于VAE在推荐系统召回(TOP-N问题)种的应用十分有趣,一时兴起,遂成此文,写了一篇关于贝叶斯的大杂烩。
贝叶斯的观点
在《平均场变分推断:以混合高斯模型为例》种有提到过贝叶斯推断的pipeline,可以总结为:
- 根据观察者的知识,做出合理假设,假设数据是如何被生成的
- 将数据的生成模型转化为数学模型
- 根据数据通过数学方法,求解模型参数
- 对新的数据做出预测
上面的整个流程其实隐含了一些贝叶斯学派的观点:我们对事件的估计是结合了先验(个人知识)和后验知识(实验数据)的。
这个观点十分合理,因为当我们只相信自己的个人知识,就会过于主观,而只相信实验数据又会被实验的具体实施情况带着走。
举个例子来说,如果我们在08年观看了知道一个射击手A在奥运会射击了100次,其中90次击中目标,10次没击中,那么这些历史上的经历就成为了我们的先验知识。时间来到了2020年,我们再去观看该射击手的比赛,时过境迁,我们知道射击手的水平肯定存在一定的变化,所以他目前的水平如何我们并不知晓,于是我们观察他现在的比赛,他前三次都没有击中,而第四次击中了,于是只相信实验数据的人会给出估计:选手命中率为25%,而相信自己先验知识的人会给出估计:选手命中率为90%,这两种估计的结果似乎都有道理,但却相差甚远。而一个贝叶斯学派的人会告诉你,他估计的结果是由先验知识+后验数据组成的,他给出的估计是: 1 + 90 100 + 4 = 87.5 % \frac{1+90}{100+4}=87.5\% 100+41+90=87.5%,从直觉上来说,似乎这才是一个更可靠的答案。
生成模型和朴素贝叶斯分类
朴素贝叶斯分类器是很简答却又很有效的一个分类器,在文本分类种很常用,现在很多垃圾邮件过滤器中都有贝叶斯分类器的影子。以垃圾邮件分类问题为例,假设有邮件
W
i
W_i
Wi与其对应的类别
y
i
y_i
yi(0表示正常邮件,1表示垃圾邮件),我们把邮件看作是一个词袋,也就是词的集合,于是可以写做
W
i
=
{
w
0
,
w
1
,
.
.
.
w
n
}
W_i=\{w_0, w_1, ...w_n\}
Wi={w0,w1,...wn},于是垃圾邮件分类问题就成了一个求解
p
(
y
=
1
∣
W
i
)
p(y=1|W_i)
p(y=1∣Wi)的问题。根据贝叶斯后验概率公式,可以得到:
p
(
y
=
1
∣
W
i
)
=
p
(
W
i
∣
y
=
1
)
p
(
y
=
1
)
p
(
W
i
)
(1)
p(y=1|W_i)=\frac{p(W_i|y=1)p(y=1)}{p(W_i)} \tag{1}
p(y=1∣Wi)=p(Wi)p(Wi∣y=1)p(y=1)(1)
如果我们假设邮件中的每个词出现的概率是相互独立的,那么可以进一步化简为:
p
(
y
=
1
∣
W
i
)
=
p
(
y
=
1
)
⋅
∏
k
=
1
p
(
w
k
∣
y
=
1
)
∏
k
=
1
p
(
w
k
)
p(y=1|W_i)=\frac{p(y=1)\cdot \prod_{k=1}p(w_k|y=1)}{\prod_{k=1} p(w_k)}
p(y=1∣Wi)=∏k=1p(wk)p(y=1)⋅∏k=1p(wk∣y=1)为了数值稳定我们可以将等号两边取对数让加法代替乘法于是得到了
log
p
(
y
=
1
∣
W
i
)
=
log
p
(
y
=
1
)
+
∑
k
log
p
(
w
k
∣
y
=
1
)
−
∑
k
log
p
(
w
k
)
(2)
\log p(y=1|W_i)=\log p(y=1) + \sum_k \log p(w_k|y=1)-\sum_k \log p(w_k) \tag{2}
logp(y=1∣Wi)=logp(y=1)+k∑logp(wk∣y=1)−k∑logp(wk)(2)
对于常见的实现来说,式子(2)中的第一项
log
p
(
y
=
1
)
\log p(y=1)
logp(y=1),第二项中的
log
p
(
w
k
∣
y
=
1
)
\log p(w_k|y=1)
logp(wk∣y=1)都可以从整个训练样本中统计频率来近似得到这两个概率,第三项对于每个邮件来说都是常数,不影响分类结果,可以直接忽略。其实从直觉上来看,上面朴素贝叶斯分类器也十分容易理解:统计出各个词在垃圾邮件中出现的概率,然后对于一封新邮件,统计邮件中的词在垃圾邮件中出现的概率之和(对数和),例如在线棋牌
这个词出现在垃圾邮件中概率比较大,那么当一个邮件中包含这个词的时候我们有理由猜测它是一个垃圾邮件。
到这里我们重新审视朴素贝叶斯分类器,虽然带着“贝叶斯”三个字,但除了用了贝叶斯公式之外,跟之前提到的贝叶斯推断没有太大关系,也没有什么pipeline之说。其实这里的朴素贝叶斯只是披着贝叶斯外衣的频率派做法,原因在于上述的分布
p
(
w
k
∣
y
=
1
)
p(w_k|y=1)
p(wk∣y=1)和
p
(
y
=
1
)
p(y=1)
p(y=1)都是直接从数据中统计得到的,对于概率
p
(
y
=
1
)
p(y=1)
p(y=1)而言,由于分类只有0, 1两类,所以在总样本量足够的情况下,0和1的样本都足够多,使用频率来估计概率本身不会有太大问题,但是对于分布
p
(
w
i
∣
y
=
1
)
p(w_i|y=1)
p(wi∣y=1)而言,由于我们常用词有数千个之多,也就是说当我们有数万样本的时候,每个
w
i
w_i
wi平均才会出现10次左右,于是不可避免地,会有许多
w
i
w_i
wi只出现一两次,如果恰巧这一两次都出现在垃圾邮件里,就会给出
p
(
w
k
∣
y
=
1
)
=
1
p(w_k|y=1)=1
p(wk∣y=1)=1的荒谬结果,严重带偏模型。所以我们需要结合先验信息来校准这个估计。
我们现在以贝叶斯推断的角度重新审视邮件分类的问题。首先根据上述贝叶斯推断的pipeline,我们会假设数据是如何生成的。对于垃圾邮件分类问题,我们假设一封垃圾邮件是这样生成的:
- 首先我们从狄利克雷分布 D i r ( u ⃗ ∣ α ⃗ ) Dir(\vec u|\vec \alpha) Dir(u∣α)中采样得到了主题参数 u ⃗ = [ u 1 , u 2 , u 3 , . . . , u i ] \vec u=[u_1, u_2, u_3, ..., u_i] u=[u1,u2,u3,...,ui],该主题参数代表垃圾邮件中 w 1 , w 2 , w 3 , . . . , w i w_1, w_2, w_3, ..., w_i w1,w2,w3,...,wi各个词出现的概率
- 然后利用主题参数,从多项分布 M u l t i ( W i ; u ⃗ ) Multi(W_i; \vec u) Multi(Wi;u)中采样得到词袋(垃圾邮件)
于是对于式子(1), 我们的目的在于估计出
p
(
W
i
∣
y
=
1
)
p(W_i|y=1)
p(Wi∣y=1), 也就是我们上述的参数
u
⃗
\vec u
u,可以写做
p
(
u
⃗
∣
W
)
∝
p
(
W
∣
u
⃗
)
⋅
p
(
u
⃗
)
(3)
p(\vec u|W) \propto p(W|\vec u) \cdot p(\vec u) \tag{3}
p(u∣W)∝p(W∣u)⋅p(u)(3)
对于式子(3)我们采用最大后验估计,也就是说要找到一个
u
⃗
∗
\vec u^*
u∗使得
p
(
u
⃗
∗
∣
W
)
p(\vec u^*|W)
p(u∗∣W)取得最大值,而由于
p
(
W
∣
u
⃗
)
p(W|\vec u)
p(W∣u)为多项式分布,而
p
(
u
⃗
)
p(\vec u)
p(u)为狄利克雷分布,而狄利克雷分布正式多项式分布的共轭先验,并且后验分布为
p
(
u
⃗
∣
W
)
=
D
i
r
(
u
⃗
∣
α
⃗
+
n
⃗
)
p(\vec u | W) = Dir(\vec u| \vec \alpha + \vec n)
p(u∣W)=Dir(u∣α+n)
其中
n
⃗
=
[
n
⃗
1
,
n
⃗
2
,
n
⃗
3
,
.
.
.
,
n
⃗
i
]
\vec n=[\vec n_1, \vec n_2, \vec n_3, ..., \vec n_i]
n=[n1,n2,n3,...,ni]表示垃圾邮件中词
w
i
w_i
wi出现的次数。并且根据狄利克雷分布的性质,我们知道当
u
⃗
=
[
α
1
+
n
1
∑
i
α
i
+
n
i
,
α
2
+
n
2
∑
i
α
i
+
n
i
,
α
3
+
n
3
∑
i
α
i
+
n
i
,
.
.
.
,
α
i
+
n
i
∑
i
α
i
+
n
i
]
\vec u=[\frac{\alpha_1+n_1}{\sum_i \alpha_i+n_i}, \frac{\alpha_2+n_2}{\sum_i \alpha_i+n_i}, \frac{\alpha_3+n_3}{\sum_i \alpha_i+n_i},..., \frac{\alpha_i+n_i}{\sum_i \alpha_i+n_i}]
u=[∑iαi+niα1+n1,∑iαi+niα2+n2,∑iαi+niα3+n3,...,∑iαi+niαi+ni]时
p
(
u
⃗
∣
W
)
p(\vec u|W)
p(u∣W)取得最大值。从形式上看,也就是在我们统计概率
p
(
w
i
∣
y
=
1
)
p(w_i|y=1)
p(wi∣y=1)时统计次数上加了一个平滑参数
α
i
\alpha_i
αi
再扯一些题外的话,以前我刚入行的时候,对于生成模型和判别模型的区别总是很困惑,在书本上的解释是“生成模型通过求p(x, y)来间接求得p(y|x),而判别模型则直接拟合p(y|x)”,我对此大为不解。对于直接拟合 p ( y ∣ x ) p(y|x) p(y∣x)的方式,由于本质上是在找一个判别平面,所以叫做判别模型似乎是顺理成章的事情,但为什么间接求p(y|x)的方法就要叫做“生成模型”呢,到底是生成了什么呢?时至今日我阅读了一点点贝叶斯相关的理论,知道了“通过p(x, y)来间接求p(y|x)”隐含了贝叶斯推断的一系列过程,其中最经典的一步就是要假设数据的生成过程,这大概就是生成模型叫法的来源吧。
变分推断
其实在《平均场变分推断:以混合高斯模型为例》中关于变分推断已经有所阐述,但这里为了阅读上的连续性,再简要写一下。
其实在贝叶斯推断过程中,最重要的是计算我们关注的目标变量的后验分布
p
(
y
∣
x
)
p(y|x)
p(y∣x), 也就是给定了特征
x
x
x的条件下,估计
y
y
y的分布,上述垃圾邮件分类就是一个例子。但是在很多模型中,不是所有的随机变量都可以观测到的,比如在混合高斯聚类,HMM等模型中,就存在不可观测的隐变量,而变分推断则是用来解决这些带有隐变量问题的数学工具。
我们把隐变量设为
z
z
z, 可观测的变量设为
x
x
x,那么根据贝叶斯公式有:
p
(
z
∣
x
)
=
p
(
z
,
x
)
p
(
x
)
=
p
(
x
,
z
)
∑
z
p
(
x
,
z
)
p(z|x)=\frac{p(z, x)}{p(x)}=\frac{p(x, z)}{\sum_z p(x, z)}
p(z∣x)=p(x)p(z,x)=∑zp(x,z)p(x,z)
如果这时候
z
z
z是一个高维向量,那么分母部分的积分复杂度将指数爆炸,无法计算。而变分推断的 思路在于绕过这个复杂的计算,转而使用一个参数化的
q
(
z
)
q(z)
q(z)来近似分布
p
(
z
∣
x
)
p(z|x)
p(z∣x),也就是通过最优化算法调整参数使得
K
L
(
q
(
z
)
∣
∣
p
(
z
∣
x
)
)
KL(q(z) || p(z|x))
KL(q(z)∣∣p(z∣x))最小化。这个优化问题可以形式化地表述为:
q
(
z
)
∗
=
arg
min
q
(
z
)
K
L
(
q
(
z
)
∣
∣
p
(
z
∣
x
)
)
q(z)^*=\mathop{\arg \min}_{q(z)} KL(q(z)||p(z|x))
q(z)∗=argminq(z)KL(q(z)∣∣p(z∣x))
我们将KL散度展开为:
KL
(
q
(
z
)
∥
p
(
z
∣
x
)
)
=
E
q
(
z
)
[
log
q
(
z
)
]
−
E
q
(
z
)
[
log
p
(
z
∣
x
)
]
=
E
q
(
z
)
[
log
q
(
z
)
]
−
E
q
(
z
)
[
log
p
(
z
,
x
)
]
+
log
p
(
x
)
(4)
\begin {aligned} \operatorname{KL}(q(\mathbf{z}) \| p(\mathbf{z} | \mathbf{x})) &= \mathbb{E}_{q(z)}[\log q(\mathbf{z})]-\mathbb{E}_{q(z)}[\log p(\mathbf{z} | \mathbf{x})] \\ &= \mathbb{E}_{q(z)}[\log q(\mathbf{z})]-\mathbb{E}_{q(z)}[\log p(\mathbf{z,x})] +\log p(x) \end {aligned} \tag{4}
KL(q(z)∥p(z∣x))=Eq(z)[logq(z)]−Eq(z)[logp(z∣x)]=Eq(z)[logq(z)]−Eq(z)[logp(z,x)]+logp(x)(4)
在最小化的过程中由于
log
p
(
x
)
\log p(x)
logp(x)难以计算,于是退而求其次,稍作变换最小化目标为
E
q
(
z
)
[
log
q
(
z
)
]
−
E
q
(
z
)
[
log
p
(
z
,
x
)
]
\mathbb{E}_{q(z)}[\log q(\mathbf{z})]-\mathbb{E}_{q(z)}[\log p(\mathbf{z,x})]
Eq(z)[logq(z)]−Eq(z)[logp(z,x)], 等同于最大化其取负后的结果,形式化地表述如下:
q
(
z
)
∗
=
arg
max
q
(
z
)
E
q
(
z
)
[
log
p
(
z
,
x
)
]
−
E
q
(
z
)
[
log
q
(
z
)
]
(5)
q(z)^*=\mathop{\arg \max}_{q(z)} \mathbb{E}_{q(z)}[\log p(\mathbf{z}, \mathbf{x})]-\mathbb{E}_{q(z)}[\log q(\mathbf{z})] \tag{5}
q(z)∗=argmaxq(z)Eq(z)[logp(z,x)]−Eq(z)[logq(z)](5)
上述地优化目标被称之为evidence lower bound ,即ELBO, 国内有翻译为“证据下界”,也有翻译为“变分下界”。换个角度来看ELBO,其实
E
L
B
O
(
q
(
z
)
)
=
log
p
(
x
)
−
K
L
(
q
(
z
)
∣
∣
p
(
z
∣
x
)
)
ELBO(q(z))=\log p(x) - KL(q(z)||p(z|x))
ELBO(q(z))=logp(x)−KL(q(z)∣∣p(z∣x)),因为KL散度的非负性,于是有:
log
p
(
x
)
≥
E
L
B
O
(
q
(
z
)
)
\log p(x) \ge ELBO(q(z))
logp(x)≥ELBO(q(z))
所以本质上最大化ELBO就是在最大化
log
p
(
x
)
\log p(x)
logp(x),这一点在最大似然估计和最大后验估计上思路都是相似的。
EM算法
我们重新审视下式子(5),首先将其改写成为:
E
L
B
O
(
q
(
z
)
)
=
E
q
(
z
)
[
log
p
(
z
)
]
+
E
q
(
z
)
[
log
p
(
x
∣
z
)
]
−
E
q
(
z
)
[
log
q
(
z
)
]
=
E
q
(
z
)
[
log
p
(
x
∣
z
)
]
−
K
L
(
q
(
z
)
∣
∣
p
(
z
)
)
(6)
\begin{aligned} ELBO(q(z)) &= \mathbb{E}_{q(z)}[\log p(\mathbf{z})] + \mathbb{E}_{q(z)}[\log p(\mathbf{ \mathbf{x}|z})]-\mathbb{E}_{q(z)}[\log q(\mathbf{z})] \\ & = \mathbb{E}_{q(z)}[\log p(\mathbf{ \mathbf{x}|z})] - KL(q(z)||p(z)) \end{aligned} \tag{6}
ELBO(q(z))=Eq(z)[logp(z)]+Eq(z)[logp(x∣z)]−Eq(z)[logq(z)]=Eq(z)[logp(x∣z)]−KL(q(z)∣∣p(z))(6)
我们可以形象地将
p
(
z
∣
x
)
p(z|x)
p(z∣x)称之为编码过程,这代表着将向量
x
x
x编码成一个隐向量
z
z
z的过程,而反之将
p
(
x
∣
z
)
p(x|z)
p(x∣z)称之为解码过程,事实上解码过程也对应这贝叶斯推断pipeline中假设的数据生成过程。而一般来说数据生成过程也是参数化的,例如在高斯混合聚类中,就假设类别是从一个参数为
(
μ
,
σ
2
)
(\mu, \sigma^2)
(μ,σ2)的高斯分布中采样的。由于
p
(
x
∣
z
)
=
p
(
z
∣
x
)
p
(
x
)
p
(
z
)
p(x|z)=\frac{p(z|x)p(x)}{p(z)}
p(x∣z)=p(z)p(z∣x)p(x),所以自然地
p
(
z
∣
x
)
p(z|x)
p(z∣x)也是参数化的,并且参数就是
p
(
x
∣
z
)
p(x|z)
p(x∣z)是一致的。
而另一方面在变分推断中编码过程由于使用了参数化的
q
(
z
)
q(z)
q(z)去近似,所以也是参数化的。我们把解码过程的所有参数组织成参数向量
θ
\theta
θ, 编码过程的所有参数组织成参数向量
ϕ
\phi
ϕ,那么变分推断的目标就变成了:
arg
max
θ
,
ϕ
E
L
B
O
(
q
(
z
)
;
θ
,
ϕ
)
\mathop{\arg \max}_{\theta, \phi} ELBO(q(z); \theta, \phi)
argmaxθ,ϕELBO(q(z);θ,ϕ)
上面这个式子的优化,可以采用类似于坐标上升法的思路,首先固定解码参数
θ
\theta
θ,然后优化
ϕ
\phi
ϕ,这里的优化是使得
q
(
z
)
q(z)
q(z)尽可能靠近
p
(
z
∣
x
)
p(z|x)
p(z∣x), 接着再固定
ϕ
\phi
ϕ去优化
θ
\theta
θ,这里的优化是使得
p
(
z
∣
x
)
p(z|x)
p(z∣x)最大化,也就是最大后验估计。
所以变分贝叶斯推断的过程可以总结如下:
- 假设数据的生成过程 p ( x ∣ z ; θ ) p(x|z; \theta) p(x∣z;θ)
- 选取一个参数化的 q ( z ; ϕ ) q(z; \phi) q(z;ϕ)去近似 p ( z ∣ x ; θ ) p(z|x; \theta) p(z∣x;θ)
- 使用最优化算法优化 E L B O ( q ( z ) ; θ , ϕ ) ELBO(q(z); \theta, \phi) ELBO(q(z);θ,ϕ)
如果使用坐标上升法来求解第三步的话,上述过程又可以细化成:
1. 在第i轮迭代中,固定
p
(
z
∣
x
;
θ
i
−
1
)
p(z|x; \theta_{i-1})
p(z∣x;θi−1)
2. 优化参数
ϕ
i
=
a
r
g
m
a
x
ϕ
E
L
B
O
(
q
(
z
)
;
ϕ
)
\phi_i=argmax_{\phi} ELBO(q(z); \phi)
ϕi=argmaxϕELBO(q(z);ϕ)
3. 固定参数
q
(
z
;
ϕ
i
)
q(z; \phi_i)
q(z;ϕi), 最优化
θ
i
=
a
r
g
m
a
x
θ
E
L
B
O
(
q
(
z
)
;
θ
)
\theta_i=argmax_{\theta} ELBO(q(z); \theta)
θi=argmaxθELBO(q(z);θ)
如果上述步骤中, 在每一轮迭代中直接取取
q
(
z
)
q(z)
q(z)为
p
(
z
∣
x
;
θ
i
−
1
)
p(z|x; \theta_{i-1})
p(z∣x;θi−1)的形式,这就得到了EM算法。实际上EM算法的E步就是(5)式子中取
q
(
z
)
=
p
(
z
∣
x
;
θ
)
q(z) =p(z|x; \theta)
q(z)=p(z∣x;θ)之后的结果:
E
q
(
z
)
[
log
p
(
z
,
x
)
]
−
E
q
(
z
)
[
log
q
(
z
)
]
=
∑
z
q
(
z
)
log
p
(
z
,
x
)
q
(
z
)
\mathbb{E}_{q(z)}[\log p(\mathbf{z}, \mathbf{x})]-\mathbb{E}_{q(z)}[\log q(\mathbf{z})] = \sum_z q(z) \log \frac{p(z, x)}{q(z)}
Eq(z)[logp(z,x)]−Eq(z)[logq(z)]=z∑q(z)logq(z)p(z,x)
而如果我们取
q
(
z
)
=
∏
j
=
1
m
q
j
(
z
j
)
q(\mathbf{z})=\prod_{j=1}^{m} q_{j}\left(z_{j}\right)
q(z)=∏j=1mqj(zj),就得到了《平均场变分推断:以混合高斯模型为例》中所说的平均场变分推断方法。
变分自编码机
在贝叶斯推断过程中,需要假设数据的生成过程,但是这个假设实际上非常难以设计,一方面要考虑假设的合理性,另一方面又要兼顾求解的便利性。所以往往在做假设的时候都习惯假设从高斯分布,多项式分布中采样,并且配合共轭先验来简化求解过程。但是时至今日算力的发展可以让我们用大力出奇迹的方式来求解问题,于是我们可以将更多精力放在假设合理性上面,而神经网络的发展又让我们可以无脑假设(反正神经网络拟合一切),于是神经网络配合大规模算力的方式与贝叶斯推断结合,产生了变分自编码机。
变分自编码机本质上就是假设数据生成过程(解码过程)
p
(
x
∣
z
)
p(x|z)
p(x∣z)为一个神经网络,而编码过程
p
(
z
∣
x
)
p(z|x)
p(z∣x)也为一个神经网络,在原论文中编码过程被设置成了一个高斯分布,其均值和方差都是通过神经网络拟合而来:
N
(
f
(
x
)
,
g
(
x
)
)
N(f(x), g(x))
N(f(x),g(x)), 具体网络结构如下:
VAE的优化目标就是式子(6),也就是ELBO。
总结
我在读书的时候,很多时候课本上会直接给我甩出一堆结论或者方法,然后给出很多例子或者证明,来证明这些结论或者方法的正确性,这使我十分困惑,不是困惑这些证明过程,或者质疑这些方法的正确性,而是这些方法总是好像变魔术似的从某个大牛的脑子里面就抛出来了,完全不知道为什么他们当时如何思考,如何得出这些方法的。但是当我知识面慢慢拓宽的时候,这些思路和知识发展的过程慢慢清晰起来,有时候感觉学一门学科而不去学它的发展历史,是没办法真正理解这门学科的。也许有时候走慢一点,多去看一看历史上已经“过时”的方法,会给我们带来不一样的见解吧。