阿明的家具工坊里,学徒小伞想用“好/坏”给每块木板贴标签。老阿明拦住他:“单块木板再漂亮,榫头对不齐,拼出的书柜也会晃。”这句话正是结构化预测与普通分类的分水岭:分类只看一个点,结构化预测要为整个零件组合——序列、树、图——整体评分,再选出最稳的那套方案。本文将借工坊里“整体做柜”的逻辑,讲清能量函数、结构化SVM 与推理算法,并看看它在语法解析、图像分割、蛋白质结构预测里如何落地。

岗位关联

对 AI 从业者而言,结构化预测是把模型从“单点判断”升级为“全局决策”的核心技能,无论做 NLP、CV 还是生物计算,都离不开它。

目录
  1. 可视化演示
  2. 认识结构化预测
  3. 输出结构与表示
  4. 能量函数设计
  5. 结构化SVM
  6. 推理算法
  7. 损失与学习
  8. 应用与挑战
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示结构化预测的核心机制,通过入门/进阶/实战/优化四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

结构化预测:结构化预 结构化预测的问题定义与挑战 结构化SVM的边际损失优化 核心机制可视化 结构化预测整体架构与关键组件

认识结构化预测

阿明把第一批木板切成抽屉侧板、隔板和背板。小伞用普通分类器给每块板打上“可用/不可用”的章,结果每块板都合格,拼起来却摇摇晃晃。问题出在哪儿?因为分类器只单独看一块木板,没看它和旁边木板的榫头是否咬合。结构化预测要解决的,正是“把整件家具当成一个整体来做决定”。

普通分类的输出是一个孤立标签,比如“猫”“狗”或“垃圾邮件”。结构化预测的输出则是一组相互关联的变量:一句中文里的词性序列、一篇文章的句法树、一张图片里每个像素的类别网格,甚至一个蛋白质的三维折叠结构。它们共同组成一个“结构化的输出对象”,任意两个位置都可能相互影响。因此,模型不能对每个位置独立取最大值,而要在所有合法的输出组合里寻找整体最优。

用一个通用公式来描述这个过程:给定输入 \(x\),我们选择一个输出 \(y\),使整体打分函数 \(f(x,y)\) 最大。

阿明拍了拍图纸说:“先看整件家具的稳定性,再决定每一块木料放哪里。”这正是结构化预测的第一课:走出单点判断,拥抱全局决策。

y^=arg⁡max⁡y∈Yf(x,y)\hat{y} = \arg\max_{y \in \mathcal{Y}} f(x,y)
公式说的是:在输出空间 \(\mathcal{Y}\) 中,挑出让整体得分最高的那一整套输出,而不是每个零件单独取最高分。
  1. 预测结果\(\hat{y}\) 是最终输出的整套结构,例如完整的词性序列“名词-动词-名词”,而不是单个词性。
    y^\hat{y}
  2. 最大化操作\(\arg\max\) 表示在所有候选方案里寻找使函数值最大的那一个,相当于老师傅在几十张拼装图纸中挑最稳的一张。
    arg⁡max⁡\arg\max
  3. 合法输出空间\(y \in \mathcal{Y}\) 表示输出必须满足结构约束,比如树的边不能乱连、序列长度必须和输入一致。
    y∈Yy \in \mathcal{Y}
  4. 整体得分函数\(f(x,y)\) 对整套输出打分,相当于“这套家具的总体做工分”,得分越高,说明拼装越协调。
    f(x,y)f(x,y)

输出结构与表示

画图纸时,阿明会把书柜拆成组件和接头:侧板和隔板之间有榫头,抽屉和滑轨之间有连接件。机器学习的“结构表示”同样要回答两个问题:输出由哪些零件组成?零件之间有哪些连接?不同任务会选择不同的结构:序列是一条线上的相邻关系,树是父子层次关系,图则是任意节点之间的复杂连接。

把结构画成“因子图”是一种通用做法。每个小圆圈代表一个输出变量,每个小方块代表一个“因子”——也就是一撮变量之间的约束或兼容性。句子词性标注可以拆成相邻两个词之间的因子;句法树可以拆成父节点与子节点之间的因子;图像分割可以拆成相邻像素之间的因子。于是,整体打分不再是黑箱,而是所有因子打分的总和。

图纸画得越细,师傅越不容易做歪。同理,结构表示越能捕捉变量之间的依赖,联合推断就越容易选出真正协调的整体方案。

f(x,y)=∑a∈Aw⊤ϕa(x,ya)f(x,y)=\sum_{a \in A} w^\top \phi_a(x, y_a)
这个公式把复杂输出拆成一张“零件图”:整体得分等于每个关节处局部得分的累加,每个局部只关心它涉及的那一小撮变量。
  1. 因子集合\(A\) 是所有因子的集合, \(a\) 是其中一个因子,相当于图纸上的一个榫卯连接点。
    a∈Aa \in A
  2. 局部特征函数\(\phi_a(x, y_a)\) 提取第 \(a\) 个连接点上的特征,比如“当前词的词性”和“它前面一个词的词性”是否搭配。
    ϕa(x,ya)\phi_a(x, y_a)
  3. 局部变量赋值\(y_a\) 是因子 \(a\) 所涉及的少量输出变量,而不是全部输出,这让计算量大大下降。
    yay_a
  4. 权重向量\(w\) 是所有因子共享的“眼光”,它决定哪些局部组合值得加分,哪些组合要减分。
    w⊤ϕa(x,ya)w^\top \phi_a(x, y_a)

能量函数设计

在工坊里,阿明会把几块板先靠在一起试一下,如果接缝处翘起、晃动,他就说“这地方很别扭”。机器学习里,“别扭度”的正式名字叫能量:能量越低,说明这套输出的各个部分越契合;能量越高,说明整体越不协调。因此,结构化预测也可以看作是“找一组让整体能量最低的输出”。

能量函数通常由两部分组成:单点势函数和成对势函数。单点势函数只管一个位置本身与该位置观察特征的匹配程度;成对势函数关注两个相邻位置“同时取某两个标签”的代价。比如在图像分割里,单点势会说“这个像素的颜色偏红,更像‘车辆’”;成对势会说“相邻两个像素如果是‘车辆’和‘天空’,交界处会很突兀,所以要扣分”。

阿明常说:“最好的家具不是每一块板都最贵,而是每两个接缝都不别扭。”能量函数设计的本质,就是把这种“别扭感”量化成可计算的分数。

E(x,y)=∑i∈Vψi(xi,yi)+∑(i,j)∈Eψij(xi,xj,yi,yj)E(x,y)=\sum_{i \in V}\psi_i(x_i,y_i)+\sum_{(i,j)\in E}\psi_{ij}(x_i,x_j,y_i,y_j)
能量函数就像一套“别扭度检查表”:把每个关节的别扭程度加起来,总别扭度最低的拼装方案,就是最优输出。
  1. 节点集合\(V\) 是所有输出变量的节点集合,\(i\) 是其中一个变量,比如句子里的一个词或图片里的一个像素。
    i∈Vi \in V
  2. 单点势函数\(\psi_i(x_i,y_i)\) 只看第 \(i\) 个位置,衡量“这个位置的观测值”和“这个位置的预测标签”是否匹配。
    ψi(xi,yi)\psi_i(x_i,y_i)
  3. 边集合\(E\) 是所有有依赖关系的边,\((i,j)\) 表示变量 \(i\) 和变量 \(j\) 直接相邻。
    (i,j)∈E(i,j) \in E
  4. 成对势函数\(\psi_{ij}(x_i,x_j,y_i,y_j)\) 同时考虑两个相邻位置的特征和标签,描述它们之间“搭不搭”。
    ψij(xi,xj,yi,yj)\psi_{ij}(x_i,x_j,y_i,y_j)

结构化SVM

小伞问:“别扭度怎么定?总不能每次都让老师傅手动打分吧?”阿明笑了:“多给我看几套好家具和几套歪家具,我就能总结出一套眼光。”结构化SVM 正是这个原理:从数据中学习一个打分函数,让正确输出的分数高于所有错误输出的分数,并且差距越大越好。

结构化SVM 的评分是线性的:\(f_w(x,y)=w^\top \Phi(x,y)\)。训练时,它要求对于每个样本,正确输出 \(y_i\) 的得分必须比任何错误输出 \(y\) 的得分高出至少 \(\Delta(y_i,y)\)——这个差值就是“结构损失”。如果不够高,就产生惩罚。把所有样本的惩罚加起来,并加入正则项控制模型复杂度,就得到目标函数。

学完这套“眼光”,模型不再只知道单点好坏,而是会对整套输出给出有全局观的评分。这就像阿明看过的家具越多,越能一眼看出哪套柜子会晃。

min⁡w12∥w∥2+C∑i=1n[max⁡y(w⊤Φ(xi,y)+Δ(yi,y))−w⊤Φ(xi,yi)]\min_{w} \frac12\|w\|^2 + C\sum_{i=1}^{n} \Big[\max_{y}\big(w^\top \Phi(x_i,y)+\Delta(y_i,y)\big)-w^\top \Phi(x_i,y_i)\Big]
结构化SVM 的学习目标可以概括为:让正确方案的分数不仅最高,还要比错误方案高出足够大的“安全距离”,距离不够就惩罚。
  1. 正则项\(\frac12\|w\|^2\) 是模型复杂度的惩罚项,防止权重过大、过度依赖某些特征,相当于提醒师傅“经验要简单通用,不要死记硬背”。
    12∥w∥2\frac12\|w\|^2
  2. 权衡系数\(C\) 控制“经验分”和“正则约束”之间的平衡,数值越大,越重视把训练样本的分数拉开。
    C∑i=1nC\sum_{i=1}^{n}
  3. 损失增广推断\(\max_{y}\big(w^\top \Phi(x_i,y)+\Delta(y_i,y)\big)\) 在推理时额外加上损失,主动找出“最危险的错误输出”,用它来构造优化压力。
    max⁡y(w⊤Φ(xi,y)+Δ(yi,y))\max_{y}\big(w^\top \Phi(x_i,y)+\Delta(y_i,y)\big)
  4. 正确输出得分\(w^\top \Phi(x_i,y_i)\) 是正确输出当前获得的分数,目标是把它的分数持续抬高,拉开与危险错误输出的距离。
    w⊤Φ(xi,yi)w^\top \Phi(x_i,y_i)

推理算法

有了打分函数,怎么从指数级的候选输出里找到最高分?小伞说:“把每块板的每个位置都试一遍不行吗?”阿明摇头:“十块板、三种标签就有 3 的十次方种组合,试到天黑也试不完。”推理算法就是用来高效搜索最优结构的工具。

对于序列结构,最经典的精确算法是维特比算法。它把问题拆成一段一段的子问题:先算第一个位置的各自最优分数,再逐步向后扩展,每一步只保留“到当前标签为止的最好分数”。递推时,如果第 \(t\) 个位置选择标签 \(j\),那么它的最高分等于前一个位置某个标签 \(i\) 的最高分,加上转移分数和当前位置的得分。最终再沿记录回溯,得到最优整条路径。

对于树结构,可以用类似动态规划的信念传播;对于一般图结构,精确推理往往很难,工程中常用束搜索等近似方法。阿明的经验是:先看清结构,再选工序;序列用精确动态规划,复杂图就用“差不多不犯错”的近似搜索。

αt(j)=max⁡i(αt−1(i)+w⊤ϕ(xt,i,j))\alpha_t(j)=\max_{i}\big(\alpha_{t-1}(i)+w^\top \phi(x_t, i, j)\big)
维特比算法像老师傅按工序推进:先定第一块板的放法,再顺着连接关系一块一块往后排,并记住每一种“当前状态”下最好的分数,避免重复劳动。
  1. 前向分数\(\alpha_t(j)\) 表示走到第 \(t\) 个位置、且该位置取标签 \(j\) 时,前 \(t\) 个位置能拿到的最高累计分。
    αt(j)\alpha_t(j)
  2. 前一步状态\(\alpha_{t-1}(i)\) 表示前一个位置取标签 \(i\) 时已经拿到的最好分数,它是子问题的结果。
    αt−1(i)\alpha_{t-1}(i)
  3. 转移与发射分\(w^\top \phi(x_t, i, j)\) 表示从上一个标签 \(i\) 转移到当前标签 \(j\)、并看到当前观测 \(x_t\) 时得到的局部得分。
    w⊤ϕ(xt,i,j)w^\top \phi(x_t, i, j)
  4. 最大值选择对所有可能的 \(i\) 取最大值,就是“不管前一步是谁,只留下到当前状态最好的那条来路”。
    max⁡i\max_{i}

损失与学习

客户验收家具时,标准并不总是“整体不倒”就够了。有时客户要求每个榫头都不能松,有时只要求柜门能正常开关。机器学习同样需要损失函数来告诉模型“错了多少”。如果只用 0/1 损失,只要整条序列错一个词性就判为全错,模型会学得很痛苦;如果按位置统计错误个数,模型就能知道“错得不多,还有救”。

最常用的结构损失之一是汉明损失:逐位比较预测结果和真实结果,数一数有多少个位置对不上。对序列标注来说,它天然适合衡量“有几个词的标签标错了”;对图像分割来说,它等价于“有多少像素被标错”。

在结构化SVM 中,这个损失还会进入“损失增广推断”,让模型重点学习那些既分数高、损失又大的危险错误。阿明把这个过程比作“带客户去现场验收”:不仅要让柜子能站稳,还要让客户指出的每一处松动都成为下次改进的重点。

Δ(y,y′)=∑t=1T1[yt≠yt′]\Delta(y, y')=\sum_{t=1}^{T} \mathbb{1}[y_t \ne y'_t]
汉明损失像“逐块验收”:每个位置的标签错了就记一个小红叉,最后数一数一共多少个红叉。损失越小,说明整体越接近真实答案。
  1. 损失函数\(\Delta(y, y')\) 表示真实输出 \(y\) 与预测输出 \(y'\) 之间的不一致程度,损失越大,错误越严重。
    Δ(y,y′)\Delta(y, y')
  2. 求和范围\(\sum_{t=1}^{T}\) 对整个结构的 \(T\) 个位置逐一检查,比如 \(T\) 个词的词性或 \(T\) 个像素的类别。
    ∑t=1T\sum_{t=1}^{T}
  3. 指示函数\(\mathbb{1}[\cdot]\) 在括号内条件成立时取 1,不成立时取 0,就像给每处错误盖一个红章。
    1[yt≠yt′]\mathbb{1}[y_t \ne y'_t]
  4. 逐位比较\(y_t \ne y'_t\) 表示在位置 \(t\) 上,真实标签与预测标签不一致。
    yt≠yt′y_t \ne y'_t

应用与挑战

阿明的工坊后来接了三类大单。第一单是“给句子搭骨架”:输入一句话,输出一棵句法依存树,哪个词修饰哪个词,关系一目了然。第二单是“给图片分区域”:输入一张街景照片,输出每个像素的类别,车辆、行人、建筑连成一片。第三单最复杂,是“预测蛋白质怎么折叠”:输出氨基酸链在三维空间里的结构图,相当于用一张大网描述几十万原子之间的空间关系。

这些任务的共同点是输出空间巨大、结构约束强。序列结构能用维特比线性规划精确求最优,但换成一般图结构,精确推理往往会遇到计算爆炸。复杂度可以这样看:

面对复杂结构,工程上常用束搜索、近似信念传播或结合深度学习做端到端近似预测。阿明的总结是:结构越复杂,越要懂得“抓大放小”;接受近似的代价,换取实际可用的速度。

time={O(TK2),链式序列动态规划NP-hard,一般图上的精确推断\text{time} =\begin{cases}O(T K^2), & \text{链式序列动态规划}\\\text{NP-hard}, & \text{一般图上的精确推断}\end{cases}
复杂度公式像工坊的报价单:简单的一串榫卯可以按顺序快速拼完,而一张缠满连接的复杂网架,想精确算出最优方案可能极其昂贵。
  1. 序列复杂度\(O(T K^2)\) 表示对长度为 \(T\)、每个位置有 \(K\) 种标签的序列,动态规划只需要 \(T\) 步,每步比较 \(K^2\) 种相邻转移。
    O(TK2)O(T K^2)
  2. 链式结构\(\text{链式序列动态规划}\) 指序列中每个变量只与前后邻居相连,这种结构能高效精确求解。
    O(TK2)O(T K^2)
  3. 一般图\(\text{一般图上的精确推断}\) 表示变量之间任意相连,此时精确求出全局最优往往需要指数级时间。
    NP-hard\text{NP-hard}

AI 应用场景

自然语言句法解析

阶段:模型设计与结构化推断

解决的问题:传统词性标注逐个预测单词,容易忽略上下文搭配,比如“打”后面跟“球”和跟“电话”的语义完全不同。结构化预测把整句词性和依存关系作为输出,通过成对势函数建模词与词的修饰关系,再用动态规划或图解析算法同时决定整棵句法树。

具体案例:搜索引擎在解析“北京到上海的航班”时,不仅要识别“北京”“上海”是地名,还要判断“到”是连接两个城市的路径关系。使用依存树结构化预测后,模型能同时输出“主谓宾”结构和地点关系,提高意图理解的准确率。

医学图像分割

阶段:特征提取与联合标签解码

解决的问题:逐像素分类会得到许多“椒盐噪声”式的孤立标签,比如一个器官内部被标成洞。结构化预测通过能量函数加入相邻像素的一致性约束,让输出保持空间连续,减少不合理跳变。

具体案例:在 CT 影像中分割肝脏和肿瘤,模型为每个像素预测“肝脏/肿瘤/背景”三类标签,同时在相邻像素之间加入“同类更平滑”的成对势。最终输出的不是一堆孤立点,而是一张边界完整的分割掩码,医生可以直接看到病灶范围。

蛋白质结构预测

阶段:结构化输出空间建模

解决的问题:蛋白质的氨基酸序列已知,但三维结构未知。独立预测每个氨基酸的位置会忽略原子之间的空间约束,导致结构互相碰撞。结构化预测把整条链的扭转角看作一个图结构输出,用能量函数惩罚空间冲突,再通过迭代推理搜索稳定构象。

具体案例:研究团队用类似能量最小化的思路预测蛋白质折叠路径,先给出候选空间坐标,再评估原子间距离是否合理,反复修正后得到可信的 3D 结构模型,辅助药物靶点发现。

Python 演示

python41 行
import numpy as np def viterbi(unary, pair):    T = len(unary)    K = len(unary[0])    alpha = [unary[0][j] for j in range(K)]    back = []    for t in range(1, T):        cur = [0] * K        prev = [0] * K        for j in range(K):            val = [alpha[i] + pair[i][j] + unary[t][j] for i in range(K)]            best = max(val)            cur[j] = best            prev[j] = val.index(best)        alpha = cur        back.append(prev)    end = max(range(K), key=lambda j: alpha[j])    path = [end]    for t in range(T - 2, -1, -1):        end = back[t][end]        path.append(end)    path.reverse()    return path, max(alpha) def independent(unary):    return [max(range(len(row)), key=lambda j: row[j]) for row in unary] unary = [    [0.9, 0.4],    [0.3, 0.8],    [0.7, 0.5],]pair = [    [1.0, -0.5],    [-0.5, 1.0],]joint_path, joint_score = viterbi(unary, pair)ind_path = independent(unary)print("joint path:", joint_path, "score:", joint_score)print("independent path:", ind_path)
目的:用维特比动态规划实现链式结构化预测,对比“联合推断”和“独立分类”在相邻标签有依赖关系时的不同结果。
  1. alpha = [unary[0][j] for j in range(K)]初始化第一个位置各标签的累计分数,相当于从第一块木板开始记录。
  2. val = [alpha[i] + pair[i][j] + unary[t][j] for i in range(K)]计算从任意前一个标签 \(i\) 转移到当前标签 \(j\) 的局部总得分。
  3. best = max(val)保留到当前标签为止的最高累计分,这是动态规划的“记住最好成绩”思想。
  4. prev[j] = val.index(best)记录最优路径来自前一个位置的哪个标签,为后面回溯做准备。
  5. back.append(prev)保存每一步的回溯表,相当于拼接完工艺流程图。
  6. joint_path, joint_score = viterbi(unary, pair)执行联合推断,得到同时考虑相邻关系的完整输出序列。
  7. ind_path = independent(unary)独立分类逐个取最高分,忽略标签之间的依赖,可能输出“局部正确、全局别扭”的序列。

常见误区

误区“结构化预测不就是把每个位置的类别分别预测一遍吗?先算每个词的词性,再拼起来就行。”

正解独立分类在每个位置单独取最大值,完全看不到相邻标签之间“搭不搭”。结构化预测的核心是构造一个关于整套输出的联合打分或能量函数,把依赖关系放进推断过程。就像书柜不是把每块木板各自选最好,而是要让所有榫头彼此咬合。

为何常见:普通分类在机器学习里太常见,初学者容易把“多个分类结果放在一起”误当成“结构化输出”。

误区“能量就是惩罚分,设计成所有地方都减分,那总体越低不就越好吗?”

正解能量函数的绝对大小没有意义,重要的是不同输出之间的相对大小。如果每个方案都被扣相同分数,比较结果不会变。真正要设计的是单点势与成对势如何刻画数据中的细微信号,而且这些信号最终要通过训练数据学习,而不是拍脑袋定死。

为何常见:“能量”这个词容易让人联想到物理里的能量越低越稳定,从而忽略机器学习里的相对比较。

误区“多分类 SVM 能输出多个类别,结构化SVM 不就是把类别数变多吗?”

正解多分类 SVM 的输出仍是一个离散标签,输出空间只是有限集合。结构化SVM 的输出空间是序列、树或图,规模随长度指数增长。它需要定义结构化的联合特征、损失函数和损失增广推理,训练中每个样本都要在指数级输出空间里找“最危险的错误输出”,难度远高于普通多分类。

为何常见:两者都有“最大间隔”词汇,容易让人只看到相似表面,忽略输出空间的本质差异。

误区“维特比能精确找出序列最优路径,那所有结构化预测都应该精确找最优。”

正解链式序列的图结构很简单,动态规划可以精确求解;但一般图上变量之间任意相连,精确推理常常是 NP-hard 的。工程中广泛使用束搜索、近似信念传播、采样等方法,在速度与效果之间做权衡。近似不等于错误,只要损失可控,就能支撑真实产品。

为何常见:教材常以序列标注举例,让人误以为所有图结构都像链式结构一样容易精确求解。

误区“反正预测对了就是 0,错了就是 1,结构损失没必要单独设计。”

正解结构输出包含很多位置,0/1 损失把所有错误一视同仁,模型很难学习“已经对了 90%,只差一点点”的样本。汉明损失、F1 损失能给出部分正确性信息,结构化SVM 还会把这些损失放进损失增广推断,引导模型优先修正危险错误。损失设计必须与输出结构匹配。

为何常见:经典分类任务中 0/1 损失很自然,初学者容易把它照搬到结构化场景,忽略输出内部的丰富结构。

面试题

Q1. 结构化预测的“输出”与普通分类的输出相比,最本质的特点是?

单选题 · easy

  • A.输出一个整数类别
  • B.输出多个有结构的变量← 正确答案
  • C.输出一个连续数值
  • D.输出一组无序集合

答案:B。普通分类输出孤立标签,结构化预测输出的是彼此关联的变量整体,如序列、树、图,因此 B 正确。A、C 是分类或回归,D 未体现结构关系。

Q2. 在阿明的家具比喻中,能量函数相当于?

单选题 · easy

  • A.木料的进货价格
  • B.家具的整体别扭度← 正确答案
  • C.师傅的手工速度
  • D.机器噪音的大小

答案:B。能量越低代表输出各部分越契合,越高代表整体越别扭,正如家具接缝越吻合越稳当。价格、速度、噪音都与“结构契合度”无关。

Q3. 序列标签预测中,维特比算法的主要作用是?

单选题 · easy

  • A.快速找到最优路径← 正确答案
  • B.随机生成标签序列
  • C.统计每种标签频率
  • D.过滤掉错误样本

答案:A。维特比是一种动态规划推理算法,在序列结构上高效寻找全局最优标签路径,而不是随机生成、统计频率或过滤数据。

Q4. 结构化SVM 的“损失增广推断”指的是?

单选题 · mid

  • A.先算损失再训模型
  • B.在推理时加入损失项← 正确答案
  • C.用损失值替换特征
  • D.在测试时输出损失

答案:B。训练时在打分函数上额外加上结构损失,目标是找出“分数高但损失也大”的危险错误输出,从而构造更强的约束。测试时不会加损失,因此 C、D 错误。

Q5. 关于成对势函数,下列说法正确的是?

单选题 · mid

  • A.只关心单个位置
  • B.描述相邻变量关系← 正确答案
  • C.可以省略所有变量
  • D.只能用于树结构

答案:B。成对势函数同时考虑两个相邻变量及其观测,描述标签之间搭不搭。单点势才只关心单个位置,成对势也不只用于树结构,序列和图中同样适用。

Q6. 对于一般图上的结构化预测,精确推理通常?

单选题 · mid

  • A.总能在线性时间完成
  • B.往往难以高效完成← 正确答案
  • C.等价于计算均值
  • D.必须使用深度学习

答案:B。一般图结构上的精确推理往往面临指数级搜索空间,甚至 NP-hard。工程中常用近似算法,而不是坚持线性时间精确求解或强制使用深度学习。

Q7. 结构化SVM 的目标函数中,\(\|w\|^2\) 项的作用是?

单选题 · hard

  • A.扩大输出空间规模
  • B.控制模型复杂度← 正确答案
  • C.增加训练样本数量
  • D.降低特征维度数

答案:B。\(\|w\|^2\) 是正则项,惩罚过大的权重,避免模型过度拟合训练样本。它不改变输出空间、样本数量或特征维度,只让模型更简洁、泛化更好。

Q8. 以下哪些属于结构化预测的输出形式?

多选题 · mid

  • A.一条词性标注序列← 正确答案
  • B.一棵句法依存树← 正确答案
  • C.图像像素分割掩码← 正确答案
  • D.一个二分类标签

答案:ABC。词性序列、句法树、像素分割掩码都包含多个变量且变量间有结构关系,属于结构化输出。二分类标签是孤立输出,不是结构化预测。

Q9. 哪些做法可以体现“结构感知”?

多选题 · hard

  • A.把相邻标签关系建模← 正确答案
  • B.用汉明损失衡量误差← 正确答案
  • C.逐个独立做分类预测
  • D.联合打分后再解码← 正确答案

答案:ABD。建模相邻依赖、使用结构损失、联合打分后解码都体现了结构感知。逐个独立分类完全忽略变量间关系,不符合结构感知。

Q10. 在训练结构化SVM时,损失增广推断通常被用来?

多选题 · extreme

  • A.找到最违反约束的负例← 正确答案
  • B.构造结构化间隔约束← 正确答案
  • C.解决NP难推理问题
  • D.唯一增加训练误差

答案:AB。损失增广推断在候选输出中找出“当前得分高、但相对真实输出损失大”的负例,用它们构造形如 \(f(y_i)-f(y)\ge\Delta(y_i,y)\) 的间隔约束。它不能从根本解决 NP-hard 推理,也不应为了增加误差而使用。