Loading [MathJax]/jax/element/mml/optable/GeneralPunctuation.js

声谱预测网络(Tacotron2)

KAIbAU.png

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

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

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

KAILh4.png

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

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

  • 编码器

    前置知识

    双向RNN

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

    在Tacotron2中,编码器将输入序列X=[x1,x2,...,xTx]映射成序列H=[h1,h2,...,hTx],其中序列H被称作“编码器隐状态”(encoder hidden states)。注意:编码器的输入输出序列都拥有相同的长度,hi之于相邻分量hj拥有的信息等价于xi之于xj所拥有的信息。

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

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

    fe=ReLU(F3ReLU(F2ReLU(F1¯E(X))))H=EncoderRecurrency(fe)

    其中,F1F2F3为3个卷积核,ReLU为每一个卷积层上的非线性激活,¯E表示对字符序列X做embedding,EncoderRecurrency表示双向LSTM。

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

  • 注意力机制

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

    KAIvcR.png

    Attention(Query,Source)=Lxi=1similarity(Query,Keyi)Value

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

    一般的计算步骤:

    • 步骤一:KeyValue相似度度量:

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

      ai=softmax(simi)=esimiLxj=1esimj

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

      Attention(Query,Key)=Lxi=1ai·Valuei

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

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

      αts=exp(score(ht,¯hs))Ss=1exp(score(ht,¯hs))

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

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

      ct=sαts¯hs

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

    以下是不同的score函数:

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

      eij=score(si1,hj)=vTatanh(Wasi1+Uahj)

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

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

      eij=score(αi1,hj)=vTatanh(Whj+Ufi,j)

      其中,fi,j是之前的注意力权重αi1经卷积而得的位置特征,fi=Fαi1vaWaUaF是待训练参数。

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

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

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

      eij=score(si1,αi1,hj)=vTatanh(Wsi1+Vhj+Ufi,j)

      其中,si1为之前的解码器隐状态,αi1是之前的注意力权重,hj是第j个编码器隐状态。为其添加偏置值b,最终的score函数计算如下:

      eij=vTatanh(Wsi1+Vhj+Ufi,j+b)

      其中,vaWVUb为待训练参数,si1为上一个时间步中解码器隐状态,hj是当前编码器隐状态,fi,j是之前的注意力权重αi1经卷积而得的位置特征(location feature),fi=Fαi1。混合注意力机制能够同时考虑内容和输入元素的位置。

    • Tacotron2注意力机制,Location Sensitive Attention

      ei,j=score(si,cαi1,hj)=vTatanh(Wsi+Vhj+Ufi,j+b)

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

      fi=Fcαi1cαi=i1j=1αj

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

      KAoiND.png

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

      整个注意力机制如图:

      KAoZjI.png

  • 解码器

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

    KAouHf.png

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

  • 后处理网络

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

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

    yfinal=y+yr

    其中,y为原始输入

    上式中,

    yr=PostNet(y)=Wpsfps+bps

    其中,fps=Fps,ixx为上一个卷积层的输出或解码器输出,F为卷积

  • 训练

    loss=1nni=1(yreal,iyi)2+1nni=1(yreal,iyfinal,i)2+λpj=1w2j

    其中,yreal,i为真实声谱,yiyfinal,i分别为进入后处理网络前、后的声谱,n为batch中的样本数,λ为正则化参数,p为参数总数,w​为神经网络中的参数。注意,不需要正则化偏置值。

参考文献

Spectrogram Feature prediction network@github

Attention机制

nmt-tensorflow-tutorial@github

posted @   冬色  阅读(14370)  评论(0编辑  收藏  举报
编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示