你也是物理学家?
内容不完善。暑假期间可能会把没整理的东西,包括 GAN、NF、SBM、Meta-Learning 等东西搬上去,先别急。
一个 生成式模型 (generative model) 可以是一个支持采样的概率分布 \(P(X)\),其中 \(X\) 是生成内容;或者,它也可以额外有一个输入 \(y\),然后支持从 \(P(X\mid y)\) 中采样。
I. 基于能量的模型
I. Hopfield 网络
Hopfield 网络是一个生成式模型。其依赖于全连接网络可以储存某些信息的特征。
对于一个 \(n\) 个节点的网络 \(y\),\(y_i\) 被限制为 \(\pm1\) 两种取值。
对于某个 \(i\),定义感受野 \(z_i=\sum_{j\neq i}w_{ji}y_j+b_i\),其中 \(w,b\) 都是网络的参数,且 \(w\) 是对称矩阵。定义 hard threshold \(\Theta(z)=\begin{cases}1&(z\geq0)\\-1&(z<0)\end{cases}\)。
然后,在每一时刻,都令某个 \(y_i\gets\Theta(z_i)\)。另一种说法是,\(y_i\) 被翻转,如果 \(y_iz_i<0\)。
不断执行操作,直到系统恒定。
这必然停止吗?是的,因为关于系统可以定义熵。
令熵 \(D=\sum_{i<j}y_iw_{ij}y_j+\sum_iy_ib_i\),则每次翻转会将熵增加 \(-2y_iz_i>0\)。
因为熵有上界、初始熵有下界、每次翻转必然增加熵,所以必然收敛。
定义能量 \(E=-D\)。则在 Hopfield 网络上 evolve 的过程中能量是递减的,且 evolve 最终会落入局部最小值中,此时该局部最小值周围的某个邻域中的 evolution 都会回归该极值,就可以看做该极值被网络记忆了。
如何训练一个 Hopfield 网络,让其可以记忆我们需要的图像?
Hebbian Learning:对于要记忆的 \(\cur{y_i^*}\),令 \(w_{ij}=y_i^*y_j^*\)(假设没有 \(b\)),则此时 \(\cur{y_i^*}\) 是最低点。
问题:只能记一张图;虽然 \(y^*\) 是最值但是 \(-y^*\) 同样也是最值、被记忆了。
记多张图可以通过令 \(w=\dfrac1n\sum y^i(y^i)^T\) 解决。但是叠合起来会产生一些虚假的信息,且原本要记的某些东西可能会被叠加成非最值,不牛。
引:\(N\) 个神经元总是可以记住 \(K\leq N\) 个图样;事实上,最多可以记 \(\dfrac N4\log N\) 个图样。但是仍然会出现虚假的极小值。
因此考虑一些数值方法,比如说训练。我们有期望的 pattern \(P=\cur{y^p}\),和能量函数 \(E(y)=-\dfrac12y^TWy\)。目标是:对全体 \(y^p\) 最小化 \(E\),且对不想要的 pattern 最大化 \(E\)。
因此,我们希望有
以 \(\cur{}\) 中的东西作为 loss 进行 GD,有
蓝色的部分的效果是为 \(P\) 中的点使用 Hebbian Learning 下拉,而红色则正相反,将其上抬。
问题是我们无法枚举全体 \(y'\notin P\)。
- 方案一:只抬升谷底。
如何找到谷底?随机值开始 evolve。
因此该模式的训练方法即为:每个 epoch,用需要的 \(y\) 作为正样本、自随机的初值开始 evolve 直到收敛的 \(y'\) 作为负样本,算梯度并更新。
-
方案一的缺点:谷底的重要程度不一致。我们只需要保证被需要的东西在谷底,因此无法从任何被需要的初值 evolve 得到的谷底可以忽略。
-
方案二:只从需要的图样出发 evolve。
-
方案二的缺点:谷底可能已经有需要的初值了。
-
方案三:只抬升图样的某个邻居。
训练方法:
每个 epoch,用需要的 \(y\) 作为正样本、自随机的被需要的初值开始 evolve 数步(\(2\sim4\) 步)的 \(y'\) 作为负样本,算梯度并更新。
大功告成!
II. Boltzmann 机
Boltzmann 机是概率化的 Hopfield 网络,较之有更泛化、更优秀的能力。
对于一切含能量的模型,都可以通过定义 \(P(X)=\dfrac1Z\exp(-E(X))\) 来将其概率化。这样,低能的态就有高概率被取到。
因此,将 Hopfield 网络概率化后,就有 \(P(y)=\dfrac1Z\exp\left(\sum_{i<j}w_{ij}y_iy_j+\sum_iy_ib_i\right)\)。
翻转操作被概率化后,就是以 \(P(y_i=1\mid y_{j\neq i})\) 的概率将 \(y_i\) 设为 \(1\)。考虑仅在第 \(i\) 位不同的 \(y_i=1\) 和 \(y_i'=-1\),则有
\[\log\dfrac{P(y)}{P(y')}=-\sum_jw_{ij}y_j-2b_i \\P(y_i=1\mid y_{j\neq i})=\dfrac{P(y)}{P(y)+P(y')}=\dfrac1{1+\exp(-\sum_jw_{ij}y_j-2b_i)} \]因此,定义 \(z_i=\sum_jw_{ij}y_j+2b_i\),则有简洁的 \(P(y_i=1\mid y_{j\neq i})=\sigma(z_i)\),其中 \(\sigma\) 是 sigmoid 函数。
因此,可以以如下方式刻画 Boltzmann 机上的概率分布:
- 将分布初始化为均匀随机分布。
- 循环枚举 \(i\),然后以 \(\sigma(z_i)\) 地概率翻转,以此更新随机分布。
- 不断更新,其最后会收敛到一个唯一的随机分布。
- 此乃 Gibbs 采样。
显然维护分布是不可能的。作为替代,我们可以用采样代替分布:随机初始化 \(y(0)\),然后令 \(y_i(t+1)\sim\text{Bernoulli}(\sigma(z_i(t)))\)。迭代足够多步后,取结尾的 \(M\) 个 \(y(t)\),然后可以选择求平均作为单个输出,或者使用频率来估算概率。实际应用时取 \(M=1\) 即可。
也可以加一个关于时间的退火,即 \(y_i(\alpha T)\sim\text{Bernoulli}(\sigma(\dfrac1Tz_i(T)))\)。
因此,对 Boltzmann 机形式化描述:
- 状态集合是 \(\cur{-1,1}^n\)。
- 有能量 \(E(y)=-\dfrac12y^TWy\)。
- 有一个概率分布 \(P(y)=\dfrac1Z\exp(-E(y)/T)\)。在实际应用中,有将 \(T\) 始终设为 \(1\) 的,也有 decrease 的(退火)。
- 有参数 \(W\)(舍去了偏置 \(b\))。
会采样了,怎么训练?
某个 pattern \(y\) 的概率是
我们的目标设为最大化 \(\sum_{y\in P}P(y)\) 即可:不需要如 Hopfield 网络一样遏制不需要态(因为此处使用的是概率密度)。使用 MLE 策略得到
因为是最大化,做梯度抬升 (Gradient Ascent) 即可。
蓝色的部分直接求就行。红色的部分呢?对其求导并使用期望形式描述即得
\[\nabla_WL=\dfrac1{|P|}\sum_{y\in P}\dfrac12yy^T-\t E_{y'}[y'y'^T] \\\approx\dfrac1{|P|}\sum_{y\in P}\dfrac12yy^T-\dfrac1{|S|}\sum_{y'\in S}y'y'^T \]其中 \(S\) 是随机集合。使用采样估测期望的方法乃是 Monte-Carlo 估计。
至于如何采样 \(y'\)?请出我们的 Gibbs 采样。
III. 隐神经元 Boltzmann 机
目前我们的神经元数目为待记忆图样的像素数目。如果我们想记忆更多的图样呢?势必要增加神经元。这些新神经元并不对应着任何可见像素,即为隐神经元 (hidden neurons)。Boltzmann 机中的隐神经元应该如何赋值呢?
状态 \(y=(v,h)\),其中 \(v\) 是可见态、\(h\) 是隐藏态。我们只在意可见态的概率分布 \(P(v)=\sum_h P(v,h)\),即关于 \(h\) 的边缘分布。目标是最大化需要态的概率分布。
\[L(W)=\dfrac1{|P|}\sum_{v\in P}\log{\color{red}\sum_h\exp(-\dfrac12y^TWy)}-\log\sum_{y'}\exp(-\dfrac12y'^TWy') \]其它部分都好说。红色的部分没见过,咋办?其实也类似。
\[\nabla_wL=\dfrac1{|P|}\sum_{v\in P}\t E_h[yy^T]-\t E_{y'}[y'y'^T] \]\(\t E_{y'}\) 直接自由 Gibbs 采样。\(\t E_h\) 则固定 \(v\),且在 Gibbs 采样的过程中也只对 \(h\) 循环增广,而保持 \(v\) 恒不变。
总结而言,流程为:
- 初始化 \(W\);
- 对于每个 \(v\in P\),固定 \(v\) 然后做 \(K\) 个 条件 Gibbs。
- 再全随机做 \(M\) 个 Gibbs 采样。
- \(\nabla=\dfrac1{N_PK}\sum_{y\in S_c}yy^T-\dfrac1M\sum_{y'\in S}y'y'^T\)。
- 梯度抬升。
IV. 受限 Boltzmann 机
Boltzmann 机的一个问题是 Gibbs 采样太慢了。因此有 受限 Boltzman 机 (Restricted Boltmann Machine, RBM)。
其受限元素来源于模型不再是像朴素 BM 一样是全连接的,而是二分图式的:隐藏神经元仅与可见神经元连接,反之亦然。具体而言:
- 对于隐藏的 \(h_i\),有 \(z^h_i=\sum w_{ij}v_j\),\(P(h_i=1\mid v)=\sigma(z_i^h)\),
- 对于可见的 \(v_j\),有 \(z^v_j=\sum w_{ij}h_i\),\(P(v_j=1\mid h)=\sigma(z_j^v)\)。
这种模式的第一个优势就是增广的时候可以关于 \(h,v\) 交替进行,而单次增广时更是可以并行,比只能慢吞吞循环增广每一位的 BM 快多了。
第二个优势在于由 \(v\) 条件 Gibbs 的时候,因为 \(v\) 不变,则更是只需要增广一次即可!
尝试形式化描述这一过程。增广是一个 \(v_0\to h_0\to v_1\to h_1\to\dots\) 的过程;而有
这时,回忆起 Hopfield 网络训练的场合:借鉴“抬升邻居”的思想,我们完全可以使用
的近似!
V. 采样方法一览
基于能量的模型 (energy-based model) 拥有如下的优势:
- 从物理方法而来,因此可以借鉴物理知识。
- 在大方差时也有效。
- 拥有指数函数的优良性状。
- 高度泛用,可以对一切含能量模型定义。
但是有一个最突出的缺点,那就是:
- 需要 配分函数 (partition function) \(Z\) 进行归一化:而其常常是难以计算的。
这就引发问题:如何从概率分布 \(p(x)\) 中采样?
I. 分类分布
分类分布 (Categorical Distribution) 的类别是离散的。可以轻易通过 CDF (Cumulative Density Function) 求出与 \(U(0,1)\) 配合得出。
II. Gauss 分布
可以使用中心极限定理,但是效率很低。
更常见的方法是使用 Box-Muller 定理 + 极角变换(虽然两者都没有讲解)。
如何使用 \(\c N(\b0,I)\) 生成 \(\c N(\b\mu,\Sigma)\)?生成 \(\b z\gets\c N(\b 0,I)\) 然后 \(\b x=\Sigma\b z+\b\mu\)。
III. 重要性采样
一类通用的采样方式是,对于 \(p(x)\) 构建 提议分布 (proposal distribution) \(q(x)\) 然后则有
方差最小的 \(q(x)\propto p(x)|f(x)|\)。这被称作 重要性采样 (Importance Sampling)。
IV. MCMC
对于遍历性的 Markov 链,可以使用充分条件
来保证 \(\pi\) 是 \(T\) 的 stationary distribution。于是就有 Metropolis Hastings 算法确保上述条件:
- 使用提议分布 \(q(s'\mid s)\) 自 \(s\) 生成下一步提案 \(s'\)。
- 以 \(\min(1,\dfrac{p(s')q(s'\to s)}{p(s)q(s\to s')})\) 的概率 接受 (accept) 这次转移并切换至态 \(s'\),反之 拒绝 (reject) 并停在原地。
有更简单的 Gibbs 采样摒弃了接受率的概念。Gibbs 采样仅适用于 \(n\) 元组的采样,每次增广仅更改元组的某一维,且 \(q(s_i\to s_i')=p(s_i'\mid s_{j\neq i})\)。Boltzmann 机的采样正是应用了这一招。
VI. 总结
Boltzmann 可以生成图像,也可以复原受污染的图像(从污染图像出发 evolve),更可以补全被切割的图像(条件 Gibbs)。
同时,它甚至可以胜任分类工作:将 label 的 one-hot 向量也看做状态的一部分,即 \(y=(v,h,c)\)。则分类相当于求后验概率 \(P(c\mid v)\);进一步地,甚至可以做条件生成,即 \(P(v\mid c)\)!二者都可以通过条件 Gibbs 达到。
II. 基于隐变量的模型
如何构建易于采样、易于计算可能性的模型?
I. 隐变量模型
一种可能的方式是所谓的“隐变量模型 (latent variable model)”:有隐变量 \(z\) 和显变量 \(x\),则 \(p(x,z)=p(z)p(x\mid z)\)。
- \(p(z)\):隐变量的先验分布 (prior distribution)
- \(p(x\mid z)\):条件分布 (conditional distribution)
- \(p(z\mid x)\):后验分布 (posterior distribution)
- \(p(x)=\int_zp(x\mid z)p(z)\):边缘分布 (marginal distribution)
如果 \(p(z)\) 和 \(p(x\mid z)\) 都是易于采样的,则边缘分布 \(p(x)\) 同样易采样;但是,使用这种手法可以描述比较复杂的分布。也即,可以让先验、条件易采样易计算分布,则边缘易采样难计算分布、后验难采样难计算分布。
例如,Gaussian 混合模型 (Gaussian Mixture Model, GMM) 就是一个较简单的隐变量模型。
有多个 Gaussian 分布。\(z\sim\t{Categorical}(w_1,\dots,w_k)\) 决定 \(x\) 自哪个分布中采样,有了 \(z\) 后即有 \(x\sim\c N(\b\mu_z,\Sigma_z)\)。
模型的参数是类别权重 \(w_k\),以及 Gaussian 参数 \(\b\mu_k,\Sigma_k\)。其训练的过程被称作 聚类 (clustering)。
如何训练一个隐变量模型?对于数据集 \(D=\cur{x^i}\),使用 MLE,则有
其中,红色部分的边缘分布是计算的难点。
尝试使用 Importance Sampling。
尝试 propose 一个 \(q(z)\),然后有
\[p(x;\theta)=\sum_zp(x,z;\theta)=\sum_zq(z)\dfrac{p(x,z;\theta)}{q(z)} \\L(x;\theta)=\log\sum_zq(z)\dfrac{p(x,z;\theta)}{q(z)} \]此时,因为 \(\log\) 的凹性,所以可以应用 Jensen 不等式
\[\log(\sum_i\alpha_ix_i)\geq\sum_i\alpha_i\log x_i \]于是有
\[L(x;\theta)=\log\sum_zq(z)\dfrac{p(x,z;\theta)}{q(z)}\geq\sum_zq(z)\log\dfrac{p(x,z;\theta)}{q(z)} \\=\t E_{z\sim q}\log\dfrac{p(x,z;\theta)}{q(z)} \]此乃 Evidence Lower Bound (ELBO),是可以被计算、优化的期望形式。
但是,对 ELBO 的优化并不意味着对原始指标 \(L(\theta)\) 的优化。
要想两者尽量贴合,就需要满足
\[q(z)=p(z\mid x;\theta) \]此时就直接有
\[\sum_zq(z)\log\dfrac{p(x,z;\theta)}{q(z)}=\sum q(z)\log p(x;\theta)=\log p(x;\theta) \]即与下界贴合。
因此,可以提出如下的模式:
- 对于当前的 \(p(x,z;\theta^k)\),令 \(q(z;\theta^k)\gets p(z\mid x;\theta^k)\)。(Estimate Step)
- 对于固定的 \(q(z;\theta^k)\),使用其优化 \(p(x,z;\theta^{k+1})\)。(Maximize Step)
- 不断迭代。
此乃 EM 算法。M-Step 是容易的,但是 E-Step,求后验概率,似乎并非容易。
首先将 \(q(z)\) 参数化为 \(q(z;\phi)\)。然后使用 reverse KL 散度 \(\t{KL}(q\|p)\) 来衡量分布差异。
这种方法被称作变分推断 (Variational Inference),因为其理论根底来源于变分法。
因为 KL 是不对称的,所以上式要保证 \(q\) 在前面(reverse KL)。\(p\) 在前面的 forward KL 也有其应用场合。
对其推导。
\[L(\phi)=\t{KL}(q(z;\phi)\| p(z\mid x))=\sum_zq(z;\phi)\log\dfrac{q(z;\phi)p(x)}{p(z,x)} \\=\sum_zq(z;\phi)\log p(x)+\sum_zq(z;\phi)\log\dfrac{q(z;\phi)}{p(z,x)} \\={\color{lightblue}\log p(x)}-{\color{pink}\sum_zq(z;\phi)\log\dfrac{p(z,x)}{q(z;\phi)}} \]其中,蓝色的部分是与 \(q\) 无关的常数,而红色的部分与 ELBO 完全相同,也被称作变分下界 (Variational Lower Bound)。
把式子移一下,又有
\[\log p(x)=&{\color{lightblue}\t{KL}(q(z;\phi)\| p(z\mid x))}&+&{\color{pink}\sum_zq(z;\phi)\log\dfrac{p(z,x)}{q(z;\phi)}}& \\&{\color{lightblue}\text{Approximation Error}}&&{\color{pink}\text{ELBO}}& \]这个式子中出现 ELBO 不是什么巧合,而是因为其就是一种绕开 Jensen 不等式对前述的
\[L(x;\theta)=\log p(x)\geq{\color{pink}\text{ELBO}} \]的重证明;KL 项总是非负的。
现在,对于单个 \(x\),可以通过训练 \(q(z;\phi)\) 来拟合 \(p(z\mid x;\theta)\),也可以通过提议的 \(q(z;\phi)\) 来优化 \(p(x;\theta)\)。但是,这里的 \(q(z;\phi)\) 尚还需要针对每个 \(x\) 分开训练。可以进一步地将 \(q\) 用一个神经网络替换,使其可以接受 \(x\) 作为输入,变成 \(q(z\mid x;\phi)\) 的完全体。这样,误差式子就直接写成一个联合误差
训练目标是
\[J(\phi,\theta;x)=\sum_zq(z\mid x;\phi)\log\dfrac{p(z,x;\theta)}{q(z\mid x;\phi)} \\=\sum_zq(z\mid x;\phi)(\log p(z,x;\theta)-\log q(z\mid x;\phi)) \\=\sum_zq(z\mid x;\phi)(\log p(x\mid z;\theta)-\log q(z\mid x;\phi)+\log p(z;\theta)) \]最终得到
\[\\=&{\color{pink}\t E_{z\sim q(z\mid x;\phi)}\log p(x\mid z;\theta)}&-&{\color{lightblue}\t{KL}(q(z\mid x;\phi)\|p(z;\theta))}& \\&{\color{pink}\text{Reconstruction Likelihood}}&&{\color{lightblue}\text{KL Divergence}}& \]其中,红色部分衡量由 \(q\) 提案的 \(z\) 生成的 \(x'\) 有多贴近原始的 \(x\),所谓“Reconstruction Likelihood”;蓝色部分即为 KL 散度。
框架有了,具体模型呢?
II. Variational Autoencoder
最简单的方式。直接令
- \(p(z)\sim\c N(\b0,I)\)。
- \(p(x_{ij}\mid z;\theta)\sim\c N({\color{red}f_{ij}(z;\theta)},1)\)。
- \(q(z\mid x;\phi)\sim\c N\Big({\color{red}\b\mu(x;\phi)},\text{diag}({\color{red}\sigma(x;\phi)}^2)\Big)\)。
- 其中,红色的部分全是神经网络。
训练 时的具体实现为:
- encoder:对输入 \(x\) 过两个神经网络分别生成 \(\b\mu,\sigma\),然后用它们采样 \(z\)。
- decoder:用 \(z\) 生成 \(f\),然后用其生成 \(x\)。
这其中,encoder 只在训练时有用。训练的目标是联合优化
其中,KL 散度的部分,对于 \(k\) 维分布 \(\c N_0(\b\mu_0,\Sigma_0),\c N_1(\b\mu_1,\Sigma_1)\),有
而 ELBO 的部分,可以作 Monte-Carlo 估测。
\(\theta\) 在期望外面,所以是好计算误差的:因为有 \(p(x_{ij}\mid z;\theta)\sim\c N(f_{ij}(z;\theta),1)\),所以
\[L(\theta)=\t E_{z\sim q(z\mid x;\phi)}\log p(x\mid z;\theta)\propto \t E_{z\sim q(z\mid x;\phi)}\|f(z;\theta)-x\|^2 \]但是,\(\phi\) 在期望下面,我们得想办法把它移上去,才能通过 MC 估测。
当有 \(z\sim\c N(\mu,\sigma^2)\) 时,可以看做 \(z=\mu+\sigma\cdot\eps\),其中 \(\eps\sim\c N(0,1)\)。因此有
\[L(\phi)\propto\t E_{z\sim q(z\mid x;\phi)}\|f(z)-x\|^2 \\=\t E_{\eps\sim\c N(0,1)}\|f(\mu(x;\phi)+\sigma(x;\phi)\cdot\eps)-x\|^2 \]此时便从期望下面移走了。此乃 重参数化技巧 (Reparameterization Trick)。
实际应用时,均只 sample 一次即可。
III. Standard Autoencoder
何为 Autoencoder (AE)?是一种端到端无监督学习的技巧,试图通过 encoder 将高维的信息 \(\b x\) 压缩成低维的特征 \(\b z\),然后再通过 decoder 将其还原。VAE 较 AE 的区别是为 \(\b z\) 引入了不确定性。
IV. VAE 扩展
如果原图随机被 mask 了怎么办?我们期许被 mask 的图仍然可以被补全为原图,因此在训练时需要有意识地将输入给 \(q\) 的 \(x\) mask,但是希望其 decode 出未被 mask 的图。
如果图像还有其对应的 label \(y\) 怎么办?无非是 encoder 和 decoder 都多一个额外参数,encoder 是 \(q(z\mid x,y)\),decoder 是 \(p(x\mid y,z)\) 即可。
如果既有有监督数据又有无监督数据,即 半监督训练 (semi-supervised training) 咋办?
Decoder 使用 \(p(x\mid y,z)\),Encoder 使用 \(q(z\mid x,y)\)。可以假设 \(q(z,y\mid x;\phi)=q(z\mid x;\phi)\cdot q(y\mid x;\phi)\)。
在有监督训练时,encoder 可以正常进行,而 decoder 对 \(z\mid x\) 使用常规 VAE、对 \(y\mid x\) 使用交叉熵处理。
在无监督训练时呢?KL 散度是 \(\t{KL}(q(z)\|p(z))+\t{KL}(q(y)\|p(y))\),其中 \(p(z)\) 是 \(\c N(0,I)\)、\(p(y)\) 是 uniform,这两个是容易的;但是 Reconstruction Loss 呢?
这个对于 \(\theta\) 可以 Monte-Carlo。但是对于 \(\phi\),reparameterization 的技巧无法对 \(y\) 适用。因此,只能适用最朴素的手法,即枚举 \(y\)。
V. VAE 总结
好处:结构灵活、训练稳定、收敛快。
坏处:KL 散度的内生问题。\(\t{KL}(q\| p)\) 被称作 reverse 或 exclusive KL,因为其倾向于 cover 最显著的一个特征而忽略其它特征;\(\t{KL}(p\|q)\) 则被称作 forward 或 inclusive KL,因为其倾向于 cover 整体,取一个贴近平均值的效果。同时,使用 MLE 作为 loss,使用 Gaussian 作为 \(p,q\) 假设的分布,只做一步 sample,这些操作都会使得图像模糊。
VI. VAE 变体
\(\beta\)-VAE 对其加上了一个微小但非常有用的修改
绿色部分的 \(\beta\) 的效果是:
- \(\beta=0\) 是常规 AE。
- \(\beta=1\) 时是常规 VAE。
- \(\beta>1\) 时会让特征 \(\b z\) 的各维度之间倾向于解耦,相对独立地操纵生成物的每一维。