1. 程式人生 > >Attention is all you need及其在TTS中的應用Close to Human Quality TTS with Transformer和BERT

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

ips fas 缺點 不同的 stand 進入 簡單 code shang

論文地址:Attention is you need

序列編碼

深度學習做NLP的方法,基本都是先將句子分詞,然後每個詞轉化為對應的的詞向量序列,每個句子都對應的是一個矩陣\(X=(x_1,x_2,...,x_t)\),其中\(x_i\)都代表著第\(i\)個詞向量,維度為d維,故\(x\in R^{n×d}\)

  • 第一個基本的思路是RNN層,遞歸式進行:
    \[ y_t=f(y_{t-1},x_t) \]
    RNN結構本身比較簡單,也適合序列建模,但RNN明顯缺點之一在於無法並行,因而速度較慢,而且RNN無法很好學習到全局的結構信息,因為其本質是一個馬爾科夫決策過程。

  • 第二個思路是CNN層,CNN方案即是窗口式遍歷,如尺寸為3的卷積,即是:
    \[ y_t=f(x_{t-1},x_t,x_{t+1}) \]


    CNN方便並行,而且容易捕捉到一些全局的結構信息,CNN實際只能獲取局部信息,其通過層疊擴大感受野。

  • 純Attention

    獲取全局信息的問題上,RNN需要逐步遞歸,因此一般雙向RNN才比較好,CNN只能獲取局部信息且通過層疊擴大感受野。Attention:
    \[ y_t=f(x_t,A,B) \]
    其中,A、B是另外一個序列(矩陣),如果取A=B=X,則稱作self_attention,其意思是直接將\(x_t\)與原來的每個詞比較最後求出\(y_t\)

Attention層

一般Attention的定義參見聲譜預測網絡(Tacotron2)註意力機制部分。

  • Attention定義

    技術分享圖片

    一般的Attention思路也是一個編碼序列的方案,因此其跟RNN、CNN一樣,是一個序列編碼的層:
    \[ Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_k}})V \]


    其中,\(Q\in R^{N×d_k},K\in R^{m×d_k},V\in R^{m×d_v}\)。忽略\(softmax\)\(\sqrt{d_k}\),其實際是\(n×d_k,d_k×m,m×d_v\)三個矩陣相乘,最後的結果為\(n×d_v\)的矩陣,這也可以認為是一個Attention層將\(n×d_k\)的序列\(Q\)編碼為一個新的\(n×d_v\)的序列。
    \[ Attention(q_t,K,V)=\sum_{s=1}^{m}\frac{1}{Z}exp(\frac{<q_t,k_s>}{\sqrt{d_k}})v_s \]
    其中,\(Z\)是歸一化因子,\(q,K,V\)
    分別是\(query,key,value\)的簡寫,\(K,V\)是一一對應的,上式意為通過\(q_t\)這個\(query\),通過與各個\(k_s\)內積並softmax的方式,來得到\(q_t\)與各個\(v_s\)的相似度,然後加權求和,得到一個\(d_v\)維的向量,其中因子\(\sqrt{d_k}\)起調節作用,使得內積不會過大(過大的話,softmax之後就非0即1,不夠soft)。

  • Multi-Head Attention

    技術分享圖片

    \(Q,K,V\)通過參數矩陣映射再做Attention,將此過程重復\(h\)次,結果拼接起來即可。具體而言,
    \[ head_i=Attention(QW_i^Q,KW_i^K,VW_i^V) \]
    其中,\(W_i^Q\in R^{d_Q×\tilde{d_Q}},W_i^K\in R^{d_k×\tilde{d_k}},W_i^V\in R^{d_V×\tilde{d_V}}\)。之後,
    \[ MultiHead(Q,K,V)=concat(head_1,head_2,...,head_h) \]
    最後得到\(n×(h\tilde{d_v})\)的序列,所謂多頭(Multi-Head),即是多做幾次同樣的事情。註意,\(Q,K,V\)做映射時的參數矩陣在各個頭之間不共享。

  • Self Attention

    假設做閱讀理解時,\(Q\)可以是文章的詞向量序列,取\(K=V\)為問題的詞向量序列,則輸出即為所謂的Aligned Question Embedding.

    在本論文中,大部分的Attention都是自註意力(self attention),或稱內部註意力。

    所謂self attention其實就是\(Attention(X,X,X)\),其中\(X\)是輸入序列。也就是說在序列內部做Attention,尋求序列內部的聯系。論文的重要貢獻之一即是表明了內部註意力在機器翻譯(甚至是seq2seq)的序列編碼上是相當重要的,而之前關於seq2seq的研究基本都只是將註意力機制應用於解碼端。更準確來說,本文使用的是self multi-head attention.
    \[ Y=MultiHead(X,X,X) \]

  • Position Embedding

    上文提出的模型並不適合捕捉序列的順序。換言之,如果將\(K,V\)按行打亂順序,相當於在句子中將詞序打亂,則Attention的結果仍一致。這表明了,前述的Attention模型至多是一個精巧的“詞袋”模型。

    position embedding,也即是位置向量,將每個位置編號,然後每一個編號對應一個向量。通過結合位置向量和詞向量訓練,這樣就可以給每個詞引入一定的位置信息,attention也就可以分辨不同位置的詞了。

    position embedding是本文中註意力機制位置信息的唯一來源,構建position embedding的公式:
    \[ \left\{\begin{matrix} PE_{2i}(p)=\mathop{sin}(\frac{p}{10000^{\frac{2i}{d_{pos}}}}) \\ PE_{2i+1}(p)=\mathop{cos}(\frac{p}{10000^{\frac{2i}{d_{pos}}}}) \end{matrix}\right. \]
    將id為\(p\)的位置映射為一個\(d_{pos}\)的位置向量,這個向量的第i個元素的數值就是\(PE_{i}(p)\)。在該論文中,比較訓練而得的位置向量和上述公式計算出的位置向量,效果相近。但很明顯,通過公式計算的position embedding更易獲得。

    position embedding本身是一個絕對位置信息,但是在語言中,相對位置也非常重要,采用上式中的位置向量公式一個重要的原因是:
    \[ sin(\alpha+\beta)=sin\alpha *cos\beta+cos\alpha *sin\beta\cos(\alpha+\beta)=cos\alpha *cos\beta-sin\alpha *sin\beta \]
    這表明了位置\(p+k\)的向量可以表示成位置\(p\)和位置\(k\)的向量的線性變換,這提供了表達相對位置的可能性。結合位置向量和詞向量可以采用元素加拼接兩種方法,直覺上,元素加會帶來信息損失,但是該論文中的實驗表明兩者相差不大。

不足之處

Attention層的好處是能夠一步到位的捕獲全局信息,因為其直接吧序列兩兩比較(計算復雜度\(O(n^2)\))。但是由於是矩陣運算,計算量並不是非常嚴重的問題。相比之下,RNN需要一步一步遞推才能捕獲全局聯系,而CNN需要層疊擴大感受野。

  • 本文中專門命名一種Position-Wise Feed-Forward Networks,事實它是窗口為1的一維卷積
  • Attention雖然和CNN沒有直接聯系,但充分借鑒了CNN的思想,如Multi-Head Attention就是Attention做多次然後拼接,這類同於CNN中多個卷積核的思路是一致的,另外殘差結構也來源於CNN。
  • 無法對位置信息進行很好的建模,用這種純Attention機制訓練一個文本分類模型或者機器翻譯模型效果還不錯,但是用來訓練序列標註問題,效果應該不會太好。
  • 並非所有問題都是長程的、全局的依賴,有很多問題只依賴局部結構,論文中提及的restricted版的Self Attention假設當前詞只與前後r個詞發生聯系,因此註意力只發生在這2r+1個詞之間,這也就能捕獲到序列的局部信息(實際上這就是卷積核中的卷積窗口)

Transformer

該論文中Transformer完全摒棄了遞歸結構,依賴註意力機制,挖掘輸入和輸出之間的關系,使得計算並行。

技術分享圖片

  • Encoder: Transformer模型的Encoder由6個基本層堆疊而來,每個基本層包含兩個子層,第一個子層是一個Attention,第二個是一個全連接前向神經網絡,對著兩個子層都引入了殘差邊和layer normalization。
  • Decoder: Transformer模型的Decoder也由6個基本層堆疊而來,每個基本層除了Encoder裏面的兩個結構之外,還增加了一層註意力機制(Maksed Multi-Head Attention),同樣引入了殘差邊和layer normalization。

總結

註意力機制簡單來說就是給定一個查找(query)和一個鍵值表(key-value),將query映射到正確輸入的過程,輸出往往是一個加權求和的形式,而權重則是由query、key和value共同決定。

  • 在encoder-decoder attention層中,query來自前一個時間步的decoder層,而key和value是encoder的輸出,這允許decoder的每個位置都去關註輸入序列的所有位置。
  • encoder包含self-attention層,在self-attention層中所有的key、value和query都來自前一層的encoder,這樣encoder的每個位置都能去關註前一層encoder輸出的所有位置。
  • decoder中也包含self-attention層

前向神經網絡:這是一個position-wise前向神經網絡,encoder和decoder的每一層都包含一個前向神經網絡,激活順序為線性、ReLU、線性。
\[ FFN(x)=max(0,xw_1+b_1)w_2+b_2 \]
位置編碼:引入位置信息

Close to Human Quality TTS with Transformer

論文地址:Close to Human Quality TTS with Transformer

目前的語音合成系統仍然有兩個問題亟待解決:1)在訓練和推斷時低效率;2)使用RNN很難對長時依賴建模。受到機器翻譯研究中Transformer網絡的啟發,將“完全的Attention”嵌入到Tacotron2中。該論文中,使用多頭註意力機制取代Tacotron2中RNN結構和原始的註意力機制。利用多頭自註意力,能夠並行訓練編碼器和解碼器,從而提高了訓練效率。同時,不同時刻的兩個輸入被自註意力直接聯系起來,有效解決了長時依賴。這個Tacotron2改進版本添加了一個音素預處理的結構作為輸入,使用WaveNet作為聲碼器。

技術分享圖片

論文中整個結構如上圖,在Encoder Pre-Net之前,添加了一個Text-to-phone Convertor,論文的解釋是:英文單詞中,不同字母的發音有可能不同,如字母‘a‘,有可能發/ei/音,也有可能發/?/或/a:/音,之前依賴神經網絡學習這種發音規則,但是在數據集小的時候可能無法有效學習到,這裏就添了個前端,用規則直接轉成音素送入模型裏面。

  • Scaled Positional Encoding

    《Attention all you need》中的位置編碼,這裏不像《Attention all you need》中,為了引入位置信息直接和詞向量元素加,而是為位置向量添了一個可訓練的權重系數:
    \[ Attention\ is\ all\ you\ need:\ x_i=prenet(phoneme_i)+PE(i)\this\ version:\ x_i=prenet(phoneme_i)+\alpha PE(i) \]
    其中,\(\alpha\)為待訓練的權重系數。論文中給出的理由是:原空間是文本,而目標空間是mel頻譜,使用固定的位置向量會給編碼器和解碼器的pre-net帶來非常大的限制。

  • Encoder Pre-net
    \[ embedding(dim:512)\to 3conv(dim:512)\to batch\ normalization\to ReLU\to LinearProjection \]
    註意:在最後ReLU層之後添加了一個線性映射,主要是因為ReLU輸出的值為\([0,+\infty]\),而位置向量的每一維均位於\([-1,+1]\),不同的區間中心會損害模型的表現。

  • Decoder Pre-net

    訓練時,mel頻譜首先會進入2層的全連接網絡,這兩層的全連接網絡主要是為了將mel頻譜做embedding,像文本一樣映射到子空間,使得\(<phoneme,mel\ frame>\)對能夠處在相同的空間中,便於註意力機制發揮作用。實驗中,將全連接層的大小由256增至512時,非但沒有明顯的提升,反而使得收斂變慢,這可能是由於mel頻譜擁有小且低維的子空間,256的神經網絡層足以映射,過大反而使得模型復雜難以收斂。同樣,解碼器Pre-net之後,加一個線性映射,保持與位置向量相同的區間中心。

  • Encoder和Decoder

    分別將Tacotron2中編碼器的Bi-directional LSTM和解碼器的2-layer LSTM替換為Transformer中的編解碼器。論文中提到曾想將基於點乘的多頭註意力變成基於location-sensitive的註意力,但是發現訓練時間加倍並且容易爆內存。

  • Mel Linear, Stop Linear and Post-net

    由於stop token的樣本不平衡,解決方法就是在stop token的交叉熵損失上加個權,權重5.0~8.0.

  • 實驗

    實驗效果上,增加Transformer中Attention的層數和多頭註意力的頭數可以提高模型表現,但是會減慢訓練速度。

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

論文地址:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

論文宣稱將在本月(2018/10)放出模型和代碼:BERT model&code

本質是一個預訓練模型,效果驚人。該論文中,將預訓練模型分為兩種,一種是類似Word2Vec那樣,提取有效特征給模型用;另一種類似於ResNet在ImageNet上訓練完成之後作為Faster R-CNN的骨幹網那樣,直接作為下遊模型的骨架網絡,一個模型通吃所有任務。該論文中提出的方法是後者,預訓練的BERT使用額外的一個輸出層進行微調,即可獲得很多任務上當前最好表現。

  • 模型結構

    BERT的模型結構是一個多層雙向Transformer編碼器(基於上述Attention all you need中的實現)。

    技術分享圖片

  • 模型輸入

    技術分享圖片

    模型輸入:Token embedding + Segmentation embedding + Position embedding

  • 預訓練任務

    不適用傳統的從左至右或從右至左的語言模型來預訓練BERT,而是使用兩種新型的無監督預測任務。

    • Masked LM

      隨機遮蓋輸入token中的某些部分,然後預測被遮蓋的token,將這一過程稱作masked LM(MLM),在其它文獻中也稱作Cloze任務。由於[MASK]在微調時從未見過,因此每一次都確定用[MASK]替換要被遮蔽的token。而是隨機選擇15%的token,在這15%的token中,80%的概率會如上所述,被遮蓋掉;10%的概率該token被替換為另一個隨機的token;10%的概率不變。這樣Transformer就必須對每一個token學習一個分布式上下文表示(distributed contextual representation)

    • Next Sentence Prediction

      預訓練下一句的二分類任務,即選擇句子 A和B作為訓練樣本,B有50%的概率是A的下一個句子,50%的概率不是,要求模型學習判斷。這是由於許多下遊任務如QA和自然語言推斷(NLI)基於對兩個文本句子之間關系的理解,因此要訓練一個理解句子關系的模型。

  • 損失函數

    \[ loss=masked\ LM\ likelihood\ +\ mean\ next\ sentence\ likelihood \]

參考文獻

《Attention is All You Need》淺讀(簡介+代碼)

《Attention Is All You Need 》閱讀筆記

如何評價 BERT 模型?

最強NLP預訓練模型!谷歌BERT橫掃11項NLP任務記錄

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