2021-11-28 沐神《transformer論文逐段精讀》

Transformer論文逐段精讀【論文精讀】筆記 - 嗶哩嗶哩 (bilibili.com)
Transformer論文逐段精讀【論文精讀】_嗶哩嗶哩_bilibili

1. 標題 + 作者(title & author)

8位作者都帶了星號,貢獻是一樣的哦。
文章末尾有說明,每位作者的分工。
200頁綜述(來自評論區(qū): https://arxiv.org/pdf/2108.07258.pdf )建議將Transformer作為基礎模型。

2. 摘要(abstract)

在主流的序列轉(zhuǎn)錄模型一般是依賴復雜的RNN或者CNN,一般使用encoder和decoder的架構?!咀ⅲ核^序列轉(zhuǎn)錄模型就是說給定一個序列生成另外一個序列。比如機器翻譯】。在性能最好的這些模型中,通常也會在endoer和decoder之間架設注意力機制。本文提出了一個新的簡單的架構,transformer,僅僅依賴于注意力機制,沒有使用RNN或者CNN?!局耙话愣家詎ovel的架構為佳,漸漸地變成simple為佳】做了機器翻譯的實驗,性能上表現(xiàn)非常,并行性更好,訓練時間更短,更好的BLEU分數(shù)。transofrmer任務還可以泛化到其他領域上。

3. 結論(conclusion)

transformer,第一個僅僅使用注意力機制的序列轉(zhuǎn)錄模型。在encoder-decoder使用了多頭注意力機制替換了RNN層。transformer架構,訓練更快更強,此架構應該不止可以用在文本上,圖片,視頻都可以推廣使用。
代碼放在https://github.com/tensorflow/tensor2tensor

4. 導言(introduction)

[基本是摘要前半部分的擴充]
第一段:在時序模型中主流的是LSTM/RNN,當輸出結構化信息比較多的時候,還會使用編碼器-解碼器架構。
第二段:

  • RNN的特點(缺點)
    在RNN中,給定一個序列,其計算方式是把序列從左往右移動,一步一步往前走,假設是個句子的話,就是一個一個詞的看,對第t個詞,RNN會計算一個輸出h_t,也稱為隱藏狀態(tài),h_t是有前面一個詞的隱藏狀態(tài)h_{t-1}和當前第t個詞本身決定的。即可將前面學到的歷史信息,通過h_{t-1}放到當下和當前的詞做一些計算后輸出。RNN就是通過這種機制有效處理時序信息,把之前的信息全部放在隱藏狀態(tài)里,依次往后進行。但是RNN的問題也出現(xiàn)在這里,1.RNN是時序即一個一個地執(zhí)行計算,難以并行,即計算h_t的時候,必須保證前面的h_{t-1}輸入完成了。無法并行,計算性能比較差。2.歷史信息是一步一步地往后傳遞,如果時序(步數(shù))比較長,早期的歷史信息會丟掉,如果不想丟掉,就需要h_t比較大,但是h_t比較大,每個步驟都存儲,內(nèi)存開銷會很大。當然后續(xù)做了很多改進,但是并沒有改變基本問題。
    第三段:attention在RNN上的應用。主要是用在如何把編碼器的東西很有效地傳輸給解碼器。
    最后一段:全新的使用注意力機制transformer,可以并行計算,更少的資源和時間即可訓練。

5. 相關工作(background)

第一段:如何使用CNN替換RNN來減少時序的計算。CNN用在時序存在的問題:卷積神經(jīng)網(wǎng)絡無法對較長的序列進行建模。(這是因為CNN計算的時候,每一次看一個一個比較小的窗口,比如3×3的像素塊,如果兩個像素離得比較遠,那么需要很多層卷積,一層一層上去才能夠最后把這兩個隔得遠的像素給融合起來。),
??如果使用transformer的注意力機制,每次可以看到所有的像素,所以一層就可以把整個序列全部看到,就沒有這個問題。但是CNN還有個優(yōu)點是,CNN可以做多個輸出通道,一個輸出通道去識別不一樣的模式,transformer使用Multi_Head Attention來模擬這種多輸出通道的效果
第后續(xù)段落:關鍵點:自注意力機制。自注意力機制并不是本文提出,但是transformer是第一個僅僅靠自注意力機制的encoder-decoder架構模型。
講清楚相關的工作有哪些,區(qū)別與聯(lián)系是什么。

6. 模型(Model Architecture)【chapter 3】

深度神經(jīng)網(wǎng)絡的論文最重要的一章。
第一段: 序列模型中現(xiàn)在比較好的是編碼器-解碼器架構。(接下來解釋什么是encoder,decoder)編碼器:將一個長為n(x_1,...,x_n)的東西(假設是一個句子的話,有n個詞,x_t就表示第t個詞),編碼器會將此序列表示為(輸出)一個長度也是n(z_1,...,z_n),z_t對應的是x_t的一個向量表示(如果是個句子,那么z_t就表示第t個詞的向量表示)。解碼器:拿到編碼器的輸出,生成一個長為m的序列,注意:nm是可以不一樣的,解碼器和編碼器不一樣在于,在解碼器中,詞是一個一個生成的。編碼器是一次性看到整個句子。但是解碼的時候只能一個一個生成)這是一個自回歸(auto_regressive)的過程(輸入又是輸出)。在最開始給定的z,生成第一個輸出y_1,在拿到y_1后可以去生成y_2,要生成y_t,可以把之前所有的y_1y_{t-1}全部拿到,即翻譯時,一個一個詞往外蹦。過去時刻的輸出可以是是當前時刻的輸入【那么RNN也是屬于自回歸的啦?】
好的論文要有優(yōu)秀的圖示結構。

image.png

左半邊是編碼器,右半邊是解碼器。“input embedding”是編碼器輸入,比如中文翻譯英文時的中文句子embedding,“output”是解碼器之前時刻的輸出,作為此刻解碼器的輸入?!皊hifted right”一個一個往后往右移。
編碼器:N個塊堆疊,具體內(nèi)部:multi-head attention,殘差&LN,前饋神經(jīng)網(wǎng)絡,殘差&LN。編碼器的輸出作為解碼器的輸入。
解碼器:其中一部分和編碼器結構相同,但是有一塊是“Masked Multi-Head Attention”,N個這樣的塊堆疊后,進入輸出層,softmax層輸出結果。
各模塊簡單標記

6.1 編碼器&解碼器

  • 編碼器
    由6個相同的layer組成。每個layer有兩個sub-layer:①multi-head self-attention;②position wise fully feed-forward network。 每個sub-layer都用了殘差鏈接,同時后面有LN,每個sub-layer的輸出是LayerNorm(x+Sublayer(x))。殘差鏈接需要輸入和輸出是一樣大小的,如果不一樣,還需要做投影。為了簡單起見,把每一個層的輸出維度變成512,固定長度表示,使得模型比較簡單。(這里和之前的CNN或MLP時是不一樣的,那時經(jīng)常把維度往下減,要么CNN的話是空間維度往下減且channel維度往上拉)
    簡單的網(wǎng)絡使得調(diào)參實際上只有兩個可調(diào),d_{model}=512N=6(layer的數(shù)量)
    • LayerNorm(文章中如果用了別人的東西,最好花幾句話講一下是什么,免得還要打開鏈接去看到底是個啥)
    • 通過LN和BN的對比來解釋一下什么是LN,以及變長的應用中不適用BN,而采用LN。
      二維情況:BatchNorm VS LayerNorm
      ??紤]最簡單的二維輸入情況:輸入是一個矩陣,每一行是一個樣本,每一列是一個特征(feature)。BN做的操作:把每一個列即每一個特征在一個mini-batch里的均值變?yōu)?方差變?yōu)?(減去向量本身的均值,再除以方差即可),注意訓練時計算均值是在mini-batch里此向量算均值和方差,預測時計算所有數(shù)據(jù)全局的均值和方差,BN還會學習一個α和β,把此向量通過學習可以放成一個任意方差和均值的向量(BN和dropout在預測和訓練時的區(qū)別)。LN做的操作:是對每一行即每一個樣本進行均值為0,方差為1的操作,其他與BN操作一致。
      RNN或transformer的輸入是三維情況,是一個序列。
      三維情況下的LN和BN
    • 為什么RNN/transformer中使用LN?
      BN切出來的結果,有效的是陰影部分,其余是 0

      遇到一個超長的樣本,效果可能不好

      LN切出來的結果,樣本內(nèi)進行均值方差計算

①在持續(xù)的序列模型里面,每個樣本的長度可能會發(fā)生變化,比如機器翻譯,句子/單詞可長可短,短的會在后面補零。BN是跨樣本計算同一特征的均值和方差,如果樣本的長度變化非常大,那么每次的mini-batch計算得到的均值方差的抖動可能會非常大;且預測時候是將全局的均值和方差記錄下來,那么全局的均值方差如果遇到一個很長很長的樣本,那么模型的表現(xiàn)很可能就不盡人意了。而LN來說,是每個樣本自己的特征來計算均值和方差,也不需要存一個全局的均值方差,故不管樣本長還是短,均值都是在樣本自身里計算的,相對穩(wěn)定一些。
②另一篇文章解釋LN:從梯度歸一化等角度解釋LN的有效性,( LayerNorm是Transformer的最優(yōu)解嗎?_夕小瑤的賣萌屋-CSDN博客

  • 解碼器
    同樣由n=6個layer組成,每個layer同樣有encoder的兩個sub-layer,但是解碼器還多了第三個sub-layer,這個sub-layer同樣是多頭注意力機制+ResNet+LN,但是區(qū)別在于是“Masked-Multi-Head attention”
    (前文提到,解碼器做的是自回歸的過程,即當前時刻的輸出的輸入集是上面一些時刻的輸出,意味著在做預測時候是不可以看到當前之后那些時刻的輸出,但是注意力機制中每次是可以看到完整的輸入的,為了避免這種情況發(fā)生,即保證解碼器訓練時,在預測第t個時刻的輸出的時候其不應該看到t時刻以后的那些輸入,
    文章的做法是通過一個帶掩碼的注意力機制,保證了輸入進來時,t時間是不會看到t時間以后的那些輸入,從而保證訓練和預測時候的行為是一致的。

這里保證訓練和預測行為一致是怎么得到的???

6.2 注意力機制(attention)

第一段,attention的一般化介紹。注意力函數(shù)是將Query和Key-Value對映射成一個輸出的函數(shù)。output是value的一個加權和,即輸出的維度和value的維度是一樣的。


給定一個query,與其中一個key較為相似,那么其權重就會更大,不同的query由于其相似的key不同會導致輸出不一樣

value的權重是此value對應的key和查詢query的相似度得來的。

6.2.1 Scaled Dot-Product Attention (3.2.1)

query和key是等長的d_k,value的長度是d_v。計算query和key做內(nèi)積,(兩個向量做內(nèi)積,內(nèi)積越大,余弦相似度越大,如果為0則二者垂直),內(nèi)積再除以\sqrt{d_k}(向量的長度),再用softmax計算權重,得到n個非負的和為1的權重(假設一個query,有n個k-v對)。
實際計算中,query作為一個矩陣,與k矩陣相乘,除以\sqrt{d_k}后進入softmax,最后乘以V。

Q,K,V的矩陣運算

其他注意力機制:常見兩種:加型注意力機制,另一種點積注意力機制。點積注意力機制和本文的區(qū)別就在于除以了\sqrt{d_k},原因是:
??當d_k不大時候,除不除沒關系,但是當d_k比較大,也就是說兩個向量(Q和K)的長度比較長的時候,做點積結果會比較大也可能比較小,當結果比較大的時候,之間的相對的差距就會變大,導致最大的那個值在softmax之后會更加靠近于1,剩下的值就會更加靠近0,即:softmax的結果會更加向兩端靠攏,這樣的情況下計算梯度,會發(fā)現(xiàn)梯度會比較?。ㄒ驗椋?img class="math-inline" src="https://math.jianshu.com/math?formula=softmax" alt="softmax" mathimg="1">最后的結果就是希望模型的預測值,置信的地方盡量靠近1,不置信的地方盡量靠近0,如此認為模型接近了收斂,此時梯度會變得比較小,模型的優(yōu)化就會跑不動),而transformer中d_k比較大(512),故除以\sqrt{d_k}比較合適。
標準化的點積注意力機制

??上圖中的MASK,主要是避免在第t時間的時候看到以后時間的東西,具體講:假設querykey是等長的n,而且時間上是能對應起來的,對于第t時刻的q_t,在計算時應該只看k_1k_{t-1},不去看k_t及其之后的內(nèi)容。給不該看的部分給予一個權重為極大的負數(shù),這樣進入softmax后,這些就會接近于0.

6.2.2 多頭注意力(3.2.2 Multi-Head Attention)

與其我做一個單個的注意力函數(shù),不如把整個querykey,value投影到低維,投影h次,然后做h次的投影函數(shù),每一個函數(shù)的輸出把它并在一起,然后再投影來會得到最終輸出。下圖演示效果:

多頭注意力

V,K,Q,進入一個線性層(線性層就是投影的比較低的維度),再做一個Scaled Dot-Product Attention,做h次,將h個向量并在一起,最后做一次線性投影,得到結果。

為什么要做多頭注意力機制呢

如果我們回過頭來看dot-product的注意力的話,會發(fā)現(xiàn)里面沒有什么可以學的參數(shù),其具體函數(shù)就是內(nèi)積,但有時候為了識別不一樣的那些模式,我希望你可能有一些不一樣的計算像素的辦法,如果你用的是加性attention的話,那里面其實還是有一個權重的可以用來學習,也許是可以學到一些東西。但是對于點積attention,可以如此:先投影到低維,那么投影的w是可以學的(即給模型h次機會,希望其學到不一樣的投影的方法,使得在投影進去的那個度量空間里面能夠去匹配不同模式需要的一些相似函數(shù),最后把這些東西回來,再做一次投影),跟之前說的在卷積神經(jīng)網(wǎng)絡里面有多個輸出通道的情形有些像。具體公式:

image.png

實際使用中,h=8,投影的維度為d_k=d_v=d_{model}/h=64,在此64維投影空間計算注意力函數(shù),最后再投影回來。如何用矩陣實現(xiàn)上述公式中的很多小矩陣運算?

6.2.3 transformer中如何使用注意力機制(Application of Attention in our Model)

  • ① 編碼器中的注意力機制:
    編碼器的輸入:假設句子長度是n的話,那么其輸入是n個長為d的向量(假設p_n大小設置為1了)。注意力層有三個輸入(Q,K,V),但是圖中可以看到,是同一個輸入復制了三份,就是說此處的Q,K,V是一個東西(故稱為自注意力機制),輸入了nquery,那么每個query會拿到一個輸出,則會有n個輸出,且輸出和長度是一樣的,維度都是d,即輸入和輸出都是n×d,計算過程見前文。 不考慮多頭和投影的情況,輸出其實就是輸入的加權和,權重來自于本身跟各個向量的相似度。多頭和投影情況下,會學到h個不一樣的距離空間出來。輸出則和純粹的單注意力機制會不一樣。
  • ② 解碼器的第一個注意力機制(下方的注意力塊)
    輸入也是Q,K,V一樣,只是不是n而是m,主要計算過程和編碼器一樣,但是有一個MASK操作,只看到k_t以前不包括k_t的數(shù)據(jù),詳見前文描述。
  • ③ 解碼器的第二個注意力機制。
    首先輸入的Q,K,V不同,keyvalue是來自于編碼器的輸出,query是來自于解碼器下方的輸出。此時權重的計算為解碼器輸出作為的query去和編碼器的輸出作為的key去計算相似度作為權重,在和value計算得到注意力分數(shù),即此attention做的事情是:有效的把編碼器里面輸出根據(jù)相似度給拎出來。根據(jù)解碼器的輸入不一樣,根據(jù)當前的向量去編碼器的輸出中挑出感興趣(對應)的內(nèi)容出來。
    三個attention

6.3 Position-wise Feed-Forward Networks

其實就是全連接神經(jīng)網(wǎng)絡層(MLP),但是不一樣的是,()position是指輸入序列中每個詞,即MLP對每個詞作用了一次,說白了就是MLP只是作用在最后一個維度。
注意力層的輸出為512,那么公式中的x就是一個512的向量,w_1會把512投影成2048,即維度擴大四倍。因為最后有個殘差鏈接,還得投影回去,故w_2又把2048投影回512,說白就是個單隱層的MLP。如果用pytorch實現(xiàn),兩個線性層放在一起就可以了,不需要改任何參數(shù),因為pytorch的輸入是3D時,其計算默認就是在最后一個維度做計算。

FFN

image.png

attention起的作用:把整個序列里面的信息抓取出來,做一次匯聚aggregation,注意力的輸出中已經(jīng)有了序列中感興趣的內(nèi)容,信息已經(jīng)抓取到,在做投影,MLP時,映射到我更想要的語義空間的時候,由于每個attention的輸出已經(jīng)包含序列信息,所以MLP對每個點獨立做即可。
對比RNN:RNN的輸入是向量,對于第一個點,其實就是做了一個線性層MLP,直接出去即可,下一個點,時序信息(綠色)上一時刻的輸出和輸入(藍色)一起并入,如此完成了歷史信息的傳遞。
二者雖有區(qū)別,但是關注點都是在于如何利用序列信息。

6.4 Embeddings and Softmax

embedding:輸入是一個個的詞,或者叫詞源叫token,我需要把它映射成一個向量,embedding就是說給任何一個詞,學一個一個長為d的向量表示它。本文中d就是512啦。
transformer的三個embedding:編碼器輸入,解碼器輸入,softmax前面的線性也需要embedding。
三個embedding權重一樣,且把權重乘以了\sqrt{d_{model}},因為在學embedding的時候,多多少少會把向量的L2 Norm學成相對比較小的,比如說1,即不管維度多大,最后的值都會等于1. 即維度一大,學到的權重值就會變小,但是之后加上的位置編碼(position encoding),位置便編碼并不會隨著長度變長,是把long固定住的。所以權重乘以\sqrt{d_{model}}之后,使得位置編碼和embedding相加的時候,二者具有差不多的scale,相當于做了一個hat?!具@里沒明白】

6.5 position encoding

attention并不具有時序信息,輸出是value的加權和,權重是query和key的距離,和順序(序列信息)是無關的,一句話打亂順序前后的attention值是一樣,這樣的情況在處理時序信息是有問題的。
故而,transformer在輸入中加入時序信息,即位置編碼。
(RNN是上一時刻的輸出作為下一個時刻的輸入來傳遞歷史信息)

位置編碼的計算

思路:舉例:計算機表示數(shù)值,32bit二進制,可以理解為長度為32的向量表示。而transformer中,一個詞在嵌入層會表示成512的向量,同樣再使用512維的向量表示詞的位置,用周期不一樣的sin/cos函數(shù)的值算出來的。二者相加,就完成了給attention添加時序信息。
?位置編碼是cos/sin函數(shù),在+1和-1之間抖動,輸入的embedding乘以\sqrtu0z1t8os,使得每個數(shù)字也差不多在+1和-1之間。

為什么使用自注意力機制(chapter 4)

四種Layer比較(復雜度,順序依賴的計算[越少越好],)

三個維度:① 復雜度;②順序的計算:下一步計算必須要等前面多少步計算完成,越不需要等,那么并行度就越高; ③ 信息從一個數(shù)據(jù)點到另外一個數(shù)據(jù)點要走多遠,越短越好。

  • 自注意力層:① n是序列的長度,d是向量的長度。self-attention的矩陣運算:query×key,q和k都是n×d維度。③矩陣計算,并行度很高,認為O(1)
    ③ 任何query和任何k-v對只要一次就可以
  • RNN層:① 序列長為n,就一個一個做運算,每個里面計算時d×d的矩陣再乘以n的輸入。 ② n個步驟都是一次依賴的 ③ 最初到最后,需要走過n步
  • CNN層:①序列上的用的1d的卷積,k為kernel數(shù),n是序列長度,d是輸入/輸出通道數(shù)。② 并行度非常高 ③ 每次一個長為k的窗口,k以內(nèi)可以一次傳遞,超過k需要多層,一層一層地傳遞
  • 自注意力層(受限)query只和最近的r個鄰居進行計算,這樣復雜度就降低了(① 提升)。但是舉例比較長的點,就需要多走幾步才能完成傳遞(③犧牲)
    得與失使用了attention后,對長數(shù)據(jù)的處理更好,而且算的也不慢,但是實際上,由于attention對模型的假設做的更少,導致需要更多的數(shù)據(jù)和更大的模型才能訓練出RNN/CNN同樣的效果。

7. 實驗(chapter 5)

英語-德語。WMT 2014的數(shù)據(jù),使用byte-pair encoding:每個詞有各種變化形式,如果每個形式都單獨做成一個詞,他們之間的區(qū)別模型就無法獲知了,且會造成詞典太大。bpe做的是把詞的詞根提出來,詞典可以較小。并且英語和德語共享一個字典,好處:編碼器和解碼器可以使用同一種embedding,即編碼器和解碼器共享權重。

優(yōu)化器使用adma,
學習率公式計算:


學習率計算

正則化:每一個子層的輸出上,進入殘差前和進入layernorm之前,加了dropout(0.1),輸入:加上詞嵌入和位置編碼時,也加了dropout(0.1)
label smoothing,將softmax的輸出為0.1時,即可認為是正確的。(置信度為0.1),這里會損失困惑度(perplexity)可理解為模型不確信度。

8. 評論

寫作非常簡潔,沒有用什么寫作技巧,基本就是提出了什么模型,模型長什么樣子,跟RNN/CNN比,結論是什么。不推薦這樣寫,而是:可以選擇把自己的東西減少一些,甚至把一些東西不那么重要的東西放到附錄里面,建議正文最好講個故事,為什么做這些事情,設計理念是什么樣的,整個文章的思考是什么樣子的,這樣會讓大家認為文章比較有深度一些。
transformer架構作為一種類似CNN的一種基礎架構,應用非常廣泛,有影響力。同樣一個模型能在許多領域使用。transformer能夠融合多模態(tài)的數(shù)據(jù)。
attention主要在模型起了一部分作用:把整個序列的信息給聚合起來,后面的MLP,殘差是缺一不可的;attention根本沒有對序列順序建模但是效果卻比CNN/RNN效果好,現(xiàn)在認為,attention使用了一個更廣泛的歸納偏置,使得它能處理更一般化的信息。從而使得attention并沒有做任何空間上的假設,他也能夠跟CNN甚至比CNN取得更好的一些效果,但是代價是假設更一般,造成對數(shù)據(jù)的信息抓取能力變?nèi)?,所以transformer的模型都是非常大

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
禁止轉(zhuǎn)載,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容