ASR笔记:从 N-gram 到语音识别里的语言模型
2021/7/10大约 4 分钟
没想到国内ASR模型做的最好的公司,部分场景竟然用的还是朴实无华的N-gram。以为是"早已过时"的模型结构,看来还是不能小瞧的,所以重新学习并整理了N-gram相关的内容。
1. 基本概念
目标: 算一个句子 出现的概率 。
理论公式(链式法则):
问题: 每个词都依赖前面所有词。历史太长,组合爆炸,语料库里根本找不到样本来算概率(数据稀疏)。
N-gram 的解决思路: 用前面最近的 个词近似替代全部。这就是马尔可夫假设。
马尔可夫链 (Markov Chain)
- 定义:未来状态只取决于当前状态,跟更早的状态没关系。
- N-gram 关系:N-gram 就是把这个思想用在词序列上。
- Bigram () 一阶马尔可夫:。
- Trigram () 二阶马尔可夫:。
2. 计算方式
N-gram 把复杂的条件概率简化了:。
计算方法: 用最大似然估计 (MLE)
- 分子:这对词 一起出现了多少次?
- 分母:前一个词 出现了多少次?
- 结论:用局部共现频率来近似条件概率。
3. N-gram 的优化手段:解决稀疏和体积问题
N-gram 模型在工程上要解决两个核心问题:数据稀疏(概率为0)和模型体积过大( 越大,参数越多)。
3.1 平滑 (Smoothing) 与插值 (Interpolation):解决稀疏
平滑:从高频词那里“借”点概率,分给低频或没见过的词。常见的有:Kneser-Ney、Good-Turing等
插值: 解决高阶 N-gram 统计不可靠的问题。
- 思路:高阶 N-gram(比如 Trigram)虽然更精确,但更容易稀疏。低阶 N-gram(比如 Bigram、Unigram)虽然不精确,但统计更可靠。
- 做法:把不同阶的 N-gram 概率加权平均起来用。
其中 。这样,即使 Trigram 没统计到,也能通过 Bigram 和 Unigram 得到一个非零的概率。
3.2 剪枝 (Pruning):解决体积
问题:N-gram 模型的体积随着 和词汇量增大而爆炸。一个 4-gram 模型文件能有几个 GB。
剪枝:把那些贡献度小的 N-gram 直接从模型里删掉。
- 做法:通常是删掉那些出现次数极少(比如只出现过 1 次)的 N-gram。
- 直觉:这些低频 N-gram 对模型性能提升不大,但占了大量的存储空间。删掉它们,模型体积能大幅减小,同时性能损失很小。
4. N-gram 在 ASR 里的作用
在传统 ASR 系统里,N-gram LM 是一个非常重要的语言先验。
4.1 解码融合:声学和语言的权重分配
Beam Search解码器 在找最佳词序列时,要平衡两个分数:
- 声学分数 ():发音像不像?
- 语言分数 ():字词语句通顺不通顺,常见不常见?
- (语言权重): 调高,结果就更像人话,更流畅; 调低,结果就更贴近声音,但可能出现病句。
5. 优缺点&对比
优势
- 可解释强:完全由可数的频次构成,便于调权、做错误分析。
- 实现简单:纯统计模型,低算力设备也能运行,适合嵌入端或资源受限的场景。
- 与传统ASR高度兼容:容易与 WFST 图融合,方便进行 beam search。
劣势
- 数据稀疏:语料没覆盖到的组合直接变成 0,需要复杂平滑和插值。
- 语义隔离:将词视为离散ID,无法迁移“同义词”知识。
- 固定窗口:只能看到 个词,长距离依赖失效。
与神经语言模型(NLM)对比
| 维度 | N-gram | NLM |
|---|---|---|
| 数据稀疏 | 没见过就是 0,泛化弱 | 词嵌入+参数化概率,可对未见词组合“类比预测” |
| 语义表示 | 离散ID,无法理解 agent ≈ robot | 向量空间捕捉语义距离,利于迁移 |
| 上下文长度 | 固定窗口, 越大模型越臃肿 | RNN/LSTM/Transformer 理论上可看任意长上下文 |
| 部署 | 模型体积可控、推理快 | 需GPU/高算力,部署成本高 |
技术路线: 统计模型(N-gram) 引入词向量(NNLM) 引入序列结构(RNN/LSTM) 引入 Attention(Transformer)。