Attention is all you need及其在TTS中的應用Close to Human Quality TTS with Transformer和BERT
論文地址: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\)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