就算所有音都听得对,一句话如果不遵守我们说话的语法、习惯与常识,正常人也不信它是对的。语言模型的唯一使命,就是在候选堆里替我们把"人话"挑出来。这一节先讲清楚,它在 ASR 流水线里具体在哪一步发力,又为什么能补声学模型的缺。
第一个场景就是"把门关上"对"把门撞上":两者的声学波形几乎分不出高低,打分差不多。这时候必须有人站出来说:在你已经说了"把门"的情况下,接下来出现"关上"比出现"撞上"的概率高得多,这一票就定了胜负。
第二个场景,一串连续的快说,声学上把"他说你好"切成了"她说你好",音素上真的对,但词序列在人话里概率就是更低。这一票也得语言模型拿。
所以,语言模型的作用一句话说完:当声学模型拿不定主意时,用语言的统计规律一锤定音。它的本质是提供一个"先验"——给定一堆发音听起来都一样的候选,哪一句本身就更有可能被人说出来,就给谁更高分。
上图把它的裁决画出来了,你感受一下。
语言模型要计算的就是一句话本身出现的概率:给定一串词 w1,w2,…,wn,它出现的概率 P(w1,w2,…,wn) 多大。用概率的链式法则把它拆开来:
P(w1,w2,…,wn) = P(w1) × P(w2|w1) × P(w3|w1,w2) × … × P(wn|w1,…,w(n-1))
每一步都预测"前(n-1)词之后,下一个词是什么概率分布"。这个拆解把一个大问题变成一串小问题,完美适配我们需要解码器一步步找最优的场景:搜索到第 k 个词,随时能拿概率分往上加。工程上没法一直用前面所有词当条件,所以我们会做一个马尔可夫假设:下一个词只依赖最前面的少数几个词。这就是 N-gram 的由来——N 就是看前面几个词。深度模型则不满足于马尔可夫,会把前面所有词都用上。
回到全流水线,语言模型是一条单独的支路:海量文本语料训练出模型,解码器搜索时,每一条候选句子都会被它算出一个对数概率,加到声学模型给的对数概率上,再乘上权重 λ,最后选总分最大。
这里要注意,它不是"把句子重写一遍",也不是"替代声学模型",它就是个打分裁判——给已经出来的候选句子加个分,帮解码器做比较。整个流水线里,它和声学模型各司其职:声学负责"对不对声音",语言负责"像不像人话",谁也代替不了谁。
只看公式还是差口气,拿三个词算一次就有手感。设候选句子是"把门关"三个词,链式将它拆成三小段:先算 P(把),再算 P(门|把),再算 P(关|把门),三者相乘得 P(把门关) 的估计。这里的每一步其实都是"站在前文,猜下一个词该是哪个"。
把两种候选并排放,差距立刻明白:
| 候选 | 前文 | 下一个词 | 估计 P | 语言分高低 |
|---|---|---|---|---|
| 把门关上 | 把门 | 关上 | 高 | 语言分高,获胜 |
| 把门撞上 | 把门 | 撞上 | 低 | 语言分低,落败 |
请注意最后一列希望能证明的正是:同样是"把门",后面跟"关上"和跟"撞上"在真实语料里出现频率大不一样。语言模型学的就是这份"频率与搭配习惯",再借链式法则把它一步步折算成全句的概率。边上那句"她要来"和"他要来",声学上难分,可一旦前文给了"她"还是"他"的上下文倾向,语言模型就能够分清。
一个常被忽略的点:语言模型被刻意做成"每一步预估下一个词",而不是一次性吐出整句概率。原因在于解码器是逐词生长的——它搜到第 k 个词时,只想立刻知道第 k+1 个词各有几分,好决定往哪条路径走。如果语言模型只能整句给分,解码器就无法在中间裁枝,搜索会慢得不可收拾。这一步一问的结构,恰好和"不断往前扩路"的解码流程严丝合缝。
为了让"打分为何必须是它那种口径"更接地气,把同一条声音配上三种可能的分词,看语言模型分别怎么表态。设声音说"他明天回上海"。候选 A 直白切成"他 明天 回 上海",语序整齐、词语规范,语言分自然最高;候选 B"他 明天 回到 上海"虚词稍多、读起来略绕,分略低;候选 C 若被切错成"他 明 天回 上海"这种半字半词的怪串,既不像标准词序,参考词表也兜不住,分被压到很低。语言模型的工作,就是在这三串候选上给出有梯度的分数,让解码器清晰地从 A、B、C 里挑出 A。
这个"有梯度"很关键——不是非黑即白的对错二选一,而是让每一步搜索都能用分差做判断,才谈得上"逐步生长、逐步选路"。这也正是链式分解体现的精神:把一整句的裁决,化成沿途一分一分的积累。理解了"打分要有梯度、要可分步",你就掌握了语言模型在这套流水里最本质的操盘逻辑。
再强调一次这条主线的偷懒提醒:语言模型从头到尾都是"给词序列打分",它既不碰波形,也不负责补全意思。判断自己的角色有没有摆正,就靠一句口诀破题——声学问你"像不像这些音",语言学问你"像不像一句话",解码才问你"哪句最像整句"。把三个问题各自归位,第五章排错时你就永远知道该找哪台机器。记住这三个提问,比记住任何公式都更能稳住全书的地图。
接下来,我们定粒度:语言建模单元,你选整词还是子词,这对模型的效果影响真不小。