Anthropic 工程博客 · 中文学习笔记Anthropic 工程笔记

    Deep Speech 2:用同一套端到端深度学习识别英语和普通话

    Deep Speech 2: End-to-End Speech Recognition in English and Mandarin

    Day 22 · 补完 原论文发布:2015-12-08 发表:ICML 2016 阅读约 9 分钟 原论文链接 ↗ 30u30 单元 ↗
    作者
    Dario Amodei, Rishita Anubhai, Eric Battenberg, Carl Case, Jared Casper, Bryan Catanzaro, Jingdong Chen, Mike Chrzanowski, Adam Coates, Greg Diamos, Erich Elsen, Jesse Engel, Linxi Fan, Christopher Fougner, Tony Han, Awni Hannun, Billy Jun, Patrick LeGresley, Libby Lin, Sharan Narang, Andrew Ng, Sherjil Ozair, Ryan Prenger, Jonathan Raiman, Sanjeev Satheesh, David Seetapun, Shubho Sengupta, Yi Wang, Zhiqian Wang, Chong Wang, Bo Xiao, Dani Yogatama, Jun Zhan, Zhenyao Zhu
    依据版本
    arXiv v1
    30u30 单元
    22_deep_speech_2(讲解、实现与练习请到原仓库查看,本站不翻译、不改编,见导读)
    ⚠️ arXiv 只有第 1 版(2015-12-08),作者按姓氏字母排序。ICML 2016 会议论文集(PMLR 48)收录了缩写版,作者名单更长、正文较短。本笔记依据 arXiv 版撰写。
    本页目录(18)
    1. 一句话总结
    2. 解决什么问题
    3. 核心思想
    4. 1. 端到端模型
    5. 2. 让深层 RNN 训得动
    6. 3. 能部署的单向模型
    7. 关键公式或机制
    8. CTC 损失
    9. 数据与规模
    10. 训练系统
    11. 部分结果(摘自论文)
    12. 部署:Batch Dispatch
    13. 图解
    14. 关键原话
    15. 和 Anthropic 笔记的对应
    16. 读的时候要注意
    17. 30u30 对应单元
    18. 延伸阅读

    一句话总结#

    把语音识别从“特征提取 + 声学模型 + 发音词典 + 语言模型 + ……”的多级流水线,换成一个从频谱直接输出字符的深层循环网络;然后靠更深的模型、更多的数据和更快的训练系统,让它在多个基准上接近或超过人工转写。

    解决什么问题#

    传统自动语音识别(ASR)系统由许多组件组成:复杂的特征提取、声学模型、语言与发音模型、说话人自适应等。每个组件都要单独构建和调参,换一种语言几乎要从头再来,而且很多组件换个环境或语言就不好用。

    论文对比的是人:人在童年能学会任何语言,学会读写之后,不需要额外训练就能在不同口音、环境和噪声下转写语音。作者希望一个识别引擎也能做到:大多数应用只需小改,新语言可以从零学起而不必大改结构。

    Deep Speech 2(DS2)是同一团队上一代端到端系统 DS1 的升级。作者把性能提升归结为三个方面:模型结构、大规模标注数据、计算规模。

    核心思想#

    1. 端到端模型#

    输入是功率归一化后的音频频谱,输出是每个时间步上的字符概率:英文是 26 个字母加空格、撇号和空白符;普通话直接输出简体汉字。网络结构是:若干卷积层 → 若干双向循环层 → 若干全连接层,用 CTC 损失训练,不需要逐帧对齐标签,也不需要用传统系统做预训练。

    2. 让深层 RNN 训得动#

    作者尝试了最多 11 层的结构,每个样本的计算量约为 DS1 的 8 倍。为了把它训好:

    • 循环网络上的 BatchNorm:只对来自下一层的输入 W·h^{l−1} 做归一化,不碰循环连接那一项,统计量在整个小批量、整段序列上计算(论文称为按序列归一化)。作者也试过在每个非线性前都归一化,没有效果。网络越深,这种归一化带来的提升越大。部署时使用训练中积累的均值和方差,可以一次只处理一条语音。
    • SortaGrad:CTC 损失随语音长度增长,长语音更难、早期梯度也更不稳定。第一个训练轮次按批内最长语音的长度从短到长排列,之后恢复随机顺序。作者发现它和 BatchNorm 部分可以互相替代,两者一起用仍有收益,还能减少 CPU 与 GPU 上超越函数实现差异带来的数值不稳定。
    • 更大的步长和双字符输出:第一层卷积按步长下采样,减少循环层的时间步。英文字符密度高,直接加大步长会损失精度,于是改为输出不重叠的双字符(如把 “the cat sat” 切成 th、e、空格、ca、t、空格、sa、t)。
    • 2D 卷积:在频率和时间两个维度上做卷积,3 层时在含噪开发集上词错率改善 23.9%。

    3. 能部署的单向模型#

    双向 RNN 要等整句说完才能输出,不适合在线低延迟场景。作者在所有循环层之上加了一层行卷积(row convolution):在时刻 t 只看未来 τ 步,对每个特征维度分别做加权求和:

    r_{t,i} = Σ_{j=1}^{τ+1} W_{i,j} · h_{t+j−1,i}

    这样下面的循环层都可以是单向的、能流式计算,只需要一小段未来上下文。作者报告,在普通话上这种单向模型的字错率甚至优于最好的双向模型。

    关键公式或机制#

    CTC 损失#

    L(x, y; θ) = − log Σ_{ℓ ∈ Align(x,y)} Π_t p_ctc(ℓ_t | x; θ)

    对所有可能的“字符到帧”的对齐求和。内层乘积随语音变长而变小,这正是 SortaGrad 的动机。

    数据与规模#

    • 英文训练数据 11,940 小时(约 800 万条语音),普通话 9,400 小时,训练时再做数据合成增强。随机选 40% 的语音加噪声,作者认为加得太多会让优化变难,太少则对低信噪比语音不够鲁棒。
    • 数据缩放:词错率随训练数据量呈幂律下降,数据每增加 10 倍,相对下降约 40%;普通与含噪开发集之间始终有约 60% 的相对差距。作者推测,增加数据中“语音情境”(说话人、背景噪声、环境、麦克风)的多样性和增加时长同样重要。
    • 模型规模:英文模型的效果一直提升到 1 亿参数;在这个规模下,普通 RNN 反而比 GRU 更好、训练更快。

    训练系统#

    单个模型需要数十 exaFLOP 的计算,单 GPU 要跑 3–6 周。作者用 8 或 16 块 GPU 做同步 SGD(他们认为比异步参数服务器更容易调试,同等数据并行度下收敛更快),配合 GPU 上的 CTC 实现、自定义内存分配器和自定义 all-reduce。16 块 GPU 时整体约 50 teraFLOP/s,即每块约 3 teraFLOP/s,约为理论峰值的 50%,训练时间缩短到 3–5 天。

    部分结果(摘自论文)#

    • 内部 3,300 条多样化测试集:DS1 词错率 24.01%,DS2 13.59%,相对改进 43.4%。
    • 朗读语音(WSJ、LibriSpeech):4 个测试集中 3 个优于众包人工转写,第 4 个(LibriSpeech test-other)接近(13.25% 对 12.69%)。
    • 口音语音和含噪语音(VoxForge、CHiME):比 DS1 大幅改善,但多数测试集仍落后于人工。例如 CHiME 真实噪声集 DS2 为 21.79%,人工为 11.84%。
    • 普通话短语音查询:100 条语音上,5 人小组一起标注的错误率 4.0%,系统 3.7%。

    部署:Batch Dispatch#

    逐条处理请求时,每次都要加载全部权重,计算受内存带宽限制,并行度也低。作者做了一个批处理调度器,把多个用户的音频流拼成批再前向计算,并采用“上一批算完就立刻处理下一批”的急切策略,以延迟优先而非批大小优先。普通话生产系统在服务器同时处理 10 路音频流时,第 98 百分位计算延迟为 67 毫秒。

    图解#

    flowchart LR
        A["音频频谱"] --> B["卷积层:频率×时间 2D 卷积,按步长下采样"]
        B --> C["多层循环层:BatchNorm,训练用双向,部署用单向"]
        C --> D["行卷积:只看少量未来帧(部署用)"]
        D --> E["全连接层"]
        E --> F["每个时间步的字符概率:英文双字符 / 简体汉字"]
        F --> G["CTC 损失(训练)或束搜索 + 语言模型(解码)"]

    图解:频谱先经过二维卷积和下采样,再经过多层循环层;部署时用单向循环层加行卷积,只看少量未来帧;全连接层输出每个时间步的字符概率,训练时用 CTC 损失,解码时结合语言模型。

    关键原话#

    “The WER decreases by ∼40% relative for each factor of 10 increase in training set size.”

    和 Anthropic 笔记的对应#

    Anthropic 笔记对得上的地方
    近期三个问题的事后复盘本文提到 CPU 和 GPU 上超越函数的实现差异会导致 CTC 计算数值不稳定。那篇复盘也涉及不同硬件平台、混合精度带来的细微差异如何影响输出质量。两者都说明:同一个模型在不同硬件上未必给出相同结果。
    构建高效的智能体:从简单可组合的模式出发本文用一个端到端模型取代手工组件流水线,代价是对数据和算力的要求高得多。那篇讨论的取舍方向相反:能用简单、可预测的工作流就别急着上自主智能体。两篇放在一起看,都是在“手工结构”和“交给模型”之间找平衡。

    读的时候要注意#

    • “超过人类”有前提:比较对象是亚马逊众包平台上的转写人员,每条语音由两人转写取较好者,不是专业速记员;而且只在部分朗读语音和普通话短查询上超过人工,口音和噪声场景仍明显落后。
    • 端到端并不完全“端到端”:解码时仍结合了外部 n-gram 语言模型。论文表 6 显示,模型从 5 层(1 个循环层)加深到 9 层(7 个循环层)时,语言模型带来的相对改进在英文上从 48% 降到 36%,普通话从 27% 降到 23%,作者推测更深的网络学到了更强的隐式语言模型。
    • 大量结果来自内部数据集:普通话的开发集、测试集和人工对比都在百度内部数据上进行,外部无法复现。
    • 会议版与 arXiv 版不同:ICML 2016 收录的是缩写版,作者名单不同(会议版作者更多),本笔记只依据 arXiv 版。
    • 数据幂律是经验观察:作者只在自己的数据和模型上测了几个数据量点,和 Day 25 规模定律那种系统研究不同。

    30u30 对应单元#

    • 30u30 的 Day 22 单元↗(仓库采用 CC BY-NC-ND 4.0,本笔记没有使用其内容)。
    • 路线位置:30u30 导读 的补完段,单元 4(Day 19 → 20 → 21 → 22)。

    延伸阅读#

    • Day 25:神经语言模型的规模定律:本文“数据每增 10 倍、错误率降约 40%”的幂律观察,后来在语言模型上被系统化研究。两篇论文的作者名单里都有 Dario Amodei。
    • Day 3:循环神经网络的正则化:本文 BatchNorm 只作用于层间连接、不作用于循环连接,思路与 Day 3 的 dropout 用法相近。
    • Day 24:GPipe:另一种用多设备训练大模型的方法(流水线并行),本文用的是同步数据并行。

    本笔记依据 2026-10-18 抓取的在线原文撰写,仅为导读与总结。原文:Dario Amodei 等(Baidu Research – Silicon Valley AI Lab),《Deep Speech 2: End-to-End Speech Recognition in English and Mandarin》, ICML 2016。

    本页目录