Transformer到底解決什麼問題?

阿里妹導讀
本文希望圍繞“Transformer到底是解決什麼問題的”這個角度,闡述NLP發展以來遇到的關鍵問題和解法,透過這些問題引出Transformer實現原理,幫助初學者理解。
近期小組內發起AI技術的學習分享,單看 Transformer的相關資料太“幹”了,很難較快的理解其中的設計思路,本文希望圍繞“Transformer到底是解決什麼問題的”這個角度,闡述NLP發展以來遇到的關鍵問題和解法,透過這些問題引出Transformer實現原理,幫助初學者理解。
一、人工智慧的興起
1950 年,計算機科學之父阿蘭・圖靈(Alan Turing)發表了一篇劃時代的論文《計算機機械與智慧》,文中預言了創造出具有真正智慧的機器的可能性。由於注意到 “智慧” 這一概念難以確切定義,他提出了一個模仿實驗,有a、b、c 三個玩家,讓c來根據a b 的回答猜測a、b的性別。a的工作是來迷惑c 讓c儘可能錯誤,b的工作是來配合c 讓c儘可能正確;現在將a換成電腦,如果回答能和之前一樣,那麼說明計算機a通過了圖靈測試。
關於這個問題後來進一步演化,提出了著名的 “圖靈測試”:如果一臺機器能夠與人類展開對話(透過電傳裝置),且不能被參與測試的 30% 以上的人類裁判辨別出其機器身份,那麼則稱這臺機器具有人類智慧。
二、NLP發展
如果讓機器可以模仿人類,進行一些思考性的工作,那麼理解人類自然語言,那就是第一步。所以NLP自然語言處理是至關重要的一步。
規則模型
最早期的相關研究都是針對規則定義的模型,這些規則的定義必須耗費大量的人力,需要由專業的人去精心定製,而且隨著規則數的增加,不得不去處理一些衝突的問題。最重要的是它不能回答規則庫裡頭沒有的問題。但是它的優點是 由於規則都是專業的人去定義的,在某些特定的專業領域,它會表現的比較高效;花20%的人力就可以達到80%的成果。這種模型可以幫助我們解決很多重複性的工作,比如電商客服、電話機器人等。
但是如果我們想要一種通用模型,可以服務於各行各業呢?
基於統計方法的模型
在1980-1990這個年代,人們開始利用基於統計機率的模型。
基於馬爾可夫假設,一個詞語出現的機率,只和前面的n個詞語有關 而與更早的詞語或者往後的詞語都無關。
馬爾可夫假設原理:https://www.au92.com/post/markov-assumption/
因此自然就產生了二元模型(一個詞語出現的機率只和它前面的一次詞語有關) 和 n元模型(一個詞語出現的機率跟它前n-1個詞語有關),但是隨著n的增大你所需要記錄的機率分佈就會呈現指數倍的增加,這導致了n不可能無限放大;放到模型上,就是說不能有一個很長的上下文,這個就是典型的長距離依賴問題;
基於神經網路的模型
幾乎在同一時期,出現了基於神經網路的NLP模型,比如我們熟知的CNN(卷積神經網路)RNN(迴圈神經網路),神經網路啟發於我們人腦的工作邏輯,其中著名的hebbian理論闡述了人腦神經元的形態
又比如我們總習慣於順序背誦古詩,根據赫布學習規則(Hebbian theory),"同時啟用的神經元會強化彼此連線"。在順序背誦時,前一個詩句對應的神經元叢集啟用會透過突觸前增強(pre-synaptic facilitation)機制,促進後續詩句對應神經元的啟用,形成鏈式神經迴路。這種"預測-驗證"的神經活動模式已被fMRI研究證實。

RNN(迴圈神經網路)

一個神經元的輸出訊號可能是另一個神經元的輸入訊號,得易於這種結構,人腦在處理序列化和結構化資料時非常高效,RNN受這種結構的啟發,在序列化的資料處理方面獲得了很大的成就,一定程度上緩解了n元模型長距離依賴的問題,但是並沒有從根本上解決,同時它也帶來了自己新的問題,那就是梯度消失-爆炸。

什麼是梯度消失-爆炸

梯度消失:誤差訊號在反向傳播時越來越弱,導致模型學不會長期規律。簡單來說,RNN的梯度消失就像“傳話遊戲越傳越錯”。
反向傳播
反向傳播(英語:Backpropagation,縮寫為BP)是“誤差反向傳播”的簡稱,是一種與最最佳化方法(如梯度下降法)結合使用的,用來訓練人工神經網路的常見方法。
舉個例子:
正向傳播:三個人在玩你畫我猜遊戲,第一個人描述物品資訊傳給第二個人,再由第二個人描述給第三個人,第三個人說出畫的是什麼?
反向傳播:第三個人得知自己說和正確答案之間的誤差,發現他們在傳遞時的問題差在哪裡,向前面一個人說下次描述時可以怎麼樣更準確的傳遞資訊,就這樣一直向前一個人告知。
權重更新:在反向傳播的過程中,三個人的默契一直在磨合,然後描述的更加準確。
關鍵原因:RNN的“記憶鏈條”太長
RNN(迴圈神經網路)像一條不斷延長的鎖鏈,每個時間步(時刻)都在鏈子上加一節。比如處理句子 `我 昨天 吃了 一個 蘋果`,RNN會把每個詞依次連起來分析。
問題出在反向傳播:
當計算梯度時,RNN需要從最後一個詞(蘋果)一路回傳到第一個詞(我)。這個過程就像傳話遊戲:
– 第5個人說:“蘋果”(目標詞)
– 第4個人告訴第3個人:“誤差要調整0.1”
– 第3個人告訴第2個人:“誤差變成0.1×0.9=0.09”
– 第2個人告訴第1個人:“誤差變成0.09×0.9=0.081”
– …
如果每一步傳遞的誤差都在衰減(比如乘以0.9),經過多步後,開頭的詞(如“我”)收到的誤差幾乎為0,導致它無法被正確調整。

LSTM(長短期記憶網路)

簡單說就是 LSTM是給關鍵資訊開了個綠色通道。現有的翻譯軟體和語音助手很多也是使用了這個技術。
LSTM結構是專門為解決RNN在學習長的的上下文資訊出現的梯度消失、爆炸問題而設計的,結構中加入了記憶體塊。這些模組可以看作是計算機中的記憶體晶片——每個模組包含幾個迴圈連線的記憶體單元和三個門(輸入、輸出和遺忘,相當於寫入、讀取和重置)。資訊的輸入只能透過每個門與神經元進行互動,因此這些門學會智慧地開啟和關閉,以防止梯度爆炸或消失。
但是基於RNN的變種都會存在一個問題,由於模型在學習訓練過程中,依賴文字的輸入順序,必須按時間步順序計算,無法並行處理序列。
那麼我們可以做的更好嗎?
三、Transformer
引子
Transformer這個概念來自於Google研究團隊,在2017發表的一篇論文《Attention Is All You Need》,從釋出的名稱來看,這個理論將會統一NLP領域,從此以後只需Attention。。。
先講下什麼是 詞嵌入(Word Embedding)
將單詞向量化,對映為高維向量,使得單詞之間的語義關係,可以在向量空間中得以體現。同一語境下的詞語往往擁有相近的語義。
比如,可以把詞嵌入比作字典裡的每個詞有一個獨特的數字身份證,但這個身份證不是隨機的,而是根據詞的意思和用法生成的。相似的詞在數字空間裡位置相近。比如“貓”和“狗”都是寵物,它們的向量可能比較接近,而“貓”和“汽車”就離得遠。而這個向量地圖透過大量文字資料訓練得到的,模型學習詞語的上下文,比如Word2Vec、GloVe這些方法。例如,透過預測周圍的詞,模型調整詞向量,讓經常一起出現的詞向量更接近。
那麼是不是每次將詞語對映到向量空間都需要重新訓練模型呢,當然不是;訓練好的模型就像一個字典,比如貓狗雞鴨這些詞語無論在什麼語境下都非常接近,我們只需要透過查表的方式去完成對映就可以。但是如果是具備多語義的詞語我們該如何處理呢,那麼就引出了 Transformer;
什麼是Transformer
Transformer結構也是參考我們人腦的思維方式,我們人腦在獲取資訊時會選擇性的劃重點,忽略掉一些無關緊要的東西。比如“我是一個浙江杭州的程式設計師,我正在寫一篇關於Transformer分享的文章”,人類在看到這句話時的反應都會是 我在寫Transformer文章和浙江杭州有什麼關係呢?因此我們自然而然的會把注意放在程式設計師和Transformer上。
Transformer經典架構圖
上圖是論文中 Transformer 的內部結構圖,左側為 Encoder block,右側為 Decoder block。紅色圈中的部分為 Multi-Head Attention,是由多個 Self-Attention組成的,可以看到 Encoder block 包含一個 Multi-Head Attention,而 Decoder block 包含兩個 Multi-Head Attention (其中有一個用到 Masked)。Multi-Head Attention 上方還包括一個 Add & Norm 層,Add 表示殘差連線 (Residual Connection) 用於防止網路退化,Norm 表示 Layer Normalization,用於對每一層的啟用值進行歸一化。
舉例:用Transformer做中英翻譯
可以看到 Transformer 由 Encoder 和 Decoder 兩個部分組成,Encoder 和 Decoder 都可以有多個。
訓練一個模型的過程大體如下:
假設我們已經有一個訓練好的模型,Transformer 的預測工作流程大體如下:
Transformer工作原理

Transformer的輸入

單詞 Embedding
單詞的 Embedding 有很多種方式可以獲取,例如可以採用 Word2Vec、Glove 等演算法預訓練得到,也可以在 Transformer 中訓練得到。
位置 Embedding
因為 Transformer 不採用 RNN 的結構,而是使用全域性資訊,不能利用單詞的順序資訊,位置資訊對於 NLP 來說非常重要。計算公式如下:
用這個公式的好處是:能夠適應比訓練集裡面所有句子更長的句子、可以讓模型容易地計算出相對位置;

Transformer的核心機制:自注意力(Self-Attention)

意思就是它不依賴額外輸入的資訊,即它只統計單詞和其他單詞之間的注意力(相關性)。
自注意力機制可以讓模型在處理序列資料(比如一句話)時,動態關注不同位置的資訊。它的實現可以簡單理解為以下四步:
1.對每個輸入詞生成Q(query)、K(key)、V(value)向量。
2.計算每個Q與所有K的轉置,縮放後得到注意力分數。
3.用softmax歸一化分數,,即每一行的和都變為 1,得到權重。
4.用權重對V加權求和,得到每個詞的輸出。
最終的公式:
簡單地來講,假設我希望翻譯的話就是前圖的“我有一隻貓”,“我”的query向量q1發出疑問,詞“我”、“有”、“一隻”、“貓”對翻譯我都有什麼貢獻?這4個詞的key向量k1、k2、k3、k4分別跟q1進行相似性匹配;
具體為,先跟q1乘,得到的結果除以

,再進softmax函式,得到權重值,假設為w1、w2、w3、w4,他們分別去跟v相乘後相加,得到最終的z1 =w1v1+w2v2+w3v3+w4v4,z2同理。

多頭注意力 Multi-Head Attention

在上一步,我們已經知道怎麼透過 Self-Attention 計算得到輸出矩陣 Z,而 Multi-Head Attention 是由多個 Self-Attention 組合形成的,下圖是論文中 Multi-Head Attention 的結構圖。
Multi-Head Attention
從上圖可以看到 Multi-Head Attention 包含多個 Self-Attention 層,首先將輸入X分別傳遞到 h 個不同的 Self-Attention 中,計算得到 h 個輸出矩陣Z。下圖是 h=8 時候的情況,此時會得到 8 個輸出矩陣Z。換成人話來說就是我們矩陣圖中的Wq,Wk和Wv分別初始化了多個進行訓練;
多個 Self-Attention
得到 8 個輸出矩陣 Z1 到 Z8 之後,Multi-Head Attention 將它們拼接在一起 (Concat),然後傳入一個Linear層,得到 Multi-Head Attention 最終的輸出Z。
Multi-Head Attention 的輸出
可以看到 Multi-Head Attention 輸出的矩陣Z與其輸入的矩陣X的維度是一樣的。
上圖左為二頭的著色結果,同樣的”The animal didnt cross the street because it was too tired“這句話,我們想知道翻譯it的時候這個詞跟什麼詞有關,或者說哪個詞對於翻譯it更有效。
從二頭的著色結果來說我們從橙色知道it指代了The animal,從綠色知道it的狀態是tired,從五頭的著色我們可以知道it的更多資訊,這種關聯性可以在翻譯中給it更多的解釋角度。
舉例
在一句話中注意力往往要從多個角度進行分析,比如 “大學生“是考研這個單詞的主體,”除了“表示考研在這個句子中的角色,”上班、創業“都是考研這個詞替代;因此我們需要從不同的角度去進行學習,防止它們過度的相似。
我們可以給不同的注意力頭選擇不同的訓練任務,比如一些注意力頭去做完形填空,一些注意力頭去預測下一個句子,不同的注意力頭之間的訓練是並行的,基於Transformer架構可以高效的訓練超大規模的模型。
如下示例 每個頭都會關注到不同的資訊:https://colab.research.google.com/github/tensorflow/tensor2tensor/blob/master/tensor2tensor/notebooks/hello_t2t.ipynb#scrollTo=OJKU36QAfqOC

Add & Norm 層的作用

1.殘差連線緩解梯度消失問題,保留原始資訊。
2.層歸一化加速訓練,提高模型穩定性和泛化能力。在Transformer中,Add & Norm 層是模型能夠高效訓練和表現優異的關鍵元件之一。

Feed Forward的作用是

Feed Forward 層(也稱為前饋神經網路)的作用是對自注意力機制輸出的特徵進行進一步的非線性變換和特徵提取;
1.非線性特徵變換引入非線性啟用函式,增強模型的表達能力。
2.特徵增強對自注意力機制的輸出進行進一步處理,提取更豐富的特徵。
3.獨立處理每個位置專注於每個位置的特徵最佳化。
4.增加模型容量透過額外的引數提高模型的擬合能力。

Encoder

Encoder block 接收輸入矩陣 X(n×d) ,並輸出一個矩陣 O(n×d) 。透過多個 Encoder block 疊加就可以組成 Encoder。

Decoder

  • 包含兩個 Multi-Head Attention 層。
  • 第一個 Multi-Head Attention 層採用了 Masked 操作。透過 Masked 操作可以防止第 i 個單詞知道 i+1 個單詞之後的資訊。
  • 第二個 Multi-Head Attention 層的K, V矩陣使用 Encoder 的編碼資訊矩陣C進行計算,而Q使用上一個 Decoder block 的輸出計算。這樣做的好處是在 Decoder 的時候,每一位單詞都可以利用到 Encoder 所有單詞的資訊 (這些資訊無需 Mask)。
  • 最後有一個 Softmax 層計算下一個翻譯單詞的機率。

Transformer 總結

  • Transformer 與 RNN 不同,可以比較好地並行訓練。
  • Transformer 本身是不能利用單詞的順序資訊的,因此需要在輸入中新增位置 Embedding,否則 Transformer 就是一個詞袋模型了。
  • Transformer 的重點是 Self-Attention 結構,其中用到的 Q, K, V矩陣透過輸出進行線性變換得到。
  • Transformer 中 Multi-Head Attention 中有多個 Self-Attention,可以捕獲單詞之間多種維度上的相關係數 attention score。

參考:

  • https://github.com/datawhalechina/learn-nlp-with-transformers
  • https://tech.dewu.com/article?id=109
  • https://zhuanlan.zhihu.com/p/338817680
  • https://arxiv.org/pdf/1706.03762
程式碼智慧生成,AI編碼助手搭建攻略
隨著人工智慧技術的飛速發展,開發人員面臨著程式碼編寫效率和質量的雙重挑戰。為了提高程式設計效率、減少錯誤並加速創新,市場對智慧編碼助手的需求日益增長。本方案旨在介紹如何部署AI模型,構建一個基於私網的AI編碼助手,以輔助開發者高效完成程式設計任務。   
點選閱讀原文檢視詳情。

相關文章