基于Transformer的文本生成算法:束搜索(Beam Search)解码策略详解
字数 1669 2025-10-29 21:52:40
基于Transformer的文本生成算法:束搜索(Beam Search)解码策略详解
题目描述
在自然语言生成任务(如机器翻译、文本摘要)中,Transformer等模型会生成一个表示下一个词概率分布的输出。贪婪解码(每次只选概率最高的词)容易陷入局部最优,生成不连贯的文本。束搜索(Beam Search)是一种平衡效率与质量的解码策略,通过维护多个候选序列,减少遗漏全局最优解的风险。本题要求理解束搜索的原理、步骤和优化方法。
解题过程
-
问题分析
- 文本生成可视为序列决策问题:给定已生成的前缀序列,逐步选择下一个词,直到生成结束符。
- 贪婪解码的缺陷:一旦某步选错词,错误会传递到后续步骤。例如,生成句子“今天天气很好”时,若第一步误选“今地”,后续无法修正。
- 束搜索的改进:在每一步保留多个候选序列(束宽为 \(k\)),最终从完整序列中选择总体概率最高的结果。
-
核心概念定义
- 束宽(Beam Size):每步保留的候选序列数量,记为 \(k\)。\(k=1\) 时退化为贪婪解码。
- 序列概率:生成序列 \((y_1, y_2, ..., y_t)\) 的联合概率为 \(P(y_1, y_t) = \prod_{i=1}^t P(y_i | y_1, ..., y_{i-1})\)。
- 对数概率:为避免概率连乘导致数值下溢,实际计算使用对数概率求和 \(\log P = \sum_{i=1}^t \log P(y_i | ...)\)。
-
算法步骤详解
步骤1:初始化- 初始序列仅包含起始符(如
<s>),其对数概率为 \(\log(1) = 0\)。 - 将初始序列加入候选集合,此时集合大小为1。
步骤2:扩展候选序列
- 对当前候选集合中的每个序列,模型预测下一个词的概率分布。
- 从每个序列的预测中选取概率最高的 \(k\) 个候选词,生成 \(k \times k\) 个新序列(若当前候选数不足 \(k\),则扩展所有可能序列)。
- 示例:若当前有2个序列(束宽 \(k=2\)),每个序列扩展出3个候选,则生成6个新序列。
步骤3:筛选与剪枝
- 计算所有新序列的对数概率(原序列对数概率 + 新词的对数概率)。
- 仅保留总对数概率最高的 \(k\) 个序列,其余剪枝。
- 注意:已生成结束符的序列需单独保存,不参与后续扩展。
步骤4:终止条件
- 当所有候选序列均生成结束符,或达到最大生成长度时,停止迭代。
- 从已保存的完整序列中,选择总对数概率最高的作为最终结果。
- 初始序列仅包含起始符(如
-
优化与变体
- 长度归一化:防止长序列因概率连乘而得分偏低。常用方法包括:
- 对数概率除以序列长度 \(t\):\(\frac{1}{t} \sum_{i=1}^t \log P(y_i | ...)\)。
- 引入长度惩罚系数,如 \(\frac{1}{t^\alpha}\)(\(\alpha\) 为超参数)。
- 动态束宽:根据序列质量动态调整 \(k\),提升效率。
- 与采样结合:如Top-k采样(仅从概率最高的k个词中随机选择),增加多样性。
- 长度归一化:防止长序列因概率连乘而得分偏低。常用方法包括:
-
实例演示
任务:生成句子前缀“人工智能是”的后续。设束宽 \(k=2\)。- 步骤1:初始序列为“人工智能是”,对数概率=0。
- 步骤2:模型预测下一个词概率:
“未来”(-0.2), “领域”(-0.3), “技术”(-0.4)。
扩展后候选序列:- “人工智能是 未来” (得分 -0.2)
- “人工智能是 领域” (得分 -0.3)
- “人工智能是 技术” (得分 -0.4)
- 步骤3:保留前2名:“人工智能是 未来” 和 “人工智能是 领域”。
- 步骤4:继续扩展这两个序列,直到生成结束符,最终选择总得分最高的序列。
总结
束搜索通过多路径探索降低了贪婪解码的短视问题,是文本生成任务中的基础解码策略。其效果依赖束宽的选择:\(k\) 越大,质量可能越高,但计算成本也越高。实际应用中需权衡效率与质量。