前言:模型是怎么“说话“的?
想象一下,你让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个 Step3Temperature=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,或者直接贪心搜索