Decoding:大模型解码策略解析
前言:模型是怎么“说话“的?
想象一下,你让ChatGPT写一篇文章,它是怎么一个字一个字“蹦”出来的?
其实,大模型每次只预测下一个词(token)。每次预测时,模型会给词库里的所有词打分。算出每个词出现的概率,然后从中“挑选”一个词。这个“挑选”的过程,就叫做Decoding(解码)。
📌 举个例子:
输入:“今天天气真”
模型预测下一个词的概率:
“好” → 40%
“差” → 30%
“热” → 20%
“冷” → 10%
……(词库里几万个词都有概率)
那么,选哪个词?这就是解码策略要解决的问题!
一、贪心搜索(Greedy Search)----每次选最好的那个
🍎 通俗理解
就像考试做选择题,每道题都选你最有把握的那个答案,不管前后联系,只追求当前最优。
⚙️ 工作原理
输入:今天天气真
第1步:选概率最大的词 → "好" (概率40%)
第2步:选概率最大的词 → "啊" (概率55%)
第3步:选概率最大的词 → "!" (概率60%)
输出:今天天气真好啊!
每一步都只保留概率最大的那一个词,直到生成结束。
✅ 优点
⚡ 速度极快,计算量小
❌ 缺点
一步错,步步错(某一步选错了,后面全受影响)
生成的文本单调、重复,容易陷入"局部最优"
💡 就像走迷宫时每次只选眼前看起来最好的路,结果走进死胡同,却发现最优路线其实是绕一步才能找到的。
📱 适用场景
对速度要求极高、对质量要求不高的场景(如实时字幕、快速问答)
二、束搜索(Beam Search)----同时走几条路
🍎 通俗理解
贪心搜索只走1条路,而束搜索同时走N条路,最后选出最好的那条路。就像高考填志愿,你同时投了3所学校,等结果出来后选最好的那个。
⚙️ 工作原理
假设 num_beams = 3(同时保留3条候选路径):
输入:今天天气真
第1步:保留概率最高的3个词
路径1:今天天气真[好] 得分:0.40
路径2:今天天气真[差] 得分:0.30
路径3:今天天气真[热] 得分:0.20
第2步:每条路径继续延伸,再保留总分最高的3条
路径1:今天天气真好[啊] 得分:0.40×0.55 = 0.22
路径2:今天天气真好[!] 得分:0.40×0.30 = 0.12
路径3:今天天气真差[极] 得分:0.30×0.40 = 0.12
……直到生成结束,选总分最高的路径输出
num_beams 效果
1 退化为贪心搜索
3~5 常用范围,质量和速度平衡
越大 质量越好,但速度越慢
✅ 优点
比贪心搜索生成质量明显更好
能找到更优的完整序列
❌ 缺点
计算量比贪心大N倍
最优路径可能被剪掉(不保证找到全局最优)
生成文本仍然可能过于保守,缺乏创意
📱 适用场景
机器翻译、文本摘要等对准确性要求高的任务
三、Top-K采样—从前K名随机选
🍎 通俗理解
不再选"最好的那一个",而是先选出前K个候选词,然后按概率随机抽一个。
就像班里选班长,不让全班投票(词库太大),先选出前5名候选人,再从这5个人里按得票率随机决定。
⚙️ 工作原理
词库概率分布:
好(40%) 差(30%) 热(20%) 冷(10%) 棒(5%) 糟(2%) ...
K=3时,只保留前3个候选词并重新归一化:
好(44%) 差(33%) 热(22%)
然后按此概率随机抽取一个词
📊 K值的影响
K=1 → 等同于贪心搜索,每次只选最大概率的词,无随机性
K=5 → 从前5个词中随机选,有一定多样性
K=50 → 从前50个词中随机选,多样性很强但可能选到奇怪的词
✅ 优点
引入随机性,生成内容更有多样性和创意
❌ 缺点
⚠️ K是固定的,但概率分布是动态变化的!
情况1(分布陡峭):好(95%) 差(2%) 热(1%) 冷(0.5%)...
→ K=50时,仍会采样到概率极小的词,生成奇怪内容
情况2(分布平缓):好(3%) 差(3%) 热(2.9%) ...(所有词概率差不多)
→ K=5时,只采样了5个词,遗漏了很多合理选项
📱 适用场景
创意写作、故事生成等需要多样性的场景
四、Top-P采样(核采样)—按概率累计动态选词
🍎 通俗理解
Top-K的缺点是K是固定的,Top-P则动态决定候选词数量。规则是:从概率最高的词开始累加,直到累计概率达到P为止,这些词就是候选集。
就像买东西,不是固定买5件,而是在预算用完之前,按喜好程度一件一件加入购物车。
⚙️ 工作原理
P = 0.9,词库概率从高到低排列:
好(40%) → 累计 40% < 90% ✅加入
差(30%) → 累计 70% < 90% ✅加入
热(20%) → 累计 90% = 90% ✅加入(刚好达到)
冷(10%) → 累计100% > 90% ❌不加入
候选词:好、差、热(重新归一化后采样)
📊 P值的影响
P值 候选词 效果
0.1 极少 非常保守,接近贪心
0.9 适中 多样性和质量平衡(推荐)
1.0 全部 完全随机,可能生成乱内容
✅ 优点
- 动态调整候选词数量,比Top-K更灵活
- 分布陡峭时自动减少候选词,分布平缓时自动增加候选词
❌ 缺点
- P设太低 → 输出太固定
- P设太高 → 输出太混乱
🔗 Top-K 与 Top-P 联合使用
两者可以同时使用,取更严格(更小)的那个范围:
先用Top-K筛选出前K个词
再用Top-P从中进一步筛选出累计概率≤P的词
最后在剩余词中采样
五、Temperature
🍎 通俗理解
Temperature就像空调的温度调节:
温度调低:模型变得"谨慎保守",更倾向于选高概率词
温度调高:模型变得"大胆随机",低概率词也有更多机会被选中
⚙️ 工作原理
Temperature通过修改softmax公式来调整概率分布:
其中 T 就是 Temperature
原始概率:好(40%) 差(30%) 热(20%) 冷(10%)
T=0.5(低温,概率差距拉大):
好(70%) 差(20%) 热(8%) 冷(2%) → 更确定
T=1.0(标准,不变):
好(40%) 差(30%) 热(20%) 冷(10%)
T=2.0(高温,概率差距缩小):
好(28%) 差(26%) 热(24%) 冷(22%) → 更随机
六、联合采样----三剑合璧
🍎 通俗理解
Top-K、Top-P、Temperature 各有优缺点,单独使用效果有限。三者联合使用,可以取长补短,生成既有质量又有创意的文本。
⚙️ 执行顺序
原始概率分布
↓
① Top-K:先筛选出前K个高概率词(粗筛)
↓
② Top-P:再从K个词中按累计概率进一步筛选(精筛)
↓
③ Temperature:调整剩余候选词的概率分布(调节随机性)
↓
④ 按最终概率采样一个词
📋 完整示例
设置:K=50, P=0.9, T=0.8
输入:今天天气真
Step1 Top-K:从词库取概率最高的50个词
[好, 差, 热, 冷, 棒, 糟, 爽, 烂...共50个]
Step2 Top-P:累计到90%停止
[好(40%), 差(30%), 热(20%)] 累计=90%
→ 保留3个词,丢弃剩余47个
Step3 Temperature=0.8(略微压低随机性):
[好(46%), 差(31%), 热(23%)]
Step4 按概率随机采样
→ 假设抽到"好"
输出:今天天气真好...(继续预测下一个词)
七、总结:如何选择解码策略?
你的需求是什么?
│
├── 速度第一,质量其次?
│ └── ✅ 贪心搜索(Greedy Search)
│
├── 准确性第一(翻译/摘要)?
│ └── ✅ 束搜索(Beam Search),num_beams=5左右
│
├── 需要创意和多样性(写作/对话)?
│ └── ✅ 联合采样(Top-K + Top-P + Temperature)
│ 推荐初始参数:K=50, P=0.9, T=0.8
│
└── 需要稳定精确输出(代码/数学)?
└── ✅ Temperature趋近于0,或者直接贪心搜索
更多推荐


所有评论(0)