<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      探秘Transformer系列之(1):注意力機制

      探秘Transformer系列之(1):注意力機制

      0x00 概述

      因為各種事情,好久沒有寫博客了,之前寫得一些草稿也沒有時間整理(都沒有時間登錄博客和微信,導致最近才發現好多未讀消息和私信,在這里和各位朋友說下萬分抱歉)。現在恢復更新,是因為最近有些從非AI領域轉過來的新同學來找我詢問是否有比較好的學習資料,他們希望在短期內迅速上手 Transformer。我在網上找了下,但是沒有找到非常合適的系統的學習資料,于是就萌發了自己寫一個系列的想法,遂有此系列。在整理過程中,我也發現了自己很多似是而非的錯誤理解,因此這個系列也是自己一個整理、學習和提高的過程。

      本系列試圖從零開始解析Transformer,目標是

      • 解析Transformer如何運作,以及為何如此運作,讓新同學可以入門Transformer。

      • 力爭融入一些比較新的或者有特色的論文或者理念,讓老鳥也可以通過閱讀本系列來了解一些新觀點,有所收獲。

      幾點說明:

      • 本系列是對論文、博客和代碼的學習和解讀,借鑒了很多網上朋友的文章,在此表示感謝,并且會在參考中列出。因為本系列參考文章太多,可能有漏給出處的現象。如果原作者發現,還請指出,我在參考文獻中進行增補。
      • 本系列有些內容是個人梳理和思考的結果(反推或者猜測),可能和原始論文作者的思路或者與實際歷史發展軌跡不盡相同。這么寫是因為這樣推導讓我覺得可以給出直觀且合理的解釋。如果理解有誤,還請各位讀者指出。
      • 對于某些領域,這里會融入目前一些較新的或者有特色的解釋,因為筆者的時間和精力有限,難以閱讀大量文獻。如果有遺漏的精品文獻,也請各位讀者指出。

      本文為系列第一篇,主要目的是引入Transformer概念和其相關背景。在2017年,Google Brain的Vaswani等人在論文”Attention is All You Need“中發布了Transformer。原始論文中給出Transformer的定義如下:

      Transformer is the first transduction model relying entirely on self-attention to compute representations of its input and output without using sequence aligned RNNs or convolution。

      其中提到了sequence,RNN,convolution,self-attention等概念,所以我們接下來就從這些概念入手進行分析。我們先開始從Seq2Seq介紹,然后逐漸切換到注意力機制,最后再導出Transformer模型架構。

      0x01 背景知識

      本節我們將介紹一些背景知識和概念。

      1.1 seq2seq

      seq2seq(Sequence to Sequence/序列到序列)概念最早由Bengio在2014年的論文“Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation”中提出,其代表從一個源序列生成一個目標序列的操作。因為機器翻譯是大家較熟悉且容易理解的領域,因此后續我們主要使用機器翻譯來進行講解,避免引入過多概念。

      1.2 文本生成機制

      機器翻譯其實就是文本生成。語言模型將文本看作是時間序列。在此視角下,每個單詞都和它之前的單詞相關,通過學習前面單詞序列的統計規律就可以預測下一個單詞。因此,機器翻譯會從概率角度對語言建模,讓新預測的單詞和之前單詞連成整個句子后最合理,即原有句子加上新預測單詞后,成為整個句子的概率最大。這就涉及到自回歸模型。

      1.3 自回歸模型

      自回歸(Autoregressive)模型是一種生成模型,其語言建模目標是根據給定的上下文來預測下一個單詞。遵循因果原則(當前單詞只受到其前面單詞的影響),自回歸模型的核心思想是利用一個變量的歷史值來預測其未來的值,其將"序列數據的生成"建模為一個逐步預測每個新元素的條件概率的過程。在每個時間步,模型根據之前生成的元素預測當前元素的概率分布。

      下圖給出了自回歸模型的示例。模型每次推理只會預測輸出一個 token,當前輪輸出token 與歷史輸入 token 拼接,作為下一輪的輸入 token,這樣逐次生成后面的預測token,直到新輸出一個結束符號或者句子長度達到預設的最大閾值。就下圖來說,模型執行序列如下:

      • 第一輪模型的輸入是“You should”。

      • 第一輪模型推理輸出“wear”。

      • 將預測出的第一個單詞“wear”結合原輸入一起提供給模型,即第二次模型的輸入是“You should wear”。

      • 第二次模型推理輸出“shoes”。

      • 將預測出的第二個單詞“shoes”結合原輸入一起提供給模型,即第三次模型的輸入是“You should wear shoes”。

      • 第三次推理輸出結束符號,本次預測結束。

      該過程中的每一步預測都需要依賴上一步預測的結果,且從第二輪開始,前后兩輪的輸入只相差一個 token。

      自回歸模式有幾個弊端:

      • 容易累積錯誤,導致訓練效果不佳,因為后面的推理對之前推理的輸出會有依賴。在訓練初期,模型尚不成熟,幾次隨機輸出會導致隨后的訓練很難學到任何東西。“一步錯,步步錯”,訓練會變得極不穩定,很難收斂,浪費訓練資源。
      • 只能以串行方式進行,這意味著很難以并行化的方式開展訓練、提升效率。

      1.4 隱變量自回歸模型

      隱變量模型是一種引入隱變量來表示過去信息的模型。自回歸模型在預測時會把過去觀測到的信息總結起來記作\(h_t\),并且更新預測\(x_t\)。即總結\(h_t = g(h_{t-1}, x_{t-1})\),然后基于\(x_t = P(x_t \mid h_{t})\)來估計\(x_t\)。由于\(h_t\)從未被觀測到,因此\(h_t\)就是隱變量,這類模型也被稱為隱變量自回歸模型(latent autoregressive models)。

      有了\(?_t\)之后,其實預測變換為兩個子問題。一個問題是如何根據之前的隱變量 \(?_{t?1}\) 和之前的輸入信息\(x_{t-1}\)得到現在的隱變量\(?_t\),另一個問題是如何根據當前的隱變量\(?_t\)和之前的輸入\(x_{t-1}\)得到當前的\(x_t\) 。其實,這就是編碼器-解碼器模型要面對的問題。

      1.5 編碼器-解碼器模型

      目前,處理序列轉換的神經網絡模型大多是編碼器-解碼器(Encoder-Decoder)模型。傳統的RNN架構僅適用于輸入和輸出等長的任務。然而,大多數情況下,機器翻譯的輸出和輸入都不是等長的,因此,對于輸入輸出都是變長的序列,研究人員決定使用一個定長的狀態機來作為輸入和輸出之間的橋梁。于是人們使用了一種新的架構:前半部分的RNN只有輸入,后半部分的RNN只有輸出(上一輪的輸出會當作下一輪的輸入以補充信息),兩個部分通過一個隱狀態(hidden state)來傳遞信息。把隱狀態看成對輸入信息的一種編碼的話,前半部分可以叫做編碼器(Encoder),后半部分可以叫做解碼器(Decoder)。這種架構因而被稱為編碼器-解碼器架構,所用到的模型就是編碼器-解碼器模型,具體如下圖所示,圖中編碼器和解碼器通過一個中間隱狀態C來完成信息交互。

      編碼器和解碼器的作用分別如下:

      • 編碼器把輸入句子的所有語義信息壓縮成一個固定長度的中間語義向量(也稱為上下文向量或隱向量或隱狀態),該向量包含了可供計算與學習的、代表句子語言特點和含義的特征信息,是輸入的濃縮摘要。具體邏輯為:
        • 編碼器會對輸入句子 \(X = (x_1, ..., x_n)\) 的每個詞進行處理,處理每個詞之后會產生一個隱狀態。
        • 從輸入的第二個詞開始,編碼器每個時刻的輸入是上一個時刻的隱狀態和輸入的新單詞。
        • 編碼器輸出的最后一個時刻的隱狀態就是編碼了整個句子語義的語義上下文(context),這是一個固定長度的高維特征向量\(C = (z_1, ..., z_n)\),輸入句子每個時間步的信息都包含在了這個上下文中。
      • 解碼器會把這個中間語義上下文向量\(C\)解碼成輸出句子\(Y = (y_1, ..., y_m)\),即解碼器將編碼器學習到的特征信息再轉化為相應的句子。具體邏輯為:
        • 在每個時刻,解碼器都是自回歸的,即上一個時刻的輸出(產生的字符\(y_{t-1}\))作為下當前時刻\(t\)的輸入之一,生成當前時刻的字符\(y_t\)
        • 解碼器最初的輸入是中間語義上下文向量\(C\),解碼器依據\(C\)計算出第一個輸出詞和新的隱狀態,即解碼器的每個預測都受到先前輸出詞和隱狀態的微妙影響。
        • 解碼器接著用新的隱狀態和第一個輸出詞作為聯合輸入來計算第二個輸出詞,以此類推,直到解碼器產生一個 EOS(End Of Service/序列結束)標記或者達到預定序列長度的邊界。

      從宏觀角度看,序列建模的核心就是研究如何把長序列的上下文壓縮到一個較小的狀態中。

      1.6 如何壓縮

      如何壓縮?人們很容易想到馬爾可夫假設,即系統的未來狀態只與當前狀態有關。這也被稱為近因效應:從文本生成角度看,就是當前詞只與距離它比較近的個詞更加相關。如果考慮前面n個單詞,這就得到了N-gram模型,即當前單詞的概率取決于前n個單詞。但是基于馬爾科夫假設的模型難以處理句子中的長距離依賴關系(某個單詞依賴句子中很早的單詞),也沒有考慮深層語義關系。而且N-gram模型的大小幾乎是n的指數倍,如果n數目太大,則n個單詞組合數可能性太多,對資源消耗過大,因此需要新的模型。新模型應該不僅僅簡單的關注單詞的頻率和順序,還可以考慮更長距離的依賴關系,卻又不必顯式考慮那么多單詞組合可能性,于是人們想到使用神經網絡來擬合。

      MLP 是最基本的神經網絡模型之一,它可以將詞向量序列映射到一個固定長度的向量表示,然后將這個向量輸入到一個softmax層中,計算出下一個詞的概率分布。MLP雖然理論上沒有距離長依賴問題,但是很難訓練好。CNN/RNN/Transformer等網絡結構都可以看作是在MLP上添加的約束條件。通過這些先驗約束,同等參數量下的優化難度被降低,模型更容易找到最優解。前面提到的“使用神經網絡來擬合”就是使用CNN,RNN或者Transformer來實現編碼器和解碼器。

      因為我們本系列介紹的主角是Transformer,就說明Transformer在實現編碼器和解碼器上是存在優勢的,因此我們先來看看CNN和RNN方案的問題所在。

      0x02 CNN和RNN方案

      注:本節只是從普遍意義或者說是在典型問題上進行闡釋,并非定論。因為CNN和RNN方案也是在不停的發展,其某一個階段的方案可能解決(或者緩解)了下面提到的問題。

      2.1 技術挑戰

      當面臨冗長且信息密集的輸入序列時,編碼器-解碼器模型在整個解碼過程中保持相關性的能力可能會減弱。為了更好的說明,我們先看看序列轉換面對的主要技術挑戰:對齊問題和長依賴問題(或者說是遺忘問題)。

      對齊

      我們來看看為什么要對齊。首先,在某些領域(比如語音識別)中,雖然輸入與輸出的順序相同,但是沒有一一對應的關系。其次,在某些領域(比如機器翻譯)中,在處理完整個輸入序列后,模型的輸出序列可能和輸入序列的順序不一致。以機器翻譯為例,假如我們要讓模型將英語 "how are you" 翻譯為中文 "你好嗎",或者將“Where are you”翻譯成“你在哪里”,我們會發現翻譯結果中的語序和原來句子的語序并不相同,同時,一些翻譯結果并不能與英語中的詞匯一一對應到。

      不對齊問題帶來的最大困境是:在時間序列的 t 時刻,我們并不能確定此時的模型是否已經獲得了輸出正確結果所需要的所有信息。因此,人們往往先把所有輸入編碼到一個隱狀態,然后逐步對這個隱狀態進行解碼,這樣才能確保在解碼過程中模型一定收到了所需的全部信息。雖然此方案可以保證輸入信息的完整性,但卻有一個明顯缺陷,即在解碼過程中,無法確定貢獻度。比如,當把”I love you"翻譯成“我愛你”時,“我”應該與“I”對齊(因為其貢獻最大),但是該方案中,"I","love","you"這三個詞對“我”的貢獻都是一致的。

      長依賴

      我們以下面句子為例來進行分析。“秋蟬的衰弱的殘聲,更是北國的特產,因為北平處處全長著樹,屋子又低,所以無論在什么地方,都聽得見它們的啼唱。”

      將例句從英文翻譯成中文時,英文和中文明顯是有對齊關系的,因此需要知道哪個英文單詞對應到哪個中文。比如將”它們“翻譯成”They“,但是“它們”代表什么呢?是“樹”?“屋子“?還是”秋蟬“?通過”啼唱“和知識,我們知道“秋蟬”和“它們”指代是同一個對象,但是如果把”聽得見它們的啼唱“ 修改為“看見它們的樹蔭”,則“它們”指代的就是“樹”了。

      人類可以很容易的同時看到“秋蟬”和“它們”這兩個詞然后把這兩個詞關聯起來,即人們知道“它們”和“秋蟬”有長距離的依賴關系,從而理解整個句子。但是對于計算機或者對于模型來說,”秋蟬“和”它們“在例句中的距離太長了,很容易被兩個詞中間的其它詞干擾。為了準確給出最終的答案,神經網絡需要對前面”秋蟬的衰弱的殘聲“和”它們“之間的交互關系進行建模。然而,某些神經網絡很難處理長距離依賴關系,因為處理這種依賴關系的關鍵因素之一是信號在網絡中穿越路徑的長度,兩個位置之間路徑越短,神經網絡就越容易學習到這種長距離依賴關系,兩個位置之間距離越遠,建模難度就越大。如果模型無法處理長距離依賴,則會出現長時信息丟失,也就是產生了遺忘問題。

      我們接下來看看CNN方案和RNN方案如何應對這兩個技術挑戰。

      2.2 CNN方案

      CNN的本質是學習空間數據中的局部依賴關系。CNN的卷積操作可以提取重要特征,但是因為單個卷積核的長度一般比較小,所以CNN的卷積感受視野是局部的,提取的是局部特征,進行局部信息計算。即CNN對相對位置敏感,對絕對位置不敏感,難以提取序列的長距離依賴關系。

      為了讓CNN可以處理長序列,人們一般會堆疊更多的卷積,通過疊加多層卷積區去把局部感受野進行擴大,讓卷積網絡依靠深度來彌補全局信息的缺失,從而捕捉長距離依賴。在這種方案中,不同卷積層會提供不同層次的特征,進而在上層完成長距離信息依賴計算,把長序列的信息壓縮到一個卷積窗口內部,以此來讓模型有機會捕捉到長距離依賴和復雜的結構關系。

      比如下圖所示,最下層CNN使用滑動窗口作用于這個文本序列,每個窗口都對其中的數據進行處理。A1窗口獲取到了“秋蟬”這個信息,A3窗口獲取到了“它們”這個信息。但是,因為“秋蟬”和“它們”距離太遠,所以沒有一個單一窗口可以把這兩個詞建立起依賴關系,即沒有單一窗口可以同時看到這兩個詞。因此,模型只能持續堆疊卷積網絡,不斷加深整個網絡,這樣C1這個窗口才可以同時包含“秋蟬”和“它們”的信息。

      但是深度就代表間接,間接就代表著流失。在CNN方案中,因為信息被“逐級加工,層層抽象”,而且信息傳遞過程不夠透明,信息會在過深的網絡傳播過程之后只有部分保留,導致模型性能下降。所以CNN一般在長依賴關系建模場景使用較少,更適合短文本計算。

      2.3 RNN方案

      從表象上看,RNN是時序結構,后面的時刻天然就依賴于前面時刻的輸出。從本質上來說,RNN是一種連接主義模型,具有選擇性地在序列步驟間傳遞信息的能力,可以對序列上下文信息以及不同范圍元素間的局部依賴關系進行捕捉。RNN的獨到之處在于引入了“記憶”功能,讓網絡能記住之前輸入的信息。隨著數據在RNN中的流動,之前時間步的記憶會作為輸入參與到當前數據的處理中,讓模型能夠動態地融合時間上下文和序列的歷史信息。因為可以有效地處理變長的序列數據,理論上,RNN可以預測無限長句子,利用前面所有信息,所以非常適合翻譯場景。

      思路

      事實上,在Transformer出現之前,編碼器和解碼器通常是由RNN或其變體(如 LSTM 或 GRU)組成的。我們先看看如何用RNN實現編碼器。以下圖為例,編碼器需要把“北國的特產”這個句子編碼成隱狀態。圖中的每個方塊都是一個簡單的RNN單元。每個RNN單元接收兩個輸入(輸入詞和隱狀態),輸出一個隱狀態。

      模型在第一步得到輸入h0和“北”,調用函數f()進行計算,得到輸出h1=f(h0, 北)。h0是第一個隱狀態(通常內容是數值0或者隨機值)。模型在第二步得到輸入h1和“國”,同樣調用函數f()進行計算,得到h2。以此類推,模型最終輸出h5。在計算過程的每一步t,前面所有節點得到的信息都保存在上一步計算出來的中間隱狀態ht中,因此,后一個詞的計算都會用到前面所有詞的輸出結果。

      可以把隱藏狀態ht看作是信息循環的載體,其承載的信息可以跨時間步在RNN中進行傳遞。隨著數據在RNN中的流動,之前時間步的激活狀態會作為輸入參與到當前數據的處理中,讓模型能夠動態地融合時間上下文和序列的歷史信息。因此從理論上來說,RNN可以通過隱狀態得到任意兩個詞的依賴,無論這兩個詞距離多遠,它們的信息一定會在某一步計算之中匯聚。

      我們再給出編碼器-解碼器的結構圖,其中si是解碼器在時刻\(i\)的隱狀態。編碼器讀入輸入的token xi,并對每個token xi生成一個隱狀態hi。從第一個h1到最后一個hm,這些隱狀態不斷將前面信息積累。最后的攜帶整個輸入序列信息的hm會作為解碼器的輸入s0。

      優點

      RNN的優點如下:

      • 適合處理序列數據。RNN天然地適合處理具有時間序列或序列結構的數據,如文本、語音和視頻等。RNN可以靈活地處理不同長度的輸入序列,并捕捉序列中的依賴關系。
      • 捕捉長期依賴。RNN任意步的隱狀態都包含了當前時間步之前所有時間步的幾乎所有信息,因此RNN可以捕捉序列中的長期依賴關系,從而克服了馬爾可夫模型的主要局限性,這對許多序列學習任務至關重要。
      • 權重共享。RNN在處理序列時采用了權重共享的策略,即不同時間步使用相同的權重。這可以減少模型參數數量,降低過擬合的風險。
      • 速度快。每個輸入僅僅依賴于對應的h,因此所有token推理的消耗基本相同。整體推理速度和上下文長長度線性相關。

      缺點

      RNN的缺點同樣鮮明。在RNN方案中,在每個時間步,RNN都會將序列中之前的所有信息壓縮到一個固定長度的隱向量,最終編碼器和解碼器之間只通過這個固定長度的隱狀態來傳遞信息。固定長度的隱狀態或者說有限的記憶能力在處理長序列時會導致接下來的幾個問題,比如信息遺失、信息瓶頸等。

      表達能力缺失

      RNN的特點會帶來表達能力的缺失,體現在如下幾點:

      • 既然隱向量長度固定,那么這個壓縮過程就是有損壓縮,會導致隱向量保存上下文的能力在本質上是有限的。我們以文本摘要為例,如果幾百字的散文,隱向量還可以存儲散文的全部語義信息,但是面對幾萬字的小說,隱向量將力有不逮。
      • RNN是個偏序結構。雖然語言本身的詞序和語法也構成了一個偏序結構,但是通常又有定語后置,補語和各種從句等附加方式,這導致整個語序并不完全滿足偏序結構,因此RNN在處理長距離關聯的復雜語法結構時力不從心。
      • 解碼器解碼時,每個事件步的隱狀態都基于編碼器生成的同一個隱向量來構建,這是不合理的,因為不同位置的單詞可能需要不同程度和不同方面的信息。而權重共享也導致會對輸入中的每個單詞都賦予同樣權重,無法對單詞的重要程度進行區分。
      信息遺失

      因為RNN的表達能力缺失,所以會帶來信息遺失問題。

      • 信息遺失或者混淆。而且當新輸入進入時,原有信息可能被新信息覆蓋或者被稀釋,這樣模型會更加關注靠近尾部的輸入,序列早期部分的記憶會隨著隨著距離的增加產生傳播衰減。越往前的輸入,信息衰減得越多,如果關鍵信息出現在序列頭部,就容易被忽略。
      • 難以捕捉長距離依賴關系。以上圖為例,h4中包含最多信息的是當前的輸入“特”,最開始的“北”所攜帶的信息會被忽略,很難有效構建兩者的依賴關系。
      難以并行

      RNN需要對序列內容進行逐步處理, 每一步的輸出取決于先前的隱藏狀態和當前的輸入。RNN這種串行計算在本質上是一種遞歸,其阻礙了訓練時的并行計算,導致訓練效率較低,訓練時間過長。

      難以訓練

      RNN的網絡結構特點導致難以訓練。RNN 用于信息傳輸通路只有一條,并且該通路上的計算包含多次非線性激活操作,當 RNN 處理長序列時,因為時間步增加帶來的多層激活函數的嵌套會導致梯度反傳時指數級地衰減(消失)或增長(爆炸),這就是梯度消失問題或者梯度爆炸問題。當梯度消失時,前面的梯度信息無法有效地傳遞 到后面,也就導致詞之間距離越遠,前面對后面的影響越弱,所以RNN網絡難以學習遠距離依賴關系。當梯度爆炸時,網絡的權重會變得極大,導致網絡不穩定。而且當面對長序列時,RNN需要大量內存來維持長序列的隱狀態,比如需要完整理解整個句子乃至整篇文章才能做出判斷,這些內存負擔對訓練也造成了很大挑戰。

      2.4 當前問題

      我們總結CNN和RNN這兩個方案的主要問題如下:

      • 對齊問題。CNN和RNN都難以在源序列和目標序列之間做到完美對齊。
      • 隱狀態長度固定。這個問題點主要存在于RNN,因為其隱向量大小固定,所以推理效果受限于信息壓縮的能力,導致信息遺失。
      • 關系距離問題。此問題在RNN和CNN中都存在。序列中兩個詞之間的關系距離不同,當詞之間距離過長時,兩個方案都難以確定詞之間的依賴關系。使得當面臨冗長且信息密集的輸入序列時,模型在整個解碼過程中保持相關性的能力可能會減弱。

      我們再仔細看看”關系距離問題“。對于CNN方案,序列的第一個詞和最后一個詞要通過多層卷積后才可以建立聯系。下圖中的粗線為CNN結構中兩個詞建立關系所需的最長距離。

      而RNN方案需要對序列“從頭看到尾”才能確定給這兩個詞建立關系所需的距離。下圖中的粗線是RNN結構中兩個詞建立關系所需的最長距離。

      因此我們要面對的問題是:如何把大量的token壓縮到一個隱藏狀態中,而且該狀態還可以有效的捕捉它們的底層結構和關系。如果想從根本上解決問題,我們有如下幾步可以選擇:

      • 可以通過拓展隱狀態的長度,或者增加新影響力因子(該因子可以反應輸入序列各個位置對于解碼器當前輸出的影響力)來增加信息含量。
      • 讓序列中兩個詞之間的關系距離更近,或者讓各個詞直接建立聯系。比如對于RNN來說,需要讓隱狀態和時序無關,從而打破這個順序結構。
      • 平等看待序列中每個單詞,避免像RNN那樣更容易注意到靠后的內容,而忽略靠前的輸入。
      • 對于序列進行”劃重點“,這樣可以區別不同元素所攜帶的信息量,對于不同的元素給予不同的關注度。
      • 雖然大多數實時因果數據只知道過去的狀態并期望影響未來的決策,但是對于某些功能(比如翻譯),我們希望可以做到同時向前預測和向后回顧。

      我們接下來介紹的注意力機制就可以在一定程度上解決上述問題。

      0x03 注意力機制

      注意力(Attention)機制由Bengio團隊2015年在論文“NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE”中提出,其主要思路為通過模仿人類觀察事物的行為來降低算法復雜度、提高性能。人類在感知、認知和行為決策過程中會選擇性地關注和處理相關信息,從而提高認知效率和精度,比如人類可以依據興趣和需求選擇關注某些信息而忽略或抑制其它信息,并且可以在多任務上分配注意力從而達到同時處理多個信息的目的。大家最熟悉的例子就是,當一個人看圖片時,他會先快速通覽,然后對重點區域進行特殊關注。而在文本生成的每個階段,并非輸入上下文的所有片段都同樣重要。比如在機器翻譯中,句子“A boy is eating the banana”中的“boy”一詞并不需要了解整個句子的上下文之后,再來進行準確翻譯。

      3.1 原理

      注意力機制可以從不同角度進行理解,人們也做出了很多精彩論斷,比如:

      • 注意力機制的本質是上下文決定一切。
      • 注意力機制是一種資源分配方案。
      • 注意力機制是信息交換,或者說是是“全局信息查詢”。

      這些角度彼此聯系又各有特色,我們逐一進行分析。

      上下文決定一切

      注意力機制的本質可以用一句話來總結:上下文決定一切(context is everything)。一個字 / 詞在一篇文本中表達的意思通常與它的上下文有關。比如下面兩個句子中都有“transformer”這個單詞,但是第一個“transformer”應該翻譯成“變壓器”,第二個“Transformer”最好不做翻譯。

      • Several distributor transformers had fallen from the poles, and secondary wires were down.
      • Transformer models have emerged as the most widely used architecture in applications such as natural language processing and image classification.

      如何才能對“transformer”這個多義詞進行語義區分?我們必須考慮單詞的上下文才能更好的把單詞的語義識別出來,即不僅僅要考慮到詞本身,還要考慮其他詞對這個詞的影響,也就是語境的影響。比如第一個句子的“pole”、”fallen”和“wires”這幾個鄰近單詞暗示了此處的“transformer”和真實物理環境相關。第二個句子的“model”和“natural language processing and image classification”則直接告訴我們此處的“Transformer”是深度學習相關概念。最終我們通過上下文語境可以推斷出“Transformer”的準確含義,從而把這兩個英文句子翻譯成如下:

      • 幾個變壓器從電線桿上摔下來,副線也垂下來。
      • Transformer模型已成為自然語言處理和圖像分類等應用中使用最廣泛的架構。

      這就是注意力機制的作用:將每個詞與序列中的其他詞聯系起來,通過句子中的其它詞對我們關注詞的語義進行推斷。

      資源分配

      注意力機制也是一種資源分配方式。目前我們知道了上下文的重要性,但是這還不夠,因為一個單詞的上下文包括很多其它單詞,不同單詞對目標單詞的影響力往往不同。以翻譯為例,因為輸入語句是一個連貫的整體,所以每個輸入詞\(X_i\)都會給每個輸出詞\(Y_i\)造成影響。因此在考慮單詞上下文時候,也需要考慮出上下文中每一個元素應該考慮多少。比如第二個英文句子中,“model”對“Transformer”的影響力必然是最大的。所以我們需要一種機制來依據不同的上下文聚焦于不同的信息,這樣,一來可以使得序列中的重要元素被投射以較高注意力,重要信息不會被淹沒;二來可以將有限的計算資源用來處理更重要的信息,從而做到提綱挈領。

      注意力機制就是這種資源分配機制。其在學習的過程中自適應的給予輸入的不同詞賦予不同的注意力權重,從而區分輸入的不同部分對輸出的影響,自適應的學習應該關注的重點位置,做出準確判斷,即注意力賦予了模型分辨的能力。

      其實,論文“Recurrent Models of Visual Attention”中有一段話就深刻的印證了資源分配這個角度。具體如下:人類感知的一個重要特性是,人們不會一次處理整個場景。相反,人類有選擇地將注意力集中在視覺空間的某些部分上,以在需要的時間和地點獲取信息,并隨著時間的推移將不同注視點的信息結合起來,建立場景的內部表示,指導未來的眼球運動和決策。將計算資源集中在場景的各個部分可以節省“帶寬”,因為需要處理的“像素”更少。但它也大大降低了任務的復雜性,因為感興趣的對象可以放置在注視的中心,而注視區域外的視覺環境的無關特征(“雜亂”)自然會被忽略。其英文原文如下:

      信息交換

      確定了資源分配的原則之后就可以進行信息交換。注意力機制計算過程就是序列中元素交換信息的過程。注意力機制的輸入是一個序列或者集合,注意力機制會從輸入中選擇性提取信息,據此計算出一組權重。這組權重代表了各個信息的重要程度,使用這種權重與原始信息相乘就得到了注意力處理后的加權信息。

      信息交換在一定程度上起到了RNN中記憶力模塊的作用,使得注意力編碼器也能像RNN一樣對一個復雜的語句或者場景進行理解和解析,比如:

      • 將注意力機制應用在序列轉換的源序列和目標序列之間,可以讓兩個序列互相交換信息,起到信息對齊的目的。

      • 將注意力機制應用在一個序列內部(這就是人們經常提到的自注意力機制),可以讓序列中每個詞都和序列中其他詞關聯起來,這樣序列中每一個元素都有機會根據自身特征,有選擇性地依據詞之間的相關性來吸取整個序列中每一個其他元素的信息,對本身進行動態調整。這使得模型能夠捕捉長距離依賴關系,不受距離的影響。考慮以下兩個句子,第一句中的“it”就指代貓,因此“it”更多吸收了“cat”的信息。第二個句子的“it”指代牛奶,因此“it”更多吸收了“milk”的信息。

        • The cat drank the milk because it was hungry.
        • The cat drank the milk because it was sweet.
      • 自注意力機制的目的是為當前單詞創建抽象的、豐富的表征。這個表征是本單詞被相同序列中的其它單詞所影響的結果。經過自注意力機制處理之后,現在每個新單詞都融入了其它單詞的部分信息,這是一種數據依賴的加權平均,這種表征更加豐富。如果非要將自注意力機制和之前的注意力機制進行對比的話:

        • 自注意力機制中的query相當于注意力機制中的解碼器隱藏狀態。
        • 自注意力機制中的key和value相當于注意力機制中的編碼器隱藏狀態。

      3.2 通用結構

      通過上面的原理分析,我們可以知道,注意力的核心思想就是幫助模型為輸入的不同部分分配不同的權重,這樣可以提取關鍵信息,讓模型判斷更精準,更加節省算力和存儲。但是如何實現注意力機制?這就要解決兩個問題:

      • 在哪里做注意力計算?
      • 如何做注意力計算?

      我們接下來就繼續學習。

      任務模型

      論文”A General Survey on Attention Mechanisms in Deep Learning“用下圖總結了注意力模型的通用結構,論文作者把這種通用架構叫做任務模型。任務模型包含四個部分:

      • 特征模型。我們假設矩陣X為任務模型的輸入,矩陣的列可能是句子之中的單詞。任務模型使用特征模型把X轉換為特征向量F。特征模型可能是RNN、CNN、嵌入層或者其他模型。
      • 查詢模型。q是由查詢模型所產生的查詢向量,用來確定任務模型需要關注X中的哪些向量、提取哪些信息。或者說,q可以被解釋為一個一般問題:哪個特征向量包含對q最重要的信息?
      • 注意力模型。特征向量F和查詢向量q是注意力模型的輸入,注意力模型的輸出是上下文向量c。我們會在接下來詳細論述注意力模型。
      • 輸出模型。輸出模型使用上下文向量c將各個部分組合成最終的高級特征向量\(\hat y\),例如輸出模型可以是softmax層,它輸出一個預測。

      我們用一個句子“北國的特產”為例來解釋下圖。圖上X就是“北國的特產”這個完整的句子,F是從“北國的特產”提取到的特征向量列表,Z是“特”,q是從“特”提取出來的特征向量,我們目的就是要獲取特征向量列表中哪個特征向量包含對于”特“最重要的信息。

      注意力模型

      注意力模型的內部流程如下圖所示,該模型的目標是生成V中向量的加權平均值,具體計算流程如下。

      • 標號1是輸入(兩個輸入),從輸入生成的特征向量F會進一步生成鍵矩陣K和值矩陣V。
      • 標號2使用矩陣K和查詢向量q作為輸入,通過相似度計算函數來計算注意力得分向量e。q表示對信息的請求,\(e_l\)表示矩陣K的第\(l\)列對于q的重要性。
      • 標號3通過對齊層(比如softmax函數)進一步處理注意力分數,進而得到注意力權重a。
      • 標號4利用注意力權重a和矩陣V進行計算,得到上下文向量c。

      QKV

      因為此處提到了Q、K、V這三個術語,我們先用文本翻譯為例來做初步介紹,后續章節會對Q、K、V進行深入分析。從上文的分析可知,序列中的每個單詞都需要了解序列中其它單詞的信息,從而才能確定彼此間的相互關系。因此每個單詞都要去詢問其它單詞:咱倆之間是否密切?其它單詞回復關系密切與否。拿到相互關系后,每個單詞會據此把其它單詞的信息吸收進來做信息融合。上述操作其實是一種搜索+合并的運算,我們需要找到一個適合的機制將這種運算進行落地。而上圖注意力模型中,有兩個輸入:q(正在處理的序列/目標序列)和F(被關注的序列/源序列),F又分別轉換為K和V,這三個變量綜合起來使用就可以滿足我們的需求。

      • Q(查詢矩陣):目標序列的每個元素把自己的特征總結到一個向量query之中,可以理解為某個單詞像其它單詞發出詢問。目標序列所有元素的query構成了查詢矩陣Q。
      • K(鍵矩陣):源序列的每個元素都會把自己的特征總結到一個向量key之中。可以理解為某個單詞的特征,或者說某個單詞依據自己特征來回答其它單詞的提問。目標序列所有元素的key構成了鍵矩陣K。
      • V(值矩陣):源序列的每個單詞的實際值(最終提供的信息)是向量value。源序列所有元素的value構成了值矩陣V。

      后續我們用 query、key、value 代表相關向量,用Q、K、V代表相關向量構成的矩陣。

      從詞典的角度來看也許可以促進理解。query是你要找的內容,key是字典的索引(字典里面有什么樣的信息),value是對應的信息。普通的字典查找是精確匹配,即依據匹配的鍵來返回其對應的值。而注意力機制是向量化+模糊匹配+信息合并。注意力機制不僅查找最佳匹配,還要依據匹配程度做加權求和。源序列每個元素轉化為<key,value>對,這就構成了源序列的字典。目標序列每個元素提出了query,這就是要查詢的內容。在查找中,目標序列中每個元素會用自己的query去和目標序列每個元素的key計算得到對齊系數。這個對齊系數就是元素之間的相似度或者相關性。query和key越相似就代表value對query的影響力越大,query越需要吸收value的信息。隨后query會根據兩個詞之間的親密關系來決定從V中提取出多少信息出來融入到自身。

      通過 query、key、value 這三個向量的相互作用,模型得以衡量每個單詞對其他單詞的關注度。最終,源序列的每個元素會把自己融合其它單詞提供的信息之后得到的真實數據放到一個向量中。

      我們假設源序列和目標序列為同一個序列,下圖中給出了序列中”一個“和其它單詞之間的相似度。虛線代表key與query的相關度,線條的粗細分布就叫做”注意力分布“。或者說,線條的粗細就是權重,線條越粗,表示key與query越相關,對理解query越重要,value的權重就越大。

      3.3 計算流程

      我們把注意力機制引入到seq2seq領域來詳細看看它的計算流程。

      思路

      我們首先看看總體思路。自注意力層是一種和循環層和卷積層等效的計算單元。它們的目的都是把一個向量序列映射成另一個向量序列,比如說編碼器把x映射成中間表示z。我們先回想翻譯場景。如果是RNN方案,則最終編碼器會生成一個隱向量,然后把這個隱向量傳遞給解碼器進行解碼。前面已經分析了這種方案的弊端,比如隱向量是固定的。為了克服這種弊端,我們應該在每一個時間步t都會產生一個隱向量\(h_t\),把這些\(h_t\) 保存起來。當產生新輸出時,我們讓模型回顧之前保存的所有隱狀態,發現隱狀態中的關鍵信息就用上,這樣就擺脫了RNN中隱向量是固定長度的弊端。但是如何判斷某個隱狀態對當前生成詞是否重要?這就需要模型采用某種機制進行學習,從而才能了解需要給這個隱狀態多少注意力。總而言之,注意力機制的任務應該是找到解碼器當前隱向量和編碼器所有隱向量之間的相互關系。按照上述思路,注意力機制的計算總體可以分為兩步:

      1. 在所有輸入信息上計算注意力分布。編碼器不只是傳遞最后一個隱藏狀態,而是傳入所有的隱藏狀態到解碼器。
      2. 根據注意力分布來計算輸入信息的加權平均。需要注意,這是一種數據依賴的加權平均,是一種靈活、高效的全局池化操作。

      具體我們又可以把這兩步拆解為5個詳細步驟,具體如下:

      1. 生成語義向量。將源序列依次輸入編碼器,編碼器依次執行,將源序列的信息<X1,X2,X3,X4>編譯成step_len個語義向量<C1,C2,C3,C4>,供后續解碼器使用。即針對輸入序列中的每個單詞,編碼器都會輸出一個隱狀態向量,表示該單詞及其上下文信息的表示。
      2. 計算對齊系數a。對于解碼器輸出的每個詞Yi,我們需要關注源序列的所有詞和目標序列中當前詞的相關性大小。因此會在解碼器輸出每一個預測值之前,會針對編碼器輸出的所有語義向量<C1,C2,C3,C4>來計算一些注意力分數(Attention Score)。我們可以把源序列認為是key,把目標系列認為是query,這樣就和上面的”注意力模型的內部流程“圖對應起來。
      3. 計算概率分布。將對齊系數進行匯總,使用softmax進行歸一化,得到注意力權重w。對這些分數進行softmax操作的目的是放大高分隱藏狀態,抑制低分隱藏狀態。后續我們將沒有做softmax歸一化之前的對齊系數稱為注意力分數,將注意力分數經過softmax歸一化后的結果稱為注意力權重。
      4. 計算當前上下文向量Context。使用注意力權重w作為權重,對編碼器所有的向量<C1,C2,C3,C4>進行加權求和,得到解碼器當前時刻的上下文語義向量Context。注意力權重表示每個輸入單詞對于當前輸出單詞的重要程度。上下文向量表示當前輸出單詞所需的源語言信息。
      5. 更新解碼器狀態隱狀態Hi。
      6. 計算輸出預測詞。把解碼器前一次的輸出、解碼器當前狀態和解碼器當前時刻的上下文語義向量Context這三者作為輸入,調用函數f()計算得到解碼器本次的輸出。這個輸出是一個概率分布,表示每個可能的目標語言單詞作為當前輸出單詞的概率。然后做一個概率值到目標詞表的映射(如果注意力機制時用于分類模型,那就是做一個到各個分類的映射),便可以得到下一個輸出單詞。

      以上步驟對應下圖中標號1~6。

      我們以“我吃了一個蘋果”為例,每次輸出的上下文如下:

      • 輸入“我",得到C1=(我 * 1)。
      • 輸入”吃了“,得到C2=(我 * 0.5, 吃了 * 0.5)。
      • 輸入”一個“,得到C3=(我 * 0.45, 吃了 * 0.45, 一個* 0.1)。
      • 輸入”蘋果“,得到C4=(我 * 0.3, 吃了 * 0.3, 一個* 0.1, 蘋果 * 0.3)。

      得到的注意力權重為 $$w_{3,1},w_{3,2},w_{3,3},w_{3,4}=softmax(g(Y2, C1, C2, C3, C4))$$。

      我們接下來對幾個關鍵概念再進行分析。

      注意力分數

      當模型需要決定給予序列中某個單詞以多大的“注意力”時,它會計算該單詞與其他單詞之間的注意力分數。注意力分數是衡量序列中不同單詞對當前單詞的重要性程度的指標,或者說是目標單詞和輸入中某單詞對齊的可能性大小。可能性越大就應該賦予更大的權重。大權重代表在生成輸出時,當下預測單詞應該更加關注源文本中其對應單詞的信息。

      注意力分數通過相似度計算函數得到。該函數一般接受key和query向量作為輸入,輸出key和query向量之間的相關性,即注意力分數。下圖提供了這些函數的概述,其中\(q\)是查詢向量,\(k_l\)是矩陣\(K\)的第\(l\)列。如果對應到seq2seq,則q可以認為是解碼器輸出的隱向量,k可以認為是編碼器內部的隱向量。現實中,相似度計算函數是通過矩陣形式來計算,而非單獨計算某一列。

      注意力權重

      得到注意力分數之后,模型會使用softmax操作將注意力分數進行歸一化得到注意力權重,這樣可以使得所有權重總和為1,確保所有源元素貢獻的特征總量保持一定,也可以更加突出重要的權重。

      加權求和

      得到注意力權重之后,每個query都能從對應的key上獲取相應的信息,此時,就需要由輸出函數(Output Function)來將各個部分組合成最終的高級特征向量進行輸出。在本階段,注意力機制會以加權求和的模式對數據進行加工。這意味著每個單詞在新的表示中不只是自身的信息,還包含了其他單詞的信息,這幫助模型捕捉輸入序列中的依賴關系。

      \[w_i = \frac{f_{score}(K_i,Q)}{\sum f_{score}(K_i,Q)} \\Out = \sum f_{out}(w_i \cdot V_i) \]

      小結

      我們梳理下計算過程中的重點三步如下:

      • 計算分數(score function)。query和所有的key進行相似度計算,得到注意力分數。計算公式為\(s_i = a(q, k_i)\)
      • 歸一化(alignment function)。使用softmax操作將權值進行歸一化,計算公式為\(a = softmax(s_i)\)
      • 生成結果(context vector function)。使用a對value進行加權平均,可以理解為輸出y是在value之間根據key-query的相似度進行內插值。計算公式為\(Attention\ Value=\sum_ia_iv_i\)

      因此,注意力的思想可以改寫為如下公式:通過計算相似性得出權重最后加權求和。

      \[Attention(Target,Source)=Attention(Query,Source)=\sum^{Length_{Source}}_{i=1}Similarity(Query,Key_i)*Value_i \]

      具體如下圖所示。

      3.4 問題解決

      回憶下之前提到的RNN方案和CNN方案遇到的問題:對齊問題、信息遺失問題和長依賴問題。以及為了從根本上解決這些問題,我們提出的幾種改進思路:

      • 通過拓展隱狀態的長度,或者增加新影響力因子來增加信息含量。
      • 讓序列中兩個詞之間的關系距離更近,或者讓各個詞直接建立聯系。
      • 平等看待序列中每個單詞的順序,避免忽略靠前的輸入。
      • 對于序列進行”劃重點“以區別不同元素所攜帶的信息量。
      • 同時向前預測和向后回顧。

      我們接下來就以自注意力機制為例,看看其如何通過自己的優點來解決之前提到的問題,順便也和這兩個方案做下對比分析。

      增大信息含量

      與RNN、CNN方案相比,自注意力機制可以增大信息含量,從而有效的解決RNN中的信息遺失問題。從某種程度上來看,所有的序列建模都在做如下操作:

      • 把歷史上下文存儲到一個隱藏狀態。
      • 依據一定的更新規則對這個隱藏狀態進行變換。

      下圖就展示了序列建模方式的特點和典型案例,這些典型案例都包括三個組件:初始狀態、更新規則和輸出規則。

      RNN方案中,解碼器把過去所有的上下文信息壓縮到一個固定大小低維向量(隱狀態)中。解碼器的不同階段都使用這個隱狀態。該方案的優勢是在長上下文中的線性(相對于二次)復雜性。但是在長上下文時,RNN受限于固定大小的隱狀態(表達能力有限),很難利用額外的條件信息。

      TTT(Test-Time Training)則把上下文壓縮到模型的權重中,其優勢是既能在時間上保持固定大小,又能大大增強表達能力。

      自注意力機制使用一個列表(從后續文章中我們會知道這其實是KV Cache)作為隱狀態。所有的上下文都存儲在列表中,沒有被壓縮。列表中所有的上下文共同構成了統一的隱狀態(每個階段的隱狀態是列表的一項),這樣編碼器可以將更多數據傳遞給解碼器。

      因此,我們可以看到自注意力機制(Transformer)的優勢:不只像RNN那樣只傳遞一個編碼器最終的隱狀態,而是傳入所有的隱藏狀態(對應處理過的所有token)到解碼器。這樣新的token就可以和過去所有上下文進行交互。當然,隨著上下文長度的增加,使用列表的成本也會越來越高,其處理時間隨上下文長度急劇增長,列表的內存也急劇增加。

      縮減單詞間距

      我們還是搬出之前的圖來進行輔助解析。

      自注意力機制中,當某單詞獲取其它單詞信息時,其它單詞和它的位置距離都是固定常數。這樣,兩個詞之間的緊密程度僅取決于它們的真實相關性,而非取決于距離。或者說對絕對位置不敏感,任意兩個詞都可以直接建模。該特點可以解決長距離依賴問題。我們具體分析下。

      首先,CNN雖然可以借助增加卷積層數來擴大視野,融合信息,但是信息在過深的網絡傳播過程之中容易丟失,導致模型性能下降。自注意力機制摒棄了 CNN 的局部假設,把感知域(perceptive field)調整到了整個序列。RNN方案因為無法彌補長距離依賴問題會導致梯度消失和梯度爆炸問題。在處理任何一個單詞時,自注意力可以注意到整個句子的所有單詞,這樣可以將序列中的任意兩個位置之間的距離縮小為一個常量,能在常數時間內有效地捕捉到它們之間的依賴關系,直接建立聯系,從而消除了距離概念。因為此特點,自注意力機制的信息傳播損失小。下圖為三個方案構建詞語之間關系所需距離的對比。

      另外,常數距離特點也讓自注意力機制沒有“有序假設”。讓自注意力機制在處理每個位置時,并非像RNN那樣更容易注意到靠后的內容,忽略靠前的輸入。而是平等看待序列中每個單詞的順序,這樣能夠有效得考慮到輸入序列中的其他位置,可以更好的將對其他單詞的“理解”融入到當前處理的單詞中,信息融合效率高。

      最后,常數距離特點讓自注意力機制沒有了遞歸的限制,像CNN一樣可以在每一層內實現并行。

      選擇性處理信息

      注意力機制可以選擇性地關注和處理相關信息,這樣即可以提綱挈領,又可以有效地解決對齊問題。

      加權求和

      加權求和可以分為加權和求和兩方面來看,前者是對數據進行有差別的對待,而后者是做數據融合,綜合在一起就是用提綱挈領(對于不同信息量的元素給予不同的關注度)的方式對數據進行加工。我們接下來從不同角度對加權求和與CNN、全連接層進行比對分析。

      首先,注意力機制是動態產生權重。CNN或者全連接層的權重是靜態權重,這些權重在訓練時候固定下來,在推理時使用相同權重進行推理,并沒有建立權重和輸入實體本身的關系。注意力機制是動態權重,用輸入的query、key通過相似度計算來得到注意力權重。注意力機制根據輸入來計算出輸出應該更關注哪些輸入,權重的產生隨著輸入變化,這是一種自適應操作。

      其次,從另一個角度來看,注意力機制是站在某個輸入對象的立場上看待上下文和它之間的關系,并以此關系為權重來確定如何吸取其它對象的信息。因此,注意力機制是一種相對關系建模。而這種操作大多采用全局注意力以建模更廣范圍的依賴關系,是一種全局操作。

      綜上所述,加權求和以一種動態、相對、全局的關系更好的完成了對序列信息的處理。

      對齊機制

      將注意力應用在序列轉換的源序列和目標序列之間就是對齊機制。在機器翻譯中,源序列中的每個單詞都可能會對輸出造成影響,不僅僅是待翻譯詞之前的輸入,其后續的輸入也可能對輸出產生影響,因此需要結合源序列和目標序列進行綜合考慮。比如下面中譯英的例子,當翻譯到”一個“時,我們無法確定英文應該翻譯成”a“還是”an“,必須往后看到”蘋果“才能確定,因此需要在翻譯時把”a or an“的操作和”蘋果“進行對齊。

      中文:我吃了一個蘋果,然后吃了一個香蕉。

      英文:I ate an apple and then a banana。

      注意力允許依據輸入序列和輸出序列的不同部分進行相關度計算,這樣就可以決定在輸出某個單詞時,模型將重點關注輸入數據的哪些部分。從而在輸入序列和輸出序列進行對齊,更準確地學習序列之間的關系,提高模型的泛化能力和性能。下圖中虛線代表key與query的相關度,線條越粗,表示越相關。我們可以看出來,“一個”和“蘋果”等詞對“an”的編碼更重要(或更相關或更相似),應該承擔更多的對“an”的預測,需要賦予更多的權重。因此,在模型生成“an“的時候,不但要從”一個“提取語義,也要從”蘋果“提取語義,才能判斷出來應該是”an“還是”a“。最終”一個“和”蘋果“共同決定了對應的英文單詞應該是"an"。

      同時前瞻和回顧

      編碼器可以同時從左到右和從右到左讀取輸入序列,并將每個時間步的隱狀態拼接起來作為輸出。這樣做的好處是,可以讓編碼器同時考慮輸入序列中每個單詞的前后上下文信息,從而生成更豐富和完整的表示。

      3.5 優劣

      綜上所述,注意力機制確保每個解碼步驟都由最相關的上下文片段提供信息,為長期存在的長距離依賴問題提供了穩健的解決方案,從而重新定義了序列建模的格局。而且,注意力機制的提出不僅是技術上的突破,也為機器學習領域開辟了新的視野,更反映了人類認知的深刻影響。正如 Andrej Karpathy 所評價的:“注意力是一種重大解鎖,是神經網絡架構設計的一次飛躍。”

      注意力機制并非完美方案,其也存在若干缺點,最主要的問題就是計算速度慢和存儲占用高。

      • 算力需求大。注意力機制需要計算序列中每個元素對其他每個元素的關系,因此隨著輸入序列長度的增加,計算量呈平方級增長。這在處理長序列時尤其成為問題,限制了大語言模型的最大序列長度N的大小,這就是在發展初期,大模型往往只支持2K或4K token輸入的原因。 與之對應,RNN只要考慮之前的隱狀態和當前輸入。
      • 內存消耗大:與計算復雜度類似,注意力機制在處理長序列時,需要存儲大量的中間結果,對內存的要求很高。

      0x04 注意力發展歷史

      注意力機制只是一種思想,可以用到很多任務上。我們接下來看看幾個經典的使用注意力機制對Encoder-Decoder進行改進的案例,也梳理一下歷史上的重要節點。用范偉的話說:我們要知道Transformer是怎么來的。當然,我們也希望可以看到Transformer是怎么沒的,畢竟如果有新方案取代了Transformer,那就說明AI領域將迎來新的歷史性突破。

      我們首先用一個圖來展示下注意力發展歷史。大家可以看到, Transformer是建立在很多巨人肩膀之上的集大成者。

      此處參考了 "看圖學大模型:Transformers 的前生今世(上)"。

      4.1 RCTM

      論文Recurrent Continuous Translation Models 被認為是神經網絡機器翻譯(NMT)的開篇之作,其特點如下:

      • 使用編碼器-解碼器框架。編碼器用CNN實現,解碼器用RNN實現。
      • 編碼器將源文本轉換成連續的上下文向量,解碼器將上下文向量轉換成目標語言。
      • 解碼中的每一步都用到了編碼器生成的上下文向量。
      • 端到端神經網絡模型。

      4.2 RNN 編碼器-解碼器

      論文"Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation"這篇是Bengio 團隊的成果,其特點如下:

      • 明確了編碼器和解碼器的概念,且都用RNN來實現。

      • 解碼的每一步都用到了編碼器生成的隱向量。

      • 沒有把編碼器-解碼器做成一個端到端的模型,只是把解碼器的輸出概率作為特征喂給了統計機器翻譯(SMT)模型。

      4.3 Sequence to Sequence Learning with Neural Networks

      論文“Sequence to Sequence Learning with Neural Networks”也起到了重要作用,其特點如下:

      • 使用端到端結構。
      • 用RNN實現編碼器和解碼器。
      • 將編碼器生成的上下文作為解碼器的初始化參數。

      4.4 Bahdanau Attention

      論文“Neural Machine Translation by Learning to Jointly Align and Translate”提出的Bahdanau Attention是Attention的開創者之一。其特點如下:

      • 端到端模型。
      • 在編碼器-解碼器的基礎上增加了注意力機制,即提出了注意力概念。
      • 編碼器生成的上下文向量不再作為解碼器每一步的輸入。
      • 因為解碼器依然是RNN,所以沒有解決并行問題。

      作者在論文中使用注意力機制解決了如何建模“與距離無關的依賴”,如何把編碼器產生的信息更有效的傳遞給解碼器的問題。這樣注意力機制就和RNN一起配合,解決了遺忘和對齊問題。

      • 對齊問題。作者認為在翻譯過程中,輸入和輸出兩種語言中相同含義的詞或者段落應該能對齊。但是目前沒有做到,因此作者使用了一個網絡來計算兩種語言間不同單詞的關聯分數,即注意力分數。
      • 遺忘問題。作者使用注意力機制打破了傳統RNN方案中依賴固定長度上下文信息的限制。
        • 作者認為該固定長度的上下文信息限制了模型性能,是瓶頸所在,需要編碼器的上下文包括更多的有效信息。而且之前解碼器每個時刻用到的語義向量都是編碼器生成的同一個上下文信息,也就是最后一個時間步的隱藏層輸出。作者認為不合理,因為通常一個詞的語義更依賴與原句子中這個詞附近的詞的意思,而非最后一個時間步的輸出。對于解碼器來說,每個時刻的上下文向量都應不同。
        • 為了解決上述問題,作者構建的注意力機制把編碼器所有的隱狀態都利用起來。編碼器每個時間步都考慮全部編碼序列,由解碼器來決定編碼后的序列中哪個部分最重要,從而給予更高的權重,然后在全部編碼序列基礎上計算一個上下文向量。

      !Andrej Karpathy分享了Dzmitry Bahdanau 的私人郵件,從中我們可以看到,為了克服編碼器和解碼器之間的瓶頸,Dzmitry Bahdanau的思路發展歷程。

      • 最初的設計靈感來自“兩個光標”的概念,即通過動態規劃,讓兩個光標分別移動在源序列和目標序列中。然而,這種方法太復雜且實現困難。
      • Dzmitry Bahdanau退而求其次,嘗試了一種“硬編碼的對角線注意力”,盡管結果尚可,但仍顯笨拙。
      • 真正的突破發生在Dzmitry Bahdanau的一次靈感閃現中:為什么不讓解碼器自主學習關注源序列中的相關部分?這一想法源自英語翻譯練習。在翻譯時,眼睛(注意力)會在源句和目標句之間反復移動。Dzmitry Bahdanau將這種軟搜索設計為 softmax 操作,并結合雙向 RNN 的狀態進行加權平均。

      可以看到,突破性的想法往往來自那些在實踐中尋求解決問題的創新者,而非空想理論家。Dzmitry Bahdanau在郵件中說得非常好:

      我的AI宏愿是啟動更多像機器翻譯項目那樣的驚人應用項目。優秀的研發工作對基礎技術的進步貢獻遠勝過那些我們常認為是“真正”AI研究的復雜理論。

      4.5 Luong Attention

      論文“Effective Approaches to Attention-based Neural Machine Translation”基于Bahdanau Attention對注意力機制的計算方式進行多樣性探索。

      • 首先依據計算區域的大小將對齊函數分為局注意力(Global Attention)和局部注意力(Local Attention)兩種機制。全局注意力模式在編碼器每一步中都會基于所有詞計算出隱狀態。局部注意力模式則只計算部分子集的隱狀態。
      • 其次依據所用信息把對齊函數分為基于內容的對齊和基于位置的對齊。前者同時考慮了編碼器的隱狀態 \(\tilde h_s\) 和解碼器當前步的隱狀態\(?_t\)。后者只考慮了編碼器當前步的隱狀態 \(?_t\)

      下圖是局部注意力。

      下圖呈現了全局注意力。

      Luong Attention和Bahdanau Attention的具體區別如下:

      • 在生成語義向量時存在區別。

        • Luong Attention使用當前解碼器的隱狀態來計算對齊向量,而Bahdanau Attention使用先前的隱狀態。
        • Luong使用多種對齊函數,而Bahdanau使用相加方式。
      • 在傳遞上下文向量進行預測時也有區別。

        • 基本模塊不同。計算隱狀態時,Luong Attention使用LSTM,Bahdanau Attention用的是雙向RNN單元。
        • 解碼器計算隱狀態的流程不同。Luong模型里單獨使用了一個隱狀態\(\tilde s_t\)來計算輸出\(y_t\)
        • 解碼器的輸入輸出不同:
          • Bahdanau Attention的輸入是\(c_t\)\(h_{t-1}\)拼接,然后計算得到\(h_t\),最終輸出\(y_t\)
          • Luong Attention的輸入是\(c_t\)\(h_t\)拼接,然后利用額外的網絡結構計算得到\(\tilde h_t\),最終輸出\(y_t\)

      4.6 ResNet

      ResNet是何凱明大神的經典之作,其可以有效解決梯度消失/爆炸問題,讓神經網絡層數的瓶頸得以突破。后面有文章詳細講解,這里不再贅述。

      4.7 Self Attention

      之前的注意力機制都關注不同序列之間的注意力,即交叉注意力。而論文Long Short-Term Memory-Networks for Machine Reading在交叉注意力的基礎上提出了self-attenton(自注意力機制),或者叫 intra-attention。作者認為我們在順序地閱讀每個單詞的時候,每個單詞和前面單詞的關聯度是不一樣的,因此使用了注意力機制來完成這個分析工作。

      論文的動機如下。傳統的LSTM在處理輸入時把句子視為單詞序列,并遞歸的將每個詞與之前的記憶結合起來,直至得到整個句子的語義表示。這種方案面臨兩個問題:

      • 在遞歸過程中記憶存在壓縮的問題,哪些部分在壓縮中能被記憶是未知的。LSTM在循環壓縮下的記憶序列能力存在疑問。LSTM的假設是:當前的狀態能夠匯總所有LSTM看到的token。傳統的LSTM只有兩個輸出,一個是memory cell,另一個是hidden state。在時刻t,這兩個輸出分別代表t時刻前的所有memory和hidden state。在馬爾科夫條件下,這個關系可以無限制的表示整個序列,但是在實際中這并不可行,即在序列足夠長的時候,LSTM的假設無法成立。
      • 輸入結構化存在問題。LSTM 按照序列順序一個一個token來整合信息,但其沒有明確的機制從結構中推理,即難以對token之間的關系進行建模。

      此論文針對這兩個問題進行處理。

      • 對于記憶壓縮問題,論文設計了memory/hidden tape 來進行解決,每個token都對應一個隱藏狀態向量和記憶向量。
      • 對于結構化輸入的問題,論文引入intra-attention,利用通過hidden tape計算出某個詞與其之前詞之間的相關程度。事實上就是利用每個詞的隱藏狀態向量和記憶向量用來做注意力計算。

      具體思路如下圖。

      在對兩個序列的alignment(語義對齊)建模方面,此論文提出了兩種方法。

      • 淺融合模型:將傳統編碼器-解碼器中的LSTM替換為LSTMN,并用inter-attention進行對齊。
      • 深融合模型:結合inter-attention和intra-attention來更新狀態,將序列內部的關系和序列之間的關系進行深度融合。

      4.8 QKV-Attention

      論文QKV-Attention: FRUSTRATINGLY SHORT ATTENTION SPANS IN NEURAL LANGUAGE MODELING這可能是最早提出QKV概念的論文。

      作者認為目前注意力機制的隱向量承擔了太多功能,這樣會分身乏術,影響模型效果。因為同一個詞,它在背景向量中的意義和它作為查詢詞時候代表的意義不同,所以要區分開來。因此該論文對每個時間步產生的輸出向量進行分割成三個向量key, value, predict,各自有不同的分工。以下是修改邏輯和歷程。

      Attention for Neural Language Modeling

      原始模型結構如下圖所示,神經網絡語言模型只有一個輸出向量,同時用來計算注意力向量,編碼歷史上下文信息和預測下一個詞的分布。

      Key-Value Attention

      論文作者將原始模型的輸出劃分成兩部分:key和value,用key來計算注意力向量,用value來編碼下一個詞的分布和上下文信息。

      但是value仍然同時被用來編碼上下文信息和下一個詞的分布表示(既要對查詢的結果負責,又要對聚合的結果負責),一心二用容易出錯。因此作者做了進一步改進。

      Key-Value-Predict Attention

      新模型結構如下圖所示,作者對原始模型的輸出做進一步劃分為三部分:key,value和predict。用key來計算注意力向量,用value來編碼上下文信息,用predict來編碼下一個詞的分布。

      N-gram Recurrent Neural Network

      作者又繼續進行改進,將原始模型的輸出劃分成N-1部分,用前N-1個時間步的輸出向量的一部分來計算下一個詞的分布表示。模型結構如下圖所示。

      4.9 MultiHead Self Attention

      論文Self Attention & MultiHead Attention : A STRUCTURED SELF-ATTENTIVE SENTENCE EMBEDDING 把注意力機制用到了文本表示學習中,讓注意力機制完成多項工作。論文的注意力計算過程如下:

      • 輸入為一個包含n個token的句子。
      • 使用雙向LSTM處理句子,得到一個單獨句子中鄰接詞的一些依賴,即隱向量。
      • 將隱向量拼接成H。
      • 使用自注意力機制把隱藏狀態H進行轉換,得到向量權重a。
      • 通過a提供的權重來求和LSTM隱藏狀態H,得到一個輸入句子的向量表示\(m\ \epsilon R^{1\times 2u}\)。多個m專注于句子的不同部分,借此來表示句子整體語義。
      • 進行多頭自注意力計算。通過將矩陣A和LSTM隱藏狀態H相乘得到句子嵌入。此處的矩陣乘AH和Transformer的注意力計算方式有些近似。

      4.10 Multi-step Attention

      論文[Convolutional Sequence to Sequence Learning](Convolutional Sequence to Sequence Learning) 使用CNN模型結合注意力機制進行操作,從而解決RNN不能并行的問題。

      與RNN相比,CNN存在一定的優勢。一來CNN可以并行處理,因此訓練速度快,二則RNN并不能很好地處理句子中的結構化信息。因此,作者使用CNN來做編碼器和解碼器,利用層次結構來捕獲詞之間遠程的依賴關系,也可以更好地捕捉更復雜的關系。在解碼過程中,每一個卷積層都會進行注意力操作,稱為multi-step attention。

      4.11 小結

      我們可以看到,在上述的演進過程中,Transformer所包括或者說所需要的組件一步步的被實現出來。然而上述注意力方案中依然有RNN、CNN的存在,這拖了后腿。比如RNN無法并行訓練,不利于大規模快速訓練和部署,也不利于整個算法領域發展。

      因此,Transformer作者徹底摒棄了RNN和CNN,構建了一個全新的序列轉換架構。Transformer整個網絡結構完全是由注意力機制組成,通過把序列元素兩兩直接比較,Transformer可以學習到輸入序列里所有詞的相關性,一步到位捕捉到全局的聯系。同時,因為Transformer不是按順序分析,這樣它可以并行操作,也使得它比 RNN 具有更高的計算效率和可擴展性。最終,Transformer就是這樣一個融匯貫通的集大成者。

      當然我們也要看到,RNN和CNN一直沒有放棄努力,各自的發展也是有聲有色。尤其在強化學習領域,RNN更是在發揮巨大的作用。我們也期望未來會有更多創新的模型和方法來讓Transformer在強化學習領域發揮更大的作用。

      下一篇我們介紹Transformer的總體架構。

      0xFF 參考

      A General Survey on Attention Mechanisms in Deep Learning Gianni Brauwers and Flavius Frasincar
      Andrej Karpathy 首次公開私人郵件:揭秘Transformer 注意力機制真相 AI寒武紀
      Attention is All your Need
      Bahdanau 和 Luong Attention 直觀介紹 Honoria
      [Convolutional Sequence to Sequence Learning](Convolutional Sequence to Sequence Learning)
      Effective Approaches to Attention-based Neural Machine Translation
      Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation
      Long Short-Term Memory-Networks for Machine Reading
      NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE
      NEURAL MACHINE TRANSLATION BY JOINTLY LEARNING TO ALIGN AND TRANSLATE
      QKV-Attention: FRUSTRATINGLY SHORT ATTENTION SPANS IN NEURAL LANGUAGE MODELING
      Recurrent Continuous Translation Models
      Recurrent Continuous Translation Models
      Self Attention & MultiHead Attention : A STRUCTURED SELF-ATTENTIVE SENTENCE EMBEDDING
      Self Attention & MultiHead Attention : A STRUCTURED SELF-ATTENTIVE SENTENCE EMBEDDING
      Self Attention 1: Long Short-Term Memory-Networks for Machine Reading
      seq2seq中的兩種attention機制(圖+公式) 胡文星
      Sequence to Sequence Learning with Neural Networks
      Thang Luong's Thesis on Neural Machine Translation Minh-Thang Luong
      Transformer自下而上理解(4) Attention without RNN marsggbo
      《FRUSTRATINGLY SHORT ATTENTION SPANS IN NEURAL LANGUAGE MODELING》閱讀筆記 Simple
      一文看懂 Bahdanau 和 Luong 兩種 Attention 機制的區別 Flitter
      注意力機制 OnlyInfo
      理解Attention:從起源到MHA,MQA和GQA Linsight
      看圖學大模型:Transformers 的前生今世(上) 看圖學
      第四篇:一文搞懂Transformer架構的三種注意力機制 AIwithGary
      綜述:圖像處理中的注意力機制 極市平臺
      非Transformer架構的進展與猜想 StormBlafe

      posted @ 2025-02-09 11:17  羅西的思考  閱讀(8364)  評論(13)    收藏  舉報
      主站蜘蛛池模板: 融水| 丁香五月婷激情综合第九色 | 久久精品免视看国产成人| 色综合网天天综合色中文| 日本一区二区三区专线| www插插插无码视频网站| 伦理片午夜视频在线观看| 久久精品视频这里有精品| 国产成人a∨激情视频厨房| 少妇被粗大的猛烈xx动态图| 国产成人无码免费看片软件| 色综合天天综合网国产人| 在线a亚洲老鸭窝天堂| 在线天堂中文新版www| 亚洲国产另类久久久精品| 国产精品SM捆绑调教视频| 中文字幕亚洲综合久久综合| 久久精品道一区二区三区| 国产成人午夜精品福利| 苏尼特右旗| 国产免费又黄又爽又色毛| 亚洲色大成网站WWW永久网站| 金寨县| 在线看免费无码av天堂的| 国产suv精品一区二区四| 国偷自产一区二区三区在线视频 | 亚洲欧美日韩人成在线播放 | 日本无遮挡吸乳视频| 国产成人亚洲综合91精品| 国产欲女高潮正在播放| 亚洲V天堂V手机在线| 国产免费一区二区不卡| 国产麻豆一精品一av一免费| 精品久久久bbbb人妻| 亚洲精品一区二区天堂| 加查县| 国产午夜在线观看视频播放| 亚洲欧洲日韩精品在线| 少妇午夜啪爽嗷嗷叫视频| 日本一区不卡高清更新二区| 精品亚洲精品日韩精品|