资讯动态

序列模型与注意力机制(二)束搜索

发布时间:2026/10/8 11:58:05 来源:尧图企业网站定制
NLP。应用在深度学习里它是专门用来进行文本与序列信息建模的模型和技术本质上是在全连接网络与统计语言模型基础上的一次“结构化特化”也是人工智能中最贴近人类思维表达方式的重要研究方向之一。这一整节课同样涉及大量需要反复消化的内容横跨机器学习、概率统计、线性代数以及语言学直觉。语言不像图像那样“直观可见”更多是抽象符号与上下文关系的组合因此理解门槛反而更高。因此我同样会尽量补足必要的背景知识尽可能用比喻和实例降低理解难度。本周的内容关于序列模型和注意力机制这里的序列模型其实是指多对多非等长模型这类模型往往更加复杂其应用领域也更加贴近工业和实际自然也会衍生相关的模型和技术。而注意力机制则让模型在长序列中学会主动分配信息权重而不是被动地一路传递。二者结合为 Transformer 等现代架构奠定了基础。本篇的内容关于束搜索是在 seq2seq 模型中用于推理阶段的解码策略。1. 序列生成的实质条件概率#在开始束搜索之前一个关键问题是seq2seq 模型在“生成序列”时本质上到底在做什么答案是序列生成本质上是在建模并求解一个条件概率最大化问题。这是整个模型逻辑的核心我们来具体展开1.1 模型输出条件概率最大的序列#总结来说seq2seq 模型真正面对的问题是在所有可能的输出序列中找到一个条件概率最大的序列。通过概率链式法则整句的条件概率可以被分解为若干个逐时间步的条件概率的乘积。因此我们在训练阶段学习得到更真实的概率分布而在推理阶段输出问题被转化为一个搜索问题需要在由词表构成的序列空间中寻找条件概率最大的那条生成路径。就像这样但是一个很明显的问题出现了如果把所有可能的生成路径画成一棵树深度为序列长度 、每一层的分支数约为 ||那么完整搜索空间的规模大致为||。这是一个指数级增长的空间显然不可能被穷举。因此你会发现到这里问题居然回归到了搜索算法中。1.2 最直接的搜索策略贪心算法#我们知道既然每一步都会生成对应的概率分布那么一个最直接的策略就是在每一个时间步都选择条件概率最大的词作为当前输出只保留这一条唯一的生成路径。这种做法通常被称为贪心解码Greedy Decoding。从形式上看贪心算法在第 步执行的是^arg⁡max∈(∣^,)并将该结果立即作为下一步的输入直到生成终止符 EOS 或达到最大长度。显然贪心算法最大的优势在于极低的计算成本它每一步只保留一个候选不需要维护多条路径。因此解码速度快、内存占用小对同一输入始终生成唯一输出结果稳定。但是贪心算法的缺陷也是老生常谈了局部最优不等于全局最优。继续用刚刚的例子因此由于贪心算法在每一步只关注当前条件下概率最大的词而完全不考虑未来的影响很容易出现某一步看起来是“最合理”的选择但实际却会在后续步骤中限制模型的表达空间最终导致整条序列的联合概率反而更低的情况。总结来说在对实时性要求较高、或对生成质量要求不高的场景中贪心算法往往是一个工程上可接受的基线方案。但显然它并不是一个很好的选择。也正因为如此我们才需要一种在计算代价可控的前提下同时保留多条高概率候选路径的搜索策略—— 这正是束搜索Beam Search要解决的问题。2. 束搜索Beam Search#在理解了序列生成和贪心解码后束搜索的理解反而可以说是水到渠成用一句话来概括束搜索没有那么贪心的贪心算法。贪心算法的问题在于它只保留一条路径导致容易错过整体概率更高的序列。而束搜索的核心思想很简单在每一步生成时不只保留一个最优词而是保留前 条最有希望的候选序列逐步扩展最后从这些候选中选择联合概率最大的序列。这里的 就是我们称为束宽beam width它控制搜索的“宽度”1 时束搜索退化为贪心算法。 越大搜索空间越广生成结果越接近全局最优。 太大又会带来计算开销增加。不难理解下面具体展开一下2.1 束搜索的步骤#假设词表大小为 ||beam width 为 束搜索的详细步骤如下初始从起始符BOS开始生成第一步所有词的概率分布选取前 个概率最高的词组成初始候选序列。扩展对每条候选序列生成下一步的所有词的概率计算每条扩展后序列的联合概率。保留从 ×|| 条扩展序列中选取联合概率前 的序列作为下一步候选。循环重复步骤 2-3直到每条候选序列生成 EOS 或达到最大长度。输出从最终候选序列中选择联合概率最大的作为最终生成结果。假设词表 ,,、目标序列最大长度 3、束宽 2,我们举例来演示一下步骤 1初始化#从起始符BOS出发生成第一步所有词概率$A0.5, B0.3, C0.2选前 2 个词A (0.5)和B (0.3)此时的候选序列池[],[]步骤 2扩展第一步候选#假定下一步生成概率分布如下候选序列ABCBOSA0.10.60.3BOSB0.40.40.2扩展过程为前一步序列扩展词新序列计算过程联合概率[A]A[A,A]0.5 × 0.10.05[A]B[A,B]0.5 × 0.60.30[A]C[A,C]0.5 × 0.30.15[B]A[B,A]0.3 × 0.40.12[B]B[B,B]0.3 × 0.40.12[B]C[B,C]0.3 × 0.20.06此时的候选序列池[A,B], [A,C]步骤 3扩展第二步候选#继续假设模型在第 3 步生成概率如下序列ABC[A,B]0.20.50.3[A,C]0.60.10.3同理前一步序列扩展词新序列计算过程联合概率[A,B]A[A,B,A]0.3 × 0.20.06[A,B]B[A,B,B]0.3 × 0.50.15[A,B]C[A,B,C]0.3 × 0.30.09[A,C]A[A,C,A]0.15 × 0.60.09[A,C]B[A,C,B]0.15 × 0.10.015[A,C]C[A,C,C]0.15 × 0.30.045需要强调的是遇到相同概率的序列本质上束搜索并没有硬性规定选哪条可以根据场景选择先到先得、随机或增加规则来提升多样性。最终我们完成扩展如下排名序列联合概率1[A,B,B]0.152[A,B,C]0.09因此最终输出序列为[A,B,B]这就是束搜索的直观机制在可控开销下同时考虑多条路径提高生成序列的整体概率。2.2 长度归一化Length Normalization#在上面的例子中我们看到束搜索通过联合概率选择了[A,B,B]作为最终输出。但是在实际应用中有一个容易被忽视的问题联合概率是每一步条件概率的乘积序列越长乘积值往往越小。也就是说如果我们直接用联合概率来比较不同长度的序列束搜索可能偏向生成短序列因为它们乘起来的概率更大而不是因为内容更合理。因此我们引入长度归一化它和 BELU 里的长度惩罚有相同的出发点但长度归一化是在“生成阶段做内部优化”BLEU 长度惩罚是在“评价阶段修正指标”两者原理类似但作用环节不同。具体来说假设有两条候选序列序列联合概率[A,B,B]0.15[A,B,B,C]0.14其中[A,B,B,C]实际上可能更合理、语义更完整但是因为联合概率 0.14 0.15直接比较会被[A,B,B]优先选中这就是“短序列偏好”问题。而长度归一化的思路很简单用联合概率开根号或除以长度的函数平衡序列长度的影响使得长序列不会因为乘积小而被不公平地排除。常见做法的就是加权归一化对于长度 :score()1∑1log⁡(∣,)其中∈[0,1] 是超参数用来控制长度惩罚强度而使用 log 用来防止下溢。还是用刚刚的例子序列联合概率log 联合概率[A,B,B]0.15log⁡0.15≈−1.897[A,B,B,C]0.14log⁡0.14≈−1.966假设 0.7计算两条序列的归一化得分[A,B,B]长度 3score([,,])−1.89730.7≈−1.8971.933≈−0.981[A,B,B,C]长度 4score([,,,])−1.96640.7≈−1.9662.639≈−0.745归一化后序列原联合概率归一化得分[A,B,B]0.15-0.981[A,B,B,C]0.14-0.745现在[A,B,B,C]得分更高此时束搜索就会选择更合理、更完整的长序列。这样就解决了短序列偏好问题同时保留概率信息。2.3 束搜索的误差分析#到此为止你会发现序列生成任务的性能被分成了两部分模型对概率分布的拟合能力和搜索算法的搜索能力。因此在调试时的一个关键点就在于正确分析误差是来自模型还是搜索算法。我们有这样一个方法来确认这一点

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑