草饲有深度,反刍懂学术
I
data:由 sample 和 label 组成。
目标:训神经网络,将 sample 对应到 label。
模型:判别式模型(discriminative model)【给定图片判定它是猫猫】/生成式模型(generative model)【给定 cat 生成猫猫图片】
课程内容:
- NN 架构 (architecture)。
- 对架构训练相应模型的参数的算法。
- 部署模型。
- 子领域!
DL 是
传统 ML:手动定义特征并根据特征优化。
DL:端到端学习。
为什么这做得到?
假设1:一个 NN 可以(近似)表达一切函数。
假设2:存在牛的算法可以自动推理一个好的 NN。
连接主义:对人脑的拙劣近似罢了。连接主义机器的所有知识都存储于连接中,与 Von-Neumann 架构不同。
Turing 的连接主义机器:B-type machine,所有的 unit 是 NAND 节点,搭配 A-type machine 奖惩地修改权重。
McCulloch-Pitts Neuron (MP Neuron):第一个神经元的数学表达。可以刻画一切 boolean function。
Hebbian Learning:第一个为 NN 设计的学习算法。原则:同时触发的神经元结构相似。公式:\(w_i=w_i+\eta x_iy\)。
SNARC:实体 NN。
perceptron:感知机,识别图片。它只能识别那些线性可分的问题,因此甚至无法表征 xor 运算。
但是可以使用多层感知机!!!
一个双层 MLP 可以实现所有两个 bit 间的运算。两个 \(N\)-bit 数间的运算,如果使用双层 MLP,至少需要 \(2^{N-1}\) 个神经元。但是,通过提高层数,\(K\)-MLP 需要 \(\exp(\Omega(N^{1/{(k-1)}}))\)。
训一个 3-节点的 NN 是 NP-Complete 的!
为什么 MLP 的训练很困难?因为数据离散,所以不知道应该向哪个方向移动,进而只能搜索。
于是把 MLP 的阶跃函数 \([\geq0]\) 换成连续的 sigmoid 即可!
然后直接 backpropagation 即可。Hinton et;al 以两个家族的分类为例,并提出了 weight decay、smoothing 等概念的先驱。
II.
MLP 的宽度往往是底层宽(学习底层知识)但上层窄。
深度越深越好,但是过深也会引发一些问题。
Filter:一层 CNN 的 kernel。
Receptive Field:感受野,CNN 中某个神经元对应的原图中的部分。
Stride:步长。可以减少 feature map。
多层 CNN 中,如果没有 max-pooling,则底层某个像素变化会大幅度影响高层的信息。我们希望接受扰动,因此使用 max-pooling。
max-pooling 的 stride 一般都等于 kernel size。其会导致大小减少,以对细节的敏感度为代价增加鲁棒性。
除了 max-p,也可以用 average-p。
average-p 也是一种 convolution。因此也可以从头卷到尾,(把 pooling 也参数化),被称作 F
时域卷积网络:语音识别。
III.
Lipschitz 连续:\(|g(x)-g(y)|\leq L|x-y|\)。
在作 GD 时,我们会假设函数是光滑凸函数。这意味着:
- \(f(x)\) 是凸的。
- \(f(x)\) 的梯度是 Lipschitz 连续的。
- \(f(x)\) 的二阶梯度是有界的。
- 这是一个合理的假设,因为 sigmoid 等函数的导数都是很平滑的,因此我们基本上可以认为,设计较为优秀的神经网络都是 smooth 的。
但是,ReLU 并非光滑的。这就是为什么有人喜欢用 Leaky ReLU \(\max(ax,x)\),或者 Exponential LU (\(a(e^x-1):x<0; x:x>0.\))。
满足上述条件的函数,有 下降引理
因此,当知道 \(f(x)\) 时,可以构建一个二次上界 \(g(y)=f(x)+\nabla f(x)^T(y-x)+\dfrac L2|x-y|^2\);迭代的时候就是渐进地让这个上界贴近真实函数的过程。
为了让迭代最好,需要让 \(\eta=\dfrac1L\);但是,任何 \(0<\eta<\dfrac2L\),都可以让下界变小。
假设 \(k\) 步后收敛至最优的 \(X^*=X^k\),则有
右式是常数。
如果我们希望 \(X^k\) 满足 \(|\nabla f(X^k)|^2\leq\eps\),即小导数、接近极小值的点,则有一个 \(k=O(1/\eps)\)。即,如果有知道 Lipschitz 常数 \(L\),通过智慧地令 \(\eta=1/L\),我们可以达到 sublinear convergence rate。
但是,因为没有用很多 convex 的性质,因此只要它满足 smooth 的性质(拥有 decent lemma),就算是 non-convex 也有 sublinear 的收敛到 saddle point 或 local optimum 的性质。
如何估计 Lipschitz 常数 \(L\)?
Adaptive Learning Rate with Line Search:从大的 \(\eta\) 开始,如果某些条件不满足则调小。
Practical 的手法:如果在 validation set 上的 performance 不减,则调小 lr。
对于 强凸函数 (strongly-convex function),它除了 decent lemma 确定的上界以外,还有另外一个类似的下界:
这个函数被两个二次函数包夹,因此其理应具有一个拟二次函数的性质。因此,对于 strongly-convex 的 Lipschitz smooth 的函数,它有更好的收敛速度:\(k=O(\log1/\eps)\),被称作 linear convergence。
L2 regularization 会把凸函数变成 strongly convex。
L2 regularization: \(f(x)\to f(x)+\alpha|x|^2\)。
上述分析在一元函数时很对。但是多元函数时呢?我们对每个维度使用相同的 lr,这牛么?
一个二元二次函数的等势面是椭圆。此时两维 lr 显然应该区别对待。如果这个椭圆并非正椭圆呢?
对于一个高维二次函数 \(\b y=\dfrac12\b x^TA\b x+\b b^T\b x+c\),假如能将其解耦,变成正圆二次函数 \(\b y=\dfrac12\hat{\b x}^T\cdot\hat{\b x}+\b b^T\hat{\b x}+c\),则直接 GD 即可。
解决方法是使用 Newton 迭代法,\(X^{k+1}=X^k-\eta A^{-1}\nabla f(X^k)\)。
那如果再松一点,只有 L-光滑呢?
由 Taylor 展开,有二次上界
用 Newton 迭代优化这个上界。因此,有扩展 Newton 迭代
这个迭代是二阶优化。
这个 method 哪哪都好,唯一的问题是要算 Hessian。比算 Hessian 更糟糕的是,要对其求逆。甚至,在非凸的场合,因为负特征值,它很容易 diverge。
这些优化的本质是,高维 learning 不应该对所有维数一视同仁。我们希望有一个 dimension-dependent lr,否则就会出现,某些维度正在收敛,而另一些维度已经收敛、正在震荡,甚至反而发散了。
因此,我们有 Heavy-Ball method: 维护了过去梯度的信息,来在时间维度上抹平震荡影响。
更新式子就是
也被称作 GD with momentum.
……然而,它有可能不收敛。
Nesterov's accelerated gradient descent:
这个就有 convergence 速率的保证了。
SGD。SGD 要想收敛,需要有一个下降的 lr:满足 \(\sum \eta^k=\infty\) 但是 \(\sum\eta^{k^2}<\infty\)。常见设置有 \(\eta^k\propto1/k\)。
为什么?假设已经站在最优点,SGD 虽然期望是 0 但是可能给你一个随机的扰动,这是不好的。
SGD 的 convergence:
- 凸函数是 \(O(1/\sqrt k)\)。
- 强凸是 \(O(1/k)\)。
它虽然方差大、收敛慢,但是它算的快呵!
这里的 SGD 一次只算一个。介于 mono-SGD 和 GD 之间的,乃是 mini batch SGD。这样,算得快、收敛得也快,太牛了!
AdaGrad
优势是不用调整 lr,而是自动调整;缺点是因为 lr 一直在 decay,所以不适合长期训练。
RMS Prop:不累加而是算历史一段时间的 average。
解决了 lr 消失的问题,在 RNN 上效果好。
Adam:RMS Prop + Momentum。
如何防止 overfit?
首先是 data augmentation。
- 对输入数据的每个位置减去了该位置上的平均值。
- 裁剪。
- 改变了 RGB 通道的强度。
其次是 dropout。
然后还有 initialization、gradient clipping 等。
Covariance Shift:batch 中的数据可能分布比较不同。因此,我们希望所有的 minibatch 具有相同的分布。BatchNorm,出列!
当然也可以不用 BN 而用 LN。它好处例如,是 batch 独立的,适合 RNN 和 transformer。
Deconvolution (Upsampling),由关键词生成图片?
Fully Convolutional Network:主要工作是 segmentation,标出每个像素属于哪个部分。
效果是先作 downsample 学习小特征,然后用小特征 upsample 检查每个位置进行 segmentation。
在生成式模型中更好玩!!!
IV.
生成式模型。
Hopfield Network。
如果一个神经网络有环怎么办?也即,考虑一个真全连接网络:有 \(y_i=\Theta(\sum_{j\neq i}w_{ji}y_j+b_i)\),其中 \(\Theta(z)=\begin{cases}+1&(z>0)\\-1&(z\leq0)\end{cases}\)。此乃 Hopfield 网络。
一个 H 网络不一定是稳定的:每个 neuron 受到“感受野 (field)” \(z_i=\sum_{j\neq i}w_{ji}y_j+b_i\);如果感受野与 \(y_i\) 不符,需要将 \(y_i\) 取反,但这会引发连锁反应。
即:对于每个神经元,令 \(y_i\gets-y_i\) 如果 \(y_iz_i<0\)。这会收敛吗?
令 \(y_i^-\) 为反转前的 \(y_i\),\(y_i^+\) 为后的。
如果 \(y_i^-z_i\geq0\),无事发生;如果 \(y_i^-z_i<0\),则 \(y_i^+=-y_i^-\),此时 \(y_i^+z_i-y_i^-z_i=2y_i^+z_i\),是一个严格正数。
因此,每次 flip 都会使得 \(2y_iz_i\) 增加。令 \(D(y_1,\dots,y_n)=\sum_{i<j}y_iw_{ij}y_j+y_ib_i\),则 \(D\) 在每次反转后都会严格上升。
而显然,\(D\) 不会永久上升,因此 \(\cur{y_i}\) 总会在有限步内收敛。令 能量 (energy) \(E=-D\),则 \(E\) 严格降。
因此,在谷底附近进行 evolve,都会回归谷底。这个网络是有“记忆”的:只要确保谷底是你需要的东西,那么就会回到你需要的位置。
如何训练一个网络“记忆”你需要的信息(例如图片)呢?
假如有 \(N\) 个像素,就有 \(N\) 个神经元;因为权值是对称的,所以有 \(\dfrac12N(N-1)\) 个参数(忽略 bias)需要 learn。
Hebbian Learning:对于要记忆的 \(\cur{y_i^*}\),令 \(w_{ij}=y_i^*y_j^*\),则此时 \(\cur{y_i^*}\) 是最低点。
缺点之一:怎么记住多张图呢?
缺点之二:一张图的 negate 也被记住了(即,最低点并非唯一,有 redundancy 冗余性)。
一个方案是,多图的场合令 \(w_{ij}\) 为 \(\dfrac1k\sum y_i^ky_j^k\),即平均值。但是多图会干涉产生出人意料的结果。
我们需要的效果是:一是要记忆的东西是谷底;二是不希望记住不想要的图。
结论:可以记住 \(\dfrac N4\log N\) 张图;但是仍然存在不想要的最小值。
如何找到这样的权值呢?构造法好像不太行。还是学习罢!
我们有期望的 pattern \(P=\cur{y^p}\),和能量函数 \(E(y)=-\dfrac12y^TWy\)。目标是:对全体 \(y^p\) 最小化 \(E\),且对不想要的 pattern 最大化 \(E\)。
求导后得到
效果是,把想要处的权值手动下拉、不想要处的权值手动上拉。但是问题是不想要的东西太多了!
简化结果:只把不想要的谷底出上拉。
但是问题是如何找到谷底?
直接随机很多初始值然后 evolve 即可找到谷底!
这很牛,但还能继续改进:谷底并非一样重要。哪些谷底更重要?结论是:从所有 desired pattern 出发做 evolution,演化到的谷底要上抬。
但是这有一个问题:假如谷底已经存了一个 pattern 呢?只能把这两点中间某处抬一抬,人为构造一个分水岭。
因此结论是,只要从一个点出发,走一两步然后就开始抬,即可保证这个点处于谷底。
Hopfield SGD:
前者使用随机的 desired pattern,后者随机选择 desired pattern 并少跑几步(\(2\sim4\) 步)。
如果我还需要记住更多图呢?我们不需要让每个 neuron 都硬性对应着某个像素,可以添加更多隐藏神经元,以提高网络的 capacity。
那么,我添加的隐藏神经元,在每个 desired pattern 中要设什么值呢?此外,我如果想 inference,又应该怎么提效呢(毕竟我们不关心隐藏神经元的信息)?
使用 Boltzmann 机。将 Hopfield 网络描述为热力学系统。
Energy function
对应着 Boltzmann Probability
通过遵照 \(P(y)\) sample 来采样 \(y\)。
随机系统下应该如何 flip?即,以 \(P(y_i=1\mid y_{j\neq i})\)(给定所有其它值,\(y_i\) 的取值)的概率,将 \(y_i\) 设为 \(1\)。
令 \(y\) 和 \(y'\) 仅在 \(i\) 处不同,而 \(y_i'=-1\)。则 \(\log P(y)=-E(y)+C\)。
另一种描述是,
因此得到结论:
也因此,若感受野是 \(z_i\),则应以 \(\sigma(z_i)\) 的概率 flip。
Stochastic Hopfield Network evolve 的方式:
- 随机初始化 \(y\)。【也即,\(y\) 初始是一个均匀随机的 distribution】
- 枚举 \(y_i\) 并根据条件分布 flip。【flip 会改变 distribution】
- distribution 最终会收敛到一个固定的 distribution,此时就可以从中 sample 了。
- 此乃 Gibbs 采样。
但是我们无法刻画 distribution。结论是:随机初始化单个 \(y_0\),然后令 \(y_i(t+1)\sim\text{Bernoulli}(\sigma(z_i(t)))\)。在足够多步后,声称其收敛然后对最后 \(M\) 步取平均即可。【recap:机制英属。】
虽然在实践中大伙都只用最后一帧就够了。
如果我们真的想找到最低点呢?答曰:开退!
这个 SHN 就是 Boltzmann 机。它的组成为:
- 有一个 energy function。
- 有一个概率分布 \(P(y)=\dfrac1Z\exp(-E(y)/T)\)。在实际应用中,有将 \(T\) 始终设为 \(1\) 的,也有 decrease 的(退火)。
- 有与 \(E\) 相关的参数 \(W\)。
如何学习 \(W\) 呢?
目标还是记住一批想要的 pattern。
一个特定的 pattern,其概率是
对全体 \(y\in P\) 求和并取 MLE (maximal logarithmic estimation) 就有
算梯度!
但是后一坨的 \(y'\) 有无穷多项,咋办?答曰:把后面一坨变成期望然后 sample 即可(Monte-Carlo Sample)。
……但是我们需要让 \(y'\) 根据 \(P(y)\) 采样。因此跑 Gibbs sampling 即可。
总算法:
- 初始化 \(W\)。
- 使用 \(M\) 个 MC sample 对 MLL 求梯度。
- 梯度上升(我们要最大化概率)
现在我们就可以处理 hidden neuron 的场合了。
\(y=(v,h)\),其中 \(v\) 是可见 pattern,\(h\) 是 hidden pattern。因为我们只关心 \(P(v)\),因此有 \(P(v)=\sum_jP(v,h)\)。如何最大化这一点?
\(\sum_{y'}\) 直接 Gibbs Sampling 即可。第一项只需要限制 \(v\in P\) 然后 MC 即可。
因此,后一半纯自由 Gibbs sampling,前一半在 GS 时把 \(v\) 强制设成你需要的东西然后只迭代 \(h\) 即可。
BM with Hidden Neuron 的 training:
- 初始化 \(W\);
- 对于每个 \(v\in P\),固定 \(v\) 然后采样 \(K\) 个 GS。
- 再全随机采样 \(M\) 个 GS。
- \(\nabla=\dfrac1{N_PK}\sum_{y\in S_c}y_iy_j-\dfrac1M\sum_{y'\in S}y'_iy'_j\)。
- GA。
BM 的效果:
- 图像生成(GS)
- 图像补全(条件 GS)
- 分类(?):把 label 看做一个 one-hot 向量然后也看做图像的一部分。
BM 哪哪都好,就是训得太慢!因为要做好多 GS。
因此考虑一种特殊的 BM:Restricted Boltzmann Machine。是一种结构特殊的 BM。其不再是完全图,而是完全二分图:只有 visible 和 hidden 间的连接。此时,在 visible 给定后,hidden 是独立的,因此可以同时 sample(反之亦然),因此支持并行且可以支持同步 sample。
\(z_i=\sum_jw_{ij}v_j\)。\(P(h_i=1\mid v_j)=\dfrac1{1+\exp(-z_i)}\),\(v\) 同理。
因此,在 \(v\) 给定时,全体 \(h\) 可以同步 sample;而 \(h\) 给定时,\(v\) 同理,因此可以两边迭代左脚踩右脚式 sample。即,模式是 \(v_0\to h_0\to v_1\to h_1\to\dots\)
更妙的是,Conditional Sample 只要 sample 一次即可!因此,式子可以直接简化为
目前来看,RBM 比起 BM 而言,有两个优势:一是所有 \(h_{\cdot,i},v_{\cdot,i}\) 之间独立因此可以并行,二是 Conditional Sample 只要 sample 一次。
有没有更有用的优化?有的兄弟,有的。
note that,在非随机的 Hopfield 网络的场合,我们可以只迭代一两步就抬升。因此,其直接优化为:
也一样好!
有更深的 RBM 吗?有的兄弟有的。多层 RBM(2009):介于当时算力有限,只能逐层训练。
生成式模型的目标是构建概率分布。其条件为:
因此可以定义 energy-based model:
- 能量函数 \(E(x;\theta)\),其中 \(\theta\) 是参数。
- \(P(x)=\dfrac1Z\exp(-E(x;\theta))\)。
- 其中,\(Z=\int\exp\)。
这个分布适用于任何接受输入,输出数的 model,具有惊人的 flexibility。
但是问题在于,\(Z\),也称作 partition function,难以计算。
为什么用 \(\exp\) 而非其它函数?
- 来自物理。可以使用物理相关技巧。
- 求导时好玩。
- Exponential Family (?)
- flexible(虽然这不是 \(\exp\) 的结果)
坏处:
- \(Z\) 难算。
\(L(\theta)=\log P(x)=-E(x;\theta)-\log Z(\theta)\),然后使用 MC 对 \(Z(\theta)\) 算。
总体而言,有 Contrastive Divergence Algorithm:
因此要能支持 sample。
但是,对于一般形式的 energy-based model(更一般地,对于一切 distribution \(p(x)\)),如何 sample?
例:catagorical distribution,离散的每一类都有概率。算前缀和即可。本质上是 CDF 到值的 inverse function(该 function 称作 quantile function)。
Gaussian?其 CDF 没有封闭形式!!!答曰:中心极限定理。多次 Bernoulli 会趋近 Gaussian(但是很慢)。更好的方法是所谓的 Box-Muller Transform。
如果有 standard Gaussian,如何求任何 \(N(\mu,\sigma^2)\) 的 Gaussian?簡単!高维呢?
更复杂的 \(p(x)\) 呢?
- idea:weighted sample,从简单的 \(q(x)\) 中采样,然后用 \(p(x)/q(x)\) 作为该值的 weight。此乃 importance sampling:\(q(x)\) 被称作 提案分布 (proposal distribution),\(\dfrac{p(x)}{q(x)}\) 是权重(importance weight),则 \(E_{x\sim p}[f(x)]=E_{x\sim q}[\dfrac{p(x)}{q(x)}f(x)]\)。但是用什么 \(q\) 呢?两个曲线至少应该比较接近,否则就需要很多次 sample。
- idea:MCMC。构造 MC 使得其 stationary distribution \(\pi=P(x)\)。
V.
隐变量模型 (latent variavle model):\(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)
隐变量模型中,先验、条件容易算,但后验、边缘不一定容易算。
例:Gaussian Mixture Model:有多坨 Gaussian Distribution。\(z\sim\t{Categorical}(w_1,\dots,w_k)\),是 Gaussian Distribution 的标号;\(x\sim N(\mu_z,\Sigma_z)\)。模型的参数是类别权重 \(w_k\),以及 Gaussian 参数 \(\mu_k,\Sigma_k\)。
显然,由 \(z\) 生成 \(x\) 的过程是容易的,但是反过来学习分布则是困难的。这个模型也被称作聚类 (cluster) 模型。
如何训练隐变量模型?模型生成的分布为 \(p(x,z;\theta)=p(z;\theta)p(x\mid z;\theta)\)。使用 MLE 描述误差
因为 \(p\) 不是 energy-based model 的形式,所以 Monte-Carlo 采样无法派上用场。
咋办?近似!!!目标是估测 \(\log\sum_zp(x,z;\theta)\)。
-
Importance Sampling。尝试 propose 一个 \(q(z)\) 然后有 \(p(x)=\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\)。
于是有
\[\log\sum_zq(z)\dfrac{p(x,z;\theta)}{q(z)}\geq\sum_zq(z)\log\dfrac{p(x,z;\theta)}{q(z)} \]此乃 Evidence Lower Bound (ELBO)。这是一个期望的形式,是可以被计算的。
但是这只是下界。何时取等?如果 \(q(z)\gets p(z\mid x;\theta)\)。
若是我们能将提议分布 \(q(z)\) 与后验分布 \(p(z\mid x;\theta)\) 挂钩,我们就可以轻而易举地计算了。因此,设计一个迭代的过程:
- 对于当前的 \(p(x,z;\theta^k)\),令 \(q(z;\theta^k)\gets p(z\mid x;\theta^k)\)。(E-Step)
- 对于固定的 \(q(z;\theta^k)\),优化 \(p(x,z;\theta^{k+1})\)。(M-Step)
- 不断迭代。
这被称作 EM 算法。
那么,如何令 \(q(z)\gets p(z\mid x;\theta)\) 呢?我们将其参数化:令 \(q(z;\phi)\gets p(z\mid x)\),后者中的 \(\theta\) 因为在本处固定所以被省略了。
使用 KL 散度衡量当前 \(q(z;\phi)\) 和 \(p(z\mid x)\) 间的差异。
\[\t{KL}(q\| p)=\sum_zq(z)\log\dfrac{q(z)}{p(z)} \]寻找最小化这一点的参数 \(\phi\)。
注意,因为 KL 是不对称的,所以上式要保证 \(q\) 在前面(reverse KL),这样能够保证可以通过采样 \(q\) 来计算 KL 的期望。
这种方法被称作变分推断 (Variational Inference),因为其理论根底来源于变分法。
\[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)} \\=\log p(x)-\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}}& \]而因为 KL 散度非负,所以得到结论 \(\log p(x)\geq\text{ELBO}\),符合前述理论。
广义来说,VI 是一个解决后验分布(Bayesian Inference)的好方法。
Bayesian:对于 \(D=\cur x\),求出 \(p(\theta\mid x)\)。
回到隐变量模型。我们可以得到一个联合误差
\[L(\phi,\theta)=\sum_zq(z;\phi)\log\dfrac{p(z,x;\theta)}{q(z;\phi)} \]但是注意到,上述模式目前而言只能对于每个 \(x\) 分别算一个独立的 proposal \(q(z;\phi)\)。有没有方法让 \(q\) 全局化?
方法:Amorized Variational Inference。使用条件分布 \(q(z\mid x;\phi)\)。有
\[L(\phi,\theta)=\sum_zq(z\mid x;\theta)\log\dfrac{p(z,x;\phi)}{q(z\mid x;\phi)} \]此时 \(q(\phi)\) 可以是一个神经网络,而 \(x\) 是其输入。
进一步推推式子。
\[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}}& \]通过选择尽量简单的 \(p,q\),我们得到了 Variational Autoencoder (VAE) 结构:
- \(q(z\mid x;\phi)=N(\mu(x;\phi),\text{diag}(\exp(\sigma(x;\phi))))\)。
- \(p(z)\sim N(0,I)\)。
- \(p(x\mid z;\theta)\sim N(f(z;\theta),I)\)。
结构是由输入 \(x\) 经过全连接等得到 \(\mu,\Sigma\),二者得到 \(q\) 后,采样 \(z\) 并由 \(f(z;\theta)\) 回归 \(x\)。 在训练时,我们计算输入输出间的差异,作为 loss;在 inference 时,我们直接使用 \(p(x)=p(z)p(x\mid z;\theta)\) 生成一个 \(x\)。
为什么是 autoencoder?因为它是无监督学习,\(z\) 是自己学的。其中 \(q(z\mid x;\phi)\) 是 \(x\to z\) 的分布,被称作 encoder;而 \(p(x\mid z;\theta)\) 则是 decoder。
这其中,\(p(x\mid z)\) 才是那个真实的生成式模型,而 \(q(z\mid x)\) 仅仅是引入的 proposal 罢了。
训练使用 \(J\)。但是问题是,
\[J(\phi,\theta;x)={\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))} \]\(\theta\) 的梯度容易算,但是 \(\phi\) 的梯度呢?
使用重系数化 (reparameterization) 技巧:注意到 \(z\sim N(\mu,\sigma)\) 实际上使用的是 \(\sigma N(0,1)+\mu\),于是
\[L(\phi)\propto\t E_{z\sim q(z\mid\phi)}|f(z)-x|^2 \\\propto\t E_{z\sim N(0,I)}|f(\mu(x;\phi)+\sigma(x;\phi)\cdot\epsilon)-x|^2 \]
附:standard autoencoder:\(x\) 经过 encoder 得到低维向量表征 \(z\),再经过 decoder 复原高维的 \(x\)。不同的是,AE 中的 \(z\) 是确定的,VAE 中的 \(z\) 则是一个分布。
通过对 \(z\) 中的某些元素进行更改,对最终生成图片也有影响。此外,VAE 也可以作 inpainting (对 masked 一部分的图片进行恢复):只需要 encoder 满足 mask 一部分后生成的 \(z\) 几乎不变 的高鲁棒性表征,那么再次 decode 就能复归原图。这就简单了:训练的时候对原图作随机 mask 但是要求 masked 的图片仍然映回原图即可。
如何让 VAE 支持生成特定图片?这就需要让 VAE 支持标签:输入将是 \((x^{(i)},y^{(i)})\) 的二元组,encoder 会是 \(q(z\mid x,y;\phi)\),而 decoder 是 \(q(x\mid y,z;\theta)\),这样就可以要求生成某一类特定的图片了。训练不变,输出时作 conditioned generation 即可。
- 如果同时有 labeled 和 unlabeled 咋办?
方法:半监督学习 semi-supervised learning。即,存在有标号的 \(D_l\) 和无标号的 \(D_u\)。此时 decoder 还是 \(p(x\mid y,z;\theta)\),而 encoder 呢?
对于 labeled data,我们可以让分布独立:令 \(q(z,y\mid x)=q(z\mid x)\cdot q(y\mid x)\)。然后前一半做 VAE,后一半做有监督学习的交叉熵即可。
那么对于 unlabeled data 呢?对于离散的 label \(y\),其处于 reconstruction loss 一项时,无法像 \(z\) 一样做 reparameterization。
……虽然离散变量确实存在某种 reparameterization 的模式,但是在 label 数目不是很多时,直接展开即可!
VAE 的好处:从 VI 继承来的训练稳定且收敛快。坏处:inference 时是近似的。例如,KL 散度有一些内生的问题,比如说非对称性。
\(\t{KL}(q\|p)\) 被称作 reverse KL (exclusive KL)。如果用一个 Gaussian 来近似两个 Gaussian 的叠合分布的话,exclusive KL 会贴近一个分布,而 inclusive KL 会尽量 cover 两个分布。即,双峰函数时,ex 会只保留一个,in 会学成二者的中间值。这就导致可能会漏特征。
解决方案:使用 forward KL?
坏处还有,使用 Gaussian 拟合了 \(p,q\) 二者,即所谓的 assumed density(假定了 \(p,q\) 的分布模式),这无法拟合一切分布。可以换成其它一些更普适的分布。此外,其 L2-loss 和 Gaussian 的性质常常容易出现背景模糊的问题。
回到 VAE 的式子
其变种为 \(\beta\)-VAE,效果是在 KL 上乘了一个 \(\beta\)。\(\beta=0\) 时是 AE,\(\beta=1\) 时是 VAE,\(\beta>1\) 时强制每一维之间独立,即每一维之间解耦,相对独立地操控生成结果。
VI.
前面的模型,都有一个生成图样的分布 \(p(x)\),以及一个好的依据 \(p(x)\) 采样的方法。
但是,我们的初心就是:有一个函数 \(g(\cdot)\),调用一次就给你一个采样,不需要 \(p(x)\) 的显式表达什么的。
因此,我们有 隐式生成模型 (implicit generative model):其有一个采样器 \(g(\cdot)\)。其当然有一个隐式的 \(p(x)\),但此处我们不关心之。
例如,有一个生成器 \(g(z;\theta)\),其中 \(z\sim N(0,I)\),生成的 \(x=g(z;\theta)\)。
我们希望 \(g(z;\theta)\approx p_\t{data}\)。我们最小化二者在某个距离尺度 \(D\) 下的差异。
最好的方法是什么?一个分类器!如果分类器都无法区分这玩意是哪一类的,我们便可以自信地说我们的算法已经天衣无缝了。
我们考虑设计一个可微的 \(D(x;\phi)\),其衡量 \(x\) 属于 \(p_\t{data}\) 的概率:输出 \(1\) 则属于 \(p_\t{data}\),\(0\) 则非。
优化生成器时,目标为
如何优化分类器?正样本已经有了,那负样本呢?随机采样太不牛了!直接从已有的那个生成器中 sample 即可!
于是,训练分类器的数据集即为:\(\cur{(x,1)\mid x\sim p_\t{data}}\cup\cur{(\hat x,0)\mid\hat x\sim g(z;\theta)}\)。有
为使得格式一致,也可以写成
此乃 GAN。
GAN 还有问题!
考虑 GAN 的 objective
考虑令
则当 \(D\) 最优时,有 \(\dfrac{\p L}{\p D}=0\),解得 \(D^*=\dfrac{p_\t{data}}{p_\t{data}+p_G}\)。这符合认知:如果生成器是完美的,那么分类器就应该输出 \(0.5\)。
但是回代可知
其中,红色的部分是两倍的 Jensen-Shannon 散度 (JSD)。
是一个对称的距离函数。
在分类器最优时,即有
这符合直觉。
GAN 的好处:不需要 likelihood;着重于生成(\(g\));loss function 是神经网络,很强力;数学模型很灵活;和博弈论紧密联系……
但是有很多坏处!
因为没有 \(p(x)\),所以没有可供 evaluate 的尺度。它的 loss 只用于训练,而无法被用于评估。
或许我们可以用另一个神经网络来 evaluate?例如,假如你生成的好,它的标签应该 entropy 低、集中于目标类;不好,则接近于随机分布。
同时,我们希望生成的东西具有 diversity,因此对于不同种类的图片,将其分布取平均后应该接近于随机分布。因此有 inception score (IS):
其中 \(f\) 是一个 discriminator。IS 越高越好。
但 IS 有其问题:它与 \(p_\t{data}\) 无关。这意味着,\(G\) 可以作弊:它为 \(p_\t{data}\) 中的每一类各记住一张图片即可。
因此,我们希望 \(G\) 尽量 cover 住整个 \(p_\t{data}\)。可以使用一些统计方法?
FID (Frechet Inception Distance):使用 Gaussian 分布拟合分类器 \(f(x)\) 高层的特征向量,然后使用 Gaussian 间的 Wasserstein Distance 计算距离。有
FID 可以识别噪音、模糊等状况,因此比 IS 更好。
……除了这些,剩下估计就只能靠人眼识别作对比了。
另一个问题是,GAN 的 diversity 不足,会仅记住数个特征图。
同时,介于二者的 adversary 关系,生成器可以选择在各个模式之间震荡,而分类器总是迟来一步,因此 GAN 甚至不一定收敛!这种 mode oscillating 的模式是难以避免的。
同时,JSD 和 reverse KL 一样,也是一个 mode-seeking 的 metric,让其先天倾向于固定于某个 mode,而非 mode-covering。
更悲惨的是,例如 \(J=-xy\),此时其有 \(x=y=0\) 的 Nash 均衡,但是二者的博弈并不保证收敛。甚至有可能 crash,有些东西可能根本没有 Nash 均衡。
此外,\(z\to x\) 的 generator 是低维向高维的生成,是困难的;但是 discriminator 却很容易就能达到 100% 的成功率,这本身就不对称。因此,当 discriminator 非常确定的时候,如果使用 sigmoid 作 loss 之类,就会出现梯度消失。我们可能需要 discriminator 别学那么快!
DCGAN:第一篇真的 work 的工作!
技巧:有监督分类中的 CNN 等技巧都太强了,用弱一点的。此外,BN 也应该被使用。ReLU 也应该用 Leaky ReLU 换。小的 learning rate 和动量、小的 batchsize 会更友好。
这样训出来的东西是好的。此外,latent variable 的 \(z\) 拥有类似图像的 embedding 的性质(戴眼镜男性的 \(z\),减去不戴眼镜男性的 \(z\),加上不戴眼镜女性的 \(z\),得到戴眼镜女性的 \(z\)),关于某一维缩放也可以和 VAE 一样调整生成的东西。
通过控制某些神经元开启与否,可以让生成的图像不含窗户等。
直接优化 \(D(G(z))\) 可能会有 gradient vanishing。因此考虑 \(D\) 的 feature 层,使用 feature 的差异作为 loss (此乃 feature matching)。
如何避免 mode collapsing?minimatch discrimination:为避免图像扎堆,给 discriminator 传一个额外的 side channel 表示图像是否扎堆,如果是的话,就给它一个低分。
如何实现这个东西?计算同一个 batch 中生成物的 pairwise 差。
还可以使用关于参数的历史平均做差,让参数的运动尽量平滑。
最后,让模型不要太自信:认为东西如果对了,只给出 \(0.9\) 分。但是 negative side 还是会打出 \(0\)!
可能会一个 batch 偏红而另一个偏绿等。此时可以用一个大 batchsize 的信息作 BN。
还是来点数学罢。JSD 有问题:当两个 distribution 完全不交时,梯度就为零,此时就 mode collapse 了。
更好的 metric:Wasserstein Distance (Earth Mover's Distance)。衡量多大的 effort 通过挪土的方案让两者相同。挪土的消耗不仅有土的数量,还有其移动距离。
其中,\(\gamma\) 是任何 \((x,y)\) 的联合分布:其边缘分布分别是 \(P,Q\)。
WD 比 JSD 的好处在于,存在单纯地令两个 distribution 更贴近(就算它们仍然无交)的 incentive。
WGAN:由所谓的 KR Duality,
\(|f|_L\leq K\) 指的是 \(f\) 是一个 \(K\)-Lipschitz 连续的函数。\(f\) 被称作 WGAN 的 critics。
如何找到这样的 \(f\)?需要搜索这样的 critics!实际使用时使用 \(K=1\)。
如何达到这一点?首先让所有参数都 clip 到 \(0\) 附近(限制值域在 \(\pm0.01\) 间),这样 sigmoid 后梯度就接近 \(1\);扔掉动量(可能冲太快),使用 RMSProp;每隔 \(n_\t{critic}\) 后便换 critic。
因为 WD 确实在衡量距离,所以其 loss 是有意义的。
WGAN 的最优的 \(f^*\),在 \(p_\t{data}\) 和 \(p_G\) 上几乎处处都有梯度为零。
VII.
有法子直接确定性地从 \(z\) 生成 \(x\),而非通过 \(p(x,z)=p(z)p(x\mid z)\) 的隐变量法吗?例如,\(z\sim N(0,I)\) 而 \(x=f(z)\)。
我们如何让 \(p(x)\) 可计算,这样就可以 MLE 了?
例:若 \(z\sim U(0,1)\),且 \(x=a\cdot z+b\),则对于 \((b,a+b)\) 中的 \(x\) 有 \(p(x)=1/|a|\)。
现在,考虑 \(f\) 是双射,则有 \(p(x)=p(z)|\d z/\d x|=|f'(z)|^{-1}p(z)\)。
同理,二维的场合,若 \(x=Az+b\),且若 \(A\) 是满秩(双射),则有 \(p(x)=|\det A|^{-1}\cdot p(z)\)。
那么任意维就直接有 \(p(x)=|J(f)|^{-1}p(z)\)。
那我能不能从一个简单的分布,例如 Gaussian 出发,多次双射后变成一个复杂的分布?
这被称为 normalizing flow。
生成是 trivial 的:每个生成元素都与 \(z\) 一一对应。
训练同理:因为对于最终的 \(p(x)\),可以方便回退到上一层的 \(p(z_{k-1})\)。有公式
想法很好,但是 jacobian 太折磨了!
我们需要一个好的非线性的双射,它的 jacobian 好算!
那只要保证 Jacobi 矩阵是三角阵即可。
Nonlinear Independent Components Estimation (NICE):论文中使用 \(z=f(x)\),是数据提取隐藏信息的过程。
将 \(x\) 关于某个 \(1\leq m\leq d\) 劈成 \(x_{1:m}\) 和 \(x_{m+1:d}\) 的两半。在 \(x\to z\) 时,令 \(z_{1:m}=x_{1:m}\),\(z_{m+1:d}=x_{m+1:d}+\mu_\theta(x_{1:m})\),其中 \(\mu_\theta\) 是一个神经网络。其对角线恰为全一,因此 \(\mu_\theta\) 是啥都行,不要求是 bijection。逆向 \(z\to x\) 的过程时也简单。
这是一个保体积变换,因此 \(\det J=1\)。
为了保证变换均匀,需要一些 coupling layer 对所有维数做 shuffling。第一层有一个 rescalling layer,保证变换可以 cover 不同体积。
inpaining:因为 \(p(x)\) 可以写出来,所以当 \(x=(x_v,x_h)\) 时,易和 MCMC 一同做梯度上升。
局限性:多数层的体积不变,因此其表达能力有所限制。
因此提出其扩展"Non-Volume Preserving (NVP)"extension。\(x\to z\) 时,有 \(z_{1:m}=x_{1:m}\),\(z_{m+1:d}=x_{m+1:d}\odot\exp(\alpha_\theta(x_{1:m}))+\mu_\theta(x_{1:m})\),其中 \(\alpha_\theta\) 也是一个神经网络,取 exp 保证可逆。
Bigger, Better, Stronger 的模型:Generative Flow with Invertible 1x1 Convolutions:
对于输入的 \(h\times w\times c\) 的图像,但是 channel size \(c\) 一般比较小。因此,当 channel size 小时,可以对于每个 pixel 关于其 channel 的 \(c\)-向量做变换,即 \(z_{ij:}=Wx_{ij:}+b\)。此时可以大力 \(O(c^3)\) 算 \(W\) 的行列式。当然,需要一些 normalization 层保证训练不炸。
总结:生成质量可能不好,但是数学性质真的很好!当 tractability 很重要时,就试看看罢!
Score-based Generative model:本质上是一种 energy-based model,但是采用了另一种框架。也被称作 diffusion model。
令 \(x_0\sim q_\t{data}(x)\)。Forward Diffusion Process:不断向数据添加 Gaussian Noise。
而去除噪声的过程,即被称作 Denoising Process。
如果 pdf 是可微的,则定义它的 score function \(s(x)=\nabla_x\log p(x)\)。这适用于一切 pdf,但是在 EBM 的场合它更加简单。
EBM 的一切痛苦都来自于 partitional function \(Z\)。但是这里我们另辟蹊径,尝试最小化 Fisher 散度
即,希望让 \(p_\theta\) 在 fisher 散度意义下贴近 \(p_\t{data}\),最小化
而 \(\log p_\theta\) 又是我们的 score function \(f_\theta\)(\(p_\theta=\exp(f_\theta)/Z(\theta)\)),于是有
就没有 partition function 了!
假设我们已经学出了 score function,则其就如同场一般,能够自然地求出势(概率)的极值点。
我们的目标是 \(s_\theta(x):\R^d\to\R^d\),且有其 \(\approx\nabla_xp_\t{data}(x)\)。
写成 Fisher 散度就是
于是即可梯度下降。但是诚然,上式须好算。用什么刻画 \(s_\theta\),一个 \(\R^d\to\R^d\) 的函数?
一个 MLP。但是 \(\text{trace}\) 要求算 \(O(d)\) 次 BP!
解决方法是,从数据分布上添加 Gaussian 噪声后,尝试近似扰动后的分布 \(q_\sigma(\tilde x)\)。即,最小化
式子推完后发现一点:standard variance \(\sigma\) 越小越精确,但是当 \(\sigma\to0\) 时 noise 会很大!因此,\(\sigma\) 有必要被仔细调节。
那么,假设学完了 \(s\),如何做 sampling?答曰:沿着 score function 做 Langevin Dynamics,就可以了……吗?
答曰:不行!score function 不一定好定义。此外,在数据密度低处,score function 就会很不准。还有,在多模态时,无法准确刻画各模态之间的 weight。
解法:Gaussian Perturbation。
- 加了 noise 后 dimension 就撑大了。
- 原本没有数据处有数据了。
- 更大的区域会出现在某个模态的辖域了。
但是,加多大的 Gaussian 呢?存在一个 data quality 与 sample 的 tradeoff。答曰:多层 Langevin,进行类似退火的过程。当然,score network 应与 noise scale 有关,因此把它当成输入的一部分也建模。此乃 Noise Conditional Score Network。
noise 怎么选?\(\sigma_1\approx\) 数据点间的最大距离。中间呢?等比数列衰减吧。过程中的没一点应该按照不同的系数被考虑:建议考虑 weight \(=\sigma_i^2\),这样可以从式子中消去分母上的 \(\sigma\),让训练稳定。
总结:
- 生成数据点。
- 生成 noise scale。
- 采样 Gaussian noise。
- 算 noise conditioned loss。
noise scale 也可以被连续化,从离散的退火变成连续的时间分布,就成为了一个随机的微分方程。
VIII.
自回归模型:\(p(x)=\prod p(x_i\mid x_{1:i-1})\)。
Pixel CNN:逐像素生成,对输入 masked。但是问题在于,这样做会有盲点!借鉴 LSTM 做出了修正。
State-Space Model:提高 scaling 能力,保证参数量与输入长度无关。其实就是 HMM。
Capture 双向信息?Bi-RNN。
?.
GNN。希望对 Graph 进行预测。
一张图的每个点有其特征 \(x_i\)。图上每个点有其标签 \(y_i\in\cur{0,1,?}\)。
Homophily Assumption:相邻点的标签应该类似。
现在的目标是为图上所有点学习 embedding \(z_i\)。
GCN:在图上卷积。
对于当前点 \(x_i\),对其全体邻居 \(x_j\) 计算 \(h_j=f(x_j)\) 作为 message,然后从所有邻居中 aggregate 一些 order invariant 的信息(例如 avg pool)。重复多次后,感受野会不断扩张。
因此,建立 GCN:对于 \(G\) 的图和 \(H\) 的 embedding,定义
令 \(A\) 是邻接矩阵,\(D\) 是度数矩阵 \(\text{diag}(|N(i)|)\),\(\tilde A=D^{-1}A\),则有
?+1.
自监督学习:数据的一部分被当作特征。例如,BERT 通过 mask 训练,autoregressive 通过预测训练。
也有 context prediction 任务:把图像分块后,给定两块预测相对位置。可以被拿来拼拼图。
还有,把图像 mask 后 impainting。
或者,把彩图拆成黑白图,以及与原图的 Delta,然后让黑白图和 Delta 互相 predict 后合起来 reconstruct 原始图片。
或者,把图像旋转后命令模型尝试复原。
但是这些 task 都有点太手工化了,难以大规模部署。
一个大规模的场合是对语音作 contrastive learning,能达到对音色的聚类效果。在图像上的迁移,是把临近的 patch 当作相似样本,远距离的 patch 当作负样本。
MoCo:正样本好办,负样本如果每次都 forward 太慢了。于是使用 memory bank,把之前算好的负样本信息存起来。但是问题是负样本的信息是旧版本模型上的结果,可能效果不好。因此,使用队列实现 memory bank,并且希望 feature 的更新速度比较慢以保证队列里的 feature 不过旧。
SimCLR:定义一堆变换,希望同一张图片变换后特征不变。于是每次对图片采样两个变换,并希望它们出来的 representation 像,而负样本就是 batch 中其它东西。
Few-Shot Learning:有小的训练集,希望模型快速调整(所以是 meta learning:让它具有「学习」的能力)。
metric learning:使用 nearest neighbour classifier。【不训练模型】
Bayesian Inference:使用算后验分布的 Bayesian 规则。方法例如 probablisitc programming:使用一种「编程语言」描述图像生成。【同样不训练】
Gradient Descent 也行,这就要训练了。即, 有 \(f_\theta(x\mid S)=g_{\theta^*}(x)\),其中有
- \(\theta^*=\t{SGD}(\theta,\eta,\cur{x_i^S,y_i^S})\)
- \(\theta^{k+1}=\theta^k-\eta\nabla L(S,\theta^k)\)
- \(\theta^0=\theta\)
看看远处的 MAML 罢。
我们希望找到一个足够好的初态:它不一定离某一个目标很近,但是它希望能通过快速迭代靠近所有的目标态。即,最优的
但是怎么对 SGD 作 SGD?答曰:把它换成单次 BP 即可。即,
进一步,没有标注的测试数据,虽然不能拿来训 classification 但是也可以被拿来学 representation。因此得到了 test-time training:在测试集上仍然训练。训练时同时作有标签和无标签的训练,而测试时使用测试数据作无标签训练。
使用神经网络搜索更好的 loss function 来取代 SGD(learning to learn)。使用大模型辅助 RL 过程。

浙公网安备 33010602011771号