十分鐘瞭解Transformers的基本概念

多年來,咱們一直在使用RNN,LSTM和GRU解決順序問題,您忽然但願咱們將其所有丟棄嗎?嗯,是!!全部這三種架構的最大問題是它們進行順序處理。並且它們也不擅長處理長期依賴關係(即便使用LSTM和GRU的網絡)。Transformers 提供了一種可並行處理順序數據的方式,所以,它不只比之前的體系結構快得多,並且在處理長期依賴性方面也很是出色。web

那麼什麼是 Transformers?

這看起來很恐怖,不是嗎?若是我告訴您全部這些均可以歸結爲一個公式,是否是就簡單一些了?
數據庫

Attention(Q, K, V) = ∑ᵢ (Similarity (Q, Kᵢ) * Vᵢ)微信

是的, 上圖的複雜體系結構所作的一切,都是爲了確保此公式正常運行。那麼這些Q,K和V是什麼?這些不一樣類型的注意力是什麼?讓咱們深刻研究!咱們將採用自下而上的方法。網絡

輸入/輸出的嵌入

這些能夠是Word2Vec,GloVe,Fastext或任何類型的詞嵌入,咱們能夠在其中將文本轉換爲某種形式的有意義的向量。(PS-單詞嵌入沒有上下文。每一個單詞只有一個固定的嵌入)架構

位置編碼(PE):

在RNN(LSTM,GRU)中,時間步長的概念按順序編碼,由於輸入/輸出流一次一個。對於Transformer,做者將時間編碼爲正弦波,做爲附加的額外輸入。這樣的信號被添加到輸入和輸出以表示時間的流逝。ide

pos是單詞的位置i是這個向量的維數。也就是說,PE的每個維度對應一個正弦曲線。波長以幾何級數的形式從2倍級到1萬·2倍級。對於偶數(2i)咱們使用正弦,對於奇數(2i + 1)咱們使用餘弦。經過這種方式,咱們可以爲輸入序列的每一個標記提供不一樣的編碼,所以如今能夠並行地傳遞輸入。這個博客(https://kazemnejad.com/blog/transformer_architecture_positional_encoding/)很好地解釋了PE背後的數學原理。
學習

可是,最近的體系結構使用的是「學習的」 PE,而不是能夠推廣到任意長度序列的PE。並且效果很好。也就是說,他們不須要將序列推廣到比訓練中看到的序列更長的序列。那是由於這些模型的輸入大小是固定的(例如BERT的512個令牌)。所以,在測試期間,他們不會看到更長的序列做爲輸入。測試

注意力的類型

編碼器自注意力搜索引擎

這是一種雙向注意(也是惟一一種雙向注意力機制,這就是爲何它是BERT中使用的惟一注意力類型),其中每一個單詞都彼此關聯。它確實捕獲了一個句子中的雙上下文信息,甚至bi-LSTM也沒法捕獲(由於bi-LSTM將Forward AR和Backward AR的結果結合在一塊兒,而不是在其核心生成雙上下文信息。這也是從本質上有些人認爲ELMo嵌入不是真正的雙向的緣由。
編碼

這種關注的主要目的是在輸入中全部其餘單詞的基礎上,根據每一個單詞在其上下文中的重要性加權,提供按比例表示。

解碼器自注意力

Transformer中的解碼器本質上是自迴歸的,也就是說,輸出中的每一個單詞都與其全部先前的單詞相關聯,但在進行預測時不與任何未來的單詞相關聯(AR也能夠相反,也就是說,給定未來的單詞 ,預測前一個字)。若是將其與未來的單詞聯繫起來,最終將致使數據泄漏,而且該模型將沒法學到任何東西。

編碼器-解碼器注意:(交叉注意而不是自注意)

使用注意力的目的是找到輸入中全部單詞的當前輸出單詞的連接。基本上,咱們試圖在這裏找到的是每一個輸入字對當前輸出字的影響。

經過僅使用最後一個解碼器層中的「查詢」部分以及使用編碼器中的「鍵和值」部分,能夠作到這一點。(由於Query用做所考慮單詞的表示形式,Key是全部單詞的表示形式,而且用於查找全部單詞相對於所考慮單詞的權重,Value也是全部單詞的表示形式,但 用於找到最終的加權和)

下面的GIF很好地總結了全部三種類型的注意力。

查詢(Q),鍵(K)和值(V)

查詢,鍵和值的概念來自檢索系統。例如,當您鍵入查詢以在YouTube上搜索某些視頻時,搜索引擎將針對數據庫中與候選視頻相關的一組鍵(視頻標題,說明等)映射您的查詢,而後向您顯示最匹配的視頻(值)。

Q,K和V基本上是原始單詞嵌入之上的線性層,可減少原始單詞嵌入的尺寸(爲何要縮減?我稍後會討論緣由)。咱們已經將原始單詞嵌入投影到了三個不一樣的(也許是相同的)低維空間中。

基本上,這樣想。每當您須要查找兩個向量之間的類似性時,咱們只需獲取它們的點積便可。爲了找到第一個單詞的輸出,咱們只考慮第一個單詞的表示形式Q,並將其點積與輸入中每一個單詞的表示形式K取乘積。這樣,咱們就能夠知道輸入中每一個單詞相對於第一個單詞的關係。

取點積後,咱們將結果除以sqrt(dᵏ),其中dᵏ是向量K的維數。這樣作是爲了穩定梯度,由於點積可能很是大。

咱們將上述值的softmax歸一化。這樣作是由於如今將這些術語視爲每一個單詞相對於第一個單詞的權重。

還記得我在帖子開頭所說的話嗎?那個Transformers就是關於∑ᵢ(類似度(Q,Kᵢ)*Vᵢ)的。好了,咱們如今已經完成了方程的∑ᵢ類似度(Q,Kᵢ)部分。如今,咱們有了一個分佈,該分佈描述了輸入中每一個單詞相對於第一個單詞的重要性。

爲了使方程完整,咱們將權重(softmax)與相應的表示V相乘,而後將它們加起來。所以,咱們對第一個單詞的最終表示將是全部輸入的加權總和,每一個輸入單詞均經過相對於第一個單詞的類似性(重要性)加權。

咱們對全部單詞重複此過程。以矢量形式,咱們能夠用下面給出的方程式來表示它。

下圖很好地總結了整個過程。(稍後我會講到mask遮罩,它只出如今解碼器部分)

多頭注意力

直到如今,咱們的談話都是關於單頭的注意力的。單頭注意力可以將注意力集中在特定的一組單詞上。若是咱們想擁有多個集合,每一個集合對不一樣的單詞集合給予不一樣的關注呢?(有點相似於咱們所作的集合體,有多個相似的模型,但他們每一個人都學習不一樣的東西)一旦咱們有多個擴展點積的注意,咱們鏈接結果,多個權重矩陣(所以每一個頭能夠基於其重要性加權)來產生最終的輸出Self-Attention層。

有一個問題仍然沒有獲得回答。爲何Q、V和K須要被降維向量,即便這樣可能會致使原始單詞的信息丟失?答案就是多頭的自我注意力。假設來自Word2Vec的嵌入輸入是(1 x 512),而且咱們有8個頭注意力。而後咱們保持Q K V的維數是1x(512/8)也就是1x64。這樣,咱們就能夠在不增長任何計算能力的狀況下使用多頭注意力。如今,它學習了24種不一樣的權重,而不是僅僅3種。

自我注意力的mask遮罩(僅適用於解碼器):

Transformers解碼器本質上是自迴歸的,由於若是咱們讓它在自我注意的過程當中看全部的單詞,它就學不到任何東西。爲了不這種狀況,咱們在計算自我注意的同時,在序列中隱藏將來詞。

一旦咱們計算出序列中全部單詞的縮放分數,咱們就應用「向前看」遮罩來得到遮罩分數。

如今當咱們計算隱藏分數的softmax時,負無窮被歸零,留下零的注意力分數給序列中全部將來的記號。

總結一下(6個簡單要點):

經過剛纔的介紹,咱們對Transformer的全部構建塊都很是熟悉,那麼如今該對它們進行總結了!到如今爲止作得很好。:)

一、將輸入序列中全部單詞的單詞嵌入添加到它們各自的位置編碼中,以獲取咱們的Transformer的最終輸入。

二、Transformer是一個Seq2Seq模型,所以它由編碼器和解碼器兩部分組成。編碼器由N個相同的層組成(原論文中N = 6)。每層包含如下組件:

  • 多頭自我注意力層(編碼器):獲取每一個單詞的輸入向量,並將其轉換爲表示形式,其中包含有關每一個單詞應如何與序列中全部其餘單詞相伴的信息。

  • 加法和歸一化:多頭自我關注層和位置前饋網絡的輸出均由該層處理。它包含一個殘差鏈接(以確保漸變不會被卡住並保持流動)和歸一化層(以防止值變化太大,從而能夠更快地進行訓練並充當正則化功能)。

  • 逐點徹底鏈接層:此層分別且相同地應用於每一個單詞向量。它由兩個線性變換組成,兩個線性變換之間使用ReLU激活。

三、計算完全部N層編碼器的輸出後,最終(鍵,值)對將傳遞到解碼器的每一個「編碼器-解碼器注意」塊。這樣就完成了咱們的Transformer的編碼器部分。

四、因爲解碼器本質上是自迴歸的,所以它將先前輸出的列表做爲輸入。而後將令牌轉換爲詞嵌入,而後將其添加到它們各自的位置編碼中,以獲取解碼器的最終輸入。

5.解碼器還包含N個相同的層(原始論文中N = 6)。每層包含如下組件:

  • 多頭自我注意力層(解碼器):爲解碼器中的每一個位置生成表示形式,以對解碼器中的全部位置進行編碼,直到該位置爲止。咱們須要阻止解碼器中的向左信息流,以保留自迴歸屬性。

  • 多頭交叉注意力層(編碼器-解碼器):這是Transformer的一部分,其中輸入和輸出字之間發生映射。(K,V)對來自Encoder,Q值來自Decoder的上一層,而後計算交叉注意力。

  • 加法和歸一化:相似於編碼器。

  • 逐點徹底鏈接層:相似於編碼器。

6.計算完解碼器全部N層的輸出後,該輸出將經過一個用做分類器的線性層。分類器的大小與vocab大小同樣大。而後將其饋入softmax層,以在解碼器的全部輸出上得到機率分佈。而後,咱們採用機率最高的索引,該索引處的單詞就是咱們的預測單詞。

Transformer的缺點

全部的好事都有很差的一面。Transformer也是如此。

不用說,Transformer是很是大的模型,所以它們須要大量的計算能力和大量的數據進行訓練。(與Transformers相比,reformer的存儲效率更高且速度更快。它們基本上已經用局部敏感哈希(LSH)代替了點積的關注。並且,他們使用了可逆殘差層而不是標準殘差。)

對於用於諸如解析之類的任務的分層數據,RNN彷佛要優於Transformers。一些相關的工做能夠在本文(https://www.aclweb.org/anthology/D18-1503/)中找到。

Transformer處理圖片

圖像不是序列。可是能夠將圖像解釋爲一系列區塊,而後經過Transformer編碼器對其進行處理。只需將圖像劃分爲小塊,並提供這些小塊的線性嵌入序列便可做爲Transformer Encoder的輸入。圖像區塊與NLP下游任務中的標記(單詞)的處理方式相同。此方法能夠用來替代當前普遍使用的基於CNN的圖像處理管道中的特徵提取方法。視覺處理的Transformer基於此概念。

我我的認爲本文的設計很是漂亮。https://arxiv.org/pdf/1706.03762.pdf

許多人將「Transformer」視爲NLP的ImageNet,如今GPT-3出來的時候也是這麼說的,其實這麼比較不太恰當,由於畢竟視覺和文本的任務從根本上就是不一樣的,因此這麼比較仍是不太恰當,可是Transformer相比於RNN的進步仍是有目共睹的。


做者:Ambuj Mittal

deephub翻譯組



本文分享自微信公衆號 - DeepHub IMBA(deephub-imba)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索