NNLM、RNNLM、LSTM-RNNLM、Bi-lstm、GPT-1…你都掌握了吗?一文总结语音识别必备经典模型(一)
机器之心专栏
本文将分 3 期进行连载,共介绍 17 个在语音识别任务上曾取得 SOTA 的经典模型。
第 1 期:NNLM、RNNLM、LSTM-RNNLM、Bi-lstm、Bi-RNN+Attention、GPT-1
第 2 期:Bert、Transformer-XL、EeSen、FSMN、CLDNN、highway LSTM
第 3 期:Attention-lvcsr、residual LSTM、CTC/Attention、Transfomer-Transducer、Conformer
您正在阅读的是其中的第 1 期。前往 SOTA!模型资源站(sota.jiqizhixin.com)即可获取本文中包含的模型实现代码、预训练模型及 API 等资源。
模型 | SOTA!模型资源站收录情况 | 模型来源论文 |
---|---|---|
NNLM | https://sota.jiqizhixin.com/project/nnlm | A Neural Probabilistic Language Model |
RNNLM | https://sota.jiqizhixin.com/project/rnnlm-2 | Recurrent neural network based language model |
LSTM-RNNLM | https://sota.jiqizhixin.com/project/lstm-rnnlm | Lstm neural networks for language modeling |
Bi-lstm | https://sota.jiqizhixin.com/project/bi-lstm-7 收录实现数量:3 支持框架:TensorFlow、PyTorch | Hybrid speech recognition with deep bidirectional lstm |
Bi-RNN+Attention | https://sota.jiqizhixin.com/project/bi-rnn-attention-2 | Attention is all you need |
GPT-1 | https://sota.jiqizhixin.com/project/gpt-1 收录实现数量:2 支持框架:TensorFlow、PyTorch | Improving language understanding by generative pre- training |
语音识别是指将语音信号转换为文字的过程。具体来说,输入一段语音信号,找到一个文字序列(由词或字组成),使得它与语音信号的匹配程度最高。这个匹配程度,一般是用概率表示的。语音识别系统一般由如下几个部分组成:信号处理、解码器、文本输出。信号处理模块根据人耳的听觉感知特点,抽取语音中最重要的特征,将语音信号转换为特征矢量序列。现行语音识别系统中常用的声学特征有线性预测编码(Linear Predictive Coding,LPC)、梅尔频率倒谱系数(Mel-frequency Cepstrum Coefficients,MFCC)、梅尔标度滤波器组(Mel-scale Filter Bank,FBank)等。解码器(Decoder)根据声学模型(Acoustic Model,AM)和语言模型(Language Model,LM),将输入的特征矢量序列转化为字符序列。解码器对给定的特征向量序列和若干假设词序列计算声学模型得分和语言模型得分,将总体输出分数最高的词序列作为识别结果。其中,声学模型是对声学、语音学、环境的变量,以及说话人性别、口音的差异等的知识表示,主要实现预测通过词 W 的发音生成特征 X 的概率。声学模型的训练数据是标注的声音特征(标注是对应的文本内容);语言模型则是对一组字序列构成的知识表示,主要实现预测某词或词序列的概率。语言模型的训练数据是一些合乎语法的句子(纯文本)。
从语言模型角度分析,近些年随着深度学习的发展,神经网络语言模型 (neural network language model,NLM) 由于能将词向量映射到低维连续空间,因此逐渐成为主流方法,具备较好的泛化性能。最早的神经语言模型是基于前馈神经网络 (feedforward neural network, FNN) 的,初步实现了对长文本序列在低维连续空间的建模,但这种方法能够处理的文本长度受限于网络的输入长度,而后循环神经网络 (recurrent neural network, RNN) 为代表的语言模型利用循环结构可以在理论上对无限长的文本建模,性能得到极大提升。基于长短期记忆循环神经网络 (long short-term memory recurrent neural network, LSTM-RNN) 的语言模型则解决了 RNN 在长历史序列建模时梯度消失的问题,在各种任务上都取得不错的效果。近年来,基于 Transformer 的语言模型在自注意力机制作用下对长文本具有更强的建模能力,在一系列自然语言和语音的任务上均取得了最优性能。从语言模型的发展中可以看出,研究核心在于如何提高模型对于长历史序列信息的建模能力,这也是神经语言模型在语音识别应用中需要考虑的核心问题。
从声学模型角度分析,传统的语音识别系统的声学模型普遍采用的是基于GMM-HMM的声学模型,其中,GMM用于对语音声学特征的分布进行建模,HMM则用于对语音信号的时序性进行建模。2006年深度学习兴起以后,深度神经网络(Deep Neural Networks,DNN)被应用于语音声学模型。2009年,Hinton及其学生将前馈全连接深度神经网络应用于语音识别声学建模,在TIMIT数据库上基于DNN-HMM的声学模型相比于传统的GMM-HMM声学模型可以获得显著的性能提升。DNN相比于GMM的优势在于:1)DNN对语音声学特征的后验概率进行建模不需要对特征的分布进行去分布假设;2)GMM要求对输入的特征进行去相关处理,而DNN可以采用各种形式的输入特征;3)GMM只能采用单帧语音作为输入,而DNN则可以通过拼接相邻帧的方式利用上下文的有效信息。2011年,Deng Li等提出基于CD-DNN-HMM的声学模型,在大词汇量连续语音识别任务上取得成功,相比于传统的GMM-HMM系统可以获得超过20%的相对性能提升。基于DNN-HMM的语音声学模型开始取代GMM-HMM成为主流的声学模型。此后大量的研究人员投入到基于深度神经网络的语音声学建模研究中,语音识别取得了突破性的进展。
本文分别总结了神经语音识别中神经语言模型和神经声学模型的经典TOP模型。
一、神经语言模型
1、 NNLM
本文第一次提出使用神经网络来解决语言模型的问题,虽然在当时并没有得到太多的重视,却为后来深度学习在解决语言模型问题甚至很多别的nlp问题时奠定了坚实的基础。本文最大的贡献在于用多层感知器(MLP)构造了语言模型,如下图1:
图1. 神经结构:f(i,w_t-1,...,w_t-n+1) = g(i,C(w_t-1),...,C(w_t-n+1)),其中,g是神经网络,C(i)是第i个单词特征向量
NNLM模型一共三层,第一层是映射层,将n个单词映射为对应word嵌入的拼接,这一层就是MLP的输入层。第二层是隐藏层,激活函数用tanh。第三层是输出层,因为是语言模型,需要根据前n个单词预测下一个单词,所以是一个多分类器,用softmax进行分类。整个模型最大的计算量集中在最后一层上,因为一般来说词汇表都很大,计算每个单词的条件概率的操作是整个模型的计算瓶颈。
具体介绍,神经网络使用softmax输出层计算以下函数,该函数可确保总和为1的正概率:
其中,y_i是每个输出单词i的未归一化对数概率:
在element-wise应用双曲正切tanh的情况下,W任选为零(无直接连接),并且x是单词特征层激活向量,是来自矩阵C的输入单词特征的级联:
设h为隐藏单元的数量,m为与每个词相关的特征数量。当不需要从单词特征到输出的直接连接时,将矩阵W设置为0。模型的自由参数是输出偏置b(有|V|元素),隐藏层偏置d(有h元素),隐藏到输出的权重U(一个|V|×h矩阵),单词特征到输出的权重W(一个|V|×(n-1)m矩阵),隐藏层权重H(一个h×(n-1)m矩阵)以及单词特征C(一个|V|×m矩阵)。
自由参数的数量是|V|(1+nm+h)+h(1+(n-1)m),主导参数数量的关键因素是|V|(nm + h)。理论上,如果权重W和H存在权重衰减,而C不存在,那么W和H可以向零收敛,而C会爆炸。神经网络上的随机梯度上升包括在呈现训练语料库的第t个单词之后执行以下迭代更新:
注意,在每个样本之后不需要更新或访问绝大多数参数:单词特征C(J)的所有单词j中没有出现在输入窗口中。
NNLM的效果在现在看来并不算什么,但对于后面的相关研究具有非常重要的意义。文中的Future Work提到了用RNN来代替MLP作为模型可能会取得更好的效果,这一想法在后面Tomas Mikolov的博士论文中得到了验证,也就是后来的RNNLM。
本文是Sutskever I.等人于2014年发表在NeurIPS的一篇论文,是自然语言处理中最基础的Seq2Seq模型,目前引用量已经超过12000次。最常见的Seq2Seq模型是解码器-编码器(Encoder-Decoder)模型,由于时序数据的序列性质,通常情况下,我们使用RNN(Recurrent Neural Network)在Encoder中得到输入序列的特征向量,再将此特征向量输入Decoder中的另一个RNN模型,逐一生成目标序列的每一个点。本文使用多层长短期记忆网络(LSTM)将输入序列映射到一个固定维度的向量,然后使用另一个深度LSTM从向量中解码目标序列。通过EncoderRNN和DecoderRNN,我们可以得到预测的序列,将预测的序列与基准真值的序列对比计算误差,更新参数来不断的训练模型。
图1. 模型读取一个输入句子 "ABC "并生成 "WXYZ "作为输出句子。该模型在输出句末标记后停止预测。请注意,LSTM是反向读取输入句子的,因为这样做在数据中引入了许多短期的依赖关系,使优化问题更加容易
RNN是前馈神经网络对序列的自然概括。给定一个输入序列(x_1, ... , x_t),一个标准的RNN通过迭代以下公式计算出一个输出序列(y_1, ... , y_T):
只要提前知道输入和输出之间的排列,RNN就可以很容易地将序列映射到序列。在本文发表的阶段,还不清楚如何将RNN应用于输入和输出序列具有不同长度的复杂和非单调关系的问题。一般序列学习的最简单策略是用一个RNN将输入序列映射到一个固定大小的向量,然后用另一个RNN将该向量映射到目标序列。虽然这在原则上是可行的,因为RNN被提供了所有的相关信息,但由于由此产生的长期依赖性,将很难训练RNN。然而,众所周知,长短期记忆(LSTM)可以学习具有长距离时间依赖性的问题,所以LSTM在这种情况下可能会成功。
LSTM的目标是估计条件概率p(y1, . . , yT′ |x1, . . , xT),其中(x1, . . , xT)是一个输入序列,y1, . . . , yT′是对应的输出序列,其长度T′可能与T不同。LSTM计算这个条件概率的方法是:首先获得由LSTM的最后一个隐藏状态给出的输入序列(x1, ..., xT)的固定维度表示,然后用标准的LSTM计算y1, ..., yT′的概率,该公式的初始隐藏状态被设置为x1, ..., xT的表示v:
在这个方程中,每个p(yt|v, y_1, ..., y_t-1)分布都是用词汇表中的所有单词的softmax来表示。此外,要求每个句子以一个特殊的句末符号"<EOS>"结束,这使得模型能够在所有可能的长度的序列上定义一个分布。
项目 | SOTA!平台项目详情页 |
---|---|
NNLM | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/nnlm |
2、 RNNLM
RNNLM模型的设计思想比较简单,主要是对NNLM中的前馈神经网络进行改进,其主要的结构图如下图2所示:
图2. RNNLM结构
NNLM的一个主要缺陷是,前馈网络必须使用固定长度的上下文,而这个长度需要在训练前临时指定。通常情况下,这意味着神经网络在预测下一个词时只能看到五到十个前面的词。众所周知,人类可以利用更长的上下文,而且非常成功。另外,缓存模型为神经网络模型提供了补充信息,因此很自然地想到是否可以设计一个模型,它可以为任意长度的上下文隐含地编码时间信息。
项目 | SOTA!平台项目详情页 |
---|---|
RNNLM | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/rnnlm-2 |
3、 LSTM-RNNLM
前馈网络仅利用固定的上下文长度来预测下一个序列词,且训练难度大。LSTM-RNNLM引入长期短期记忆神经网络架构解决了这些问题:修改了网络结构,以避免梯度消失问题,而令训练算法保持不变。具体的,重新设计了神经网络的单元,使其相应的缩放系数固定为1。从这个设计目标中得到的新单元类型在学习能力上相当有限。进一步,引入门控单元以提升其学习能力。最终得到的神经单元如图3所示。
图3. 带有门控单元的LSTM记忆单元
一个标准的神经网络单元i只由输入激活a_i和输出激活b_i组成,当使用tanh激活函数时,它们之间的关系为:
门控单元将先前隐藏层、前一时间步长的当前层以及LSTM单元的内部激活,再利用logistic函数压缩处理激活后得到的值,然后分别将其设置为b_1、b_φ、b_ω。
图4. 神经网络LM架构
最终的神经网络语言模型架构如图4所示,将LSTM单元插入第二个递归层,并将其与标准神经网络单元的不同投影层相结合。对于大词汇量的语言建模,训练在很大程度上是由softmax输出层的输入激活a_i的计算主导的,与输入层相比,输出层不是稀疏的:
为了减少计算的工作量,将单词分成一组不相干的单词类别。然后,将概率p(w_m|(w_1)^(m-1))分解如下:
项目 | SOTA!平台项目详情页 |
---|---|
LSTM-RNNLM | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/lstm-rnnlm |
4、 Bi-LSTM
给定一个输入序列x = (x_1, ... , x_T),一个标准的RNN通过从t = 1到T迭代以下方程来计算隐藏向量序列h = (h_1, ... , h_T)和输出向量序列y =(y_1, ... , y_T):
通常,H是一个sigmoid函数的element-wise应用。LSTM架构使用专门的记忆单元来存储信息,在寻找和利用长距离背景方面更有优势。图5展示了一个单一的LSTM存储单元。H由以下复合函数实现:
图5. LSTM存储单元
传统的RNNs的一个缺点是,它们只能利用以前的上下文。在语音识别中,整个语料被一次性转录,因此,需要考虑利用未来的上下文信息。双向RNN(BRNN)通过用两个独立的隐藏层来处理两个方向的数据来做到这一点,然后再将这些数据反馈给同一个输出层。如图6所示,BRNN通过迭代后向层从t=T到1,前向层从t=1到T,然后更新输出层来计算前向隐藏序列→h,后向隐藏序列←h和输出序列y:
将BRNN与LSTM结合起来就得到了双向LSTM,它可以在两个输入方向上获取长距离的上下文,如图6所示。
图6. 双向RNN
可以通过将多个RNN隐藏层相互堆叠来创建深度RNN,一个层的输出序列形成下一个层的输入序列,如图7所示。假设堆栈中的所有N层都使用相同的隐层函数,那么隐层向量序列h^n从n=1到N、t=1到T,都是反复计算的:
网络输出y_t为:
深度双向RNN可以通过用前向和后向序列→h^n和←h^n替换每个隐藏序列h^n来实现,并确保每个隐藏层都能收到来自下面一层的前向和后向层的输入。如果隐藏层使用LSTM,我们就可以得到深度双向LSTM( Deep Bidirectional Long Short-Term Memory Network,DBLSTM),如图8所示。
图7. 深度RNN
图8. 深度双向长短期记忆网络(DBLSTM)
当前 SOTA!平台收录 Bi-lstm 共 3 个模型实现资源,支持的主流框架包含 PyTorch、TensorFlow 。
项目 | SOTA!平台项目详情页 |
---|---|
Bi-lstm | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/bi-lstm-7 |
5、 BiRNN+Attention
BiRNN+Attention使用了典型的编码器-解码器结构,编码器部分使用BiRNN,解码器部分使用Attention机制。对于普通的RNN模型,输入(x_1,x_2,...,x_T) 在经过 T 个时刻之后,可以得到 T 个正向隐藏层状态(h→,...,h→T) ;之后将输入序列单词的顺序颠倒之后得到(x_T,...,x_2,x_1) ,然后再次经过RNN,就可以得到反向的隐藏层状态(h←1,...,h←T) 。最后,我们要得到单词x_j 的向量表示,只需要将正向的隐藏状态h→j 跟反向的隐藏状态h←j 进行连接即可,例如:hj=[h→j;h←j] 。
解码器
在解码器中,作者引入注意力机制。解码器通过如下方式输出目标序列:
对于RNN模型,每一个条件概率通过下式进行建模:
该模型使用的条件概率如下:
需要注意的是,对于每一个目标单词y_i,用来计算其条件概率的上下文向量c_i都是不一样的。这跟传统的编码器-解码器模型是不一样的。c_i 指的就是中间语义变量,作者在论文中称为上下文变量。首先,c_i 依赖于编码器所有的隐藏状态(h_1,...,h_T) ,其次,在双向循环神经网络中,h_i 是包含整个输入序列的信息的,但是其包含的信息更集中在输入序列第 i 个单词位置附近。最后,在翻译输出单词的时候,不同的隐藏状态h_i 对输出序列的贡献是不一样的。
图9. 模型图示,在源句(x_1, x_2, ..., x_T)的基础上生成第t个目标词y_t
编码器( BIDIRECTIONAL RNN FOR ANNOTATING SEQUENCES
一个BiRNN由前向和后向RNN组成。前向RNN→f按顺序读取输入序列(从x_1到x_Tx),并计算出前向隐藏状态的序列(→h_1,..., →h_Tx)。后向RNN←f以相反的顺序读取序列(从x_Tx到x_1),生成一个后向隐藏状态的序列(←h_1, ...,←h_Tx)。我们通过连接前向隐藏状态→h_j和后向隐藏状态←h_j 得到每个词x_j的注释。这样一来,注释h_j就包含了前面的词和后面的词的摘要。由于RNNs倾向于更好地代表最近的输入,注释h_j将集中在x_j周围的词。这一连串的注释被解码器和对齐模型用来计算上下文向量。完整的模型图示见图9。
项目 | SOTA!平台项目详情页 |
---|---|
Bi-RNN+Attention | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/bi-rnn-attention-2 |
6、 GPT-1
BiRNN+Attention使用了典型的编码器-解码器结构,编码器部分使用BiRNN,解码器部分使用Attention机制。对于普通的RNN模型,输入(x_1,x_2,...,x_T) 在经过 T 个时刻之后,可以得到 T 个正向隐藏层状态(h→,...,h→T) ;之后将输入序列单词的顺序颠倒之后得到(x_T,...,x_2,x_1) ,然后再次经过RNN,就可以得到反向的隐藏层状态(h←1,...,h←T) 。最后,我们要得到单词x_j 的向量表示,只需要将正向的隐藏状态h→j 跟反向的隐藏状态h←j 进行连接即可,例如:hj=[h→j;h←j] 。
解码器
在解码器中,作者引入注意力机制。解码器通过如下方式输出目标序列:
对于RNN模型,每一个条件概率通过下式进行建模:
该模型使用的条件概率如下:
需要注意的是,对于每一个目标单词y_i,用来计算其条件概率的上下文向量c_i都是不一样的。这跟传统的编码器-解码器模型是不一样的。c_i 指的就是中间语义变量,作者在论文中称为上下文变量。首先,c_i 依赖于编码器所有的隐藏状态(h_1,...,h_T) ,其次,在双向循环神经网络中,h_i 是包含整个输入序列的信息的,但是其包含的信息更集中在输入序列第 i 个单词位置附近。最后,在翻译输出单词的时候,不同的隐藏状态h_i 对输出序列的贡献是不一样的。
图9. 模型图示,在源句(x_1, x_2, ..., x_T)的基础上生成第t个目标词y_t
编码器( BIDIRECTIONAL RNN FOR ANNOTATING SEQUENCES
一个BiRNN由前向和后向RNN组成。前向RNN→f按顺序读取输入序列(从x_1到x_Tx),并计算出前向隐藏状态的序列(→h_1,..., →h_Tx)。后向RNN←f以相反的顺序读取序列(从x_Tx到x_1),生成一个后向隐藏状态的序列(←h_1, ...,←h_Tx)。我们通过连接前向隐藏状态→h_j和后向隐藏状态←h_j 得到每个词x_j的注释。这样一来,注释h_j就包含了前面的词和后面的词的摘要。由于RNNs倾向于更好地代表最近的输入,注释h_j将集中在x_j周围的词。这一连串的注释被解码器和对齐模型用来计算上下文向量。完整的模型图示见图9。
当前 SOTA!平台收录 GPT-1 共 2 个模型实现资源,支持的主流框架包含 TensorFlow、PyTorch。
项目 | SOTA!平台项目详情页 |
---|---|
GPT-1 | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/gpt-1 |
前往 SOTA!模型资源站(sota.jiqizhixin.com)即可获取本文中包含的模型实现代码、预训练模型及API等资源。
网页端访问:在浏览器地址栏输入新版站点地址 sota.jiqizhixin.com ,即可前往「SOTA!模型」平台,查看关注的模型是否有新资源收录。
移动端访问:在微信移动端中搜索服务号名称「机器之心SOTA模型」或 ID 「sotaai」,关注 SOTA!模型服务号,即可通过服务号底部菜单栏使用平台功能,更有最新AI技术、开发资源及社区动态定期推送。
微信扫码关注该文公众号作者