整个特征预测网络是一个带有注意力机制(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

声谱预测网络(Tacotron2)的更多相关文章

  1. 网络流量预测入门(三)之LSTM预测网络流量

    目录 网络流量预测入门(三)之LSTM预测网络流量 数据集介绍 预测流程 数据集准备 SVR预测 LSTM 预测 优化点 网络流量预测入门(三)之LSTM预测网络流量 在上篇博客LSTM机器学习生成音 ...

  2. Attention is all you need及其在TTS中的应用Close to Human Quality TTS with Transformer和BERT

    论文地址:Attention is you need 序列编码 深度学习做NLP的方法,基本都是先将句子分词,然后每个词转化为对应的的词向量序列,每个句子都对应的是一个矩阵\(X=(x_1,x_2,. ...

  3. Kaggle比赛冠军经验分享:如何用 RNN 预测维基百科网络流量

    Kaggle比赛冠军经验分享:如何用 RNN 预测维基百科网络流量 from:https://www.leiphone.com/news/201712/zbX22Ye5wD6CiwCJ.html 导语 ...

  4. 学习TensorFlow,调用预训练好的网络(Alex, VGG, ResNet etc)

    视觉问题引入深度神经网络后,针对端对端的训练和预测网络,可以看是特征的表达和任务的决策问题(分类,回归等).当我们自己的训练数据量过小时,往往借助牛人已经预训练好的网络进行特征的提取,然后在后面加上自 ...

  5. darktrace 亮点是使用的无监督学习(贝叶斯网络、聚类、递归贝叶斯估计)发现未知威胁——使用无人监督 机器学习反而允许系统发现罕见的和以前看不见的威胁,这些威胁本身并不依赖 不完善的训练数据集。 学习正常数据,发现异常!

    先说说他们的产品:企业免疫系统(基于异常发现来识别威胁) 可以看到是面向企业内部安全的! 优点整个网络拓扑的三维可视化企业威胁级别的实时全局概述智能地聚类异常泛频谱观测 - 高阶网络拓扑;特定群集,子 ...

  6. 科普文:从人人网看网络科学(Network Science)的X个经典问题

    转:https://zr9558.wordpress.com/2013/12/05/科普文:从人人网看网络科学(network-science)的x个经典问/ 长文,写了N个小时写完的.你肯定能看懂, ...

  7. 从2019-nCoV趋势预测问题,联想到关于网络安全态势预测问题的讨论

    0. 引言 在这篇文章中,笔者希望和大家讨论一个话题,即未来趋势是否可以被精确或概率性地预测. 对笔者所在的网络安全领域来说,由于网络攻击和网络入侵常常变现出随机性.非线性性的特征,因此纯粹的未来预测 ...

  8. Objects as Points:预测目标中心,无需NMS等后处理操作 | CVPR 2019

    论文基于关键点预测网络提出CenterNet算法,将检测目标视为关键点,先找到目标的中心点,然后回归其尺寸.对比上一篇同名的CenterNet算法,本文的算法更简洁且性能足够强大,不需要NMS等后处理 ...

  9. 视频动作定位的分层自关注网络:ICCV2019论文解析

    视频动作定位的分层自关注网络:ICCV2019论文解析 Hierarchical Self-Attention Network for Action Localization in Videos 论文 ...

随机推荐

  1. 小强的HTML5移动开发之路(38)——jqMobi插件ActionSheet

    现在在手机客户端上Action Sheet非常常见,比如微信中的分享按钮菜单,下面我们使用jqMobi实现一个Action Sheet,如下: 首先右击上面的按钮选择审查元素(我用的是Chrome浏览 ...

  2. 关于Boolean类型做为同步锁异常问题

    public class Test2 { private static volatile Boolean aBoolean = true; static class A implements Runn ...

  3. [搜索]Trie树的实现

    trie这种树也被称为线索,搜索树. 正如图 以下是用stl 的map来实现 class trie_item_c { public: trie_item_c(){} trie_item_c(const ...

  4. 微信小程序的轮播图swiper问题

    微信小程序的轮播图swiper,调用后,怎样覆盖系统的 点,达到自己想要的效果 不多说,先上一图望大家多给意见: 这个是效果图: 微信小程序效果图就成这样子: <view class=" ...

  5. VS Code插件之Cordova Tools

    原文:VS Code插件之Cordova Tools 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u011127019/article/detai ...

  6. 动态备份SQL-SERVER数据库——SQLDMO

    转载:http://www.cnblogs.com/liulanglang/archive/2007/12/04/981812.html 上周要写一个SQL-SERVER数据库备份还原的程序,很没有思 ...

  7. MATLAB Toolbox Path Cache is out of date and is not being used的解决

    作者:朱金灿 来源:http://blog.csdn.net/clever101 使用mcc编译MATLAB\R2009a\extern\examples\compiler目录下的hello.m,编译 ...

  8. jquery 源码学习(二)

    在网上找到一篇广为流传的文章<常用正则表达式>,逐一分析,不足地方进行补充和纠正   作者:nuysoft/JS攻城师/高云 QQ:47214707 EMail:nuysoft@gmail ...

  9. .net命名空间和程序集详解

    命名空间是一种用于将逻辑上相似的类按层次结构分组的机制.这种机制防止了命名冲突.在这种结构化采用被点号"."分隔的单词来实现.通常最顶层的命名空间是System,例如System; ...

  10. codeforces Round #259(div2) D解决报告

    D. Little Pony and Harmony Chest time limit per test 4 seconds memory limit per test 256 megabytes i ...