声谱预测网络(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_salpha_{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^Tmathop{tanh}(Ws_{i-1}+Vh_j+Uf_{i,j}) ]

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

      [e_{ij}=v_a^Tmathop{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,calpha_{i-1},h_j)=v_a^Tmathop{tanh}(Ws_i+Vh_j+Uf_{i,j}+b) ]

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

      [f_i=F*calpha_{i-1}\ calpha_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+lambdasum_{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

原文地址:https://www.cnblogs.com/mengnan/p/9527797.html