声谱预测网络(Tacotron2)

KAIbAU.png

整个特征预测网络是一个带有注意力机制(attention)的seq2seq网络。

编码器-解码器(Encoder-Decoder)结构

在原始的编码器-解码器结构中,编码器(encoder)输入一个序列或句子,然后将其压缩到一个固定长度的向量(向量也可以理解为一种形式的序列)中;解码器(decoder)使用固定长度的向量,将其解压成一个序列。

KAILh4.png

最普遍的方式是使用RNN实现编码器和解码器。

编码器将输入序列映射成固定长度的向量,解码器在生成输出序列阶段,利用注意力机制“关注”向量的不同部分。

  • 编码器

    前置知识

    双向RNN

    双向RNN确保模型能够同时感知前向和后向的信息。双向RNN包含两个独立的RNN,一个前向RNN从前向后读入序列(从\(f_1\)\(f_{T_x}\)),另一个后向RNN从后向前读入序列(从\(f_{T_x}\)\(f_1\)),最终的输出为两者的拼接。

    在Tacotron2中,编码器将输入序列\(X=[x_1,x_2,...,x_{T_x}]\)映射成序列\(H=[h_1,h_2,...,h_{T_x}]\),其中序列\(H\)被称作“编码器隐状态”(encoder hidden states)。注意:编码器的输入输出序列都拥有相同的长度,\(h_i\)之于相邻分量\(h_j\)拥有的信息等价于\(x_i\)之于\(x_j\)所拥有的信息。

    在Tacotron2中,每一个输入分量\(x_i\)就是一个字符。Tacotron2的编码器是一个3层卷积层后跟一个双向LSTM层形成的模块,在Tacotron2中卷积层给予了神经网络类似于\(N-gram\)感知上下文的能力。这里使用卷积层获取上下文主要是由于实践中RNN很难捕获长时依赖,并且卷积层的使用使得模型对不发音字符更为鲁棒(如'know'中的'k')。

    经词嵌入(word embedding)的字符序列先送入三层卷积层以提取上下文信息,然后送入一个双向的LSTM中生成编码器隐状态,即:

    \[f_{e}=ReLU(F_3*ReLU(F_2*ReLU(F_1*\overline{E}(X))))\\ H=EncoderRecurrency(f_{e}) \]

    其中,\(F_1、F_2、F_3\)为3个卷积核,\(ReLU\)为每一个卷积层上的非线性激活,\(\overline{E}\)表示对字符序列\(X\)做embedding,\(EncoderRecurrency\)表示双向LSTM。

    编码器隐状态生成后,就会将其送入注意力网络(attention network)中生成上下文向量(context vector)。

  • 注意力机制

    “注意力”(attention)用作编码器和解码器的桥接,本质是一个上下文权重向量组成的矩阵。

    KAIvcR.png

    \[Attention(Query,Source)=\sum_{i=1}^{L_x}similarity(Query,Key_i)*Value \]

    如果在机器翻译(NMT)中,\(Souce\)中的\(Key\)\(Value\)合二为一,指的是同一个东西,即输入句子中每个单词对应的语义编码。

    一般的计算步骤:

    • 步骤一:\(Key\)\(Value\)相似度度量:

      • 点积\(Similarity(Query,Key)=Query·Key\)
      • cos相似性\(Similarity(Query,Key)=\frac{Query·Key_i}{||Query||*||Key_i||}\)
      • MLP网络\(Similarity(Query,Key_i)=MLP(Query,Key_i)\)
      • \(Key\)\(Value\)还可以拼接后再内积一个参数向量,甚至权重都不一定要归一化
    • 步骤二:\(softmax\)归一化(alignments/attention weights):

      \[a_i=softmax(sim_i)=\frac{e^{sim_i}}{\sum_{j=1}^{L_x}e^{sim_j}} \]

    • 步骤三:Attention数值(context vector):

      \[Attention(Query,Key)=\sum^{L_x}_{i=1}a_i·Value_i \]

    在Tacotron中,注意力计算(attention computation)发生在每一个解码器时间步上,其包含以下阶段:

    • 目标隐状态(上图绿框所示)与每一个源状态(上图蓝框所示)“相比”,以生成注意力权重(attention weights)或称对齐(alignments):

      \[\alpha_{ts}=\frac{exp(score(h_t,\overline{h_s}))}{\sum_{s'=1}^{S}exp(score(h_t,\overline{h_{s'}}))} \]

      其中,\(h_t\)为目标隐状态,\(\overline{h_s}\)为源状态,\(score\)函数常被称作“能量”(energy),因此可以表示为\(e\)。不同的\(score\)函数决定了不同类型的注意力机制。

    • 基于注意力权重,计算上下文向量(context vector)作为源状态的加权平均:

      \[c_t=\sum_s\alpha_{ts}\overline{h_s} \]

    • 注意力向量作为下一个时间步的输入

    以下是不同的\(score\)函数:

    • 基于内容的注意力机制(content-based attention):

      \[e_{ij}=score(s_{i-1},h_j)=v_a^Ttanh(W_as_{i-1}+U_ah_j) \]

      其中,\(s_{i-1}\)为上一个时间步中解码器的输出(解码器隐状态,decoder hidden states),\(h_j\)是编码器此刻输入(编码器隐状态,encoder hidden state j),\(v_a\)\(W_a\)\(U_a\)是待训练参数张量。由于\(U_ah_j\)是独立于解码步\(i\)的,因此可以独立提前计算。基于内容的注意力机制能够将不同的输出与相应的输入元素连接,而与其位置无关。在Tacotron2中使用基于内容的注意力机制时,当输出对应于's'的Mel频谱帧,模型会寻找所有所有对应于's'的输入。

    • 基于位置的注意力机制(location-based attention):

      \[e_{ij}=score(\alpha_{i-1},h_j)=v_a^Ttanh(Wh_j+Uf_{i,j}) \]

      其中,\(f_{i,j}\)是之前的注意力权重\(\alpha_{i-1}\)经卷积而得的位置特征,\(f_i=F*\alpha_{i-1}\)\(v_a\)\(W_a\)\(U_a\)\(F\)是待训练参数。

      基于位置的注意力机制仅关心序列元素的位置和它们之间的距离。基于位置的注意力机制会忽略静音或减少它们,因为该注意力机制没有发现输入的内容。

    • 混合注意力机制(hybrid attention):

      顾名思义,混合注意力机制是上述两者注意力机制的结合:

      \[e_{ij}=score(s_{i-1},\alpha_{i-1},h_j)=v_a^T\mathop{tanh}(Ws_{i-1}+Vh_j+Uf_{i,j}) \]

      其中,\(s_{i-1}\)为之前的解码器隐状态,\(\alpha_{i-1}\)是之前的注意力权重,\(h_j\)是第\(j\)个编码器隐状态。为其添加偏置值\(b\),最终的\(score\)函数计算如下:

      \[e_{ij}=v_a^T\mathop{tanh}(Ws_{i-1}+Vh_j+Uf_{i,j}+b) \]

      其中,\(v_a\)\(W\)\(V\)\(U\)\(b\)为待训练参数,\(s_{i-1}\)为上一个时间步中解码器隐状态,\(h_j\)是当前编码器隐状态,\(f_{i,j}\)是之前的注意力权重\(\alpha_{i-1}\)经卷积而得的位置特征(location feature),\(f_i=F*\alpha_{i-1}\)。混合注意力机制能够同时考虑内容和输入元素的位置。

    • Tacotron2注意力机制,Location Sensitive Attention

      \[e_{i,j}=score(s_i,c\alpha_{i-1},h_j)=v_a^T\mathop{tanh}(Ws_i+Vh_j+Uf_{i,j}+b) \]

      其中,\(s_i\)当前解码器隐状态而非上一步解码器隐状态,偏置值\(b\)被初始化为0。位置特征\(f_i\)使用累加注意力权重\(c\alpha_i\)卷积而来:

      \[f_i=F*c\alpha_{i-1}\\ c\alpha_i=\sum_{j=1}^{i-1}\alpha_j \]

      之所以使用加法累加而非乘法累积,原因如图:

      KAoiND.png

      累加注意力权重,可以使得注意力权重网络了解它已经学习到的注意力信息,使得模型能在序列中持续进行并且避免重复未预料的语音。

      整个注意力机制如图:

      KAoZjI.png

  • 解码器

    解码过程从输入上一步的输出声谱或上一步的真实声谱到PreNet开始,解码过程如图:

    KAouHf.png

    PreNet的输出与使用上一个解码步输出计算而得的上下文向量做拼接,然后整个送入RNN解码器中,RNN解码器的输出用来计算新的上下文向量,最后新计算出来的上下文向量与解码器输出做拼接,送入投影层(projection layer)以预测输出。输出有两种形式,一种是声谱帧,一种是\(<stop\ token>\)的概率,后者是一个简单二分类问题,决定解码过程是否结束。使用缩减因子(reduction factor)即每一个解码步仅允许预测\(r\)(缩减因子)Mel谱帧,能够有效加速计算,减小内存占用。

  • 后处理网络

    一旦解码器完成解码,预测得到的Mel谱被送入一系列的卷积层中以提高生成质量。

    后处理网络使用残差(residual)计算:

    \[y_{final}=y+y_r \]

    其中,\(y\)为原始输入

    上式中,

    \[y_r=PostNet(y)=W_{ps}f_{ps}+b_{ps} \]

    其中,\(f_{ps}=F_{ps,i}*x\)\(x\)为上一个卷积层的输出或解码器输出,\(F\)为卷积

  • 训练

    \[loss=\frac{1}{n}\sum_{i=1}^{n}(y_{real,i}-y_i)^2+\frac{1}{n}\sum_{i=1}^n(y_{real,i}-y_{final,i})^2+\lambda\sum_{j=1}^p w_j^2 \]

    其中,\(y_{real,i}\)为真实声谱,\(y_i\)\(y_{final,i}\)分别为进入后处理网络前、后的声谱,\(n\)为batch中的样本数,\(\lambda\)为正则化参数,\(p\)为参数总数,\(w​\)为神经网络中的参数。注意,不需要正则化偏置值。

参考文献

Spectrogram Feature prediction network@github

Attention机制

nmt-tensorflow-tutorial@github

posted @ 2018-08-24 08:56  冬色  阅读(14271)  评论(0编辑  收藏  举报