整个特征预测网络是一个带有注意力机制(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. list数组归并去重

    C#两路list数组归并去重 个相同类型已排序数据进行合并,虽然list数组中有AddRange方法,但它只是把第二个数组从第一个数组末尾插入,假如两个数组有重复数据,保存进去.还有Union方法合并 ...

  2. oracle 全部查询和表空间,以及其关系

    select * from dba_users;   查看数据库里面全部用户,前提是你是有dba权限的帐号.如sys,system select * from all_users;     查看你能管 ...

  3. Windows消息:WM_USER与WM_APP的区别

    Windows消息范围及意义 #define WM_USER 0x0400 #define WM_APP 0x8000 0到WM_USER-1 Messages reserved for use by ...

  4. AutoHotKey 的使用 —— 使用键盘调节 windows 声音

    AutoHotKey 下载地址 AutoHotkey Downloads 首先进行 AutoHotKey 的安装 编写如下 .ahk 文件(F10:打开关闭声音,F11:增加声音,F12:减少声音,当 ...

  5. Lucene分词报错:”TokenStream contract violation: close() call missing”

    Lucene使用IKAnalyzer分词时报错:”TokenStream contract violation: close() call missing”  解决办法是每次完成后必须调用关闭方法. ...

  6. CUDA流(Stream)

    CUDA流表示一个GPU操作队列,该队列中的操作将以添加到流中的先后顺序而依次执行.可以将一个流看做是GPU上的一个任务,不同任务可以并行执行.使用CUDA流,首先要选择一个支持设备重叠(Device ...

  7. Creating Apps With Material Design —— Defining Custom Animations

    转载请注明 http://blog.csdn.net/eclipsexys 翻译自Developer Android,时间仓促,有翻译问题请留言指出.谢谢 定义动画 在材料设计动画让用户与您的应用程序 ...

  8. Mybatis使用TypeHandler实现数据的加解密转换

    参考: MyBatis之TypeHandler: https://www.cnblogs.com/yulinfeng/p/5991170.html   前段时间收到这么个需求:为安全起见,要求在数据库 ...

  9. 给WPF示例图形加上方便查看大小的格子

    原文:给WPF示例图形加上方便查看大小的格子 有时,我们为了方便查看WPF图形的样式及比例等,需要一些辅助性的格线,置于图形.图像的背景中. 比如下图,就是为了更清晰地查看折线的图形,我们画了用于标示 ...

  10. window7使用MinGW在命令行编译C/C++源程序(从零开始,设置PATH,LIBRARY_PATH,C_INCLUDE_PATH)

    1.要想在window命令行下面编译C/C++源程序,对于初学者来说,需要在window环境下面配置好GCC和G++编译器,我使用的是MinGW,下载地址为:http://sourceforge.ne ...