NYU-DLSP20 第七周技术全解:能量基模型、自监督学习与自编码器的 PyTorch 实战
示例工程【免费下载链接】NYU-DLSP20NYU Deep Learning Spring 2020项目地址https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning点击查看免费下载本篇技术指南围绕本仓库NYU Deep Learning Spring 2020 课程即 pytorch-Deep-Learning 项目第七周讲义展开系统讲解三个层层递进的主题能量基模型Energy-Based Model, EBM的统一建模框架与推理方式、自监督学习Self-Supervised Learning, SSL与 EBM 的训练方法含隐变量模型、K-均值示例、对比方法与对比散度、以及自编码器Autoencoder从原理到 PyTorch 实现的完整链路。读完本篇你将掌握 EBM 为什么比前馈网络更适合多可能输出的预测任务、如何用 Gibbs-Boltzmann 分布把能量转成概率、K-均值如何被视为一种隐变量 EBM、对比方法与架构方法的区别并能在 PyTorch 中从零实现标准自编码器与去噪自编码器。第七周课程全景三个部分一条主线第七周的内容在仓库中对应四份文档周索引 docs/tr/week07/07.md以及英文原版 docs/en/week07/07.md其下展开为三个部分Ders bölümü A讲座 A引入能量基模型的概念以及不同于前馈网络的建模思路为解决 EBM 中推理的困难引入隐变量提供辅助信息并支持多种可能预测最后说明 EBM 如何推广为评分函数更灵活的概率模型。Ders bölümü B讲座 B讲解自监督学习、EBM 的训练方法以及带隐变量的 EBM——特别是以 K-均值作为具体示例随后介绍对比方法Contrastive Methods、用拓扑图解释的去噪自编码器及其训练过程与用法并引入 BERT最后讲解同样用拓扑图阐释的对比散度Contrastive Divergence。Uygulama实践课讨论自编码器的若干应用及其使用动机然后介绍自编码器的不同架构欠完备/过完备隐层、如何避免过拟合、应选用的损失函数最后实现一个标准自编码器和一个去噪自编码器。对应到仓库中的三篇详细讲义docs/tr/week07/07-1.md能量基模型、docs/tr/week07/07-2.mdSSL 与 EBM 训练、docs/tr/week07/07-3.md自编码器导论以及实验 Notebook 10-autoencoder.ipynb。能量基模型一个统一监督、无监督与自监督的建模框架前馈网络的两个根本问题能量基模型提供了一种定义模型的新框架它像一个统一伞可以同时刻画监督学习、无监督学习和自监督学习。EBM 观察一组变量 $x$输出一组变量 $y$。课程指出前馈网络存在两个重大问题推理过程可能比堆叠的加权求和层更复杂如果最优推理不是简单的逐层加权求和前馈网络架构就无法表达。单个输入可能对应多个可能输出例如预测视频的下一帧。在分类网络中我们可以为每个类别训练一个分数但在图像这样的连续高维空间中无法做到不可能对图像做 softmax。即使输出是离散的样本空间也可能极其庞大——例如文本的组合性质导致组合数量爆炸。能量基模型为建模这类多模态数据提供了更好的框架。课程对应内容见 docs/tr/week07/07-1.md。EBM 的核心思想判断 (x, y) 是否相容不同于试图把 $x$ 分类到 $y$EBM 转而预测特定的 $(x, y)$ 组合是否匹配。换言之找到与 $x$ 相容的 $y$即找到使某个函数 $F(x,y)$ 取值较低的 $y$。典型例子$y$ 是否是 $x$ 的准确高分辨率图像文本A是否是文本B的良好翻译这种通过最小化一个函数来完成推理的方法被一大类模型采用。最小化的对象就是 $f(x,y)$即所谓的能量推理过程等价于最小化由 $f(x,y)$ 表示的约束。此后我们把 $f(x,y)$ 称为能量函数Energy function。形式化定义与梯度推理定义能量函数 $F: \mathcal{X} \times \mathcal{Y} \rightarrow \mathcal{R}$其中 $F(x,y)$ 描述 $(x,y)$ 配对之间的依赖程度。注意这个能量用于推理inference而非学习learning。推理由下式给出$$ \check{y} \displaystyle \text{argmin}_y \left { F(x,y)\right } $$为了让推理可行我们希望能量函数平滑且可微从而能用基于梯度的推理方法通过梯度下降在函数面上搜索找到与 $x$ 相容的 $y$。除梯度法外还存在多种求最小值的替代方法。补充观点图模型Graphical Models是能量基模型的特例——能量函数可分解为若干能量项之和每个能量项只涉及我们关心的变量的一个子集当这些项以特定形式组织时存在高效的推理算法能在待推理变量上求和的极小值。计算图视角下图是本讲给出的 EBM 计算图示意来源 docs/images/week07/07-1/fig1.png带隐变量的 EBM让机器输出多种可能输出 $y$ 不仅依赖 $x$还依赖一个我们不知道取值的额外变量 $z$隐变量。隐变量可以提供辅助信息。例如一个隐变量可以告诉你一段文本中词边界的位置——这在解释没有空格的手写体时非常有用对存在难辨空隙的语音也大有帮助此外某些语言如法语的词边界非常微弱因此在模型中引入该隐变量对解释此类输入十分关键。推理对带隐变量的 EBM 做推理需要同时关于 $y$ 和 $z$ 最小化能量函数$$\check{y}, \check{z} \text{argmin}_{y,z} E(x,y,z)$$这等价于把能量函数重新定义为$$F_\infty(x,y) \text{argmin}_{z}E(x,y,z)$$进一步可写成软最小化形式$$F_\beta(x,y) -\frac{1}{\beta}\log\int_z \exp(-\beta E(x,y,z))$$当 $\beta \rightarrow \infty$ 时$\check{y} \text{argmin}_{y}F(x,y)$ 成立。隐变量的另一大优势通过在某个集合上变化隐变量预测输出 $y$ 也能沿着可能预测的流形变化讲义中用一条丝带示意即 $F(x,y) \text{argmin}_{z} E(x,y,z)$。这使得机器能够产生多个输出而不仅仅是单个预测。示例视频预测可用于构建视频压缩系统也可用自动驾驶汽车采集的视频预测其他车辆的下一步行为。翻译同一段文本从一种语言翻译到另一种语言通常不存在唯一正确译文人们往往很难解释为何选择某一译法。若能参数化系统对给定文本可能产生的所有译文将非常有用——例如德语译英语时可能存在多个都正确的英文译文通过改变某些隐变量即可改变生成的译文。EBM 与概率模型从能量到 Gibbs-Boltzmann 分布能量即未归一化的负对数概率可以把能量看作未归一化的负对数概率并通过 Gibbs-Boltzmann 分布将能量转换为概率归一化后$$P(y \mid x) \frac{\exp (-\beta F(x,y))}{\int_{y}\exp(-\beta F(x,y))}$$其中 $\beta$ 是正常数需要校准以适配模型。$\beta$ 越大模型越波动$\beta$ 越小模型越平滑在物理学中 $\beta$ 是温度的倒数$\beta \rightarrow \infty$ 意味着温度趋近于零。带隐变量的联合形式为$$P(y,z \mid x) \frac{\exp(-\beta F(x,y,z))}{\int_{y}\int_{z}\exp(-\beta F(x,y,z))}$$若在 $y$ 上做边缘化$P(y \mid x) \int_z P(y,z \mid x)$可得$$ \begin{aligned} P(y \mid x) \frac{\int_z \exp(-\beta E(x,y,z))}{\int_y\int_z \exp(-\beta E(x,y,z))} \ \frac{\exp \left [ -\beta \left (-\frac{1}{\beta}\log \int_z \exp(-\beta E(x,y,z))\right ) \right ] }{\int_y \exp\left [ -\beta\left (-\frac{1}{\beta}\log \int_z \exp(-\beta E(x,y,z))\right )\right ]} \ \frac{\exp (-\beta F_{\beta}(x,y))}{\int_y \exp (-\beta F_{\beta} (x,y))} \end{aligned} $$因此如果拥有一个隐变量模型、并希望以概率上正确的方式消去隐变量 $z$只需重新定义能量函数 $F_\beta$。自由能名字从何而来$$ F_{\beta}(x,y) - \frac{1}{\beta}\log \int_z \exp (-\beta E(x,y,z)) $$计算自由能通常非常困难多数情况下可能不可解intractable。因此如果模型中有需要最小化的隐变量或希望通过定义该能量函数 $F$ 来边缘化的隐变量且最小化对应于 $\beta$ 的无穷极限那么这一过程是可以完成的。在上述 $F_\beta(x, y)$ 定义下$P(y \mid x)$ 只是 Gibbs-Boltzmann 公式的一次应用$z$ 已在其中被隐式边缘化。物理学家把 $F$ 称为自由能Free Energy——$e$ 是能量$F$ 是自由能。为什么要放弃严格概率框架来自课程的问答问EBM 相比概率模型的优势是什么概率模型也可以有可边缘化的隐变量。答区别在于——在概率模型中你没有选择要最小化的目标函数的自由且必须忠于概率框架即你操作的每个对象都必须是归一化分布可用变分方法等近似。而 EBM 的立场是这些模型的最终目的是做决策。如果你构建了一个驾驶系统它告诉你0.8 概率左转或 0.2 概率右转你最终会左转——0.2 与 0.8 这个数值本身并不重要重要的是做出最优决策。若想把两个分别训练的系统的输出结合起来例如一个人类与一个系统则确实需要校准分数以组合决策而校准分数的唯一正确方式是把它们转成概率。但若端到端训练一个系统做决策那么只要评分函数能给最佳决策打最高分用什么评分函数都可以。EBM 在如何处理模型、如何训练、使用什么目标函数上提供了多得多的选择。如果坚持概率模型就必须用最大似然——即让模型对观测数据给出最大概率但这一点只在模型正确时才能被证明成立而你的模型永远不是正确的。正如统计学家 George Box 的名言All models are wrong, but some are useful.所有模型都是错的但有些有用。尤其在高维空间与组合空间如文本中概率模型都是近似模型都在某种意义上错试图对它们做归一化只会让它们错得更厉害因此不如不归一化。能量面像山脉为什么完美概率模型反而不可行把能量函数想象成山脉山谷处是数据点图中黑色圆点四周是高山。若用概率模型拟合这些位于无穷薄流形上的数据点正确的密度模型应当在流形上密度为无穷大、在距流形 $\varepsilon$ 处密度为零并且在整个 $[x,y]$ 域上的积分为 1——这在计算机上几乎无法实现也是本质上不可能的神经网络需要有无限大的权重并且输出在整个定义域上的积分要恰好为 1。最大似然会要求你产出这样一个模型而世界上没有计算机能算出来。更糟的是即便你拥有这个完美模型$(x,y)$ 空间中的一张薄板你也无法做推理给定 $x$所有除零概率集合外的 $y$ 概率都是零只有少数几个可能值例如 3 个且它们无限狭窄没有任何推理算法能找到它们。唯一可行之道是让对比函数contrast function平滑且可微这样从任意起点出发、用梯度下降就能为任意 $x$ 找到合适的 $y$——但代价是它不再是该分布的良好概率模型。这正是坚持要有良好概率模型反而有害的情形在此场景下最大似然是失败的。若坚持贝叶斯观点可用密度函数必须平滑的强先验来补救然而贝叶斯框架中的一切操作——取对数、忘掉归一化——最终都得到能量基模型带有加性正则化器的 EBM能量 $$ 正则项与似然为能量指数的贝叶斯模型完全等价即 $\exp(\text{energy})\exp(\text{regularizer}) \exp(\text{energy} \text{regularizer})$去掉指数即得到带加性正则项的 EBM。结论是概率/贝叶斯方法与 EBM 之间存在对应关系但坚持最大似然在高维或组合空间中常常有害——离散分布尚可连续情形可能错得很离谱。自监督学习EBM 思想在无标注数据上的应用什么是自监督学习自监督学习Self-Supervised Learning, SSL同时涵盖监督与无监督学习。SSL 的目标预训练任务是学习输入的优良表示以便后续用于监督任务。在 SSL 中模型被训练为用数据的一部分预测另一部分。例如 BERT 就是用 SSL 技术训练的而去噪自编码器DAE在自然语言处理NLP中展示了先进的结果。SSL 任务可归纳为三类用过去预测未来用可见部分预测被遮挡部分用所有可用部分预测被遮蔽的部分下图示意了 SSL 的核心思想来源 docs/images/week07/07-2/1_ssl.png详见 docs/tr/week07/07-2.md一个经典例子如果系统被训练为在摄像头移动时预测下一帧它会隐式学习深度与视差parallax——这迫使系统认识到视野中被遮挡的物体并没有消失而是继续存在并学会区分有生命/无生命物体与背景甚至可能学到重力之类的直觉物理。NLP 的巨大成功与视觉的差距最先进的 NLP 系统BERT在一个 SSL 任务上预训练巨型神经网络从句子中移除一些词让系统预测缺失的词取得了巨大成功。计算机视觉也尝试了类似思路——从图像中移除一部分训练模型预测缺失部分。虽然模型能补全缺失区域但并未取得与 NLP 同等的成功若把这些模型生成的内部表示作为输入喂给计算机视觉系统其表现不如在 ImageNet 上监督预训练的模型。差异根源在于NLP 是离散的而图像是连续的在离散域我们知道如何表示不确定性可以在可能输出上使用大 softmax而在连续域我们不知道。为什么 AI 系统需要 EBM智能系统AI agent需要能预测自身动作对环境与自身的结果才能做出明智决策。由于世界并非完全确定机器/人脑也没有足够的算力枚举每一种可能我们需要教 AI 系统在高维空间中存在不确定性时进行预测——EBM 对此极为有用。一个直观的反例用最小二乘Least Squares训练神经网络预测视频下一帧得到的帧会是模糊图像——因为模型无法精确预测未来为降低损失它只能学习平均掉训练数据中下一帧的所有可能性。这正是需要隐变量 EBM 的场合。用隐变量 EBM 预测下一帧与线性回归不同隐变量 EBM 不仅利用我们对世界的已知信息还引入一个隐变量给出现实中实际发生了什么的信息二者结合即可做出接近真实的预测。这些模型可被看作根据使系统能量最小的隐变量对应的预测来评估输入 $x$ 与真实输出 $y$ 的相容性的系统观察输入 $x$为输入 $x$ 与隐变量 $z$ 的不同组合产生可能预测 $\bar{y}$再选择使能量即预测误差最小的那个。取决于抽取到的隐变量我们能得到所有可能的预测——隐变量可视为输出 $y$ 中不存在于输入 $x$ 的重要信息。标量值能量函数有两种版本条件式$F(x, y)$ —— 衡量 $x$ 与 $y$ 之间的相容性无条件式$F(y)$ —— 衡量 $y$ 各分量之间的相容性训练能量基模型对比方法 vs 架构方法为了参数化 $F(x, y)$训练 EBM 有两大类方法对比方法Contrastive methods压低 $F(x[i], y[i])$抬高其他点 $F(x[i], y)$架构方法Architectural methods通过正则化构造 $F(x, y)$使低能量区域的体积被限制或最小化。共存在七种塑造能量函数的策略对比方法在选择抬高哪些点上各不相同架构方法则在限制编码的信息容量的方式上各不相同。最大似然一种对比式学习最大似然是对比方法的典型代表。能量可被解释为未归一化的负对数密度Gibbs 分布给出给定 $x$ 时 $y$ 的似然$$ P(Y \mid W) \frac{e^{-\beta E(Y,W)}}{\int_{y}e^{-\beta E(y,W)}} $$最大似然试图让分子变大、分母变小等价于最小化 $-\log(P(Y \mid W))$$$ L(Y, W) E(Y,W) \frac{1}{\beta}\log\int_{y}e^{-\beta E(y,W)} $$单个样本 $Y$ 的负对数似然损失的梯度为$$ \frac{\partial L(Y, W)}{\partial W} \frac{\partial E(Y, W)}{\partial W} - \int_{y} P(y\mid W) \frac{\partial E(y,W)}{\partial W} $$上述梯度中第一项是数据点 $Y$ 处的梯度第二项是能量梯度在所有 $Y$ 上的期望。因此做梯度下降时第一项努力降低数据点 $Y$ 处的能量第二项努力抬高所有其他 $Y$ 处的能量。能量函数的梯度通常非常复杂因此计算、估计或近似该积分在多数情况下不可解这也是该问题极具研究价值的原因。隐变量 EBM 的两种类型隐变量模型的核心优势在于通过隐变量允许多个预测当 $z$ 在一个集合上变化时$y$ 沿着可能预测的流形变化。典型例子包括 K-均值、稀疏建模Sparse modelling与 GLO。它们可分为两类条件模型$y$ 依赖 $x$$F(x,y) \text{min}_{z} E(x,y,z)$$F_\beta(x,y) -\frac{1}{\beta}\log\int_z e^{-\beta E(x,y,z)}$无条件模型标量能量函数 $F(y)$ 衡量 $y$ 分量间相容性$F(y) \text{min}_{z} E(y,z)$$F_\beta(y) -\frac{1}{\beta}\log\int_z e^{-\beta E(y,z)}$K-均值一个具体的隐变量 EBM 示例K-均值可被视为一个能量基模型试图对 $y$ 上的分布建模其能量函数为 $E(y,z) \Vert y-Wz \Vert^2$其中 $z$ 是 one-hot 向量。给定 $y$ 与 $k$推理就是找出 $W$ 的 $k$ 个可能列中哪一个使重构误差能量函数最小。训练时可采用找 $z$ 选出离 $y$ 最近的 $W$ 列再走一步梯度使其更近然后重复的流程——不过实际上坐标梯度下降coordinate gradient descent效果更好、更快。在讲义绘制的图中粉色螺旋上是数据点围绕这条线的黑色团块对应 $W$ 每个原型prototype周围的二次势阱。一旦学得能量函数就可以开始回答两类问题给定 $y_1$ 能否预测 $y_2$给定 $y$ 能否找到数据流形上最近的点值得注意K-均值属于架构方法与对比方法相对我们不在任何地方抬高能量只把特定区域的能量压低。其缺点在于一旦确定了 $k$只能有 $k$ 个点能量为零其他所有点的能量会随着远离这些点而二次增长。对比方法与对比散度据课程讲师 LeCun 的观点人人最终都会使用架构方法但就目前而言对图像有效的是对比方法。理想情况下我们希望能量面在数据流形上具有最低能量因此要压低训练样本附近的 $F(x,y)$——但这单独可能不够还必须抬高那些本应高能量却实际低能量区域的 $y$ 值。下图展示了数据点与能量面的等高线来源 docs/images/week07/07-2/6_contrastive_1.png寻找需要抬高能量的候选 $y$有若干途径去噪自编码器Denoising Autoencoder对比散度Contrastive Divergence蒙特卡洛Monte Carlo马尔可夫链蒙特卡洛Markov Chain Monte Carlo哈密顿蒙特卡洛Hamiltonian Monte Carlo下文聚焦前两种也是本讲详细讨论的对象。去噪自编码器DAE找到需要抬高能量的 $y$ 的一个办法是随机扰动训练样本图中绿色箭头示意。得到被破坏的数据点后在那里抬高能量如果对每个数据点都足够多次地重复能量样本就会在训练样本周围卷曲起来。训练步骤为取一点 $y$ 并破坏corrupt它训练编码器与解码器从被破坏的数据点重构出原始数据点。若 DAE 训练得当能量会随远离数据流形而二次增长。用法上DAE 能把偏离流形的输入拉回流形附近实现去噪与修复。BERT离散空间的掩码自编码器BERT 以类似方式训练区别在于空间是离散的处理文本破坏技术是掩码掉一些词重构步骤则是预测这些词——因此这种方法也被称为掩码自编码器masked autoencoder。对比散度Contrastive Divergence对比散度给出了寻找要抬高能量的 $y$ 点的更聪明方式给训练点一个随机扰动random kick然后用梯度下降沿能量函数下行轨迹终点处抬高落在该点的能量图中绿色折线示意见 docs/images/week07/07-2/10_contrastive_div.png。相比随机扰动这种先向低能量区移动再抬高的采样策略能更高效地塑造能量面。自编码器应用、架构与损失函数实践部分对应 docs/tr/week07/07-3.md先讲为什么用与怎么用再给出完整 PyTorch 实现。主要应用图像生成课程展示了由 StyleGan2 生成器产生的两张人脸——其实都是假的。虽然面部细节非常逼真但背景看起来怪异左图模糊、右图物体畸形原因在于网络是在人脸样本上训练的而背景的变异性高得多此处数据流形大约有 50 维与人脸图像的自由度相当。像素空间 vs 隐空间插值在像素空间对狗与鸟的图像做线性插值得到的是两图的叠加淡出效果而若对两个隐空间表示插值再送入解码器则能得到狗→鸟的平滑变换。显然隐空间更能捕获图像的结构。各类变换缩放、平移、亮度、旋转注意旋转可能是三维的都可以在隐空间中流畅地参数化。图像超分辨率模型目标是把 16×16 的输入放大并重构原始人脸。从左到右依次为16×16 输入、标准双三次插值结果、神经网络输出、真实图像。输出图像清楚地暴露了训练数据中的偏差——例如左上角的亚洲男性因训练图像不均衡被重构得像欧洲人左下角女性的脸因训练数据缺少该角度样本而显得奇怪。图像修复Inpainting在人脸上放一块灰色补丁会让图像偏离训练流形修复则是通过最小化能量函数在训练流形上找到最近的样本图像。描述生成图像Caption to Image提取与重要视觉信息相关的文本特征表示再将其解码为图像。自编码器是什么自编码器是以无监督方式训练的人工神经网络先学习数据的编码表示再从编码表示尽可能接近地生成输入数据——因此自编码器的输出就是它对输入的预测。下图展示了基本架构来源 docs/images/week07/07-3/13_ae_structure.png从底部输入 $\boldsymbol{x}$ 开始送入编码器由 $\boldsymbol{W_h}$ 定义、后接压缩函数squashing的仿射变换得到中间隐层 $\boldsymbol{h}$$\boldsymbol{h}$ 再送入解码器由 $\boldsymbol{W_x}$ 定义、后接另一个压缩函数的仿射变换得到输出 $\boldsymbol{\hat{x}}$——即模型对输入的预测/重构。按惯例这是一个三层神经网络。数学表达如下$$ \boldsymbol{h} f(\boldsymbol{W_h}\boldsymbol{x} \boldsymbol{b_h}) \ \boldsymbol{\hat{x}} g(\boldsymbol{W_x}\boldsymbol{h} \boldsymbol{b_x}) $$维度约定为$$ \boldsymbol{x},\boldsymbol{\hat{x}} \in \mathbb{R}^n,\quad \boldsymbol{h} \in \mathbb{R}^d,\quad \boldsymbol{W_h} \in \mathbb{R}^{d \times n},\quad \boldsymbol{W_x} \in \mathbb{R}^{n \times d} $$注为了表示 PCA可以采用紧密权重tied weights即 $\boldsymbol{W_x}\ \dot{}\ \boldsymbol{W_h}^\top$。为什么使用自编码器自编码器的主要用途是异常检测与图像去噪。自编码器的任务是重构存在于流形上的数据——我们希望它只能重构训练中见过的输入因此把模型约束为重构训练期间观察到的内容于是新输入中的变化会被消除因为模型对这些扰动不敏感。另一个应用是图像压缩若隐层维度 $d$ 小于输入维度 $n$编码器即可充当压缩器隐表示在保留输入全部或大部分信息的同时占用更少空间。重构损失函数数据集上的总损失等于逐样本损失的平均$$ L \frac{1}{m} \sum_{j1}^m \ell(x^{(j)},\hat{x}^{(j)}) $$输入为类别型时用交叉熵损失$$ \ell(\boldsymbol{x},\boldsymbol{\hat{x}}) -\sum_{i1}^n [x_i \log(\hat{x}_i) (1-x_i)\log(1-\hat{x}_i)] $$输入为实数值时用均方误差MSE损失$$ \ell(\boldsymbol{x},\boldsymbol{\hat{x}}) \frac{1}{2} \lVert \boldsymbol{x} - \boldsymbol{\hat{x}} \rVert^2 $$欠完备与过完备隐层当隐层维度 $d$ 小于输入维度 $n$ 时称为欠完备under-complete隐层当 $dn$ 时称为过完备over-complete隐层。如前述欠完备隐层可用于压缩把输入信息编码到更少维度过完备隐层则用比输入更高维的编码这使优化更容易。由于目标是重构输入模型倾向于把输入特征全部复制进隐层再原样输出从而退化成恒等函数——这意味着模型什么也没学到必须避免。因此需要引入信息瓶颈information bottleneck等额外约束把隐层可能的配置限制为仅在训练中见过的配置。这实现了选择性重构限于输入空间的子集并使模型对不在流形上的一切不敏感。值得注意的是欠完备层因维度不足无法充当恒等函数所以比过完备层更不容易过拟合但仍然可能过拟合——例如给定强大的编码器与解码器模型可能为每个数据点关联一个编号并学会该映射。避免过拟合的方法包括正则化方法、架构方法等。去噪自编码器与收缩自编码器去噪自编码器DAE假设我们注入与现实中会观测到的相同的噪声分布从而学会如何稳健地恢复。对比输入与输出可知已经在流形上的点几乎不动远离流形的点则大幅移动。用不同颜色表示每个输入点移动的距离可以发现角落处的点移动了接近 1 个单位而两条分支之间的点几乎不动——因为它们在训练中被上下两条分支共同吸引。收缩自编码器Contractive AE损失函数包含重构项加上隐表示对输入梯度的范数平方因此总损失会最小化给定输入变化时隐层的变化收益是让模型对重构方向敏感、对其他可能方向不敏感。训练流形是在三维空间中延伸的一维对象自编码器的目标是把弯曲的曲线沿一个方向拉伸$\boldsymbol{z}\in \boldsymbol{Z}\subseteq\mathbb{R}^{d}$。结果是输入层的一个点被变换为隐层的一个点——我们在输入空间点与隐空间点之间建立了对应关系但输入空间区域与隐空间区域之间没有对应之后用解码器把隐层的点变换为有意义的输出层。PyTorch 实战标准自编码器与去噪自编码器实践部分对应的完整 Notebook 是 10-autoencoder.ipynb仓库根目录。我们将实现一个标准自编码器与一个去噪自编码器并比较输出。数据准备Notebook 使用 MNISTbatch_size 256图像先ToTensor()再以(0.5,), (0.5,)归一化加载后判断是否可用 CUDAimport torch import torchvision from torch import nn from torch.utils.data import DataLoader from torchvision import transforms from torchvision.datasets import MNIST batch_size 256 img_transform transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,)) ]) dataset MNIST(./data, transformimg_transform, downloadTrue) dataloader DataLoader(dataset, batch_sizebatch_size, shuffleTrue) device torch.device(cuda:0 if torch.cuda.is_available() else cpu)模型架构与重构损失使用 $28 \times 28$ 图像与 30 维隐层变换过程为 $784\to30\to784$。对编码器与解码器应用双曲正切函数使输出范围限制在 $(-1, 1)$损失函数使用均方误差MSE# n 28 x 28 784 d 30 # for standard AE (under-complete hidden layer) # d 500 # for denoising AE (over-complete hidden layer) class Autoencoder(nn.Module): def __init__(self): super().__init__() self.encoder nn.Sequential( nn.Linear(28 * 28, d), nn.Tanh(), ) self.decoder nn.Sequential( nn.Linear(d, 28 * 28), nn.Tanh(), ) def forward(self, x): x self.encoder(x) x self.decoder(x) return x model Autoencoder().to(device) criterion nn.MSELoss()Notebook 中通过注释/取消注释几行代码即可在标准自编码器与去噪自编码器之间切换但别忘了(1) 相应改变隐层大小(2) 重新生成模型(3) 把新参数重新传给优化器。优化器使用 Adamlearning_rate 1e-3learning_rate 1e-3 optimizer torch.optim.Adam(model.parameters(), lrlearning_rate)训练标准自编码器用 PyTorch 训练标准自编码器需要在训练循环中放入以下 5 个步骤前向调用output model(img)把输入图像送入模型用criterion(output, img.data)计算损失。反向 3. 用optimizer.zero_grad()清零梯度避免梯度累积 4. 用loss.backward()反向传播 5. 用optimizer.step()更新参数。完整循环num_epochs 20num_epochs 20 # do nn.Dropout() # comment out for standard AE for epoch in range(num_epochs): for data in dataloader: img, _ data img img.to(device) img img.view(img.size(0), -1) # noise do(torch.ones(img.shape)).to(device) # img_bad (img * noise).to(device) # comment out for standard AE # forward output model(img) # feed img (for std AE) or img_bad (for denoising AE) loss criterion(output, img.data) # backward optimizer.zero_grad() loss.backward() optimizer.step() print(fepoch [{epoch 1}/{num_epochs}], loss:{loss.item():.4f})训练去噪自编码器在标准流程基础上去噪自编码器需要增加以下步骤调用nn.Dropout()随机关闭神经元创建噪声掩码do(torch.ones(img.shape))用二值掩码乘好图像生成坏图像img_bad (img * noise).to(device)。之后把img_bad作为模型输入output model(img_bad)损失仍与原始img.data比较。训练完成后还可以把 DAE 的修复能力与 OpenCV 的inpaintINPAINT_TELEA与INPAINT_NS两种算法做对比实验——Notebook 的第 1113 个代码单元专门演示了这一对照。从核kernel看两种模型的差异一个值得注意的细节即使输入维度是 $28\times28784$、隐层维度设为 500由于图像中有大量黑色像素该隐层仍然算过完备层。观察欠完备标准自编码器学到的编码器核数字所在区域的像素明显检测出了某种模式而区域外的像素基本是随机的——这说明标准自编码器不关心数字区域之外的像素。相反对每个图像在拟合前施加 dropout 掩码的去噪自编码器其每个学到模式的核都会把数字区域外的像素设置为某个常数——因为施加了 dropout 掩码模型开始关心数字区域之外的像素了。课程讲义还将该 DAE 的修复输出与 Telea、Navier-Stokes 等经典修复算法的输出并排对比展示了学习型方法的修复效果。关键要点回顾EBM 用能量函数 $F(x,y)$ 度量 $(x,y)$ 的相容性推理即 $\arg\min_y F(x,y)$适用于一对多的高维连续或组合预测问题。隐变量使 EBM 能产出多个可能输出通过自由能 $F_\beta$ 可在概率上正确地边缘化隐变量且 $F_\infty$ 对应 $\arg\min_z E$。能量→概率只需 Gibbs-Boltzmann 分布但严格归一化的概率模型在高维/组合空间中常常错得更厉害端到端决策场景下未归一化能量更实用。训练 EBM 的两大类方法对比方法压低数据点能量、抬高其他点与架构方法用正则限制低能量区域体积K-均值是架构方法的一个简洁实例其能量为 $\Vert y-Wz \Vert^2$。对比散度给训练点一个随机扰动后沿能量面梯度下降在终点抬高能量DAE通过随机破坏输入来寻找待抬高点BERT则是离散空间中的掩码自编码器。自编码器是无监督的学习压缩表示再重构网络欠完备层用于压缩过完备层优化容易但更易过拟合可用信息瓶颈/正则化抑制类别输入用交叉熵、实数输入用 MSE。实战要点Notebook 10-autoencoder.ipynb 中通过切换d30 欠完备 / 500 过完备并注释/取消注释 dropout 掩码三行代码即可在标准与去噪自编码器间切换训练循环保持前向两步 反向三步的标准范式。建议继续阅读仓库中的三篇英文/土耳其文讲义原文docs/tr/week07/07-1.md、docs/tr/week07/07-2.md、[docs/tr/week07/07-3.md]并配合 Notebook 与docs/images/week07/目录下的图示能量面等高线、拓扑图、训练过程图等对照理解。赞分享示例工程【免费下载链接】NYU-DLSP20NYU Deep Learning Spring 2020项目地址https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning点击查看免费下载相关推荐RuoYi-Vue3 前端工程实战Vue3 Vite Element Plus 技术栈解析、环境搭建与内置功能全景RuoYi Vue3 前端工程实战Vue3 Vite Element Plus 技术栈解析、环境搭建与内置功能全景 RuoYi Vue3 是若依权限管示例工程NYU-DLSP20 第七周深度解析能量模型EBM、自监督学习与自编码器实战NYU DLSP20 第七周深度解析能量模型EBM、自监督学习与自编码器实战 本篇技术指南以 NYU Deep Learning Spring 2020示例工程NYU-DLSP20 第七周能量模型EBM详解自监督学习、潜变量能量模型与对比方法实战NYU DLSP20 第七周能量模型EBM详解自监督学习、潜变量能量模型与对比方法实战 导读 本文基于 NYU 深度学习课程Spring 2020讲师示例工程上一篇Audacity终极指南从开源音频编辑器到专业音频处理平台的技术深度解析下一篇kubectx与Cilium在eBPF网络环境中的命名空间切换创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Nginx 核心配置拆解:从静态部署到反向代理与负载均衡实战

Nginx 核心配置拆解:从静态部署到反向代理与负载均衡实战

作为一名常年跟线上服务打交道的人,我对 Nginx 的感情一直很复杂。一方面,静态部署、反向代理、负载均衡这几件事,随便拿出来一个都不算难,网上教程一把一把的;另一方面,真到了线上出问题的时候——SSL 证书…

2026/10/10 8:24:53 阅读更多 →
GOF设计模式笔记:从策略到模板方法,构建代码架构思维

GOF设计模式笔记:从策略到模板方法,构建代码架构思维

1. 为什么值得专门整理一份GOF笔记写代码写了这些年,回头看看,真正让我从“能跑就行”进化到“设计得还行”的转折点,就是认真啃了一遍GoF的《设计模式》。不过说句实话,光看书是不够的。那本书英文原版四百多页,每一段…

2026/10/10 8:24:53 阅读更多 →
oneTBB 头文件体系与 C++20 模块(tbb.cppm)完全指南

oneTBB 头文件体系与 C++20 模块(tbb.cppm)完全指南

并发编程高性能计算 【免费下载链接】oneTBB oneAPI Threading Building Blocks (oneTBB) 项目地址: https://gitcode.com/gh_mirrors/on/oneTBB 点击查看 免费下载 oneTBB(oneAPI Threading Building Blocks)的全部公共接口通过一组 C 头文…

2026/10/10 8:23:53 阅读更多 →

最新新闻

苏州综合布线公司推荐:2026 报价拆解与选商避坑

苏州综合布线公司推荐:2026 报价拆解与选商避坑

同样是 200 个信息点的厂房,两家公司报出的价格能差出一半。这不是谁在乱要价,而是两份报价单里装的东西不一样:线缆等级、桥架形式、测试范围、辅材包不包、有没有把机柜和配线架算进去,每一项都藏在价格里。只对总价&#xff0c…

2026/10/10 9:14:54 阅读更多 →
大四网络工程转型 AI 应用开发:我的 5 个月自学计划(第二周)

大四网络工程转型 AI 应用开发:我的 5 个月自学计划(第二周)

从"跟着敲"到"自己搭"这一篇是第二周的记录。第二周我学的东西,比第一周更硬:集合、字典、函数、参数的几种传法、lambda、递归,最后还写了两个完整的系统。上一篇发出去之后,我说尽量每周更一篇。结果假期玩…

2026/10/10 9:14:54 阅读更多 →
C语言学习笔记(指针)

C语言学习笔记(指针)

指针:指向变量所使用的内存空间的地址 指针变量:一个变量专门用来存放另一变量在内存中数据的地址 (即指针),则它称为“指针变量”。我们可以通过访问指针变量达到访问内存中另一个变量数据的目的。(有时为了阐述方便, 将指针变量…

2026/10/10 9:14:54 阅读更多 →
3个月从纯前端到独立交付AI产品 | 给前端小白的AI转型路线图(收藏版)

3个月从纯前端到独立交付AI产品 | 给前端小白的AI转型路线图(收藏版)

本文作者分享了从纯前端独立交付完整AI产品的3个月转型经历,涵盖后端基础、数据库设计、AI接入实战、Agent工具调用等关键学习点。通过项目驱动、AI辅助学习的方式,逐步掌握Node.js、Prisma、DeepSeek API等技能,最终实现前端界面、后端API、…

2026/10/10 9:14:54 阅读更多 →
掌握AI智能体,小白也能月入过万:收藏这份进阶指南!

掌握AI智能体,小白也能月入过万:收藏这份进阶指南!

本文介绍了如何利用AI智能体(Agent)提升工作效率和收入。通过三个真实案例,展示了运营、Java工程师和行政人员如何通过学习和应用AI技术,实现职业突破和薪资增长。文章强调AI不是简单的工具,而是能够自动化工作流程的数…

2026/10/10 9:14:54 阅读更多 →
「同一套数据」到底是什么:教育 SaaS 里最被含糊的一句话

「同一套数据」到底是什么:教育 SaaS 里最被含糊的一句话

一、先拆这个词 「同一套数据」在教育 SaaS 的销售话术里出现频率很高,但它几乎从没被准确定义过。 在系统设计层面,它指的是一种数据所有权架构:业务实体只有一份权威记录(single source of truth),所有模…

2026/10/10 9:13:53 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →