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

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

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

最普遍的方式是使用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)用作编码器和解码器的桥接,本质是一个上下文权重向量组成的矩阵。

    \[
    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
      \]

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

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

      整个注意力机制如图:

  • 解码器

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

    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

最新文章

  1. Handlebars 模板引擎之前后端用法
  2. 搭建 AngularJS+Ionic+Cordova 开发环境并运行一个demo
  3. 使用MaskFilter
  4. HDU-1233 还是畅通工程
  5. 黄聪:解决Web部署 svg/woff/woff2字体 404错误
  6. PHP中的特殊符号
  7. libsvm使用详细说明
  8. centos安装youcompleteme
  9. POJ2449 (k短路)
  10. Core Java Volume I — 4.10. Class Design Hints
  11. 数据类型的处理(提取自FMDB)
  12. 【学习总结】整理一下int, NSInteger 等概念
  13. ng-option小解
  14. AngularJS实用基础知识---入门必备
  15. 远程桌面服务当前正忙,因此无法完成您尝试执行的任务-win2008R2
  16. 想起以前写的一个爬虫,然后就用C#WinForm写了一个下载小说的软件,比较简单
  17. bzoj1398 Necklace
  18. C#标准体重判断
  19. supervisor 监控redis &amp; mongodb
  20. 巧用PHP数组函数

热门文章

  1. web开发-MVC IoC 框架(转)
  2. 通过手机其他iOS应用打开此文件
  3. NOIP模拟 Date - Tarjan
  4. 【87.65%】【codeforces 731A】Night at the Museum
  5. 于CentOS 6.5编译器安装Git 1.8
  6. .net remoting 使用事件
  7. 解析URL查询字符串参数为对象以及老浏览器的getElementsByClassName
  8. 【从翻译mos文章】采用高速全扫描索引(index ffs) 为了避免全表扫描
  9. VAssist 使用技巧(函数声明定位,比VS的还要强大)
  10. Entity Framework加载数据的三种方式。