system: [SYSTEM]

user: 4. 基于循环神经网络的字音转换模型 本文设计的字音转换标注模型总体架构如图2所示。 图2. 基于字符嵌入 + RNN + CTC的西班牙语字音标注模型 从图中可以看出，该框架主要包括三部分内容，一是基于字符嵌入的序列输入层，二是基于循环神经网络的特征提取层，三是基于连接时序分类构建的标签输出层。其中，输入层是以向量形式构成的输入序列，代表顺序输入的字符。本文用实数向量的方式来对西班牙语字符进行编码，将字符自身特征及其所处的上下文特征进行向量化表示，以作为神经网络特征提取器的输入数据；之后，基于循环神经网络的特征提取层对输入的字符向量序列进行线性的加权和非线性映射，从而提取出能够区分不同音素的字符特征作为输出层类别判断的依据 [ 2 ]。由于循环神经网络具有天然的时序结构，因此能够有效建模字符序列的上下文特征，从而为最终的音素标注提供高质量的特征依据。最后，基于连接时序分类的输出层依据循环神经网络提供的数据特征来为每个时刻的输入向量预测一个音素类别，最终形成音素类别的序列，从而实现对单词发音基元的标注。连接时序分类层从结构上来讲实际是一个Softmax分类层，在每个时刻为每个输入的向量判断一个音素类别。但其特殊之处在于一个特别的损失函数，该函数用于衡量两个序列之间的差异，从而用于模型的训练和优化。最重要的是，连接时序分类层可以实现长序列到短序列的自动映射。由于构成西班牙语单词的字符个数一般多于其音素个数，而循环神经网络的输出序列与其输入序列是等长的，因此通过采用连接时序分类可以有效的实现输入序列到真实音素序列的映射关系，从而实现端到端训练与解码。 4.1. 基于向量表示的字符嵌入输入层 由于神经网络的输入只能是以数字形式表示的向量或张量，因此对符号形式的西班牙语字符进行编码是构建基于神经网络的字–音转换模型首先要解决的问题。传统模式下，字符编码通常采用one-hot向量形式将所有字符编码到一个正交的向量空间中，向量的维度就是字符的个数。这种编码方式无法体现字符与字符之间在构词上的相似度，忽略了不同字符在构成一个单词时存在的上下文关联关系。因此，本文基于NLP中常用的词嵌入思想 [ 3 ] [ 4 ]，以字符作为编码对象，采用词向量训练工具来训练字符向量，从而实现西班牙语字符的嵌入式表示。在这种模式下，表示各个字符的向量不再是正交的one-hot向量，而是可计算相似度的多维实数向量，其形式如图3所示。 图3. 西班牙语字符的one-hot向量编码与嵌入向量编码 目前，可用于训练词向量的工具有很多，其中典型的一个是由Google发布的Word2vec框架。该框架的本质是基于神经网络的语言模型计算工具，即利用神经网络来计算语言模型，其结构原理如图4所示。 可以看出，基于神经网络的语言模型计算框架包含三个神经网络层，第一层是输入层，表示采用one-hot编码的词序列；第二层是一个映射层，用于将one-hot向量映射成一个维度较低的实数向量；第三层是一个神经网络隐含层，对实数向量进行非线性变换；最后是softmax层，用于预测输入词序列后面下一个词的可能性。等模型训练收敛后，存储在映射层中的向量就是对应输入词的嵌入式表示，因此词向量实际上是神经网络语言模型的副产物。由于图7的神经网络模型要经过隐含层的非线性变换，计算量过大，因此word2vec又设计了CBoW模型和Skip-gram模型，两种模型从结构上都摒弃了隐含层的非线性变换，只保留了分类层。其中CboW模型以单词两边的上下文作为输入来预测当前位置的单词，而Skip-gram模型则当前单词为输入来预测其左边和右边的其他单词，两种模型的计算原理分别如图5、图6所示。 Word2vec词向量训练工具可以在百万数量级的词典上进行高效的训练。因此，本文采用Word2vec作为西班牙字符向量的训练工具，以单词的字符作为模型的输入，以CBoW模型作为字符嵌入的训练模型，训练语料则为本文自建的西班牙语词库。 4.2. 基于循环神经网络的特征提取层 循环神经网络(Recurrent Neural Network， RNN)是一种特殊的深层神经网络，其显著特点就是隐含层自连接结构使其具有天然的时序特征，因此能够有效建模序列数据的上下文依赖关系 [ 5 ] [ 6 ]。RNN的结构特点可如图7所示。 图4. Word2vec的架构 图5. CBoW模型 图6. Skip-gram模型 图7. 循环神经网络的结构特点 RNN的输入层表示输入样本的编码向量，输入层神经元个数即输入数据编码向量的维数。编码向量经加权后会进入中间的隐含层；RNN的隐含层具有自连接特性，即将上一时刻隐含层的状态向量进行加权计算后，与输入层的加权向量一起送入激活函数，经计算得到隐状态向量。该隐状态向量再进入输出层进行分类预测，同时会进入下一时刻的隐含层进行时序迭代。RNN的输出层实际是一个分类层，其中的每个神经元代表一个类别，每个神经元的输出值表示输入样本属于该类别的后验条件概率值。可以看出，RNN实际上是一个三维的网络结构，其中时间维度上的展开步数等于输入序列的长度，但在任意时刻，网络连续的权值是恒定不变的。序列数据进入RNN隐含层的计算过程可如公式1所示： h t = H ( W x h x t + W h h h t − 1 + b h ) y t = O ( W h y h t + b y ) (1) 其中x t 为t时刻的网络输入，H为隐含层激活函数(通常为非线性函数，如Tanh函数)，O代表输出层的分类函数(通常是Softmax函数)，y t 为t时刻的输出向量，通常表示一个类别的编码向量。权值W xh 、W hh 、W hy 以及偏置项b h 、b y 都是需要通过训练才能确定的网络参数。 RNN通常采用基于梯度的训练方法，在输入序列较长时，其时域展开步数也随之线性增加。由于只有简单的激活函数结构，因此在模型训练时产生的梯度并不能按照理想的方式持续回传，普遍存在梯度消失问题，这也导致普通的RNN在实际应用中无法捕获序列内部的长距离时序依赖关系。为了改善循环连接对时序关联特征的建模能力，人们提出了门控机制，即通过门控函数的方式来提升其对长距离时序特征的记忆、强化及弱化能力，典型的如长短时记忆单元(Long-Short Term Memory， LSTM)和门循环单元(Gated Recurrent Unit， GRU)等，两者的内部结构及运算过程分别如图8和图9所示。 图8. LSTM的内部结构及运算过程 从图中可以看出，LSTM实际上是加入门控函数的RNN激活单元。其神经元内部共有三个门函数和一个存储单元。三个门函数通常称为输入门、遗忘门和输出门，分别控制神经元的输入、存储以及输出。存储单元是LSTM神经元的记忆组件，受遗忘门的控制，同时接收新的输入，并在达到激活条件时产生输出值。LSTM的内部计算过程可如公式2所示： i t = σ ( W i ⋅ [ h t − 1 ， x t ] + b i ) f t = σ ( W f ⋅ [ h t − 1 ， x t ] + b f ) o t = σ ( W o ⋅ [ h t − 1 ， x t ] + b o ) c t = f t c t − 1 + i t tanh ( W c ⋅ [ h t − 1 ， x t ] + b c ) h t = o t tanh ( c t ) (2) 图9. GRU的内部结构及运算过程 与LSTM相比，GRU同样使用了门控机制。但是GRU只有两个门函数，即更新门和重置门。其中，更新门用于控制前一时刻状态信息对神经元激活的有效程度，而重置门则用于控制经过激活值对当前时刻状态信息的有效程度。GRU cell的内部结构及运算过程如图9和公式3所示： z t = σ ( W z ⋅ [ h t − 1 ， x t ] ) r t = σ ( W r ⋅ [ h t − 1 ， x t ] ) h ˜ t = tanh ( W [ r t h t − 1 ， x t ] ) h t = ( 1 − z t ) h t − 1 + z t h ˜ t (3) 门控机制能够实现对输入信息流的控制，从而缓解训练过程中的梯度消失现象，但也带来了参数量成倍增加的问题。相对LSTM来讲，GRU的参数要少，但在应用中的效果却并不比LSTM差，甚至在某些情况下还要优于LSTM。因此，GRU是目前循环神经网络的首选变体。 另外，传统RNN是单向展开，因此只能利用之前的历史信息来预测当前时刻的输出，而序列标注任务是对整个输入序列的转写，当前元素后面的上下文信息对当前元素也有直接的影响。因此双向RNN (Bidirectional RNN， Bi-RNN)可以使用两个独立的隐含层分别从前往后和从后往前处理数据，之后再同时进入输出层，可有效解决两个方向上的时序特征建模该问题 [ 7 ]。Bi-RNN隐含层的结构可如图10所示。 图10. 双向循环神经网络的隐含层结构 因此，双向RNN隐含层的计算过程可如公式4所示： h t = W h → h → t + W h ← h ← t (4) 组合两个方向的LSTM(GRU)单元就可以构成双向的LSTM(GRU)网络。 4.3. 适用于端到端训练的连接时序分类层 由于构成西班牙语单词的字符个数与其对应的音素个数并非一一对应，并且通常情况下其发音音素的个数会小于字符的个数。因此，字–音转换模型还要实现较长字符序列到较短音素序列的自动映射。连接时序分类(Connectionist Temporal Classification， CTC)作为一种在语音识别领域比较经典的序列标注算法，其本身可以实现从长序列到短序列的映射 [ 8 ]。从结构上来讲，连接时序分类实际上是一个经过改进的Softmax分类器。在传统Softmax分类器中，每个输出节点代表一个真实有效的类别标签，但在CTC中，Softmax层除了设置有效的类别标签节点外，还增加了一个表示“空输出”的节点。相应的，其标签集中也会增加一个空(blank)标签，表示某一时刻的输入元素没有实际的类别标签。同时，从功能上来讲来讲，CTC本身又是一个用于模型训练的误差函数，可以建模长序列与短序列的差异。具体的，假设循环神经网络的输出是一个长度为T的向量序列π，则T实际也是最后循环神经网络在时域上的展开长度，而序列π中的每个向量都表示一个标签类别的概率。标签类别来自于真实有效的标签类别集合(记为K)以及一个“空”(blank)类别。神经网络输出层生成序列π的计算过程如公式5所示： p ( k ， t | x ) = s o f t max ( o u t t k ) ， k ∈ K ∪ blank p ( π | x ) = ∏ t = 1 T p ( k ， t | x ) ， k ∈ K ∪ blank (5) 式中x表示输入序列，p(k， t|x)表示在t时刻模型预测类别为k的概率值，是由Softmax分类器根据前一层神经网络输出的特征值计算得到的；p(π|x)则为整个输出序列的概率值，是由每个时刻的类别概率值p(k， t|x)相乘得到的。此时，使用一个多对一映射β(π)即可将模型输出序列π转换成真实标签序列y，其映射过程可如公式6所示： y = β ( π ) ⇔ ( a ， b ， c ) = { β ( a ， b ， − ， − c ) β ( − ， a ， b ， − ， c ) β ( − ， a ， a ， b ， − ， c ， c )                       ⋮ β ( − ， a ， − ， b ， − ， c ， c ) (6) 可以看出，该函数首先将序列π中两个彼此相邻并且值相同的标签合并为一个类别标签，然后再删除π中的空(blank)标签，即可形成最终的标签序列y。因此，CTC分类层的序列转换过程可如图11所示。 图11. CTC层序列转换过程示意 不难看出，可以存在多种形式的序列π对应着同一个标签序列y。因此真实标签序列y的概率实际上是所有能够转换成y的序列π的概率之和，如公式7所示： p ( y | x ) = ∑ π ∈ β − 1 ( y ) p ( π | x ) (7) CTC训练的目标即是让得到真实标签序列y的概率达到最大值(极大似然估计)。通常我们会将上述目标函数转换为负对数似然的形式，以便使用梯度下降法使该目标函数达到最小值(等价于最大化真实标签序列的概率)。因此，目标函数的定义如公式8所示： CTCLoss = − log p ( y | x ) (8) 公式8的计算可用类似于HMM前向算法的动态规划算法有效解决，并且该算法的中间值还可用于计算公式7的梯度值，从而加速模型的训练过程。当模型训练完成之后，即可用于对西班牙单词发音基元的预测。 由于CTC可有效实现较长序列到较短序列的映射转换，因此对训练数据不再要求单词内字素与发音基元的对齐关系，在实现端到端序列转换的同时，大大减轻训练集的建设成本。