☰
NYU-DLSP20 课程笔记:基于能量的结构化预测——因子图、高效推理与图变换网络(Graph Transformer Net)
2026/10/10 2:34:11 网站建设 项目流程
  • 示例工程

【免费下载链接】NYU-DLSP20

NYU Deep Learning Spring 2020

项目地址:https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning
点击查看免费下载

本文基于 NYU Deep Learning Spring 2020(NYU-DLSP20)第 14 周理论课 Part A(讲师:Yann LeCun)整理,对应仓库文档 docs/ko/week14/14-1.md(英文原版见 docs/en/week14/14-1.md)。课程围绕"结构化预测(Structured Prediction)"展开:先给出结构化预测的问题定义与早期工作(TDNN + 动态时间规整),再引出能量基因子图(Energy-Based Factor Graphs)及其高效推理框架,随后介绍以"浅层因子"构建的线性结构化模型(条件随机场、最大间隔马尔可夫网络、结构化感知机),最后落到可端到端训练的图变换网络(Graph Transformer Net, GTN),并展示如何在动态计算图上完成反向传播。读完本文,你将掌握能量函数如何用因子和表示、如何把推理转化为 trellis 图上的最短路径问题,以及 GTN 如何用两阶段(钳位/自由)流程实现判别式训练。

一、什么是结构化预测

文档开篇给出的定义:结构化预测是针对给定输入 $x$,预测一个相互依赖、受约束的输出变量 $y$ 的问题——这里的 $y$ 不是标量离散值或实数值,而是具有结构性的组合对象。

关键特征有三点:

  • 输出变量不属于单一类别,其可能取值个数可以是指数级甚至无限的;
  • 输出内部存在顺序、空间或组合结构,各分量之间相互依赖;
  • 模型的根本任务是捕获问题领域中的序列(sequential)、空间(spatial)或组合(combinatorial)结构。

典型的应用场景包括:语音识别、手写识别、自然语言翻译等。在这些任务中,输出必须符合语法约束(例如单词序列必须构成合法语句),因此无法预先限定输出的可能数量,也不能把问题简化成"从有限类别中选一个"。

二、结构化预测的早期工作:TDNN 与动态时间规整

2.1 从 TDNN 到特征向量

早期做法是先把输入信号(如语音)送入时延神经网络(TDNN, Time-Delay Neural Network),得到一个特征向量。在传统模型系统中,这个特征向量可类比于表示某个类别的 softmax 输出。

2.2 动态时间规整解决"同一单词不同发音"

识别发音单词时面临一个天然难题:不同的人以不同方式和速度发音同一个词,导致特征序列长度和节奏都不一致。为此,早期系统引入动态时间规整(Dynamic Time Warping, DTW)。

其核心思想是:系统预先保存一组由某人录制的、对应序列或特征向量的模板(templates);神经网络与模板同时训练,使系统学会识别不同发音下的同一个词。**潜变量(latent variable)**在此扮演关键角色——它允许对特征向量做时间轴上的"扭曲(time-warp)",使其长度与模板对齐。

2.3 矩阵视角与图上的最短路径

将 TDNN 输出的特征向量按水平方向排列、单词模板按垂直方向排列,可以把它可视化为一个矩阵:矩阵中每个元素对应特征向量与模板之间的距离。这一矩阵又可进一步可视化为图(graph)问题:目标是从左下角出发,沿着使累计距离最小的路径到达右上角。

2.4 训练目标

训练这个潜变量模型时,需要让正确答案的能量尽可能小、所有错误答案的能量尽可能大。实现方式是设计一个目标函数:输入错误单词的模板,将其从当前特征序列"推离"(增大能量),并通过反向传播更新梯度。

三、能量基因子图

3.1 基本思想

能量基因子图(Energy-Based Factor Graphs)的核心思想是:构造一个能量基模型,使总能量等于若干部分能量项之和(等价地,概率为若干因子之积)。

这类模型的最大优势是:可以运用高效的推理算法。因为能量被分解成局部因子,全局优化不必逐点穷举,而是可以利用因子间的依赖结构加速。

3.2 序列标注(Sequence Labeling)

一个具体例子是序列标注:模型输入语音信号 $X$,输出标签序列 $Y$,使得输出标签满足总能量项最小化。

在此例中,能量是三个项的求和,图中用蓝色方块表示——每个方块是一个神经网络,为输入变量生成特征向量:

  • 语音识别场景下,$X$ 可视为语音信号;
  • 方块实现了语法约束(grammatical constraints);
  • $Y$ 表示生成的输出标签。

四、能量基因子图的高效推理

4.1 问题背景:穷举为何不可行

文档引用了经典文献A Tutorial on Energy-Based Learning(Yann LeCun, Sumit Chopra, Raia Hadsell, Marc'Aurelio Ranzato, Fu Jie Huang, 2006):能量基模型的学习与推理涉及在答案集合 $\mathcal{Y}$ 与潜变量集合 $\mathcal{Z}$ 上对能量做最小化。当 $\mathcal{Y}\times\mathcal{Z}$ 的基数很大时,这种最小化会变得难以处理(intractable)。

一种解决思路是利用能量函数的结构来高效完成最小化。当能量可以表示为若干独立函数(称为因子,factors)之和、且每个因子只依赖于 $Y$ 和 $Z$ 中不同的变量子集时,这种依赖关系用**因子图(factor graph)**表达最自然。因子图是图模型(graphical models)或信念网络(belief networks)的一种一般化形式。

4.2 四因子分解示例

图 5(即原文 Figure 19)给出了一个简单因子图。其能量函数是四个因子之和:

$$E(Y, Z, X) = E_a(X, Z_1) + E_b(X, Z_1, Z_2) + E_c(Z_2, Y_1) + E_d(Y_1, Y_2)$$

其中 $Y = [Y_1, Y_2]$ 是输出变量,$Z = [Z_1, Z_2]$ 是潜变量。每个因子可视为对其输入变量取值之间的一种软约束(soft constraints)。推理问题即求解:

$$(\bar{Y}, \bar{Z})=\operatorname{argmin}{y \in \mathcal{Y}, z \in \mathcal{Z}}\left(E{a}\left(X, z_{1}\right)+E_{b}\left(X, z_{1}, z_{2}\right)+E_{c}\left(z_{2}, y_{1}\right)+E_{d}\left(y_{1}, y_{2}\right)\right)$$

4.3 计算量:从 96 次降到 16 次

假设 $Z_1$、$Z_2$、$Y_1$ 是离散二值变量,$Y_2$ 是三值变量。由于 $X$ 始终被观测,其定义域的基数无关紧要。给定 $X$ 时,$Z$ 和 $Y$ 的可能配置数为:

$$2 \times 2 \times 2 \times 3 = 24$$

朴素穷举会评估整个能量函数 24 次,即 $24 \times 4 = 96$ 次单因子求值。

但观察因子结构可以发现:

  • $E_a$ 只依赖 $Z_1$,仅有 2 种输入配置($Z_1 = 0$ 或 $Z_1 = 1$);
  • $E_b$、$E_c$ 各有 4 种配置;
  • $E_d$ 有 6 种配置。

因此最多只需 $2 + 4 + 4 + 6 = 16$ 次单因子求值——这就是利用分解结构带来的指数级效率提升。

4.4 trellis 图与最短路径推理

把这 16 个因子值预先计算出来,放到 trellis(格状图)的**弧(arc)**上:每一列节点表示单个变量的可能取值,每条边的权重是该因子在对应输入取值下的输出能量。此时,从起点到终点的一条路径就代表所有变量的一种可能配置,路径上权重之和等于该配置的总能量。

于是推理问题被归结为在图中搜索最短路径(shortest path),可以使用Viterbi 算法或A* 算法等动态规划方法完成。其代价与边的数量(16)成正比,而边数通常比路径数指数级更小。

计算 $E(Y, X) = \min_{z\in Z} E(Y, z, X)$ 时,只需把图限制为与给定 $Y$ 值兼容的弧的子集,再走同样的流程。

4.5 min-sum 算法与它的适用边界

上述过程有时被称为min-sum 算法,它是图模型中传统max-product 算法的对数域版本。该流程可以自然推广到:

  • 因子接收两个以上变量的因子图;
  • 树结构(而非链结构)的因子图。

但注意其前提:它只适用于无环的二部树(bipartite trees)结构。若图中存在环(loop),min-sum 算法迭代时可能只给出近似解,甚至完全不收敛。此时需要改用模拟退火(simulated annealing)之类的下降算法。

五、"浅层"因子的简单能量基因子图:线性结构化模型

5.1 对数域中的线性模型

图 6(原文 Figure 20)展示的是线性结构化模型(即文档所称"简单能量基因子图")的对数域因子图。其能量函数形式为:

$$E(W, Y, X)=\sum_{(m, n) \in \mathcal{F}} W_{m n}^{T} f_{m n}\left(X, Y_{m}, Y_{n}\right)$$

其中:

  • $\mathcal{F}$ 表示因子集合,即存在直接相互依赖的标签对$(m, n)$ 的集合;
  • $W_{mn}$ 是因子 $(m, n)$ 的参数向量;
  • $f_{mn}(X, Y_m, Y_n)$ 是(固定的)特征向量;
  • 全局参数向量 $W$ 是所有 $W_{mn}$ 的拼接(concatenation)。

模型选好后,剩下的核心问题是:该用什么样的损失函数来训练?文档由此引出三类经典模型。

5.2 条件随机场(Conditional Random Field, CRF)

对线性结构化模型使用**负对数似然(NLL, negative log-likelihood)**损失,得到的就是条件随机场。

直觉:我们希望正确答案的能量低,同时让包括正确答案在内所有答案的"指数对数"(log-sum-exp)尽量大。其形式化定义为:

$$\mathcal{L}{\mathrm{nll}}(W)=\frac{1}{P} \sum{i=1}^{P} E\left(W, Y^{i}, X^{i}\right)+\frac{1}{\beta} \log \sum_{y \in \mathcal{Y}} e^{-\beta E\left(W, y, X^{i}\right)}$$

5.3 最大间隔马尔可夫网络与潜变量 SVM

也可以使用**合页损失(Hinge loss)进行优化,这就是最大间隔马尔可夫网络(Max Margin Markov Nets)与潜变量 SVM(Latent SVM)**背后的思想。

直觉:在让正确答案能量低的同时,从所有错误配置中找出能量最低的那个"最差劲的错答案",只把它(最冒犯的答案,most offending answer)的能量推高即可——其他错误答案的能量本来就更大,无需处理。这使得训练目标更"温和":并不要求所有错误答案都无限远,只要求最坏的一个被推开。

5.4 结构化感知机模型(Structured Perceptron)

用**感知机损失(perceptron loss)**训练线性结构化模型,即结构化感知机。Collins([Collins, 2000, Collins, 2002])在 NLP 语境下倡导对线性结构化模型使用该损失:

$$\mathcal{L}{\text {perceptron }}(W)=\frac{1}{P} \sum{i=1}^{P} E\left(W, Y^{i}, X^{i}\right)-E\left(W, Y^{* i}, X^{i}\right)$$

其中 $Y^{* i}=\operatorname{argmin}_{y \in \mathcal{Y}} E\left(W, y, X^{i}\right)$ 是系统自己生成的答案——即能量最低(在无约束条件下)的答案。

5.5 早期判别式训练:语音/手写识别

文档还提及判别式训练的早期尝试——最小经验误差损失(Minimum Empirical Error Loss, Ljolje & Rabiner, 1990)。其做法是:

  • 在序列级别训练,而不告诉系统"某个声音或某个位置对应什么";
  • 只给系统输入句子及其逐词转写,让系统通过时间规整自行求解;
  • 当时并未使用神经网络,而是用其他手段把语音信号转成声音类别。

这一"在序列层面、通过对齐进行判别式训练"的思路,正是后面图变换网络(GTN)的历史前身。

六、图变换网络(Graph Transformer Net)

6.1 问题:未知分割的序列识别

GTN 面对的问题:输入是一串数字(如手写数字"34"),但我们不知道该如何分割(哪里是 3 的结束、哪里是 4 的开始)。解决方案是构造一个图:图中每条路径对应一种分割方式,然后用最短路径搜索找到能量最低的那条路径。

具体流程:

  1. 输入图像"34",送入分割器(segmenter),得到多种候选分割;
  2. 每种分割对应把"墨迹团块(blobs of ink)"分组的特定方式,分割图中的每条路径对应一种分组方式(见 Fig7);
  3. 对每个分割片段分别通过同一个字符识别 ConvNet,得到各类别得分列表(如对"3"的片段得到 10 类得分,示例图中简化为 2 类)——例如1 [0.1]表示类别 1 的能量为 0.1;
  4. 由此得到一个图——它可以被看作一种稀疏张量(sparse tensor):对每个变量的每种可能配置,给出该配置的代价。由于讨论的是能量,它更接近于"张量上的(对数)分布"。

6.2 钳位阶段:计算正确答案的能量

接下来要计算正确答案的能量。给定正确答案"34",在路径中挑选所有标注为"34"的路径:

  • 一条路径能量为 $3.4 + 2.4 = 5.8$;
  • 另一条为 $0.1 + 0.6 = 0.7$。

选择能量最低的路径(这里是 0.7)。这等价于对潜变量做最小化——这里的潜变量就是"你选了哪条路径"。概念上,GTN 就是一个"潜变量为路径"的能量模型。

6.3 对动态结构做反向传播

得到正确路径能量 0.7 之后,需要对整个结构做梯度反向传播,调整 ConvNet 权重使最终能量下降。虽然看似困难,但完全可行——因为整个系统由已知元素构成:

  • 神经网络是常规的;
  • **路径选择器(Path Selector)**与 **Viterbi 变换器(Viterbi Transformer)**本质上是"开关",决定选择或不选择某条边。

梯度如何流动?0.7 是 0.1 与 0.6 之和,因此这两点各获得梯度 +1;Viterbi 变换器在两条路径中只选一条,于是把梯度复制到被选路径对应边上,未被选中的路径梯度设为 0——这正是Max-Pooling / Mean-Pooling中的行为。路径选择器同理,只是负责选出正确答案。之后梯度穿过神经网络反向传播,使正确答案的能量变小。

文档特别强调:该结构是动态的(dynamic)——换一个新输入,神经网络实例数量会随分割数量变化,派生出的图也随之改变。因此必须对动态结构反向传播,这正是PyTorch 这类框架真正重要的场景(动态计算图 + 自动微分)。

6.4 自由阶段:拉开错误答案

仅有第一阶段只能降低正确答案的能量,还需第二阶段把错误答案的能量推高:

  • 第二阶段前半段与第一阶段完全相同:Viterbi 变换器直接选择能量最低的路径,不关心它是否正确;
  • 由于该能量是所有可能路径中最小的,它必然小于等于第一阶段的能量;
  • 这构成一种使用感知机损失的简化判别式训练:让系统自由选择它想要的答案。

6.5 两阶段合并与感知机损失

把两个阶段合并,损失函数为:

$$\text{loss} = \text{energy}_1 - \text{energy}_2$$

此时需要对整个结构反向传播:左侧(正确答案钳位路径)获得 +1 梯度,右侧(自由选择的路径)获得 −1 梯度。因此,如果某个分数(如3 [0.1])同时出现在左右两条路径中,其梯度为0。如此训练,系统最终将最小化"正确答案能量"与"任意最优答案能量"之间的差距——即感知机损失(与 5.4 节的公式一致)。

七、理解问答(课程 Q&A)

Q1:为什么能量基因子图的推理是容易的?

带潜变量的能量基模型做推理时,通常需要穷举式技术(如梯度下降)来最小化能量;但在因子图场景下,能量是若干因子之和,因此可以改用动态规划(如 Viterbi、A*、min-sum)完成推理,代价随边数而非路径数增长。

Q2:如果因子图中的潜变量是连续的,还能用 min-sum 算法吗?

不能——因为无法再对所有因子值做全组合穷举。但能量分解此时仍然带来好处:可以做独立优化。例如图 5(Figure 19)中 $Z_1$ 与 $Z_2$ 的组合只影响因子 $E_b$,因此仍可通过"独立优化 + 动态规划"来完成推理。

Q3:图中的 NN 方块是否指向不同的 ConvNet?

不是,它们是共享的——同一个字符识别 ConvNet 的多个副本,只是被重复实例化到不同分割片段上。

八、本篇在课程与仓库中的位置

本文内容属于 NYU-DLSP20 第 14 周理论课 Part A。课程总览见 docs/ko/week14/14.md:Part A 覆盖结构化预测、能量基因子图、高效推理、浅层因子模型与 GTN;Part B(docs/ko/week14/14-2.md)进一步比较各类损失函数(Energy Loss、Perceptron、Hinge、Log、LVQ2、MCE、Square-Square、Square-Exp、NLL/MMI、MEE),并把 Viterbi 与forward 算法(Log-Sum-Exponential 软最小化)应用到图变换网络上,还延伸到反向传播的拉格朗日表述、Neural ODE 与基于能量的变分推理。

关于实现层面的两个关键提示:

  1. 推理即动态规划:Viterbi 找的是 $\min_z E(x,y,z)$,forward 算法算的是 $-\frac{1}{\beta}\log\sum_z \exp(-\beta E(x,y,z))$,两者代价相当,后者可微分、便于端到端反向传播(详见 14-2);
  2. 训练即判别式对比:无论 NLL、Hinge 还是 Perceptron 损失,本质都是"压小正确答案能量、拉开错误答案能量",区别只在于错误答案如何选取(全部求和 / 最冒犯者 / 系统自选最优)。

理解这些概念后,你可以在 PyTorch 中用自定义 autograd Function 复现 Viterbi/forward 算法的前向与反向,再配合共享权重的 ConvNet 搭建一个可端到端训练的 GTN 原型——这正是该讲义留给实践者的自然延伸。

  • 示例工程

【免费下载链接】NYU-DLSP20

NYU Deep Learning Spring 2020

项目地址:https://gitcode.com/gh_mirrors/pyt/pytorch-Deep-Learning
点击查看免费下载

相关推荐

上一篇:网盘文件丢给 IDM 或 Aria2?先装这个浏览器脚本把直链取出来
下一篇:TradingAgents-CN 完整使用指南:5 分钟跑通多智能体 AI 股票分析(含深度调优清单)

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询