从 GMM–HMM 到 DNN–HMM

换掉「打分器」,
不换「走路的规则」。

GMM:这一种状态,能不能产生眼前的声音?
DNN:看到眼前的声音,各种状态分别有多大可能?
两者都提供逐帧声学证据;HMM 仍然负责顺序与时长。

保留预设声音 → MFCC同一段声音、同一份特征
→
只替换这个模块各状态自己的 GMM
一个共享 DNN
逐帧声学打分
→
保留HMM → Viterbi → 文字状态、转移、自循环与搜索

只比较“开灯”的六个状态,不做候选词识别。
无录音、无上传;页面不会采集声音。

01 / 同一份输入

一帧声音,交给两种打分器。

橙色窗口选择当前帧。
下方两边的输入完全相同。

同一个 xₜ
12 维 MFCC
A / 原来的模块

六个状态,六套 GMM。

同一帧分别代入各状态自己的高斯混合密度。小图为 C₁/C₂ 投影,打分仍用全部 12 维。

输出:六个 log p(xₜ | s)
是密度分数,不要求六个数加起来等于 1。
B / 换上的模块

一个共享 DNN,六个输出。

输入一起走过非线性层,最后一次输出全部状态概率。

输出:六个 P(s | xₜ),合计 1.0000
只有输出节点代表状态;隐藏节点不是字或音素。
02 / 接口要对齐

网络给的是后验,HMM 要的是似然。

不能把 P(s | xₜ) 直接当成 p(xₜ | s)。用贝叶斯公式除以状态先验 P(s),得到可供解码的比例似然。

log p(xₜ | s) = log P(s | xₜ) − log P(s) + log p(xₜ)

最后一项对同一输入的所有状态相同,路径比较时可省略。下表橙色列就是传给 HMM 的分数。

为什么要除以“本来就常见”?

某状态常见,不等于这帧特别像它。

A:后验 0.6 ÷ 先验 0.8 = 0.75
B:后验 0.4 ÷ 先验 0.2 = 2.00
这个独立小例子说明校正后排名可能改变;不是当前帧的数据。
当前帧 · 点击状态行,检查两种打分
同一套 HMM 状态GMM
log 密度
DNN
后验 P(s | xₜ)
训练集
先验 P(s)
传入 HMM
log 后验 − log 先验

03 / 完全相同的下游

证据换了,六个状态仍然这样走。

换成 DNN,也不能随便跳过状态。
一次前进一步,或留在原地。

检查同一个 HMM 格子:
Viterbi 的公式不变
δₜ(s) = 声学分数ₜ(s) + maxᵢ [δₜ₋₁(i) + log aᵢₛ]

只有橙色项的来源替换了。前驱比较、转移概率和回溯步骤都没变。

橙线:合法 Viterbi 路径;虚线:各帧声学分数独立赢家。底色在每帧内部归一化,仅展示相对强弱;GMM 与 DNN 分数的绝对尺度不同,不能用总分高低判断哪种模型更好。

再问一步 / DNN 是怎么学会的?

先知道每帧的状态,再学会给状态分类。

① 带整句转写的语音

例如声音 + “开灯”。训练时知道整句答案。

→
② 已有 GMM–HMM 做强制对齐

在已知文本对应的状态链里,给每帧生成状态标签。

→
③ 用状态标签训练 DNN

交叉熵让正确状态的后验更高;不是直接预测“开灯”两个字。

这是经典混合系统的入门训练路线,不是唯一方法:后续还可做序列判别训练。识别时不输入正确文本;完整系统仍用词典、语言模型与搜索图竞争候选。

↳
记住这张“替换清单”就够了。

替换:逐帧 GMM 密度计算 → DNN 状态后验 + 先验校正。
保留:声学状态、状态转移、自循环、HMM 时序结构和 Viterbi 搜索。
DNN–HMM 仍是混合系统,不是“用一个网络把整段声音直接变成文字”。

再看 CTC:不提供逐帧状态标签,怎样训练? →
模型范围与正确性约定

本页固定比较“开灯”的六个状态,不是完整三指令 DNN 识别器。为了只改变一个模块,两条路线保持相同的 12 维 MFCC 前端和 HMM 转移概率。这里 DNN 输入只有当前帧;实际经典 DNN–HMM 常拼接邻近帧上下文,前端也可能使用滤波器组特征。

DNN 为实际运行的 12→16→12→6 网络,两个 tanh 隐藏层和一个 Softmax 输出层。只用本页两段预设合成语音及 GMM–HMM 对齐标签训练,先验由这些标签频次估计。它用于展示接口,不用于评估泛化、证明 DNN 优于 GMM 或识别未见语音。

真实系统通常用一个共享 DNN 输出全状态集合(经常是绑定的上下文相关音素状态 / senone),不是每个字训练一张网络。本页的六状态仅为看清接口而缩小了状态集合。

参考:Hinton 等,2012:Deep Neural Networks for Acoustic Modeling in Speech Recognition。本页不提供录音或上传,所有预设演示计算在浏览器本地完成。