李宏毅NLP-8-语音模型
Language Model
语言模型的定义(LM)
- 核心功能:估计token 序列的概率,即 P ( y 1 , y 2 , … , y n ) P(y_1,y_2,…,y_n) P(y1,y2,…,yn)。
- Token:可以是单词、字、子词(如 BPE),代表文本的基本单元。
- 示例:LM 能判断 “我吃饭” 比 “我吃床” 更可能(概率更高),因为前者符合语言规律。
LM 在模型中的应用:HMM vs LAS
(1)HMM(隐马尔可夫模型)
公式: Y = a r g m a x Y P ( X ∣ Y ) P ( Y ) Y=argmax_YP(X∣Y)P(Y) Y=argmaxYP(X∣Y)P(Y)
- 场景:典型用于语音识别(X 是语音信号,Y 是文字序列)。
- 分工:
- P ( X ∣ Y ) P(X|Y) P(X∣Y):建模 “文字→语音” 的映射(如声学模型,需语音 - 文字配对数据)。
- P ( Y ) P(Y) P(Y):建模 “文字本身的合理性”(如 n - gram 模型,只需纯文本数据)。
- 意义:通过 “观测概率 + 语言先验” 联合决策,提升预测的合理性(比如避免 “我吃床” 这类语法错误)。
(2)LAS(Listen - Attend - Spell,端到端模型)
公式: Y = a r g m a x Y P ( Y ∣ X ) P ( Y ) Y=argmax_YP(Y|X)P(Y) Y=argmaxYP(Y∣X)P(Y)
- 场景:同样用于语音识别,但 LAS 是端到端模型(直接学习 “语音→文字” 的映射 P(Y∣X))。
- LM 的作用:
- P ( Y ∣ X ) P(Y|X) P(Y∣X) 依赖 配对数据(语音 - 文字对,收集成本高)。
- P ( Y ) P(Y) P(Y) 依赖 纯文本数据(如互联网文本,容易大规模收集)。
- 引入 LM 可利用海量纯文本数据,补充 P ( Y ∣ X ) P(Y|X) P(Y∣X) 的不足(比如提升语法合理性)。
3. 数据层面的核心优势
- P ( Y ∣ X ) P(Y|X) P(Y∣X) (如 LAS 的主模型):
- 需要 配对数据(如语音 - 文字对),收集难度大(需标注、场景覆盖有限)。
- P ( Y ) P(Y) P(Y)(语言模型):
- 只需 纯文本数据(如新闻、小说、社交媒体文本),容易大规模获取(互联网是天然语料库)。
→ 当模型需要输出文本(如语音识别、机器翻译、文本生成)时,语言模型能利用 “易获取的纯文本数据”,补充主模型对 “语言规律” 的学习,提升输出的合理性和准确性。
简单来说:
- 主模型(如 LAS、HMM 的观测模型)负责 “输入→输出” 的映射,但依赖稀缺的配对数据;
- 语言模型负责 “输出本身的合理性”,依赖易获取的纯文本数据;
- 两者结合,实现 “精准映射 + 语言先验” 的双重保障。
N-gram
- 核心目标:估计序列概率**
语言模型的核心是计算 token 序列的概率 P ( y 1 , y 2 , … , y n ) P(y_1,y_2,…,y_n) P(y1,y2,…,yn)(如句子 “wreck a nice beach” 的概率)。
2. 问题:数据稀疏性
直接估计长序列概率面临 “数据稀疏” 难题:
- 训练数据中,完整的长序列(如 “wreck a nice beach”)可能从未出现,无法直接统计其概率。
3. N-gram 的解决思路:分解为短距离条件概率
N-gram 通过 “马尔可夫假设” 简化问题:假设 “每个词的概率仅依赖前 n − 1 n−1 n−1 个词”,将长序列概率分解为 短距离条件概率的乘积。
(1)链式法则分解(以 2-gram 为例)
以句子 “wreck a nice beach” 为例,利用 链式法则 分解为:
- START:序列开始的占位符(如句子开头)。
- 2-gram(Bigram):每个词仅依赖 前 1 个词,是 N-gram 中最常用的形式。
(2)条件概率的统计估计
以 P ( b e a c h ∣ n i c e ) P(beach∣nice) P(beach∣nice) 为例,通过 训练数据中的词对频率 估计:P(beach∣nice)= C o u n t ( “ n i c e b e a c h ” ) Count(“nice beach”) Count(“nicebeach”)/ C o u n t ( “ n i c e ” ) Count(“nice”) Count(“nice”)
-
分子:训练数据中 “nice beach” 同时出现的次数(共现次数)。
-
分母:训练数据中 “nice” 出现的总次数。
-
这是 最大似然估计(MLE),核心是 “用频率近似概率”。
N-gram 通过 训练数据中的词频 估计条件概率,但存在先天缺陷: -
当 n n n 较大时(如 3-gram、4-gram),问题更严重:
长距离的词组合(如 “the dog jumped”,“the cat ran”)在训练数据中 极难完整出现,导致很多合理的序列被错误估计为 “概率 0”。
假设训练数据只有两句:
- “The dog ran …”
- “The cat jumped …”
计算 P(jumped∣the, dog)
- 含义:前两个词是 “the dog” 时,下一个词是 “jumped” 的概率。
- 训练数据中,“the dog” 后面接的是 “ran”,从未出现 “the dog jumped”。
- 按 MLE(最大似然估计),概率会被算成 0,但这显然不合理(“The dog jumped” 是合理句子)。
计算 P(ran∣the, cat),按 MLE,概率也会被算成 0,但这同样不合理(“The cat ran” 是合理句子)。
3.根源:数据稀疏(Data Sparsity)
- 自然语言的 词组合是无限的(如 3-gram 的组合数是 V 3 V^3 V3,V 是词表大小,通常很大)。
- 训练数据 无法覆盖所有可能的 n-gram 组合,导致大量合理组合的频率为 0,进而概率估计为 0。
建议 赋予这些未出现的组合一个 “小概率”(如 0.0001),而非绝对 0。“平滑(Smoothing)” 技术的思想(如加 1 平滑、Kneser-Ney 平滑等),核心是 “让未出现的组合也有微小概率,避免概率为 0 的极端情况”。
数据稀疏导致大量合理序列的概率被错误估计为 0,使模型无法处理未见过的词组合,必须通过平滑技术修正。
Continuous LM
- N-gram 的缺陷:依赖离散的词共现计数,未出现的组合概率为 0(数据稀疏)。
- 连续模型的优势:通过 低维隐向量的泛化能力,即使没见过 “用户 B - 动漫 2” 的组合,也能通过向量内积预测评分(类似神经语言模型用词向量泛化未见过的词组合)。
将推荐系统的矩阵分解思想引入语言模型(Continuous LM)”** 的核心逻辑,用于解决 词组合的稀疏性问题。以下从 模型类比、矩阵结构、向量学习、损失函数 四个维度解析:
1. 核心类比:推荐系统 → 语言模型
- 推荐系统:处理 “用户 - 物品” 交互矩阵(如用户对电影的评分),通过矩阵分解学习用户和物品的隐向量,预测缺失的评分。
- 连续语言模型:处理 “词 - 历史上下文” 共现矩阵(如 “dog” 和 “ran” 的共现次数),通过矩阵分解学习 词向量( v i v^i vi) 和 上下文向量( h j h^j hj),预测未观察到的词组合概率。
2. 矩阵结构:词 - 上下文的共现计数
(1)行(Vocabulary):词汇
- 代表 目标词(如
ran
、jumped
、cried
…),对应推荐系统的 “用户”。 - 每个词用 向量 v i v^i vi 表示(如 v 1 v^1 v1 是
ran
的向量, v 2 v^2 v2 是jumped
的向量)。
(2)列(History):上下文
- 代表 历史上下文(如
dog
、cat
、child
…),对应推荐系统的 “物品”。 - 每个上下文用 向量 h j h^j hj 表示(如 h 1 h^1 h1 是
dog
的向量, h 2 h^2 h2 是cat
的向量)。
(3)单元格( n i j n_{ij} nij):共现次数
- n i j n_{ij} nij 是 词 i i i 和上下文 j j j 的共现次数(如 n 11 = 2 n_{11}=2 n11=2 表示 “dog” 和 “ran” 共现 2 次; n 22 = 2 n_{22}=2 n22=2 表示 “cat” 和 “jumped” 共现 2 次)。
- 大量单元格为 0(如 “dog” 和 “jumped” 的 n 21 = 0 n_{21}=0 n21=0),对应 “未观察到的词组合”(数据稀疏)。
3. 向量学习:连续表示的泛化能力
- 目标:学习词向量 v i v^i vi 和上下文向量 h j h^j hj,使得 向量内积 v i ⋅ h j v^i⋅h^j vi⋅hj 尽可能接近实际共现次数 n i j n_{ij} nij。
- 泛化逻辑:
- 即使某词和上下文未共现( n i j = 0 n_{ij}=0 nij=0),它们的向量内积仍可给出 非零的 “预测共现概率”(如 “dog” 和 “jumped” 的内积 v 2 ⋅ h 1 v^2⋅h^1 v2⋅h1 可预测其共现可能性)。
- 这解决了 N-gram 的稀疏性缺陷(N-gram 中未出现的组合概率为 0,而连续 LM 通过向量泛化赋予其合理概率)。
4. 损失函数:最小化预测误差
为了学习向量 v i v^i vi 和 h j h^j hj,定义 均方误差(MSE)损失: L = ∑ ( i , j ) ( v i ⋅ h j − n i j ) 2 L=∑_{(i,j)}(v^i⋅h^j−n_{ij})^2 L=∑(i,j)(vi⋅hj−nij)2
- 优化目标:通过梯度下降最小化 L L L,使向量内积尽可能拟合实际共现次数。
- 类比推荐系统:这与协同过滤中 “最小化预测评分与实际评分的误差” 完全一致。
借鉴推荐系统的矩阵分解思想,将 “词 - 上下文” 的共现关系建模为连续向量的内积,通过学习向量表示泛化稀疏数据,解决 N-gram 的概率估计偏差问题。
- N-gram 的痛点:未观察的词组合(如 “dog jumped”)概率被置为 0,需手动平滑(如加小概率)。
- 连续 LM 的优势:通过 向量相似性的自然传递,未观察的组合会自动获得合理概率(继承相似上下文的关联),实现 “自动平滑”。
可以将这个连续语言模型看作一个神经网络。整个图示清晰地展示了连续语言模型的工作原理,即通过学习历史上下文和词汇的连续向量表示,利用向量内积来预测共现次数,并通过损失函数进行优化,从而自动解决数据稀疏问题,实现更好的泛化能力。
更进一步的可以扩展到基于神经网络的LM
NN-based LM
基于神经网络的语言模型(NN-based LM)” 的训练逻辑,核心是 “自回归学习:预测下一个词”,以下分步拆解:
1. 训练数据:纯文本语料
左侧展示 无监督文本数据(如中文句子片段):
- 例:“潮水 退了 就 知道 誰 …”“不爽 不要 買 …”“公道價 八萬 一 …”
- 特点:只需纯文本(无需配对数据),符合语言模型 “易收集数据” 的优势。
2. 训练目标:预测下一个词
核心诉求:Learn to predict the next word
- 给定 前文(context)(如 “潮水 退了”“退了 就”),模型学习预测 下一个词(如 “就”“知道”“誰”)。
3. 网络结构:序列依赖的建模
右侧展示 神经网网络的输入 - 输出关系:
- 输入:前文的词(如 “潮水”+“退了”,“退了”+“就”,“就”+“知道”)。
- 输出:下一个词的概率分布(如 “就”“知道”“誰”)。
- 示例对应:
- 输入 “潮水 退了” → 预测 “就”;
- 输入 “退了 就” → 预测 “知道”;
- 输入 “就 知道” → 预测 “誰”;
完美匹配左侧文本 “潮水 退了 就 知道 誰 …” 的序列依赖。
4. 模型本质:自回归(Autoregressive)学习
- 自回归:用 前面的词预测后面的词,逐步生成序列。
- 对比传统 N-gram:
- N-gram 依赖固定长度的窗口(如 2-gram 看前 1 个词),而神经网络可通过循环结构(RNN)或注意力(Transformer) 捕捉更长距离的依赖。
利用纯文本数据,训练神经网络学习 “前文→下一个词” 的映射,自动捕捉语言的序列依赖,实现比 N-gram 更灵活的长距离建模。
神经网络的角色:预测下一个词的概率
每个条件概率 P(next word∣context) 由 相同结构的神经网络 计算:
- 输入:前文(context)的1-of-N 编码(独热编码)。
- 例:预测 P ( w r e c k | S T A R T ) P(wreck|START) P(wreck|START)时,输入是 “START” 的独热编码;
- 预测 P ( a ∣ w r e c k ) P(a|wreck) P(a∣wreck) 时,输入是 “wreck” 的独热编码。
- 输出:词汇表中每个词作为下一个词的概率分布。
- 例:第一个 NN 输出 “wreck”,“a”,“nice”… 的概率,其中 “wreck” 的概率最高(对应 P ( w r e c k ∣ S T A R T ) P(wreck|START) P(wreck∣START))。
1-of-N 编码:词的离散表示
- 独热编码:每个词用一个向量表示,向量长度等于词汇表大小,只有对应词的位置为 1,其余为 0。
- 作用:将离散的词转换为神经网络可处理的数值输入,是 “离散词→连续向量” 的过渡(后续会进化为词嵌入,如 Word2Vec)。
这类想法最早可以追溯到2003年,Bengio 等人提出的神经语言模型(Neural Probabilistic Language Model)架构,是现代词嵌入和神经 LM 的奠基性工作。
神经网络的三级结构
模型目标:给定前 n − 1 n−1 n−1 个词(上下文),预测下一个词 w t w_t wt 的概率 P ( w t ∣ w t − n + 1 , … , w t − 1 ) P(w_t|w_{t−n+1},…,w_{t−1}) P(wt∣wt−n+1,…,wt−1)。
- 输入层:词嵌入(Word Embedding)
- 操作:对每个上下文词(如 w t − n + 1 , w t − 2 , w t − 1 w_{t−n+1},w_{t−2},w_{t−1} wt−n+1,wt−2,wt−1),通过 共享的词嵌入矩阵 C C C 查表,得到其 连续向量表示 C ( w ) C(w) C(w)。
- 意义:
- 替代传统 “独热编码”,将离散词映射到低维连续空间,解决稀疏性问题。
- 词嵌入矩阵 C C C 是共享参数(所有词共用),大幅减少参数数量,提升泛化能力。
- 隐藏层:非线性特征提取
- 操作:将多个上下文词的嵌入向量拼接(或组合),输入到 tanh 激活的隐藏层,捕捉词间的复杂交互。
- 意义:
- 相比 N-gram 的 “统计共现”,神经网络可学习 非线性的上下文依赖(如语义、语法关系)。
- 输出层:Softmax 预测概率
- 操作:隐藏层输出经过 Softmax 函数,生成词汇表中每个词作为下一个词的概率分布: P ( w t = i ∣ c o n t e x t ) = S o f t m a x ( 隐藏层输出 ) i P(w_t=i|context)=Softmax(隐藏层输出)_i P(wt=i∣context)=Softmax(隐藏层输出)i
- 挑战:
- 词汇表 V V V 通常很大(如 104∼105),Softmax 计算复杂度为 O ( V ) O(V) O(V),是模型的计算瓶颈(后续通过层次 Softmax、负采样优化)。
解决传统 LM 的两大痛点
- 数据稀疏性:
- 词嵌入的连续表示,让语义相似的词(如 “dog” 和 “cat”)在向量空间中靠近,天然实现 “平滑”(未观察的词组合可通过向量相似性泛化)。
- 长距离依赖:
- 神经网络的隐藏层可建模 非线性的长距离依赖(虽受限于固定窗口,但为后续 RNN、Transformer 等递归 / 注意力模型奠定基础)。
在 Bengio 论文发表的 2003 年,ReLU 尚未提出(ReLU 在 2010 年后才广泛应用),tanh 是当时比 sigmoid 更优的选择。尽管 tanh 仍有梯度消失问题,但已解决了 sigmoid 的核心缺陷(零中心、梯度强度)。
后来,ReLU 因 计算简单、梯度更稳定(正区间导数恒为 1) 逐渐成为主流,但在 序列建模的早期阶段,tanh 的设计是神经语言模型突破传统 N-gram 的关键一步 —— 它让连续词向量的学习更高效,为后续发展奠定了基础。
综上,图中隐藏层用 tanh,是因为它在 零中心特性、梯度传递效率、非线性表达能力 上更适配神经语言模型的训练需求,相比 sigmoid 更能解决当时的核心痛点(稀疏性、梯度消失、长依赖建模)。
RNN-based LM
基于 RNN 的语言模型(RNN-based LM)突破 “长历史依赖” 的瓶颈,核心是 用循环隐状态替代固定窗口的独热编码,让语言模型首次具备处理 长距离历史依赖 的能力,为后续 LSTM、Transformer 等模型奠定了 “序列循环建模” 的基础。从 “固定窗口” 到 “动态记忆”,使模型能捕捉句子级甚至段落级的语义关联(如 “猫” 和远早出现的 “鱼” 的关联)
复杂模型的诞生:突破 RNN 的瓶颈
上方的复杂架构(如神经图灵机变体)针对传统 RNN 的两大痛点设计:
- 长依赖遗忘:普通 RNN 隐状态易丢失早期信息 → 引入 显式记忆模块(Memory) 存储长期信息。
- 交互粗粒度:对历史信息利用粗糙 → 通过 注意力(Attention)+ 精细寻址(Addressing),像 “数据库查询” 般精准提取记忆。
本质:给 RNN 加装 “外挂记忆” 和 “精细操控系统”,试图处理更长、更复杂的序列(如长文本、程序代码)。
记忆如何 “存” 和 “取”
(1)记忆更新(Update memory)
- 基于当前输入 w t + 1 w^{t+1} wt+1、注意力 a t a^t at 等,通过 元素乘法(⊙)和加法 动态修改记忆单元:保留关键信息,覆盖冗余内容,让记忆 “可控更新”。
(2)寻址(Addressing)
分五步精细操作(Match→Normalization→Interpolation→Shift→Sharpening):
- Match:计算查询与记忆的相似度(内积);
- Normalization:归一化相似度,转化为概率;
- Interpolation:结合历史权重,平滑读取位置;
- Shift:微调读取位置(处理序列顺序);
- Sharpening:强化高概率位置,让读取更聚焦。
像给模型配了 “记忆索引 + 插值微调”,解决 “记忆太多,不知读哪” 的问题,但 架构复杂、训练难度陡增。
LSTM 的务实优势:简单有效,经优化仍能打
- LSTM 的核心价值:通过门控机制(输入 / 遗忘 / 输出门),天然缓解长依赖遗忘,架构比复杂模型简单,训练更稳定。
- 工程现实:在很多场景中,精心调优的 LSTM(加正则、优化器) 能逼近复杂模型的效果,却避免了高复杂度的代价(训练慢、部署难)。
提升LAS
如何将语言模型(LM)集成到 LAS 模型(Listen-Attend-Spell,端到端语音识别模型)” 的技术框架,从 “集成时机(when)” 和 “集成方式(how)” 两个维度分类:
浅融合(Shallow Fusion) 将语言模型(LM)与 LAS 模型结合,核心是 “解码阶段在输出概率层直接融合,无需修改模型结构”:
模块结构:独立训练,解码融合
LAS 解码器
- 训练目标:学习 P L A S ( Y ∣ X ) P_{LAS}(Y|X) PLAS(Y∣X)(语音→文本的条件概率)。
- 结构:
- 黄色模块:解码器的隐状态(如 RNN/LSTM 隐状态),逐步生成输出。
- 橙色模块:输出层,通过 Softmax 生成 词汇表(大小 V V V)上的概率分布 P L A S ( y ) P_{LAS}(y) PLAS(y)。
- 语言模型(LM)
- 训练目标:学习 P L M ( Y ) P_{LM}(Y) PLM(Y)(文本自身的概率,即语言先验)。
- 结构:
- 绿色模块:LM 的隐状态(如 RNN 结构),输入为序列结束符
<EOS>
或历史词。 - 蓝色模块:输出层,通过 Softmax 生成 同词汇表(大小 V V V)的概率分布 P L M ( y ) P_{LM}(y) PLM(y)。
- 绿色模块:LM 的隐状态(如 RNN 结构),输入为序列结束符
- 融合层(紫色模块)
-
操作:在对数域将两者的概率相加(避免数值下溢):
l o g P 融合 ( y ) = l o g P L A S ( y ) + λ l o g P L M ( y ) logP_{融合}(y)=logP_{LAS}(y)+λlogP_{LM}(y) logP融合(y)=logPLAS(y)+λlogPLM(y)
- λ:平衡系数(如 λ=0.5,控制 LM 和 LAS 的贡献权重)。
-
解码决策:对每个位置,选择 融合后概率最高的词(图中 “max” 操作,对应 beam search 等解码算法)。
“浅融合” 的核心特点
-
“浅” 的本质:
仅在 输出概率层 融合,不修改 LAS 或 LM 的内部结构(如隐藏层、注意力模块),无需重新训练,工程实现简单。 -
独立训练,解码复用:
- LAS 和 LM 可 完全独立训练(LAS 用语音 - 文本配对数据,LM 用纯文本数据)。
- 解码时 “即插即用”,直接结合两者的概率,快速提升输出的语言合理性(如纠正 “我吃床” 为 “我吃饭”)。
-
优缺点对比:
优势 局限 实现简单,无训练成本 语言信息未参与模型内部决策 复用预训练模型,灵活适配 融合效果弱于 “深融合”(改隐藏层)
深融合(Deep Fusion) 的核心逻辑,对比浅融合,其关键是 “在模型内部隐藏层融合,需重新训练”,以下分步拆解:
深融合的架构逻辑
- 双输入流:
- 绿色路径:语言模型(LM)的信息流(如文本的词嵌入、隐状态,代表语言先验)。
- 黄色路径:LAS 模型的信息流(如语音编码器输出、解码器隐状态,代表语音→文本的映射)。
- 融合层(灰色 Network):
- 位置:模型的 隐藏层 / 中间特征层(而非浅融合的输出概率层)。
- 作用:让 LM 和 LAS 的特征 深度交互(如拼接、相加、门控融合),使语言知识参与模型内部的决策过程(如影响 RNN 隐状态更新、注意力权重)。
- 需要训练,让参数学习 “如何最优结合 LM 和 LAS 的特征”。
更换 LM 的连锁反应
- 若替换 LM(如从 N-gram 换为 BERT),深融合的 融合层参数是针对旧 LM 训练的,新 LM 的特征分布不同,必须 重新训练融合网络 以适配,否则无法有效融合。
深融合 vs 浅融合:核心对比
维度 | 浅融合(Shallow) | 深融合(Deep) |
---|---|---|
融合位置 | 输出概率层(表层) | 隐藏特征层(深层) |
训练需求 | 无需重新训练 | 必须重新训练 |
语言知识影响 | 仅修正最终输出 | 深度参与特征交互 |
工程复杂度 | 低(即插即用) | 高(模型修改 + 重训) |
深融合在此图中选择 SoftMax 之前的 logits(未归一化的线性输出,保留更丰富的梯度信息),要不同 LM 的 输出维度一致(Size V,与词汇表大小匹配),就能替换(如从 N-gram 换为 BERT,只需确保 LM 输出层维度为 V)。通过 “SoftMax 前 logits 融合 + 标准化维度接口”,在保留 “深度特征交互” 优势的同时,提升了 LM 的可替换性 和 训练效率。
冷融合(Cold Fusion) 的核心逻辑,属于 “预训练 + 微调” 范式,核心是 “训练 LAS 前,用预训练语言模型(LM)的参数初始化 LAS,继承语言知识”。
- 基于海量纯文本数据,LM 学习语言规律(如词嵌入、RNN/LSTM 参数),得到 通用语言知识(如 “dog” 和 “jump” 的语义关联)
- 在 LM 预训练参数的基础上,微调适配语音任务(学习 “语音特征→文本” 的映射,修正语言知识与语音场景的偏差