自然語言處理(1):Transformer模型實現原理詳解
劃時代的產物
在2018年,谷歌推出了BERT模型之後,該模型在11項NLP任務中奪得STOA結果,引爆了整個NLP界。而BERT取得成功的一個關鍵因素是Transformer的強大作用。谷歌的Transformer模型最早是用於機器翻譯任務,當時達到了STOA效果。
Transformer改進了RNN最被人詬病的訓練慢的缺點,利用self-attention機制實現快速並行。並且Transformer可以增加到非常深的深度,充分發掘DNN模型的特性,提升模型準確率。在本文中,我們將研究Transformer模型,把它掰開揉碎,理解它的工作原理。
近期發現,在影象識別領域,Transformer表現出來的效果出乎意料的好,竟然有取代CNN的勢頭!
傳統的解決方案遇到的問題
傳統的RNN
- 傳統的RNN有依賴關係,不能實現並行,但是Transformer可以
- Self-Attention注意力機制來進行平行計算,在輸入與輸出相同
- 輸出的結果是同時被計算出來的,現在基本已經取代了RNN
模型對比
傳統的word2vec
-
使用詞向量模型,是預先對詞語訓練好詞向量,然後這個向量就不變了,然後去尋找文字中的詞,將其轉換為詞向量,再輸入到RNN中網路模型中。
但是呢,相同的詞在不同的語境中,表達的意思可能不同,例如:幹哈捏。
-
使用BERT模型,可以考慮到上下文的影響,在不同的輸入當中,對應詞向量也就不同了哦。太牛了吧!
如圖:兩句話中的it就是不同的,指代的意思也不同!
注意力機制的作用
提取特徵的時候,什麼是重點,就是去發現你的資料的重點在哪。如下圖,我們前面輸入了一個序列,當我不強調哪個詞重要,我得到的結果可能是平行的。
但是呢,這個判斷過程不是你認為加進去的,是交給計算機,讓他去判斷的哦!!!
在一句話中,每一個詞(中文是字),都會結合上下文判斷句子中其餘詞和自己關係的遠近,如圖,it中animal就關係影響很大:
self-attention如何計算
整體流程如下
①首先將x1、x2兩個詞進行編碼得到向量
②經過計算得到每個詞的三個特徵矩陣Q、K、V
Q:第一個詞做了啥貢獻、第二個詞做了啥貢獻,就要去查一查和第一個詞關係咋樣,和第二個詞關係咋樣。
K:被查的,q1和k1就是第一個詞的與第一個詞的關係,q1和k2就是第一個詞和第二個詞的關係。
V:每個關係都查到了,關係大的多點輸入,關係少的少點輸入,v1就代表x1的特徵表達,v2就代表x2的特徵表達,表示實際的特徵資訊
③回顧
計算q1·k1是使用內積計算的,當線性無關的時候就會垂直,即內積為0,當相關性越大,關係就越大哦!
④最終的value計算
softmax計算流程
分值->e^x->歸一化
計算每一個詞語對該詞語的影響權重,計算公式:
然後再計算對應詞的value與計算到的權重的乘積之和,就能得到第一個詞的影響力。如下圖所示:
⑤整體回顧
再次宣告:咱們的計算是並行加速計算的,即使用矩陣乘法(不是使用for迴圈,多low哦)!直接就出來了,是不是很牛批,嗚嗚嗚我愛線代❤️
multi-head(多頭機制)的作用
一個詞已經得到了一個q、k、v,參考卷積神經網路的卷積和與特徵圖,我們一組qkv得到了一種特徵表達,如果能有多種qkv,我們就能得到多種當前特徵的表達。
多頭不是越多越好,一般而言是8個。
堆疊在一起,得到最後的注意力!嘿嘿,機智哦寶貝!!!
這是兩個頭,圖中可以看到,和自己的注意力是挺大的,離得越遠可能就注意力會小一下
堆疊多層:經過多頭機制,一個不太好看的向量轉化為了差不多的向量,我們重複多次提取,得到最後好看的向量!
位置編碼與歸一化
位置編碼
在self-attention中每個詞都會考慮整個序列的加權,所以其出現位置並不會對結果產生什麼影響,相當於放哪都無所謂,但是這跟實際就有些不符合了,例如:我今天下午想去打球,肯定下午和打球是重點呀,於是我們希望模型能對位置有額外的認識。
這個人家已經寫好了,不用管太多,BERT是使用正弦週期變化來進行位置編碼。
歸一化
下圖所示,self-attention之後呢,有一個LayerNorm歸一化,但是,什麼叫對層進行歸一化??
LayerNorm就是沒有Batch概念了,對他的一組資料,使得均值為0,平方差為1。
虛線部分是連線,用的是基本的殘差連線方式,得到兩個資料,模型自己去選擇,至少不比原來差
整體梳理
多了Decoder-Encoder-attention機制
除了self-attention機制之外,BERT還加入了Decoder-Encoder-attention機制,充分利用資料的特徵,通過Q來從解碼器中查一查編碼器中的K、V對應的是啥。
加入了MASK機制(別透題)
比如使用機器翻譯,當前詞無法使用後面詞的資訊,但是又不得不考慮,因此我們引入MASK機制,前面有的我們就能用,後面沒有的我們就是當做黑盒子。
最終輸出結果
就是得到一個分類,經過Softmax層即可
效果展示
經過訓練,計算機可以知道it指代的是什麼。天吶,計算機要成神了!!!