聲譜預測網絡(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_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 \]

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

      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+\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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM