二、神经声学模型
1、EeSen
Eesen框架简化了构建最优ASR系统的流程。声学建模包括使用RNN学习预测上下文无关目标(音素或字符),为了消除对预先生成的帧标签的需求,本文采用了CTC目标函数来推断语音和标签序列之间的对齐方式。Eesen的一个显著特征是基于带权有限状态转录器(Weight finite state transducer,WFST)解码方式,该方法可将词典和语言模型有效地合并到CTC中。具体的,Eesen使用RNN作为声学模型,使用LSTM作为模型组成块,使用CTC作为目标函数,Eesen将声音建模简化为通过语音和上下文无关( context-independent ,CI)的标签序列对学习单个RNN。用这种方法,将各个组成部分(CTC标签、词典和语言模型)编码为WFST,然后组成一个全面的搜索图。WFST表示提供了一种简易方式来处理CTC空白标签,并在解码期间启用波束搜索。
Eesen中的声学模型是深度双向RNNs,用CTC目标函数训练。给定一个输入序列X = (x_1, ..., x_T),使用一个递归层计算隐藏状态的前向序列→H = (→h 1, ..., →h T),从t=1到T进行迭代:
除了输入x_t之外,也将前一个时间步长的隐性激活h_t-1输入,以影响当前时间步长的隐性输出。在双向RNNs中,一个额外的递归层计算从t=T到1的隐藏输出←H的后向序列:
RNNs的学习可以使用通过时间的反向传播(back-propagation through time,BPTT)来完成。在实践中,由于梯度消失的问题,训练RNN来学习长期的时间依赖性可能是很困难的。为了克服这个问题,引入LSTM单元作为RNNs的构建模块。LSTM包含具有自连接的记忆单元,以存储网络的时间状态。此外,还增加了乘法门控单元来控制信息流。
图3 LSTM的一个存储块
图3中蓝色曲线代表窥视孔连接,将存储单元与门控单元连接起来,以了解输出的精确时间。时间步长t的计算可以正式写成如下。省略了"→"这个箭头,以使表述不那么复杂:
这项工作中提出了一种基于WFSTs的通用解码方法。一个WFST是一个有限状态接受器( finite-state acceptor,FSA),其中每个过渡都有一个输入符号,一个输出符号和一个权重。一个通过WFST的路径需要一串输入符号,并生成一串输出符号。解码方法将CTC标签、词典和语言模型作为独立的WFST。使用高度优化的FST库,如OpenFST,可以将WFSTs有效地融合到一个单一的搜索图中。各个WFST的构建描述如下。虽然是以英语为例,但同样的程序也适用于其他语言。
语法。语法WFST对语言/领域中可允许的单词序列进行编码。图4所示的WFST代表一个玩具语言模型,它可以生成两个句子 "你怎么样 "和 "它怎么样"。WFST的符号是单词,弧形权重是语言模型的概率。有了这个WFST表示,CTC解码原则上可以利用任何可以转换为WFST的语言模型。语言模型WFST表示为G。
图4 语法(语言模型)WFST的示例
弧的权重是给定前一个词时发出下一个词的概率。节点0是起始节点,双圈的节点是结束节点
词库。词库WFST编码了从词库单元序列到单词的映射。根据RNN所建模的标签,有两种情况需要考虑。如果标签是音素,词库就是一个标准的词典,就像我们在混合方法中通常使用的那样。如果标签是字符,则词库只包含单词的拼写。这两种情况的一个关键区别是,拼写词库可以很容易地扩展以包括任何词库外(Out of Vocabulary,OOV)的词汇。相比之下,音素词库的扩展就不那么简单了。它依赖于一些字形到音素的规则/模型,并有可能出现错误。将词库WFST表示为L。两种方法如图5所示。
图5 语音词条的WFST "IH Z"。符号"<eps>"表示不消耗任何输入或不发出任何输出
对于拼写词典,还有一个复杂的问题需要处理。对于作为CTC标签的字符,我们通常会在每一对单词之间插入一个额外的空格字符,以模拟原始文本中的单词定界。在解码过程中,允许空格字符选择性地出现在一个词的开头和结尾。图6所示的WFST可以很容易地处理这个复杂的问题。
图6 WFST为 "is "字的拼写。允许该词有选择地以空格字符"<space>"开始和结束
Token。第三个WFST组件将框架级别的CTC标签序列映射到一个词库单元(音素或字符)。对于一个词库单元,将其Token WFST设计为包含其在框架级别的所有可能的标签序列。因此,这个WFST允许出现空白标签∅,以及任何非空白标签的重复。Token WFST将所有这3个序列映射到一个单子词库单元 "A"。
搜索图。在汇编了三个单独的WFSTs之后,将它们汇编成一个综合搜索图。首先生成词典和语法的WFST组合。然后,在组合中执行两个特殊的WFST操作,即确定化和最小化,以压缩搜索空间,从而加快解码速度。生成的WFST LG语言图再与Token WFST组成,最后生成搜索图。总的操作如下式所示:
在对混合DNN模型进行解码时,需要使用状态先验来扩展DNN的状态后验。这些先验值通常是从训练数据的强制排列中估计出来的。在对CTC训练的模型进行解码时,采用类似的程序。具体来说,我们在训练集上运行最终的RNN模型,进行传播处理。挑选出具有最大后验值的标签作为框架级的排列,从中估计出标签的先验值。在此基础上,作者建议从训练数据中的标签序列来估计更稳健的标签预设。
当前 SOTA!平台收录 EeSen 共 2 个模型实现资源。
项目 | SOTA!平台项目详情页 |
EeSen |
前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/eesen |
2、 FSMN
LSTM是一种特殊的RNN,主要是为了解决长序列训练过程中的梯度消失和梯度爆炸问题。通过门控状态来控制传输状态,记住需要长时间记忆的,忘记不重要的信息;而不像普通的RNN那样仅有一种记忆叠加方式。但也因为引入了很多内容,导致参数变多,也使得训练难度加大了很多。因此很多时候我们往往会使用效果和LSTM相当但参数更少的GRU来构建大训练量的模型。RNN与LSTM计算复杂度较高,很难应用于较大任务,如何在不使用循环前馈的基础上更有效的对数据序列构建长依赖?受信号处理理论启发,使用高阶有限冲激响应(FIR)滤波器可以很好地逼近任何无限冲激响应(IIR)滤波器,本文提出了前馈顺序记忆网络(feedforward sequential memory networks,FSMN),在不使用循环反馈的情况下对时间序列中的长期依赖性进行建模。FSMN是一个标准的全连接前馈神经网络,在其隐藏层中配备了一些可学习的记忆模块。记忆模块使用了一个 tapped-delay line结构,将长的上下文信息编码成一个固定大小的表示,作为短期记忆机制。
(a)FSMN
(b)无向FSMN的记忆模块
图7. 前馈顺序记忆网络(FSMN)及其抽头延迟记忆块的图示。(每个z-1块代表一个延迟或存储单元)
观察图17(a)可以发现,在隐藏层的旁边,FSMN挂了一个记忆模块Memory Block,记忆模块的作用与LSTM门结构类似,可以用来记住t时刻输入信息的相邻时刻序列的信息。FSMN使用一组可学习的系数将回溯期(lookback window)内的past context编码为一个固定大小的表示。结果表示被计算为所有先前N个时间实例的隐藏激活的加权和,在图17(b)中显示为一个tapped-delay的结构。
根据记忆模块编码方式的区别,FSMN又可以分为sFSMN和vFSMN,前者代表以标量系数编码,后者代表以向量系数编码。对于sFSMN和vFSMN,使用与上下文无关的系数,将长的周围环境编码为固定大小的表示法。前述简单的回看式FSMN,也就是说当下的记忆模块只关注了它之前的信息,如果还要关注未来的信息,实现上下文联通,也就是所谓的双向的FSMN。在这项工作中,也尝试使用依赖于上下文的系数,称之为基于注意力的FSMN。使用以下的注意力函数来计算与上下文有关的系数:
其中,N1和N2分别代表回看和前看的阶数。因此,(a_t)^l是一组与上下文有关的系数,相对于(h_t)^l,用于编码时间实例t的长周期上下文,如下所示
与sFSMN和vFSMN相同,将(h~_t)^l送入下一个隐藏层。
项目 | SOTA!平台项目详情页 |
FSMN | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/fsmn |
3、 CLDNN
卷积神经网络(CNN)和长短期记忆(LSTM)都已在各种语音识别任务中显示出对深度神经网络(DNN)的改进。CNN、LSTM和DNN在建模能力上是互补的,CNN擅长减少频率变化,LSTM擅长时间建模,而DNN适合将要素映射到更加可分离的空间。本文通过将CNN、LSTM和DNN组合成一个统一的架构来利用它们的互补性,提出了CLDNN(CONVOLUTIONAL, LONG SHORT-TERM MEMORY, FULLY CONNECTED DEEP NEURAL NETWORKS)。具体使用到的经典网络结构包括:
- LSTM(Long-Short-Term-Memory) ,处理与时间相关的数据;
- CNN(Convolutional Neural Network) ,将多个时间点的数据抽象提取特征,减少无效数据;
- DNN(Deep-Neural-Network) 将输入数据中的特征映射至更离散的空间,即将输入的数据变成神经网络中的各种参数。
图8 CLDNN模型架构
如图8所示模型架构。CLDNN网络的输入数据包括:数据的基本单位为帧(x_t ),每帧都是一个含40维度的梅尔频谱,输入的数据是由多帧组合成的向量[x_t−l,..., x_t+r] ,其中,最左侧一帧即第一帧计为l,最后一帧计为r。
CLDNN的卷积结构具体为:
(1)CNN共使用两层卷积层,第一层的卷积核为(9,9),第二层的卷积核为(4,3),两层卷积层中包含1个池化核为3的池化层。由于卷积结构的结果数据量过大,CLDNN使用线性层将数据降维处理,将数据降维至每帧256个数据。
(2)LSTM每层包含832个单元,另有一个包含500个单元的Projection Layer作降维处理。time_step设为20,使用BPTT(backpropagation through time)方法训练。
(3)全连接层:在进行频率和时间建模后,将LSTM的输出传给几个全连接的DNN层。共两层全连接层,每层1024个神经元。
项目 | SOTA!平台项目详情页 |
CLDNN | 前往 SOTA!模型平台获取实现资源:https://sota.jiqizhixin.com/project/cldnn |