李宏毅机器学习笔记——Transformer
李宏毅機器學習筆記——Transformer
本章主要是介紹了Transformer(全自注意力網絡):
1. 通過sequence-to-sequence模型中的RNN存在問題——不能并行計算,CNN替換可以解決一部分問題,但也存在缺陷。
2.由CNN缺陷引入了Self-Attention Layer來替代RNN的sequence-to-sequence模型——Transformer。
3.講解Self-Attention的基本原理與具體過程。
4.講解了一種叫做“多頭”注意力(“multi-headed” attention)的機制,進一步完善了自注意力層。
5.為了解決在Self-Attention中詞的順序信息是不重要的問題,而提出Position Encoding操作。
6.重點是Transformer的整體架構,Transformer采用了Encoder-Decoder框架,以機器翻譯為具體實例做了過程講解;
7.Attention visualization(可視化)與Transformer的實際應用和變形。
一、Transformer的引入
一般的sequence-to-sequence模型是用RNN(單方向或者雙向)來做,RNN輸入是一串sequence,輸出是另外一串sequence。RNN常被用于input是一個序列的情況,但是有一個問題——不容易平行化(并行化計算)。
例如下圖中左邊的模型就是RNN結構的sequence-to-sequence模型,(假設是單向RNN)想要求出b4就得先從a1輸入開始一步一步往后求,直到求出b4,而不能對a1,a2,a3,a4一起計算。(如下圖左側!)
解決辦法:為了能夠進行并行計算,于是提出了使用CNN代替RNN的方法,如上圖右側基于CNN的sequence-to-sequence模型:
(1)將三個vector的內容串起來與filter內部的參數做內積,得到一個數值,將filter掃過sequence,產生一排不同的數值。
(2)會有多個不同(顏色不同)的filter,產生另外一排不同的數值。
用CNN也可以做到和RNN類似的效果:輸入一個sequence,輸出一個sequence,表面上CNN和RNN都可以有同樣的輸入輸出。但是每個CNN只能考慮很有限的內容(三個vector),而RNN是考慮了整個句子再決定輸出。
(其實CNN也可以考慮更長的信息,只要疊加多層CNN,上層的filter就可以考慮更加多的信息。)
使用CNN的優點:可以并行化計算,全部的filter可以同時進行計算。
使用CNN的缺陷:是必須疊加多層filter,才可以看到長時間的信息,如果要在第一層filter就要看到長時間的信息,那是無法做到的。
那要怎么解決使用CNN的缺陷呢?我們引入了 一個新的想法:Self-Attention!
例如:隨著人工智能的不斷發展,機器學習這門技術也越來越重要,很多人都開啟了學習機器學習,本文就介紹了機器學習的基礎內容。
二、Self-Attention
2.1 Self-Attention具體原理及過程
首先我們知道Transformer是用Self-Attention Layer來替代RNN的sequence-to-sequence模型。Transformer模型在質量上更優越,同時更具可并行性,并且需要的訓練時間更少。
Self-Attention做的事情就是取代RNN原本要做的事情,Self-Attention Layer 與雙向RNN有同樣的能力,**每一個輸出都是看過整個input sequence,**并且 b1,b2, b3, b4 是可以同時算出來的,可以并行計算!如下圖:
Self-attention 的具體過程(Self-attention is all you need):
第一步:
輸入sequence x1-x4,通過乘上一個W權重矩陣來得到向量a1~a4,然后丟入Self-attention層,每一個輸入都分別乘上三個不同的transformation matrix(變換矩陣,是隨機初始化的),產生三個不同的向量 q,k,v。其中vector q,k,v分別代表:(如下圖)
q代表query,用來match其他單詞;
k代表key,用來被query匹配的;
v代表要被抽取出來的information。
第二步:
拿每個query q去對每個key k 做attention,我們這里用到的計算attention的方法是scaled dot-product Attention ,attention本質就是輸入兩個向量,輸出一個分數**(這個分數就是attention的體現)**。(做attention的方法有很多)
**除以根號d的原因:**d是q和k的維度,q和k做內積,所以q和k的維度是一樣的為d。除以根號d的直觀解釋為q和k做內積/點乘的數值會隨著維度增大 ,它的方差越大,所以除以根號d來進行平衡(防止梯度消失,d較大時,點積的值較大,相對差距也較大,導致最大值softmax→1,剩下的→0,兩端化,梯度更新時大的越大小的越小)。
第三步:
通過一個softmax函數(下圖右上角),將α11—α14變形得到一個新的α^ (11-14),然后用變形α^(11-14)分別乘以Vi 然后求和計算得到b1 。
下圖是計算b1的過程,其中是考慮了全部的sequence:
并且可以同時計算b2,b3,b4,同理可得:
self-attention做的和雙向RNN的事情是一樣的,只不過self-attention是可以平行計算的!整體流程如下圖:
那!self-attention和全連接有什么區別?
全連接:可以看做特征映射,其權重表示的是特征的重要度。
self-attention:并不是一種映射,其權重表示的是序列每個實體的重要度。
2.2 Self-Attention是如何并行計算的?(矩陣運算)
self-attention中所有的運算都可以利用矩陣來進行運算,因此我們就可以使用GPU來進行加速,極大的加快了我們的運算速度。(利用矩陣乘法運算來實現并行化)
用矩陣運算的形式來表現:
self-attention的第一步,矩陣運算就是將a1~a4拼起來作為一個matrix Ⅰ ,用 Ⅰ再乘以Wq 權重矩陣,一次得到matrix Q ,里面的每一列代表一個q。同理,將matrix Ⅰ乘以Wk權重矩陣
Wv權重矩陣,可以得到相應的matrix K 和marix V 。如下圖:
self-attention的第二步,拿query q去對每個key k做attention計算:將k1到k4串起來,組成矩陣K,之后轉置為KT ;再將q1到q4串起來組成矩陣Q ,具體過程如下圖:
self-attention的第三步,將做矩陣運算KT×Q=A,將A按列softmax之后(得到每個詞對于當前詞的相關性大小),就可得到新的A^,如下圖:
self-attention的第四步,把v1到v4串成矩陣V,將矩陣A^ 每一列分別和矩陣V點乘得到矩陣O,從而得到我們的一個輸出。如下圖所示:
最后,我們將所有矩陣運算整合起來,來回顧一下整個流程:
整個過程就是輸入序列I,輸出序列O,可以看到從輸入到輸出是一堆矩陣乘法,所以GPU可以很容易加速!
更簡化的分析:
2.3 Multi-Head Self-Attention原理
增加一種叫做“多頭”注意力(“multi-headed” attention)的機制(這個想法的來源是CNN能夠多通道output從而識別不同的模式),進一步完善了自注意力層,并在兩方面提高了注意力層的性能:
(1)擴展了模型專注于不同位置的能力
(2)給出了注意力層的多個“表示子空間”(representation subspaces),多頭注意力相當于多個不同的自注意力的集成。通過矩陣運算,原本的q,k,v實際進行了降維。
multi-head attention的兩種解釋:
multi-head attention給 h 次機會去學習 不一樣的投影的方法,使得在投影進去的度量空間里面能夠去匹配不同模式需要的一些相似函數,然后把 h 個 heads 拼接起來,最后再做一次投影。(有點類似CNN多通道輸出的意思)
多頭注意力機制允許模型在不同的表示子空間(representation subspaces里學習到相關的信息,每個head關注的地方不同,各司其職(不同模式)。如下圖:
注意:每個頭只能和對應的頭進行運算。比如:q(i,2) 只能和對應的k(i,2)以及k(j,2)進行運算。多頭計算的結果可以矩陣拼接起來,經過矩陣運算,保持和單頭的運算結果維度相同。如下圖:
總的來說,多頭注意力機制在保持參數總量不變的情況下,將同樣的query, key和value映射到原來的高維空間(Q,K,V)的不同子空間(Qo,Ko,Vo等)中進行自注意力的計算,最后再合并不同子空間中的注意力信息。
2.4 Position Encoding原理
在注意力機制中,詞的順序信息是不重要的,其思想是:天涯若比鄰。
為了解決這個問題,Transformer為每個輸入的詞嵌入添加了一個向量。這些向量遵循模型學習到的特定模式,這有助于確定每個單詞的位置,或序列中不同單詞之間的距離。這里的直覺是,將位置向量添加到詞嵌入中使得它們在接下來的運算中,能夠更好地表達的詞與詞之間的距離。
具體做法:
在原始paper中,ei是人手設置的,不是學習出來的。ei代表了位置信息,每個位置ei不同。paper中將ei加上ai得到一個新的vector,之后和Self-attention操作一樣。如下圖所示:
用one-hot編碼解釋加上ei的這個操作的合理性:
將 xi append一個one-hot向量pi,其運算結果就相當于上述過程(加上ei)。如下圖:
2.5 Seq2Seq with Attention
首先一般的seq2seq model 包含兩個RNN,分別是encoder和decoder,之后將RNN用self-attention替換,其他的操作與之前是一樣的。如下圖:
三、Transformer架構
基本框架(Encoder-Decoder):
更加具體一步的過程:
Encoder編碼器:
在 Encoder 中,Input 經過 embedding 后,要做 positional encodings
Encoder由N層相同的層組成,每一層包括2個sub-layers:
(1)第一部分是 multi-head self-attention,然后是做Add &Norm
(2)第二部分是 position-wise feed-forward network,是一個全連接層,接著也是做Add &Norm
注意:Add &Norm操作是殘差連接(輸入和輸出加起來)與Layer Normalization。(LayerNorm和BatchNorm的區別?)
注:
1.每個 sub-layer 的輸出做殘差連接 和 LayerNorm:
公式:LayerNorm( x + Sublayer(x) ) (Sublayer(x) 指 self-attention 或者 MLP);
殘差連接需要輸入輸出維度一致,不一致需做投影。簡單起見,固定每層輸出維度dmodel = 512。
殘差(防止梯度消失)圖解:
2.LayerNorm和BatchNorm的區別:
BatchNorm:對feature做norm;LayerNorm:對樣本做norm。
為什么LayerNorm用的多?時序數據中樣本長度不固定:
BatchNorm:切出來的有效部分是陰影部分,均值和方差抖動大,測試時遇到一個特別長的全新樣本 (最上方藍色陰影塊),訓練時未見過,(全局均值和方差)訓練時計算的均值和方差可能不好用。
LayNorm分析:LayerNorm 每個樣本自己算均值和方差,不需要存全局的均值和方差。(穩定!)
Q:不同的 feature 之間做 normalization 有意義嗎?LayerNorm 和 BatchNorm 的例子理解:n 本書!
BatchNorm:n本書,每本書的第一頁拿出來,根據 n 本書的第一頁的字數均值 做 Norm
LayerNorm:針對某一本書,這本書的每一頁拿出來,根據此書每頁的字數均值,自己做 Norm。
Decoder解碼器:
操作與encoder 類似,decoder 也是由N個相同的層組成,但每一個層包括以下3個sub-layers:
(1)第一個部分是 masked multi-head attention(表示attention時會注意到已經產生的sequence)
(2)第二部分是 multi-head attention (表示attend 到之前encoder的輸出)
(3)第三部分是一個 position-wise feed-forward network
注意:
1.上面三個部分的每一個部分,都有一個Add &Norm(殘差連接,后接一個 Layer Normalization)。
2.decoder 和 encoder 不同的地方在 masked multi-head attention。為什么要mask?
(1)decoder 是 auto-regressive 自回歸。當前時刻的輸入集 是 之前一些時刻的輸出。做預測時,decoder 不能看到 之后時刻的輸出。
(2)attention mechanism 每一次能看完完整的輸入,要避免這個情況的發生。
(3)在 decoder 訓練的時候,在預測第 t 個時刻的輸出的時候,decoder不應該看到 t 時刻以后的那些輸入。它的做法是通過一個帶掩碼 masked 的注意力機制。保證訓練和預測時 行為一致。
mask具體做法(和padding有結合的地方):
在機器翻譯任務中,編碼器(Encoder)對輸入句子進行編碼,將輸入句子通過非線性變換轉化為中間語義表示。解碼器(Decoder)的任務是根據中間語義表示和之前已經生成的歷史信息來預測未來時刻要生成的單詞。最終,解碼的特征向量經過一層激活函數為Softmax的全連接層之后得到表示每個單詞概率的輸出向量。
四、Attention Visualization
如左下圖attention的weight越大,線條越粗,attention的weight越小,線條越細,圖上兩兩word之間都會有attention。
如下右圖上部分可以發現it和animal的attention很大,因為這個it是指animal。下部分當把tired改成wide后,it表示street,這時候it和street的attention變成最大的了**(說明attention真的能學到上下文語義表示)**。
**多頭注意力機制的可視化:**不同的頭捕捉到了不同的句法。在multi-head attention中,每一組Q、K、V,它們的作用都不一樣,不同組Q、K、V的attention的可視化結果也不同。(如上圖紅色那組Q、K、V,表示attention下一個(或下幾個)word,綠色那組Q、K、V,表示attention一個時間段的word。)
五、Transformer應用
基本上原來可以做seq2seq的,都可以換成transformer!
(1)做summarization(摘要):訓練一個summarizer,input是一堆文章,output是一篇具有維基百科風格的文章。如果沒有transformer,沒有self-attention,很難用RNN產生10^3長的sequence,而有了transformer以后就可以實現。
(2)**另外的一個版本Universal transformer:**簡單的概念是說,本來transformer每一層都是不一樣,現在在深度上做RNN,每一層都是一樣的transformer,同一個transformer的block不斷的被反復使用。
(3)**圖像self-attention GAN:**讓每一個pixel都attend到其他的pixel,可以考慮比較全面的信息。
六、總結與展望
本章圍繞Self-Attention,其基本思想是計算不同部分的權重后進行加權求和,最后的效果是對attention的不同部分予以不同程度的關注。self-attention的基本計算基本都是矩陣計算,其最大的優點是不包含任何RNN、CNN結構,可以解決序列的長程依賴問題,同時矩陣計算可以因為并行化而非常快速。Transformer的(整體架構)Encoder和Decoder的結構詳解,需要注意的是:
(1)Add&Norm環節,使用了殘差網絡和Layer Normalization;
(2)解碼器中第一處注意力機制叫Masked多頭注意力,因為在機器翻譯中,解碼過程是一個順序操作的過程,當解碼第k個特征向量時,我們只能看到第k-1及其之前的解碼結果。
(3)解碼器中第二處注意力機制計算是Encoder-Decoder Attention,是用編碼器的最終輸出和解碼器自注意力輸出作attention。
(4)由于RNN系列的模型,無法并行計算;并且Transformer的特征抽取能力比RNN系列的模型要好。之后是Transformer的實際應用,基本上是可以使用seq2seq的都可以使用Transformer。在文章集摘要上表現得十分強大,以及會在圖像Self-attention GAN 結合,會有很好的效果!
參考博客:
1.2020李宏毅機器學習筆記——19. Transformer(全自注意力網絡)(作者:HSR CatcousCherishes)
2.Transformer模型結構詳解【小白必看】(作者:和你在一起_)
3.(B站)Transformer論文逐段精讀【論文精讀】(作者:BeBraveBeCurious)
總結
以上是生活随笔為你收集整理的李宏毅机器学习笔记——Transformer的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BAT批处理整人代码
- 下一篇: 李宏毅机器学习笔记:机器学习介绍