1. 贪心搜索:简单高效的策略
想象你在玩文字接龙游戏,每次只选择当前看起来最合适的词。这就是贪心搜索的核心思想:在生成序列的每一步,都选择当前概率最大的候选词。
数学表达:
在时间步,我们选择的词元为:
示例:
假设词表为["猫", "狗", "跑", "<eos>"],各时间步概率如下:
- 时间步1:猫(0.6) > 狗(0.3) > 跑(0.1)
- 时间步2:跑(0.5) > 狗(0.3) > 猫(0.2)
- 最终输出:"猫 → 跑 →
<eos>",总概率0.6×0.5=0.3
致命缺陷:
如下图所示,当第二步选择次优词元时,可能得到更优的全局结果。就像走迷宫时,当前看似最好的路口可能通向死胡同。
贪心搜索条件概率:
在时间步2选择第二高条件概率的词元,而非最高条件概率的词元:
2. 穷举搜索:暴力破解的代价
如果我们尝试所有可能的路径,就能保证找到最优解。但计算量呈指数级增长:
当词表大小,序列长度时,需要计算种可能——这需要宇宙中所有原子作为计算单元都远远不够!
3. 束搜索:在效率与精度间走钢丝
3.1 核心思想:保留多个候选
设置束宽(如k=3),在每一步保留概率最大的前k个候选序列。
算法步骤:
- 初始化:选择首词概率前k大的词
- 扩展候选:每个候选序列生成后续词概率
- 筛选保留:合并所有候选,保留总概率前k大的序列
- 终止条件:所有候选都生成结束符或达到最大长度
数学表达:
最终选择标准(带长度惩罚):
3.2 实际案例演示
假设词表为["A", "B", "C", "<eos>"],束宽k=2,最大长度T=3
| 时间步 | 候选序列 | 概率计算 |
|---|---|---|
| 1 | A(0.6), B(0.3) | 保留前2名 |
| 2 | AA(0.6×0.3)=0.18 | 合并后保留前2名 |
| AB(0.6×0.4)=0.24 | → AB(0.24)和AC(0.18) | |
| AC(0.6×0.3)=0.18 | ||
| BA(0.3×0.5)=0.15 | ||
| BB(0.3×0.3)=0.09 | ||
| 3 | ABA(0.24×0.2)=0.048 | 最终选择概率最高的序列 |
| ABB(0.24×0.4)=0.096 | ||
AB<eos>(0.24×0.3)=0.072 | ||
| ACA(0.18×0.3)=0.054 |
最终最优序列:ABB(概率0.096)
3.3 性能分析
计算量公式:
当k=5,,T=10时,计算量为5×10×1000=50,000次运算——普通手机都能轻松处理!
4. 关键参数解析
下图是一个束搜索过程(束宽:2,输出序列的最大长度:3)。候选输出序列是A、C、AB、CE、ABD和CED
- 束宽k:平衡搜索质量与计算成本
- 长度惩罚系数α:解决长序列概率衰减问题
- 最大长度T:防止无限生成
5. 现实应用中的调优技巧
- 动态束宽:初期用大束宽,后期逐步缩小
- 多样性增强:防止多个候选过于相似
- 混合策略:先束搜索再重排序
6. 总结:选择适合自己的策略
| 策略 | 计算量 | 结果质量 | 适用场景 |
|---|---|---|---|
| 贪心搜索 | O(T) | ★★☆☆☆ | 实时性要求极高的场景 |
| 束搜索 | O(kT) | ★★★★☆ | 大多数生成任务 |
| 穷举搜索 | O(exp(T)) | ★★★★★ | 理论分析与小规模问题 |
关键启示:在人工智能的世界里,完美解往往可望不可及,聪明的折中方案才是王道。就像人生的重要选择,我们无法穷尽所有可能性,但可以通过有限度的探索(类似束搜索),找到满意的人生路径。