草饲有深度,反刍懂学术

\[\newcommand{\eps}{\epsilon} \newcommand{\b}{\boldsymbol} \newcommand{\cur}[1]{\left\{#1\right\}} \newcommand{\d}{\mathrm d} \newcommand{\t}{\text} \newcommand{\p}{\partial} \]

I

data:由 sample 和 label 组成。

目标:训神经网络,将 sample 对应到 label。

模型:判别式模型(discriminative model)【给定图片判定它是猫猫】/生成式模型(generative model)【给定 cat 生成猫猫图片】

课程内容:

  • NN 架构 (architecture)。
  • 对架构训练相应模型的参数的算法。
  • 部署模型。
  • 子领域!

DL 是 特征学习Representation Learning(如 PCA)的一部分;后者是 ML 的一部分(如 SVM);后者是 AI(如专家系统)的一部分。

传统 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(y)\leq f(x)+\nabla f(x)^T(y-x)+\dfrac L2|x-y|^2 \]

因此,当知道 \(f(x)\) 时,可以构建一个二次上界 \(g(y)=f(x)+\nabla f(x)^T(y-x)+\dfrac L2|x-y|^2\);迭代的时候就是渐进地让这个上界贴近真实函数的过程。

为了让迭代最好,需要让 \(\eta=\dfrac1L\);但是,任何 \(0<\eta<\dfrac2L\),都可以让下界变小。

\[X^{k+1}=X^k-\dfrac1L\nabla_Xf(X^k) \\f(X^{k+1})\leq f(X^k)-\dfrac1{2L}|\nabla f(X^k)|^2&(\text{decent lemma}) \\|\nabla f(X^k)|^2\leq 2L(f(X^{k+1})-f(X^k))&(\text{progress bound}) \]

假设 \(k\) 步后收敛至最优的 \(X^*=X^k\),则有

\[k\min_{i=0,\dots,k}\{|\nabla f(X^i)|^2\}\leq 2L(f(X^0)-F(X^*)) \]

右式是常数。

如果我们希望 \(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 确定的上界以外,还有另外一个类似的下界:

\[f(y)\geq f(x)+\nabla f(x)^T(y-x)+\dfrac\mu2|x-y|^2 \]

这个函数被两个二次函数包夹,因此其理应具有一个拟二次函数的性质。因此,对于 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 展开,有二次上界

\[f(\b y)\leq f(\b x)+\nabla f(\b x)^T(\b y-\b x)+(\b y-\b x)^T\nabla^2f(\b x)(\b y-\b x) \]

用 Newton 迭代优化这个上界。因此,有扩展 Newton 迭代

\[X^{k+1}=X^k-\eta^k\nabla^2 f(X^k)^{-1}\nabla f(X^k) \]

这个迭代是二阶优化。


这个 method 哪哪都好,唯一的问题是要算 Hessian。比算 Hessian 更糟糕的是,要对其求逆。甚至,在非凸的场合,因为负特征值,它很容易 diverge。

这些优化的本质是,高维 learning 不应该对所有维数一视同仁。我们希望有一个 dimension-dependent lr,否则就会出现,某些维度正在收敛,而另一些维度已经收敛、正在震荡,甚至反而发散了。


因此,我们有 Heavy-Ball method: 维护了过去梯度的信息,来在时间维度上抹平震荡影响。

\[\Delta X^k=\beta \Delta X^{k-1}-\eta\nabla f(X^k) \]

更新式子就是

\[X^{k+1}=X^k-\eta\nabla f(X^k)+\beta(X^k-X^{k-1}) \]

也被称作 GD with momentum.

……然而,它有可能不收敛。

Nesterov's accelerated gradient descent:

\[X^{k+1}=X^k-\eta\nabla f(X^k+{\color{red}\beta(X^k-X^{k-1})})+\beta(X^k-X^{k-1}) \]

这个就有 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

\[g^k=\nabla_\theta f(\theta^k) \\G_i^k=G_i^{k-1}+|g_i^k|^2 \\\theta_i^{i+1}=\theta_i^k-\dfrac{\eta}{\sqrt{G_i^k+\eps}}g_i^k \]

优势是不用调整 lr,而是自动调整;缺点是因为 lr 一直在 decay,所以不适合长期训练。

RMS Prop:不累加而是算历史一段时间的 average。

\[g^k=\nabla_\theta f(\theta^k) \\G_i^k=\gamma G_i^{k-1}+(1-\gamma)|g_i^k|^2 \\\theta_i^{i+1}=\theta_i^k-\dfrac{\eta}{\sqrt{G_i^k+\eps}}g_i^k \]

解决了 lr 消失的问题,在 RNN 上效果好。

Adam:RMS Prop + Momentum。

\[g^k=\nabla_\theta f(\theta^k) \\{\color{lightblue}M_i^k=\delta M_i^{k-1}+(1-\delta)g_i^k} \\G_i^k=\gamma G_i^{k-1}+(1-\gamma)|g_i^k|^2 \\{\color{lightblue}\hat M_i^k=M_i^k/(1-\delta^k),\hat G^k=G^k/(1-\delta)}&(\text{避免初始decay}) \\\theta_i^{i+1}=\theta_i^k-\dfrac{\eta}{\sqrt{G_i^k+\eps}}\hat M_i^k \]


如何防止 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\)

\[W=\arg\min_W\sum_{y\in P}\cur{E(y)-\sum_{y\notin P}E(y)} \]

求导后得到

\[W\gets W-\eta(\sum_{y\in P}yy^T-\sum_{y'\in P}y'y'^T) \]

效果是,把想要处的权值手动下拉、不想要处的权值手动上拉。但是问题是不想要的东西太多了!

简化结果:只把不想要的谷底出上拉。

但是问题是如何找到谷底?

直接随机很多初始值然后 evolve 即可找到谷底!

这很牛,但还能继续改进:谷底并非一样重要。哪些谷底更重要?结论是:从所有 desired pattern 出发做 evolution,演化到的谷底要上抬。

但是这有一个问题:假如谷底已经存了一个 pattern 呢?只能把这两点中间某处抬一抬,人为构造一个分水岭。

因此结论是,只要从一个点出发,走一两步然后就开始抬,即可保证这个点处于谷底。


Hopfield SGD:

\[W\gets W-\eta(E_{y\in P}[yy^T]-E_{y'}[y'y'^T]) \]

前者使用随机的 desired pattern,后者随机选择 desired pattern 并少跑几步(\(2\sim4\)​ 步)。


如果我还需要记住更多图呢?我们不需要让每个 neuron 都硬性对应着某个像素,可以添加更多隐藏神经元,以提高网络的 capacity。

那么,我添加的隐藏神经元,在每个 desired pattern 中要设什么值呢?此外,我如果想 inference,又应该怎么提效呢(毕竟我们不关心隐藏神经元的信息)?


使用 Boltzmann 机。将 Hopfield 网络描述为热力学系统。

Energy function

\[E(y)=-\sum_{i<j}w_{ij}y_iy_j-b_iy_i \]

对应着 Boltzmann Probability

\[P(y)\sim\exp(-E(y)) \]

通过遵照 \(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\)

\[\log P(y)-\log P(y')=E(y')-E(y)=-\sum_jw_{ij}y_j-2b_i \]

另一种描述是,

\[\log\dfrac{P(y)}{P(y')}=\log\dfrac{P(y_i=1\mid y_{j\neq i})P(y_{j\neq i})}{P(y'_i=-1\mid y'_{j\neq i})P(y'_{j\neq i})}=\log\dfrac{P(y_i=1\mid y_{j\neq i})}{1-P(y_i=1\mid y_{j\neq i})} \]

因此得到结论:

\[\log\dfrac{P(y_i=1\mid y_{j\neq i})}{1-P(y_i=1\mid y_{j\neq i})}=-\sum_jw_{ij}y_j-2b_i \\P(y_i=1\mid y_{j\neq i})=\dfrac1{1+\exp(-\sum_jw_{ij}y_j-2b_i)} \]

也因此,若感受野是 \(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:机制英属。】

虽然在实践中大伙都只用最后一帧就够了。

如果我们真的想找到最低点呢?答曰:开退!

\[y_i(T)\sim\text{Bernoulli}(\sigma(\dfrac1Tz_i(T))) \]

这个 SHN 就是 Boltzmann 机。它的组成为:

  • 有一个 energy function。
  • 有一个概率分布 \(P(y)=\dfrac1Z\exp(-E(y)/T)\)。在实际应用中,有将 \(T\) 始终设为 \(1\) 的,也有 decrease 的(退火)。
  • 有与 \(E\) 相关的参数 \(W\)

如何学习 \(W\) 呢?


目标还是记住一批想要的 pattern。

一个特定的 pattern,其概率是

\[P(y)=\dfrac{\exp(\dfrac12y^TWy)}{\sum_{y'}\exp(\dfrac12y'^TWy')} \]

对全体 \(y\in P\) 求和并取 MLE (maximal logarithmic estimation) 就有

\[L(W)=\dfrac1{N_P}\left(\sum_{y\in P}\dfrac12y^TWy-\log\sum_{y'}\exp(\dfrac12y'^TWy')\right) \]

算梯度!

但是后一坨的 \(y'\) 有无穷多项,咋办?答曰:把后面一坨变成期望然后 sample 即可(Monte-Carlo Sample)。

\[\nabla_{w_{ij}}L=\dfrac1{N_P}\sum_{y\in P}y_iy_j-E_{y'}[y'_iy_j'] \\=\dfrac1{N_P}\sum_{y\in P}y_iy_j-\dfrac1{|S|}\sum_{y'\in S}y'_iy_j' \]

……但是我们需要让 \(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)\)。如何最大化这一点?

\[P(v)=\sum_hP(v,h)=\sum_h\dfrac{\exp}{\sum\exp} \\L(W)=\dfrac1{|P|}\sum_{v\in P}\log(\sum_h\exp)-\log(\sum_{y'}\exp) \]

\(\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 一次即可!因此,式子可以直接简化为

\[\nabla_{w_{ij}}L(W)=\dfrac1{N_PK}\sum_{v\in P}v_{0i}h_{0j}-\dfrac1M\sum v_{\infty i}h_{\infty j} \]

目前来看,RBM 比起 BM 而言,有两个优势:一是所有 \(h_{\cdot,i},v_{\cdot,i}\) 之间独立因此可以并行,二是 Conditional Sample 只要 sample 一次。

有没有更有用的优化?有的兄弟,有的。

note that,在非随机的 Hopfield 网络的场合,我们可以只迭代一两步就抬升。因此,其直接优化为:

\[\nabla_{w_{ij}}L(W)=\dfrac1{N_PK}\sum_{v\in P}v_{0i}h_{0j}-\dfrac1M\sum v_{1 i}h_{1j} \]

也一样好!


有更深的 RBM 吗?有的兄弟有的。多层 RBM(2009):介于当时算力有限,只能逐层训练。


生成式模型的目标是构建概率分布。其条件为:

\[P(x)\geq0 \\\int P(x)\d x=1 \]

因此可以定义 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:

\[\nabla_\theta L(\theta)\approx\nabla_\theta(-E(x_\t{train};\theta)+E(x_\t{sample},\theta)) \]

因此要能支持 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 描述误差

\[L(\theta)=\log\prod_{x\in D}p(x;\theta)=\sum_{x\in D}\log\sum_zp(x,z;\theta) \]

因为 \(p\) 不是 energy-based model 的形式,所以 Monte-Carlo 采样无法派上用场。

咋办?近似!!!目标是估测 \(\log\sum_zp(x,z;\theta)\)

  1. 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 的式子

\[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))} \]

其变种为 \(\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\) 则非。

优化生成器时,目标为

\[L(\theta)=D(g(z;\theta);\phi) \]

如何优化分类器?正样本已经有了,那负样本呢?随机采样太不牛了!直接从已有的那个生成器中 sample 即可!

于是,训练分类器的数据集即为:\(\cur{(x,1)\mid x\sim p_\t{data}}\cup\cur{(\hat x,0)\mid\hat x\sim g(z;\theta)}\)。有

\[\theta^*=\max_\theta D(g(z;\theta);\phi) \\\phi^*=\max_\phi[\t E_{x\sim p_\t{data}}\log D(x;\phi)+\t E_{\hat x\sim g(z;\theta)}\log (1-D(\hat x;\phi))] \]

为使得格式一致,也可以写成

\[\theta^*=\max_\theta D(g(z;\theta);\phi)=\theta^*=\min_\theta[1-D(g(z;\theta);\phi)] \]

此乃 GAN。


GAN 还有问题!

考虑 GAN 的 objective

\[L(\theta,\phi)=\min_\theta\max_\phi[\t E_{x\sim p_\t{data}}\log D(x;\phi)+\t E_{\hat x\sim g(z;\theta)}\log (1-D(\hat x;\phi))] \]

考虑令

\[L(D)=p_\t{data}(x)\cdot\log D+p_G(x)\log(1-D) \]

则当 \(D\) 最优时,有 \(\dfrac{\p L}{\p D}=0\),解得 \(D^*=\dfrac{p_\t{data}}{p_\t{data}+p_G}\)。这符合认知:如果生成器是完美的,那么分类器就应该输出 \(0.5\)

但是回代可知

\[L(\theta,\phi)=\t E_{x\sim p_\t{data}}\log D(x;\phi)+\t E_{\hat x\sim g(z;\theta)}\log (1-D(\hat x;\phi) \\=\t E_{x\sim p_\t{data}}\log\dfrac{p_\t{data}}{p_\t{data}+p_G}+\t E_{\hat x\sim g(z;\theta)}\log \dfrac{p_G}{p_\t{data}+p_G} \\={\color{red}\t{KL}(p_\t{data}\|\tfrac12(p_\t{data}+p_G))+\t{KL}(p_G\|\tfrac12(p_\t{data}+p_G))}+\log4 \]

其中,红色的部分是两倍的 Jensen-Shannon 散度 (JSD)。

\[\t{JSD}(p\|q)=\dfrac12\Big(\t{KL}(p\|\tfrac12(p+q))+\t{KL}(q\|\tfrac12(p+q))\Big) \]

是一个对称的距离函数。

在分类器最优时,即有

\[L(\theta)=2\t{JSD}(p_G\|p_\t{data})-\log4 \]

这符合直觉。

GAN 的好处:不需要 likelihood;着重于生成(\(g\));loss function 是神经网络,很强力;数学模型很灵活;和博弈论紧密联系……

但是有很多坏处!


因为没有 \(p(x)\),所以没有可供 evaluate 的尺度。它的 loss 只用于训练,而无法被用于评估。

或许我们可以用另一个神经网络来 evaluate?例如,假如你生成的好,它的标签应该 entropy 低、集中于目标类;不好,则接近于随机分布。

同时,我们希望生成的东西具有 diversity,因此对于不同种类的图片,将其分布取平均后应该接近于随机分布。因此有 inception score (IS):

\[\t{IS}=\exp\Bigg(\t E_{x\sim G}\bigg(\t{KL}\Big(f(y\mid x)\|p_f(y)\Big)\bigg)\Bigg) \]

其中 \(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 计算距离。有

\[\t{FID}=|\mu_p-\mu_G|^2+\t{trace}(\Sigma_p+\Sigma_G-2\sqrt{\Sigma_p\Sigma_G}) \]

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 通过挪土的方案让两者相同。挪土的消耗不仅有土的数量,还有其移动距离。

\[W(P,Q)=\inf_{\gamma\sim\Gamma}\t E_{(x,y)\sim\gamma}|x-y| \]

其中,\(\gamma\) 是任何 \((x,y)\) 的联合分布:其边缘分布分别是 \(P,Q\)

WD 比 JSD 的好处在于,存在单纯地令两个 distribution 更贴近(就算它们仍然无交)的 incentive。

WGAN:由所谓的 KR Duality,

\[W(p_\t{data},p_G)=\dfrac1K\sup_{|f|_L\leq K}\t E_{x\sim p_\t{data}}f(x)-\t E_{x\sim p_G}f(x) \]

\(|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})\)。有公式

\[\log p(x)=\log p(z_0)-\sum_i\log\left|\det\left(\dfrac{\p f_i}{\p z_{i-1}}\right)\right| \]

想法很好,但是 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。

\[q(x_t\mid x_{t-1})=N(x_t;\sqrt{1-\beta)t}x_{t-1},\beta_tI) \]

而去除噪声的过程,即被称作 Denoising Process。


如果 pdf 是可微的,则定义它的 score function \(s(x)=\nabla_x\log p(x)\)。这适用于一切 pdf,但是在 EBM 的场合它更加简单。

EBM 的一切痛苦都来自于 partitional function \(Z\)。但是这里我们另辟蹊径,尝试最小化 Fisher 散度

\[F(p\| q)=\dfrac12 E_{x\sim p}[|\nabla_xp(x)-\nabla_xq(x)|_2^2] \]

即,希望让 \(p_\theta\) 在 fisher 散度意义下贴近 \(p_\t{data}\),最小化

\[\dfrac12E_{x\sim p_\t{data}}[|\nabla_x\log p_\t{data}(x)-\nabla_x\log p_\theta(x)|_2^2] \\=E_{x\sim p_\t{data}}[\dfrac12|\nabla_x\log p_\theta(x)|_2^2+\text{trace}(\nabla_x^2\log p_\theta(x))]+\text{Const} \]

\(\log p_\theta\) 又是我们的 score function \(f_\theta\)\(p_\theta=\exp(f_\theta)/Z(\theta)\)),于是有

\[=E_{x\sim p_\t{data}}[\dfrac12|\nabla_xf_\theta(x)|_2^2+\text{trace}(\nabla_x^2f_\theta(x))]+\text{Const} \]

就没有 partition function 了!

假设我们已经学出了 score function,则其就如同场一般,能够自然地求出势(概率)的极值点。


我们的目标是 \(s_\theta(x):\R^d\to\R^d\),且有其 \(\approx\nabla_xp_\t{data}(x)\)

写成 Fisher 散度就是

\[\dfrac12E_{x\sim p_\t{data}}[|\nabla_x\log p_\t{data}(x)-s_\theta(x)|_2^2] \\=E_{x\sim p_\t{data}}[\dfrac12|s_\theta(x)|_2^2+\text{trace}(\nabla_xs_\theta(x))]+\text{Const} \]

于是即可梯度下降。但是诚然,上式须好算。用什么刻画 \(s_\theta\),一个 \(\R^d\to\R^d\) 的函数?

一个 MLP。但是 \(\text{trace}\) 要求算 \(O(d)\) 次 BP!

解决方法是,从数据分布上添加 Gaussian 噪声后,尝试近似扰动后的分布 \(q_\sigma(\tilde x)\)。即,最小化

\[\dfrac12E_{x\sim p_\t{data}}[|\nabla_x\log q_\sigma(\tilde x)-s_\theta(x)|_2^2] \\=\text{const}+\dfrac12E_{\tilde x\sim q_\sigma}\|s_\theta(\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,定义

\[z_i=\sigma(W\sum_{j\in N(i)}\dfrac{h_j}{|N(i)|}+B\cdot h_i) \]

\(A\) 是邻接矩阵,\(D\) 是度数矩阵 \(\text{diag}(|N(i)|)\)\(\tilde A=D^{-1}A\),则有

\[Z=\sigma(\tilde AHW^T+HB^T) \]

?+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 罢。

我们希望找到一个足够好的初态:它不一定离某一个目标很近,但是它希望能通过快速迭代靠近所有的目标态。即,最优的

\[\theta^*=\arg\min_\theta L(B_i,\t{SGD}(\theta,S_i)) \]

但是怎么对 SGD 作 SGD?答曰:把它换成单次 BP 即可。即,

\[\theta^*=\arg\min_\theta L(B_i,\theta-\eta\nabla L(S_i,\theta)) \]

进一步,没有标注的测试数据,虽然不能拿来训 classification 但是也可以被拿来学 representation。因此得到了 test-time training:在测试集上仍然训练。训练时同时作有标签和无标签的训练,而测试时使用测试数据作无标签训练。

使用神经网络搜索更好的 loss function 来取代 SGD(learning to learn)。使用大模型辅助 RL 过程。

posted @ 2025-03-19 21:47  Troverld  阅读(180)  评论(3)    收藏  举报