本文是觀看B站視頻(傳送門:https://www.bilibili.com/video/av48285039/?p=92
)后做的筆記,一方面加深理解,另一方面方便日后復習的時候不用重頭再來。
transformer有一個非常出色的應用叫做BERT,下一篇將會說明BERT,我會在學習后做好筆記并把它上傳。
1.引入
在講transformer之前,我想提一下RNN,我們都知道RNN非常擅長處理這些input是sequence,但是它有個問題,不容易被平行化(單向信息流),也就是說每個word Embedding都不能同時計算,而需要按照順序執行。
那么現在就有人提出用CNN來代替RNN。
但是單層的CNN相比RNN考慮的序列有限,如上圖中它只考慮了4個vector。為了考慮更長的序列,這就需要增加CNN的層數,那么第二層的filter卷積核會將第一層的輸出Output當成它的Input。
CNN的優勢在于可以不需要等待第一個filter卷積核計算完成,自己才能進行計算,它達到了平行的狀態,也就是說所有的filter卷積核能夠同時進行計算。
而伴隨二樓的CNN的缺點就是必須要疊加很多層,以便為了得到上下文的更多信息,反之只能得到很少的范圍。
2.Self-Attention
那么為了解決這個問題,self-attention應運而生,它取代了RNN可以做的事情(Input是sequence,output也是sequence),它特別的地方是相比于RNN(需要按順序執行),如下圖b1到b4它是可以同時進行計算的。
下面將對self-attention以及multi-head attention的原理進行介紹,進而引出transformer模型
2.1Self-Attention從輸入到輸出到底發生了什么?(含詳細計算過程)
Self-attention出現在google發表的一篇論文名為Attention is all you need中(原文地址:https://arxiv.org/abs/1706.03762).
2.1.1q,v,k分別是什么,怎么產生的?
首先,這里的input是到
,然后通過Word Embedding再乘上matrix W變成
到
,然后把它們丟進self-attention 層中,這時候每一個input都分別乘上3個不同的matrix產生3個不同的vector,分別把它們命名為
。
代表的是查詢向量,query (to match others用來去匹配其它的向量)
代表的是地址向量,key (to be matched用來去被query匹配的向量)
代表的是內容向量,value(information to be extracted用來被抽取的信息的向量)
2.1.2用q和k做attention,得到α向量
現在要做的工作就是用每個query 去對每個 key 做attention(吃2個向量,輸出就是告訴你這2個向量有多么匹配或者可以說輸入兩個向量輸出一個分數(而怎么去吃2個向量output一個分數,有很多不同的做法))。
這里的公式被稱為 Scaled Dot-Product Attention 被縮放的點積 注意力,它是由向量與向量
做點積然后除以
,這里的
指的是
和
向量的維度。
至于為什么要除以,一種直觀的解釋是
和
的點積會隨著它們維度的增加,點積中相加的子項就越多,所以除以
(論文有注解。)(思考:如果這里的點積換成其他的方式,效果會不會更好?)
這里普及下點乘的幾何意義:
可以用來表征或計算兩個向量之間的夾角,以及在$b$向量在$a$向量方向上的投影
a·b>0 方向基本相同,夾角在0°到90°之間
a·b=0 正交,相互垂直
a·b<0 方向基本相反,夾角在90°到180°之間
2.1.3soft-max
接下來要做的是Soft-max,會將到通過Soft-max層得到biaozheng到 。
2.1.4得到輸出
我們用和每一個v相乘,和相乘加上和相乘。以此類推并相加,最終得到。
剛才說self-attention就是輸入一個sequence輸出一個sequence,現在我們已經得到了要輸出的sequence的第一個vector ,這時候的
,根據它的計算過程使得它考慮到了全部的sequence。
這里考慮一下得到的其他情況:
- 如果我們只想讓它考慮局部的信息,只要讓
和
得到值為0就可以實現。
- 如果我們只想讓它考慮最遠的信息,只讓
和
計算出值,其他沒有即可。
這就做到了想截取input哪部分的sequence,self-attention都可以實現它。
因為self-attention是可以同時進行計算的,那么self-attention可以在計算b1的時候同時計算、
、
,計算過程與
相同,他們這些表征向量是可以平行的計算出來。
2.1.5整體架構
如果以黑盒的角度看,self-attention的機制就是這樣的。
2.2self-attention進階版
下面根據2.1的內容,更詳細的說明self-attention每一步是怎么進行計算的。
2.2.1
分別是什么,怎么產生的?
整體思路:輸入信息,通過線性變換得到為查詢向量序列,鍵向量序列和值向量序列。
首先看第一行:
-
乘以matrix
得到
;
-
乘以matrix
得到
;
-
乘以matrix
得到
;
-
乘以matrix
得到
;
這時候我們可以把到
拼接起來作為一個matrix。概括一下將
到
整合為
,將
到
整合為
,整體為
=
,
代表每個位置的query。
同理,對于向量的計算同
向量。將
到
整體概括為
。整體為
。
對于向量的計算也同
向量。將
到
整體概括為
。整體為
。
2.2.2用q和k做attention,得到α向量;soft-max得到
之前說我們用每一個向量去和做attention,其實是做點積。
這里將做轉置與
點積,可以將
省去,讓式子更加簡化。
那么,
,
,
,在這個過程中我們發現所有式子都用到了
,那么這時候我們將
提取出來,將
到
疊放在一起成為一個matrix矩陣,那么這時候
乘以這個matrix矩陣,得到的結果是
到
的matrix矩陣。
同理,到的計算過程和一樣,和到組成矩陣相乘得到到,依此類推。
我們將到
組成的向量叫做
,
到
組成的向量轉置叫做
,他們之間相乘的結果為
,經過softmax得到
。
2.1.3得到輸出
現在按照之前的步驟,我們要得到,此時按照線性代數的公式,用
到
組成的矩陣
乘以
矩陣,即
的行去相乘相加
矩陣的每一列,第一次計算得到
,以此類推直到
。將
到
的向量組成矩陣
(也是整個self-attention層的輸出)。
2.1.4回顧
現在我們再將剛才的運算回顧一下,我們將到
組成的輸入叫做
(以下用
來指代),輸出
到
叫做
。下面我們梳理下從
到
這個過程之中,self-attention層做了哪些事情。
1.首先,我們將分別和三個不同的matrix相乘,
,
和
。我們得到了
到
向量組成的矩陣
,
到
向量組成的矩陣
,
到
組成的矩陣
。
2.然后,我們用矩陣和
的轉置
相乘(為了省去
,讓式子簡化),得到了
矩陣(attention矩陣),每個元素α代表的是input輸入的的sequence每個位置上的兩兩之間的attention(即概率分布)。
3.然后矩陣經過softmax計算,成為了
矩陣
4.最后,矩陣與
矩陣相乘就得到了輸出
矩陣。
Tips:我們發現self-attention中做的就是一連串的矩陣乘法,我們可以使用GPU進行加速計算。
3.Multi-head Self-attention 多頭自注意力機制
除了self-attention,現在還有多頭自注意力機制 Multi-head Self-attention。下面以2頭注意力機制作為說明。
多頭的關鍵之處就在于,分別將向量繼續細分為
。
這里的只和位置在1的
進行相乘,如
乘以
和
,得到
,然后經過soft-max的
,再和
,
相乘相加,最終得到
。
同理,同上
,最終得到
。
進行到這一步,這時候我們擁有了和,如果不想要和組成的矩陣的維度(這里是2),我們可以進行降維,得到。
這樣多頭的機制有什么好處呢?在論文中,不同的head它們關注的部分不同,這樣每個head會各司其職注意力集中于各自的區域,
(換句話說,多頭注意力(multi-head attention)是利用多個查詢Q = [],來平行地計算從輸入信息中選取多個信息。每個注意力關注輸入信息的不同部分,然后再進行拼接)
在模型中head的個數也是超參數,可以進行調優。
4.Transformer在此前的基礎上改進了什么?
我們這里有個問題,對于self-attention來說,它的Input的sequence是沒有順序的,這顯然不是我們想要的。
在Transformer的論文中,我們手動設定了位置編碼向量,它代表了位置信息,我們就可以知道某個
現在在哪個位置。
那么這里可能會有疑問,直接將位置向量和輸入向量
相加會不會導致向量混亂影響結果,這里對
的產生有一種解釋(與原論文不同,但是最后的公式一致):
在輸入的時候,每個輸入的
再加入一個用one-hot編碼的向量pi用來代表位置信息。
1.將和
進行拼接;
2.然后與(
分為
和
)相乘得到Embedding,
3.根據線性代數公式和
相乘,
和
相乘然后相加。
對比上面的式子,
和
相乘就得到
,
和
相乘然后相加就得到
。
而在原論文中比較匪夷所思的是,是人工設置的。
右邊的圖形就是的樣子。
4.1什么是Transformer?
Transformer就是seq2seq model with Attention。
4.2從Input到output發生了什么?
Encoding的時候所有輸入的序列的詞,兩兩進行attention,這些attention是平行的,有三層所以做三次。
Decoding的時候,不僅會attend之前已經輸入的部分還有已經輸出的部分。
4.3Transformer內部原理
一個seq2seq的model,左邊是encoder,右邊是decoder,希望輸入中文輸出是英文。
比如輸入的是機器學習
首先decoder給一個BOS的token,decoder輸出machine,然后將machine作為輸入,輸出learning,然后知道輸出句點,就結束了。
下面解釋下transformer內部發生了什么?
左半部分:
1.input通過一個input Embedding層變為vector;
2.vector會加上位置編碼進入block,這個block會重復N次;
3.block的第一層是multi-head attention,通過它會得到另一個sequence;
4.然后是add&norm,其中add是:將multi-head attention的輸出b和輸入a加起來b';norm是:將b'經過layer norm做layer normalization(詳情見http://www.lxweimin.com/p/c357c5717a60);
5.經過add&norm,vector會進入feed forward進行處理(簡單的全連接網絡,對每個position的向量分別進行相同的操作,包括兩個線性變換和一個ReLU激活輸出),然后再進行add&norm;
右半部分:
1.decoder的底部的output是由前一個向量計算產生的結果作為輸入;
2..同理。vector會加上位置編碼進入block,這個block會重復N次;
3.進入第一層,block的第一層是masked multi-head attention。這里的masked是attend on the generated sequence,意思就是decoder只會參加到已經產生出的sequence中(由于是序列生成過程,所以在時刻 i 的時候,大于 i 的時刻都沒有結果,只有小于 i 的時刻有結果,所以沒有產生出來的向量是不存在的,無法進行attention),然后進行add&norm;
4.之后進入一層 multi-head attention,它的輸入是之前encoder部分的輸出;
5.然后再與3.的輸出進行add&norm,之后進入feed forward進行處理,進入add&norm,然后是linear層(Linear層就是一個全連接網絡,作用是把decoder輸出的向量映射到一個大很多的logits 向量上。)
6.經過softmax計算后輸出分數最高的那個詞就是這一步的輸出。
4.4Transformer的應用場景
transformer的應用場景:
只要是可以用seq2seq,就可以用transformer