- 示例工程
【免费下载链接】NYU-DLSP20
NYU Deep Learning Spring 2020
导读
本文是 NYU-DLSP20(NYU Deep Learning Spring 2020,即本仓库 pytorch-Deep-Learning)第八周课程的深度解析,以法文索引页 docs/fr/week08/08.md 为骨架,对照英文完整讲义 docs/en/week08/08.md 及其三篇分节笔记(08-1、08-2、08-3),并结合作业笔记本 11-VAE.ipynb 的完整源码展开。你将掌握三块核心能力:(1)理解能量模型(EBM)中"对比方法"压低/抬高能量的训练思想,以及它在自监督学习(MoCo、PIRL、SimCLR)、去噪自编码器、对比散度中的应用与局限;(2)理解正则化隐变量 EBM 中稀疏编码(ISTA/FISTA/LISTA)与卷积稀疏编码的原理;(3)完整走通 VAE 的数学推导与 PyTorch 实现,在 MNIST 上训练并生成新样本。
第八周的内容横跨课程三大环节:讲座 A 部分(Cours magistral partie A)讲解能量模型中的对比方法;讲座 B 部分(Cours magistral partie B)讲解正则化隐变量能量模型;实践课(Travaux dirigés)实现并训练变分自编码器。本文将严格按此脉络展开。
一、讲座 A:能量模型中的对比方法(Contrastive Methods in Energy-Based Models)
1.1 回顾:能量模型的两类学习范式
在正式进入第八周之前,LeCun 教授先用约 15 分钟回顾了上一周(第七周,参见 docs/en/week07 笔记)的能量模型核心概念。能量函数 $F(x, y)$ 对输入输出对 $(x, y)$ 打分,训练的目标是让观测数据点拥有低能量、非观测点拥有高能量。由此衍生出两类主要学习方法:
- 对比方法(Contrastive Methods):压低训练数据点的能量 $F(x_i, y_i)$,同时抬高其他位置的能量 $F(x_i, y')$,其中 $y' \neq y_i$。
- 结构方法(Architectural Methods):通过设计并施加正则化,构建一个低能量区域天然受限(minimized/limited)的能量函数 $F$。
LeCun 进一步从这两大类中归纳了7 种训练策略,其中之一与**最大似然(Maximum Likelihood)**方法类似——概率意义上压低数据点能量,同时抬高其余所有 $y' \neq y_i$ 的能量。这里有一个关键洞察:最大似然并不关心能量的绝对值,只关心能量之间的差值。原因是概率分布总是被归一化(求和/积分为 1),因此比较任意两个数据点之间的概率比值比比较绝对值更有意义。这一点直接奠定了后续对比方法"成对比较"的设计哲学。
1.2 对比方法在自监督学习中的应用
在对比方法中,我们压低观测训练点 $(x_i, y_i)$ 的能量,同时抬高训练数据流形之外点的能量。而**自监督学习(self-supervised learning)的做法是:用输入的一部分去预测另一部分,希望模型为视觉任务学到能与监督任务相媲美的特征。研究者从经验上发现,将对比嵌入(contrastive embedding)**方法应用于自监督模型,确实能获得接近监督模型的性能。
对比嵌入的核心流程:
- 构造一个正样本对(positive pair)$(x, y)$:$x$ 是一张图像,$y$ 是 $x$ 的某种保持内容不变的变换(旋转、放大、裁剪等),如图 1 所示。
- 将 $x$ 与 $y$ 分别送入同一个卷积网络,得到两个特征向量 $h$ 与 $h'$。因为两者内容相同,我们希望 $h$ 与 $h'$尽可能相似——选用某种相似度度量(如余弦相似度)与损失函数来最大化二者的相似度,从而降低训练数据流形上图像的 energy。
- 同时还需要抬高流形外点的能量,因此还要构造负样本对(negative pair)$(x_{\text{neg}}, y_{\text{neg}})$,即内容不同的图像(例如类别标签不同),送入同一网络得到特征向量后最小化它们之间的相似度。
该方法最终实现:压低相似对的能量、抬高不相似对的能量。近期 ImageNet 上的结果表明,这样学到的特征用于目标识别可以媲美监督方法学到的特征。
1.3 自监督代表方法:MoCo、PIRL 与 SimCLR
PIRL 的目标函数——NCE(噪声对比估计)。PIRL 与 MoCo 在 ImageNet 上取得了当时的最佳结果(尤其是参数量较小的低容量模型),PIRL 的 top-1 线性精度已接近监督基线的约 75%。PIRL 的目标函数为:
$$ h(v_I,v_{I^t})=\frac{\exp\big[\frac{1}{\tau}s(v_I,v_{I^t})\big]}{\exp\big[\frac{1}{\tau}s(v_I,v_{I^t})\big]+\sum_{I'\in D_{N}}\exp\big[\frac{1}{\tau}s(v_{I^t},v_{I'})\big]} $$
$$ L_{\text{NCE}}(I,I^t)=-\log\Big[h\Big(f(v_I),g(v_{I^t})\Big)\Big]-\sum_{I'\in D_N}\log\Big[1-h\Big(g(v_{I^t}),f(v_{I'})\Big)\Big] $$
其中特征图/特征向量之间的相似度度量采用余弦相似度。PIRL 与常规做法不同之处在于:它不直接使用卷积特征提取器的原始输出,而是在基础卷积特征提取器之上定义不同的"头"(heads)$f$ 和 $g$,可以理解为叠加在基础网络之上的独立层。
在一个 mini-batch 内,PIRL 的 NCE 目标函数这样运作:batch 中有一对正样本(相似对)和大量负样本(不相似对);计算变换后图像特征向量 $I^t$ 与 batch 中其余特征向量的相似度(一个正、其余为负);然后对正样本对计算一个 softmax 风格的得分。最大化 softmax 得分意味着最小化其余得分——这正是能量模型想要的:压低相似对的能量、抬高不相似对的能量。
LeCun 特别指出,要让这类方法奏效,需要大量负样本。而在 SGD 中,从 mini-batch 内部持续维持大量负样本比较困难,因此 PIRL 还采用了缓存的记忆库(cached memory bank)。
课堂问答:为什么用余弦相似度而不是 L2 范数?如果用 L2 范数,把两个向量变"短"(靠近原点)就能让它们相似,变"长"(远离原点)就能让它们不相似——因为 L2 范数只是向量各分量差的平方和。用余弦相似度可以强制系统找到真正的解,而无法通过"缩短/拉长向量"来作弊。
SimCLR:SimCLR 在 ImageNet 上的结果优于此前的方法,其 top-1 线性精度达到了监督方法的水平。它使用精细的数据增强方案生成相似对,并在 TPU 上用极大的 batch size 进行长时间训练。LeCun 认为 SimCLR 在一定程度上展示了对比方法的极限:在高维空间中,有非常非常多的区域需要抬高能量,以确保它们确实高于数据流形上的能量;随着表示维度增加,需要越来越多的负样本来保证流形外那些位置的能量更高。
1.4 去噪自编码器(Denoising Autoencoder)及其缺陷
去噪自编码器已在第七周实践课(见 docs/en/week07/07-3.md)中讨论过。该模型通过将损坏(corrupted)的输入重建为原始输入来学习数据的表示。更具体地说,我们训练系统产生一个能量函数,当损坏数据偏离数据流形时,能量呈二次方增长。
但去噪自编码器存在若干问题:
- 高维连续空间中损坏方式不可数:我们无法保证仅通过在大量不同位置"抬高能量"就能塑造出正确的能量曲面。
- 处理图像时表现不佳:由于缺乏隐变量,重建图像的方式有无数种,系统会输出各种预测,因而学不到特别好的特征。
- 流形中间的损坏点可能被重建到两侧:这会在能量函数中产生"平坦区域"(flat spots),影响整体性能。
1.5 其他对比方法:对比散度与持久对比散度
除了上述方法,还存在对比散度(Contrastive Divergence, CD)、比率匹配(Ratio Matching)、噪声对比估计(Noise Contrastive Estimation)、最小概率流(Minimum Probability Flow)等对比方法。这里重点介绍对比散度的基本思想:
- 对比散度通过"巧妙地损坏输入样本"来学习表示。在连续空间中,先选取一个训练样本 $y$ 并降低其能量:对该样本,用某种基于梯度(并带噪声)的过程沿能量曲面向下移动;若输入空间是离散的,则随机扰动训练样本以修改能量,如果得到的能量更低就保留,否则以一定概率丢弃。不断重复最终会降低 $y$ 的能量。随后用某种损失函数比较 $y$ 与对比样本 $\bar y$,更新能量函数的参数。
- 持久对比散度(Persistent Contrastive Divergence)是对比散度的一种改进:系统使用一组"粒子"(particles)并记住它们的位置,这些粒子像普通 CD 一样沿能量曲面向下移动,最终找到低能量区域并使这些区域被抬高。但该方法的可扩展性差——随着维度增加,性能并不理想。
二、讲座 B:正则化隐变量能量模型(Regularized Latent Variable EBMs)
2.1 隐变量能量模型与信息容量正则化
带隐变量的模型能够基于观测输入 $x$ 和额外隐变量 $z$,给出一个预测分布 $\overline{y}$。能量模型同样可以包含隐变量。问题在于:如果隐变量 $z$ 在产生最终预测 $\overline{y}$ 时表达力过强,那么对任意真实输出 $y$,总能选取一个合适的 $z$ 使 $y$ 被完美重建。由于推断时能量同时对 $y$ 和 $z$ 优化,这会导致能量函数处处为 0。
自然的解决方案是限制隐变量 $z$ 的信息容量,常见手段是正则化隐变量:
$$ E(x,y,z) = C(y, \text{Dec}(\text{Pred}(x), z)) + \lambda R(z) $$
该方法限制 $z$ 取小值的空间体积,进而控制低能量 $y$ 的空间。$\lambda$ 控制这一权衡。$R$ 的一个实用例子是 $L_1$ 范数——它可以被看作"有效维度"的几乎处处可微的近似。另一种方案是在限制 $z$ 的 $L_2$ 范数的同时向其添加噪声,同样能限制其信息内容(这正是 VAE 的做法,见下文)。
2.2 稀疏编码(Sparse Coding)
稀疏编码是无条件(unconditional)正则化隐变量 EBM的一个例子,其本质是用分段线性函数近似数据:
$$ E(z, y) = \Vert y - Wz\Vert^2 + \lambda \Vert z\Vert_{L^1} $$
其中 $n$ 维向量 $z$ 倾向于最多只有 $m \ll n$ 个非零分量,每个 $Wz$ 位于 $W$ 的 $m$ 个列张成的子空间中。每一步优化之后,矩阵 $W$ 与隐变量 $z$ 都按 $W$ 各列的 $L_2$ 范数之和归一化,以确保 $W$ 和 $z$ 不会分别发散到无穷大和归零。
2.3 FISTA:稀疏编码的快速优化算法
FISTA(快速 ISTA)在给定 $y$ 时针对 $z$ 优化稀疏编码能量函数 $E(y,z)$,通过交替优化$\Vert y - Wz\Vert^2$ 与 $\lambda \Vert z\Vert_{L^1}$ 两项。初始化 $Z(0)$ 后按如下规则迭代更新 $Z$:
$$ z(t + 1) = \text{Shrinkage}_\frac{\lambda}{L}\Big(z(t) - \frac{1}{L}W_d^\top(W_dZ(t) - y)\Big) $$
其中内部表达式 $Z(t) - \frac{1}{L}W_d^\top(W_dZ(t) - Y)$ 是对 $\Vert y - Wz\Vert^2$ 项的一次梯度步;$\text{Shrinkage}$(收缩)函数将值向 0 方向移动,从而优化 $\lambda \Vert z\Vert_{L_1}$ 项。
2.4 LISTA:用学习的前馈/循环网络替代迭代优化
FISTA 对大规模高维数据(如图像)而言计算代价过高。一个高效的替代方案是训练一个网络来直接预测最优隐变量 $z$,这就是 LISTA(Learned ISTA)。该架构的能量函数额外增加一项,度量预测隐变量 $\overline z$ 与最优隐变量 $z$ 之间的差异:
$$ C(y, \text{Dec}(z,h)) + D(z, \text{Enc}(y, h)) + \lambda R(z) $$
进一步定义:
$$ W_e = \frac{1}{L}W_d \qquad S = I - \frac{1}{L}W_d^\top W_d $$
于是更新规则可改写为:
$$ z(t+1) = \text{Shrinkage}_{\frac{\lambda}{L}}\big[W_e^\top y - Sz(t)\big] $$
这个更新规则可以被解释为一个循环网络:网络按固定步数 $K$ 展开运行,$W_e$ 的梯度通过标准的随时间反向传播(backpropagation-through-time, BPTT)计算。训练好的网络用比 FISTA 更少的迭代次数就能产出好的 $z$。
2.5 稀疏编码的实例与卷积稀疏编码
实例一(MNIST 手写数字):当 256 维隐向量的稀疏编码系统应用于 MNIST 时,系统学到 256 个"笔划",通过少量笔划的线性组合即可近乎重建整个训练集——稀疏正则化保证了这一点。
实例二(自然图像):在自然图像块上训练的稀疏编码,学到的特征是Gabor 滤波器(方向边缘),与动物视觉系统早期部分学到的特征相似。
卷积稀疏编码:假设有一幅图像及其特征图(feature maps)$z_1, z_2, \cdots, z_n$,将每个特征图与核 $K_i$ 做卷积($*$),重建即为:
$$ Y=\sum_{i}K_i*Z_i $$
这不同于原始稀疏编码的重建方式 $Y=\sum_{i}W_iZ_i$:普通稀疏编码是字典矩阵列的加权和(权重为 $Z_i$ 的系数);卷积稀疏编码仍是线性操作,但字典矩阵变成一组特征图,每个特征图与对应核卷积后求和。
在自然图像上训练的卷积稀疏自编码器中,编码器与解码器的滤波器看起来非常相似:编码器是"卷积 → 非线性 → 对角层(调整尺度)",并对编码施加稀疏约束;解码器是线性卷积解码器,重建损失为平方误差。随着滤波器数量增加,学到越来越多样化的滤波器:1 个滤波器是中心环绕型;2 个得到形状奇特的滤波器;4 个得到水平与垂直方向边缘(每个滤波器两种极性);8 个得到 8 个方向的边缘;16 个则在方向之外还出现中心环绕等;继续增加,除边缘检测器外还会出现各种方向的光栅检测器(grating detectors)、中心环绕等。这一现象与视觉皮层中的观察相似,表明完全可以以完全无监督的方式学到很好的特征。
作为一个附带用途,把这些特征接入卷积网络并在任务上训练,并不必然比从头训练 ImageNet 更好;但在样本量不足或类别很少的场景,纯监督训练会得到退化(degenerate)特征,此时预训练特征有助于提升性能。
2.6 变分自编码器(VAE)的能量视角
VAE 的架构与正则化隐变量 EBM 类似,唯一区别是不用稀疏性,而是通过加噪声限制编码的信息内容。其关键差异在于:隐变量 $z$不是通过最小化能量函数得到的,而是将能量函数视为"按某个分布随机采样 $z$",该分布的对数就是连接 $z$ 与 $\overline z$ 的代价。该分布是均值为 $\overline z$ 的高斯分布,等价于向 $\overline z$ 添加高斯噪声。
带高斯噪声的编码向量可以被想象成**"模糊球"(fuzzy balls)**:
- 无正则化时,系统会尽量把编码向量 $\overline z$ 变大,使噪声 $z$ 的影响尽可能小,导致模糊球飘离原点;另一个原因是防止模糊球重叠(重叠会让解码器在重建时混淆不同样本)。
- 但我们希望模糊球能聚集在数据流形附近,于是对编码向量施加正则化,使其均值与方差接近 0——就像用弹簧把模糊球拴在原点。弹簧强度决定球离原点的远近:太弱球会飞走,太强球会坍缩在原点导致高能量。为防止这种情况,系统只允许相似的样本对应的球重叠。
- 模糊球的大小也可以自适应,其上限由**惩罚函数(KL 散度)**约束:它让方差接近 1,使球既不太大也不太小(不至于坍缩)。
三、实践课:在 MNIST 上实现并训练 VAE
3.1 经典自编码器(AE)回顾与 VAE 的直觉
一个最简单的自编码器可以概括为两段:
- 编码器:$\boldsymbol{h} = f(\boldsymbol{W}_h \boldsymbol{x} + \boldsymbol{b}_h)$,其中 $f$ 是逐元素激活函数,$\boldsymbol{h}$ 也被称为编码(code)。
- 解码器:$\hat{\boldsymbol{x}} = g(\boldsymbol{W}_x \boldsymbol{h} + \boldsymbol{b}_x)$。
(详细推导见第七周笔记 docs/en/week07/07-3.md。)
VAE 与经典 AE 的本质区别:
- 经典 AE 编码器直接输出一个确定性的隐藏表示 $\boldsymbol{h}$。
- VAE 编码器输出的"code"由两部分组成:$\mathbb{E}(\boldsymbol{z})$(均值)和 $\mathbb{V}(\boldsymbol{z})$(方差),其中 $\boldsymbol{z}$ 是服从以 $\mathbb{E}(\boldsymbol{z})$ 为均值、$\mathbb{V}(\boldsymbol{z})$ 为方差的高斯分布的隐随机变量(实践中常用高斯分布,也可用其他分布)。编码器是从 $\mathcal{X}$ 到 $\mathbb{R}^{2d}$ 的函数;随后均值与方差被送入**采样器(sampler)**生成隐变量 $\boldsymbol{z}$;最后 $\boldsymbol{z}$ 送入解码器生成 $\hat{\boldsymbol{x}}$(解码器是从 $\mathcal{Z}$ 到 $\mathbb{R}^{n}$ 的函数)。
可以说,经典 AE 中的 $\boldsymbol{h}$ 相当于 VAE 中的 $\mathbb{E}(\boldsymbol{z})$。简言之,VAE 与 AE 的主要区别在于 VAE 拥有一个良好的潜在空间,从而支持生成过程。
为什么关注生成模型?判别模型学习"给定观测做预测",而生成模型旨在模拟数据生成过程,因此能更好地理解底层因果联系,从而获得更好的泛化。
3.2 VAE 的目标(损失)函数
VAE 的损失由重建项 + 正则项两部分构成:
$$ l(\boldsymbol{x}, \hat{\boldsymbol{x}}) = l_{reconstruction} + \beta l_{\text{KL}}(\boldsymbol{z},\mathcal{N}(\textbf{0}, \boldsymbol{I}_d)) $$
- 重建项作用在最终层,对应 $l(\boldsymbol{x}, \hat{\boldsymbol{x}})$:
- 二值输入:$l(\boldsymbol{x}, \hat{\boldsymbol{x}}) = - \sum\limits_{i=1}^n [x_i \log{(\hat{x_i})} + (1 - x_i)\log{(1-\hat{x_i})}]$(二元交叉熵);
- 实值输入:$l(\boldsymbol{x}, \hat{\boldsymbol{x}}) = \frac{1}{2} \Vert\boldsymbol{x} - \hat{\boldsymbol{x}} \Vert^2$。
- 正则项作用在隐层,通过惩罚项 $l_{KL}(\boldsymbol{z}, \mathcal{N}(\boldsymbol{0}, \boldsymbol{I}_d))$ 强制潜在空间具备特定的高斯结构。没有这一项,VAE 就会退化成经典自编码器,可能导致过拟合,且失去想要的生成性质。
将正则项展开:
$$ \beta l_{\text{KL}}(\boldsymbol{z},\mathcal{N}(\textbf{0}, \boldsymbol{I}d)) = \frac{\beta}{2} \sum\limits{i=1}^d\big(\mathbb{V}(z_i) - \log{[\mathbb{V}(z_i)]} - 1 + \mathbb{E}(z_i)^2\big) $$
其中求和号内每项有四个子项。前三个子项 $v_i = \mathbb{V}(z_i) - \log{[\mathbb{V}(z_i)]} - 1$ 在$z_i$ 方差为 1 时最小——因此惩罚项会把估计隐变量的方差保持在 1 附近,即"模糊球"半径约为 1。最后一个子项 $\mathbb{E}(z_i)^2$最小化 $z_i$ 之间的距离,从而防止重建项引发的"爆炸"。$\beta$ 是超参数,决定重建项与惩罚项的权重。
3.3 重参数化技巧(Reparameterisation Trick)
在训练 VAE 时,我们需要从编码器返回的分布中采样 $\boldsymbol{z}$。但直接采样会带来一个问题:梯度下降时无法穿过采样模块做反向传播。解决方案是重参数化技巧:
$$ \boldsymbol{z} = \mathbb{E}(\boldsymbol{z}) + \boldsymbol{\epsilon} \odot \sqrt{\mathbb{V}(\boldsymbol{z})}, \qquad \epsilon\sim \mathcal{N}(\boldsymbol{0}, \boldsymbol{I}_d) $$
这样训练中的反向传播成为可能——梯度通过上式中的逐元素乘法和加法流动。
3.4 从 11-VAE.ipynb 看完整实现
本节代码全部取自仓库根目录下的 11-VAE.ipynb(该笔记本可在本地用 Jupyter 打开运行)。MNIST 像素值已归一化到 $[0, 1]$ 区间。
模型结构。潜在维度取d = 20。编码器将 $784$ 维输入映射到 $2d$ 维(前 $d$ 个为均值mu,后 $d$ 个为对数方差logvar);解码器最后一层使用 sigmoid 激活,使输出落在 $[0, 1]$,与输入数据一致:
d = 20 class VAE(nn.Module): def __init__(self): super().__init__() self.encoder = nn.Sequential( nn.Linear(784, d ** 2), nn.ReLU(), nn.Linear(d ** 2, d * 2) ) self.decoder = nn.Sequential( nn.Linear(d, d ** 2), nn.ReLU(), nn.Linear(d ** 2, 784), nn.Sigmoid(), )重参数化与 forward。reparameterise函数在训练模式下从对数方差计算标准差(std = logvar.mul(0.5).exp_()),采样标准正态噪声eps,再执行eps.mul(std).add_(mu);推理模式下直接返回mu。用对数方差而非方差的原因:确保方差非负,同时取对数能覆盖方差的全值域,训练更稳定。每次调用reparameterise相当于在"模糊球"上取一个点;多次调用会得到近似球形的点集,该球以mu为球心、std为半径——这与讲座中"黄色气泡"的直觉完全一致。
def reparameterise(self, mu, logvar): if self.training: std = logvar.mul(0.5).exp_() eps = std.data.new(std.size()).normal_() return eps.mul(std).add_(mu) else: return mu def forward(self, x): mu_logvar = self.encoder(x.view(-1, 784)).view(-1, 2, d) mu = mu_logvar[:, 0, :] logvar = mu_logvar[:, 1, :] z = self.reparameterise(mu, logvar) return self.decoder(z), mu, logvar损失函数。重建项用二元交叉熵(BCE),正则项用 KL 散度(KLD),对应 3.2 节的公式:
def loss_function(x_hat, x, mu, logvar, β=1): BCE = nn.functional.binary_cross_entropy( x_hat, x.view(-1, 784), reduction='sum' ) KLD = 0.5 * torch.sum(logvar.exp() - logvar - 1 + mu.pow(2)) return BCE + β * KLD数据加载与训练配置。batch_size = 256,优化器为 Adam、learning_rate = 1e-3,训练epochs = 10;训练/测试分别使用MNIST('./data', train=True/False, download=True, transform=transforms.ToTensor()),并在torch.cuda.is_available()时自动切换到 GPU(device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu"))。训练循环每个 epoch 记录平均损失(损失除以数据集长度),测试阶段在torch.no_grad()下评估并保存每个样本的mu、logvar与标签,用于后续可视化。
生成新样本。训练完成后,从标准正态分布采样z = torch.randn((N, d))并送入解码器即可生成新图像。实践中部分生成结果质量不佳,原因是解码器尚未"覆盖"整个潜在空间,可通过增加训练轮数改善。
潜在空间插值(morphing)。在潜在空间中对两个样本的均值编码做线性插值(code[i] = i / (N - 1) * mu[B].data + (1 - i / (N - 1)) * mu[A].data),解码器输出仍然是合法的手写数字——例如把数字 3 逐渐"变形"为 8。这在经典自编码器上是做不到的,是 VAE 潜在空间良好结构的直接体现。
均值投影(t-SNE)。笔记本最后用TSNE(n_components=2)将各 epoch 的编码器输出均值投影到 2D 空间并按数字类别着色(每个颜色代表一个数字,可视化工具来自 res/plot_lib.py 的set_default)。可以观察到:epoch 0 时类别散布各处、只有少量聚集;随着训练推进,潜在空间越来越有结构,各类别(数字)开始形成簇——这正是 KL 正则项在起作用。
3.5 对照:经典 AE 与去噪 AE 的实现差异(10-autoencoder.ipynb)
仓库中的 10-autoencoder.ipynb 与本周内容互为补充:它实现了标准 AE(欠完备隐层,d = 30)与去噪 AE(过完备隐层,d = 500),通过注释/取消注释少量代码即可切换,并需相应调整隐层尺寸、重新生成模型并重新传入优化器。去噪 AE 通过nn.Dropout对输入加噪(img_bad = img * noise),训练时喂入损坏图像、以原始图像为重建目标。笔记本还提供了用 OpenCV 的inpaint(Telea 与 Navier-Stokes 两种方法)与去噪 AE 修复能力对比的代码。将 10-autoencoder.ipynb 与 11-VAE.ipynb 对照阅读,可以直观看到"确定性编码 vs 概率编码(均值+方差)"以及"有无 KL 正则项"带来的本质差异。
四、本周内容速查
| 主题 | 核心思想 | 关键公式/实现 | 仓库依据 |
|---|---|---|---|
| 对比方法 | 压低数据点能量、抬高非数据点能量 | $F(x_i,y_i)\downarrow$,$F(x_i,y')\uparrow$ | docs/en/week08/08-1.md |
| 对比嵌入 | 正对相似、负对不相似 | 余弦相似度 + NCE 损失 | 同上 |
| 去噪自编码器 | 由损坏输入重建原输入,塑造二次能量曲面 | 重建损坏输入 | 同上、10-autoencoder.ipynb |
| 对比散度 / 持久对比散度 | 带噪声下坡 + 粒子记忆 | CD 与 PCD | 同上 |
| 稀疏编码 | 用分段线性函数近似数据 | $E(z,y)=\Vert y-Wz\Vert^2+\lambda\Vert z\Vert_{L^1}$ | docs/en/week08/08-2.md |
| FISTA / LISTA | 交替优化 + 用展开的网络学习 $z$ | Shrinkage 更新规则、BPTT | 同上 |
| 卷积稀疏编码 | 字典变为特征图卷积 | $Y=\sum_i K_i*Z_i$ | 同上 |
| VAE | 加噪声限制编码信息容量 | $l_{reconstruction} + \beta l_{KL}$ | 同上、docs/en/week08/08-3.md、11-VAE.ipynb |
此外,本周讲座对应的课件为 slides 目录下的 "12 - EBM.pdf",可作为复习材料配合阅读。
结语
第八周的内容形成了一个完整的逻辑闭环:从能量模型的两类训练范式出发,先看对比方法在自监督学习中的成功与局限(MoCo/PIRL/SimCLR、去噪自编码器、对比散度),再看正则化隐变量这一"非对比"路径如何通过限制信息容量解决能量塌缩问题(稀疏编码、FISTA/LISTA、卷积稀疏编码),最终落到 VAE 的推导与实现。读者在掌握这些概念后,可以沿两条路线继续深入:一是阅读 docs/en/week08/ 下的完整英文讲义与 slides 课件;二是直接运行 11-VAE.ipynb,通过调整d、β、epochs等超参数观察潜在空间结构的变化,将理论转化为手感。
- 示例工程
【免费下载链接】NYU-DLSP20
NYU Deep Learning Spring 2020
相关推荐
NYU-DLSP20 第八周:能量模型对比方法、正则化潜变量 EBM 与变分自编码器 VAE 实战指南
NYU DLSP20 第八周:能量模型对比方法、正则化潜变量 EBM 与变分自编码器 VAE 实战指南 本篇技术指南围绕 NYU DLSP20( pytorch
示例工程从能量基模型对比方法到变分自编码器:NYU-DLSP20 第八周 EBM 与稀疏编码实战解析
从能量基模型对比方法到变分自编码器:NYU DLSP20 第八周 EBM 与稀疏编码实战解析 本篇文章以 docs/ar/week08/08.md https:
示例工程NYU-DLSP20 第七周精读:从能量模型(EBM)到自编码器——潜变量推断、对比方法与 PyTorch 实战
NYU DLSP20 第七周精读:从能量模型(EBM)到自编码器——潜变量推断、对比方法与 PyTorch 实战 本文基于 NYU DLSP20( pytorc
示例工程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考