1. 程式人生 > 實用技巧 >自然語言處理(1):Transformer模型實現原理詳解

自然語言處理(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指代的是什麼。天吶,計算機要成神了!!!