
Deep Learning 学习笔记 04 – Energy-Based Model
之前的监督学习都是找一个网络 f(X) 去预测 y。如果需要反过来生成 X 就不行了。
要解决这个问题,我们需要使用生成模型(Generative Model)。生成模型不像监督学习学输入X和标签y的关系,而是学习输入X和标签y的联合分布(joint distribution),P(X,y) 或者 P(X|y) 或者 P(X)。
接下来的几课会主要讲生成模型。这一课我们先来学习基于能量的模型(Energy-Based Model)。
前置知识:马尔可夫链蒙特卡洛方法(MCMC)。
Hopfield Network
之前讲的神经网络结构都是一个DAG,那么如果我们允许神经元的连接出现环会怎么样呢?
考虑一个简化的模型。有 n 个点的带权有向完全图,每个点有一个值 yi=±1。假设边权对称,即 wij=wji。设定转移方程 yi:=Θ(∑i≠jwijyj+bi),其中 Θ(x) 当 x>0 时为 1,否则为 −1。(假设 ∑i≠jwijyj+bi)≠0。)
这就是Hopfield Network。
接下来,我们证明对于这种网络,不断地用这个转移方程更新 y,能够收敛。
定义 D(y1,y2,…,yN)=∑i<jyiwijyj+∑iyibi。假设某一步把 y− 更新成了 y+,那么 y−(∑i≠jwijyj+bi)<0,y+(∑i≠jwijyj+bi)>0。
ΔD=D(…,y+,…)–D(…,y−,…)=y+(∑i≠jwijyj+bi)–y−(∑i≠jwijyj+bi)>0
这个 D 有上界,然后 ΔD 最小值大于零,就收敛了。(如果一次更新多个y的话,也是收敛的
我们称Hopfield Network的一次转移为演化(evolution)。
定义能量(energy)E=−D,这个网络就像一个物理系统,演化之后到达(局部)最小能量的稳定的状态。
这就很好,如果我想要存的东西正好是这个网络的一个极小值,那我就算 y 有一点扰动,也可以恢复。
那么我们怎么训练这个网络呢?有一个Hebbian Learning Rule,就是对于我们想要存的模式(patten) y,让 wij:=yiyj,bi 直接简化掉不要。这个时候的 E=−12N(N−1) 是最小的。
如果要存多个patten,我们当然可以让 wij 是 1N∑Nk=1ykiykj,但是这样会出现不好的效果,比如假的(spurious)部最小值。想要解决这个问题,可以考虑机器学习中最优化的方法。
最优化(Optimization)
首先用矩阵形式化地表示Hopfield Network。对于我们希望记录的模式 P={yp},我们希望找一个能量函数 E(y)=−12yTWy。出于简化,我们忽略偏差值(bias) b。
首先我们要的不是 argminW∑y∈PE(y),否则容易直接学成 W=+∞×I 啥的。
一个朴素的想法是 argminW∑y∈PE(y)−∑y′∉PE(y′),然后梯度下降 Wk+1:=Wk–η(∑y∈PyyT−∑y′∉Py′y′T)。
但是这样以来,我们需要让选的 y′ 数量上和 |P| 相当,否则会学出 W=−∞×I 啥的。
一个比较好的办法是对于y∈P,以 y 为初始值,在Hopfield Network上演化几步得到 y′。
SGD Optimization
既然可以GD,那也能SGD。
Stochastic Hopfield Network
理论上一个有 N 个节点的Hopfield Network可以存 O(N) 个模式。想要存更多的模式,就需要更大的网络。
以图像为例,Hopfield Network中,每个yi都表示一个像素。想要扩容网络,就需要加一些冗余的神经元,或者叫隐藏(hidden)神经元。
那么新加隐藏神经元的值该怎么给呢?
一种可能的解决方法是随机赋值。但是这并不那么符合生成模型拟合概率分布的想法。
事实上,当我们有了能量函数之后,我们可以做任何事情。回忆物理上的玻尔兹曼分布,我们可以设定状态 y 的概率是 P(y)=1Zexp(−E(y)/kT)。其中 k 是一个常数,直接取1好了。T 是温度。温度越高,这个概率分布越平坦,温度越低,这个概率分布趋向于在能量最大的地方取1。
众所周知,我们可以用Gibbs Sampling随机采样。在确定 y 的其他位置的前提下,yi 的概率分布是
P(yi|yi≠j)=11+exp(−(∑jwijyj+2bi)/T).
接下来,我们可以利用退火(Annealing)来得到这个最小能量的 y。具体的做法是,一开始 T=Tmax,y 是随机初始化的值。然后每一轮,我们先进行若干步Gibbs Sampling,然后让 T:=αT。若干轮后收敛。
最大似然学习(maximum likelihood learning)
接下来我们来训练Stochastic Hopfield Network。
假设 T=1,某个特定模式 y 的概率是
P(y)=exp(12yTWy)∑y′exp(12y′TWy′).
我们要最大化似然(likelihood)
L(W)=1|P|∑y∈P12yTWy–log∑y′exp(12y′TWy′).
∇wijL(W)=1|P|∑y∈Pyiyj–1Z∑y′exp(12y′TWy′)y′iy′j
由于 y′ 的数量是指数级的,后面 log∑y′exp(12y′TWy′) 的梯度不好算。我们需要按照概率随机采样来估计这个梯度。设随机的样的集合是S,
∇wijL(W):=1|P|∑y∈Pyiyj–1|S|∑y′∈Sy′iy′j.
这里对 y′ 采样也可以像Hopfield Network上一样,从 y∈P 出发跑几步Gibbs sampling。
隐藏神经元(with Hidden Neurons)
用Stochastic Hopfield Network可以很好处理隐藏神经元。
设对于一个状态 y=(v,h),可见神经元的值是 v,隐藏神经元的值是 h。可见神经元就是能看到的部分,比如存一张图片,图片自己的像素就是可见的。
P(v)=∑hP(v,h)=∑y=(h,v)exp(12yTWy)∑y′exp(12y′TWy′)
L(W)=1|P|∑v∈Plog(∑y=(v,h)exp(12yTWy))–log∑y′exp(12y′TWy′).
前面这项的 h 的数量也是指数级的,可以用和之前类似的方法(Gibbs Sampling)按照概率随机采样。
∇wijL(W):=1|P|∑v∈PEh[yiyj]–ES[y′iy′j].
如果想要再加一个标签 c,得到 P(v|c),就让 y=(v,h,c),然后最大似然学习。
受限玻尔兹曼机(Restricted Boltzmann Machine)
Stochastic Hopfield Network确实厉害,而且有一套很好的理论性质,但是它是建立在Gibbs Sampling上的。Gibbs Sampling虽然可以做到多项式时间的采样,但是仍然需要多轮之后才能趋向平稳分布(stationary distribution),尤其是在训练的过程中,有两个需要采样的项。
于是有了受限玻尔兹曼机。与Hopfield Network不同,受限玻尔兹曼机只在隐藏神经元与可见神经元之间连边,隐藏神经元与隐藏神经元之间、可见神经元与可见神经元之间不连边。
回顾Gibbs Sampling,每次选一个维度随机选。在受限玻尔兹曼机上,由于这样的连边,我们可以同时让所有隐藏神经元或者所有可见神经元一起随机。
于是在 v 的条件下,对 h 采样就只需要一轮。对 y′ 的采样可以从 v 生成 h,然后生成 v1, 然后生成 h1,用 y′=(v1,h1) 来代替收敛后的 y′。这相当于Hopfield Network里,只增加模式附近的能量。
这玩意儿只要3次Gibbs sampling,终于能够用于实践了。
然后这玩意儿的隐藏层可以叠好多层,相邻的层之间有连边,就是Deep Boltzmann Machine。
//Hinton 牛逼(
一般的基于能量的模型
一般的基于能量的模型是先学出一个能量函数 E(x:θ),然后 P(x)=1Zexp(E(x)),其中 Z 是归一化系数。
计算 Z 的难度非常大。那么有没有办法避免 Z呢?
我们可以每次找一个正例 x 和一个反例 x′,P(x)/P(x′)=exp(E(x)–E(x′))。
想要从这个模型中采样,首先随机初始化一个 s0,然后每一轮给它加个噪声 s′=si+ϵ,如果加了之后能量变大了,就跳过去,否则以 exp(E(si)−E(si+1)) 跳过去。(Metropolis-Hasting)
No Comments