论文题目:Deep Speech: Scaling up end-to-endspeech recognition
作者信息:Awni Hannun∗, Carl Case, Jared Casper, Bryan Catanzaro, Greg Diamos, Erich Elsen,Ryan Prenger, Sanjeev Satheesh, Shubho Sengupta, Adam Coates, Andrew Y. Ng
所属机构:Baidu Research – Silicon Valley AI Lab
论文链接:https://arxiv.org/pdf/1412.5567.pdf
1. 摘要
2. 模型结构
3. 优化工作
4. 实验结果
这篇论文是2014年吴恩达在Baidu AI Lab 期间所发布的,从论文的摘要就可以知道,作者抛弃了传统的语音识别模型框架,转向了基于深度学习的端到端的语音识别模型框架:抛弃原先的特征工程,如:MFCC;抛弃音素词典,抛弃音素这一概念;采用 RNN 网络(2010后,深度学习在语音识别领域开始受到广泛的关注,这篇文章在当时是比较前沿的论文)。
除了作者所提出的模型结构,论文的工程实现和优化工作做的非常的好,这也使得这个模型能在如此大的训练数据集上跑起来。
总体来看,模型结构由两部分组成:
AM(Acoustic Model,声学模型) : Bi-directional RNN (其中,loss function 为 CTC,optimizer 为 NAG,即Nesterov Accelerated Gradient)
LM (Language Model,语言模型) : N-gram(作者利用 KenLM 训练该模型)
我们重点来看一下声学模型部分:
model input : speech spectrograms,即语音的频谱图
model output : English text transcripts ,即英文文本
loss function : CTC loss
optimizer : Nesterov Accelerated Gradient method
该模型一共有五层 hidden layer,除了第四层外,其余层都不是 recurrent layer,第四层为 bi-direnctional layer。
前三层的计算公式为:
h t ( l ) = g ( W ( l ) h t ( l − 1 ) + b ( l ) ) h^{(l)}_{t} = g(W^{(l)}h^{(l-1)}_{t}+b^{(l)}) ht(l)=g(W(l)ht(l−1)+b(l))
其中, l ∈ [ 1 , 3 ] l \in [1,3] l∈[1,3], g ( z ) = m i n { m a x { 0 , z } , 20 } g(z)=min\{max\{0,z\},20\} g(z)=min{max{0,z},20}, W ( l ) W^{(l)} W(l)和 b ( l ) b^{(l)} b(l)是第 l l l层的权重矩阵和偏置参数。
第四层的计算公式为:
h t ( f ) = g ( W ( 4 ) h t ( 3 ) + W r ( f ) h t − 1 ( f ) + b ( 4 ) ) , h t ( b ) = g ( W ( 4 ) h t ( 3 ) + W r ( b ) h t + 1 ( b ) + b ( 4 ) ) h^{(f)}_{t} = g(W^{(4)}h^{(3)}_{t}+W^{(f)}_{r}h^{(f)}_{t-1}+b^{(4)}), h^{(b)}_{t} = g(W^{(4)}h^{(3)}_{t}+W^{(b)}_{r}h^{(b)}_{t+1}+b^{(4)}) ht(f)=g(W(4)ht(3)+Wr(f)ht−1(f)+b(4)),ht(b)=g(W(4)ht(3)+Wr(b)ht+1(b)+b(4))
其中, h ( f ) h^{(f)} h(f)从前往后计算, h ( b ) h^{(b)} h(b)从后往前计算。
第五层的计算公式为:
h t ( 5 ) = g ( W ( 4 ) h t ( 4 ) + b ( 5 ) ) h^{(5)}_{t} = g(W^{(4)}h^{(4)}_{t}+b^{(5)}) ht(5)=g(W(4)ht(4)+b(5))
其中, h t ( 4 ) = h t ( f ) + h t ( b ) h^{(4)}_t=h^{(f)}_t+h^{(b)}_t ht(4)=ht(f)+ht(b)。
最后,output layer 是一个标准的 softmax function:
h t , k ( 6 ) = e x p ( W k ( 6 ) h t ( 5 ) + b k ( 6 ) ) ∑ j e x p ( W j ( 6 ) h t ( 5 ) + b j ( 6 ) ) h^{(6)}_{t,k}=\frac{exp(W^{(6)}_{k}h^{(5)}_t+b^{(6)}_{k})}{\sum_{j}^{} {exp(W^{(6)}_{j}h^{(5)}_t+b^{(6)}_{j})}} ht,k(6)=∑jexp(Wj(6)ht(5)+bj(6))exp(Wk(6)ht(5)+bk(6))
其中, h t , k ( 6 ) h^{(6)}_{t,k} ht,k(6) 表示模型预测第t帧语音所对应的字母为字典中第k个字母的概率。
(注意: 文中第四层所用 RNN cell 为 GRU,作者出于计算资源和存储空间的考虑,未采用LSTM)
1. 数据并行化
这一部分其实就是利用 GPU 进行并行计算,作者将相同长度的训练数据放入一个minibatch中,必要时作者向训练数据中 padding with slience 以使得 batch 中的数据的长度相同。
2. 模型并行化
从上文可知,模型中的第四层 hideen layer 为 bi-directional recurrent layer,由于其序列化的特点(计算 t 时刻的状态,得先计算 t-1 时刻得状态),我们其实很难做到模型并行化的。
为此,作者的解决办法如下:
假设所处理的训练数据长度为 T T T,采用两个 G P U GPU GPU,分别为 G P U 1 GPU_1 GPU1 和 G P U 2 GPU_2 GPU2。
在前半部分处理过程中, G P U 1 GPU_1 GPU1 计算 h t ( f ) h^{(f)}_{t} ht(f)(其中, t ∈ [ 1 , T / 2 ] t \in [1, T/2] t∈[1,T/2]), G P U 2 GPU_2 GPU2 计算 h t ( b ) h^{(b)}_{t} ht(b)(其中, t ∈ [ T / 2 + 1 , T ] t \in [T/2+1, T] t∈[T/2+1,T])。
在处理完前半部分后, G P U 1 GPU_1 GPU1 和 G P U 2 GPU_2 GPU2 交换 h T / 2 ( f ) h^{(f)}_{T/2} hT/2(f) 和 h T / 2 ( b ) h^{(b)}_{T/2} hT/2(b)。
接着, G P U 1 GPU_1 GPU1 计算 h t ( b ) h^{(b)}_{t} ht(b)(其中, t ∈ [ 1 , T / 2 ] t \in [1, T/2] t∈[1,T/2]), G P U 2 GPU_2 GPU2 计算 h t ( f ) h^{(f)}_{t} ht(f)(其中, t ∈ [ T / 2 + 1 , T ] t \in [T/2+1, T] t∈[T/2+1,T]).
3. 其他
(1) 作者在模型参数正则化部分,对 feed-forward layer 采用了 5%-10% 的 dropout;同时,也对输入随机的进行jittering。
(2) 作者为使模型更好的克服语音识别中经常出现的背景噪音问题,通过叠加背景噪音,合成大量含有噪音的训练数据(原训练数据为 5000 hours of read speech from 9600 speakers) 。其中,合成公式为: x ^ ( i ) = x ( i ) + ξ 1 ( i ) + ξ 2 ( i ) + . . . . \hat{x}^{(i)}=x^{(i)}+\xi^{(i)}_{1}+\xi^{(i)}_{2}+.... x^(i)=x(i)+ξ1(i)+ξ2(i)+....。
(3) 作者为使模型更好的克服语音识别中经常出现的隆巴德效应(Lombard Effect),让 speakers 戴着播放噪音的听筒进行说话。
参考资料:
如果你看到了这篇文章的最后,并且觉得有帮助的话,麻烦你花几秒钟时间点个赞,或者受累在评论中指出我的错误。谢谢!
作者信息:
知乎:没头脑
LeetCode:Tao Pu
CSDN:Code_Mart
Github:Bojack-want-drink