深入理解 Attention 機制(上)- 起源

FunCry
5 min readFeb 28, 2023

--

介紹

近幾年自然語言處理有很大的進展,從 2018 年 Google 推出的 BERT,到後來的 GPT、ChatGPT 等,這些模型之所以能取得這樣的成果,除了龐大的資料量及運算資源外,最重要的就是背後的 Transformer 模型,以及其使用的 Attention 機制。

今天這篇文章將分為兩個部分,上篇介紹序列到序列模型遇到的困難,以及為何要引入 Attentino 機制;下篇則著重在 Transformer 背後的 Scaled Dot-Product Attention 以及實際的使用例子。

機器翻譯

在開始前,我們先介紹一項自然語言處理的領域:機器翻譯。

翻譯是一種典型的序列到序列(Sequence to Sequence)問題,意思就是:

  1. 輸入是一個長度可以變的序列(例如一個中文的句子。「今天天氣很晴朗」)
  2. 輸出是一個長度可以變的序列(例如一個英文的句子。”It’s sunny today”)

假設今天 Transformer 還沒被發明,電腦會如何處理這類問題呢?

直覺上會想到的作法大概就像上面這張圖一樣,分為兩個步驟:

  1. 把輸入序列(中文句子)一個字一個字讀完
    在上面這張圖中,每個 x 對應的就是一個字,而電腦會先讀第一個字,讀完後存起來,再去讀下一個字(先讀「今」,再讀「天」……),之後把所有資訊存在中間的 context vector。
  2. 計算輸出序列(英文句子)
    輸出時,模型會根據 context vector 儲存的資訊,一個字一個字的輸出(”it”, “’s”, “sunny”, ……)。

實作上確實可以用這樣的模型去做機器翻譯,但上面的例句都很短,如果今天我希望機器處理長一點的輸入(例如這篇文章),那就會遇到下面的問題:

  1. context vector 維度太小,把比較前面的字給忘了
  2. 讀完前面才能讀後面,速度很慢

針對這兩個問題,下面的模型提出了解方

Neural Machine Translation by Jointly Learning to Align and Translate

這篇論文主要試圖解決上面提出的第一點問題,概念其實很簡單,既然 Context Vector 沒辦法存下整個輸入句的資訊,那我就在每次輸出字時都看一遍整個句子就好了

實際上的做法就是在輸出每個字的時候分別給輸入的每個字一個權重,再讓輸入的句子做加權平均。

在下面的模型中,輸入的每個字會被先轉成 hidden state(下面的 h,可以想像成 word-embedding),而模型根據目前翻譯到的字和每個字分別的 hiddent state 來計算 Attention 分數。

計算分數的函式會由模型自己學會。

舉例:假設現在模型已經輸出 “It’s sunny”,準備要輸出下一個字

但是在輸出前,它需要先確定哪些中文字對下一個輸出來說比較重要,所以它用某個函數 α 來計算每個字該有的分數,α("sunny", 今) = 0.8, α(“sunny", 天) = 0.6 ……

照理來說,下一個字是 “today”,所以輸入中和「今天」兩個字有關的部分應該會比較高分。

因此,在輸出 “today” 前,每個中文字可能會有下面的分數。

  • 「今」:0.8
  • 「天」:0.6
  • 「氣」:0.05
  • 「很」:0.01
  • ……

接下來它就把「今」的 hidden state 乘上 0.8、把「天」的 hidden state 乘上 0.6 ……,接著把所有的 hidden state 加起來,用它來計算下一個輸出的英文字應該要是什麼。

這個模型其實就是 Attention 的雛型,Attention 的概念就是:

  1. 給每個輸入的字一個權重
  2. 將輸入的字做加權計算

之後談到 Attention 時往往會提到三個東西,Query、Key 和 Value,雖然這篇論文沒有明確提到這三個詞,但是從上面的模型架構已經可以看出些端倪:

  • Query: 翻譯到的前一個字(”sunny”)
  • Key、Value: 每個字的 hidden state
  • Attention 分數: α 函式算出來的分數

你可以用下面的句子來理解 Attention,對於現在的 Query(正在翻譯的英文字)來說,哪個 Key(中文字)最重要。

而在這個模型中,Value 和 Key 其實是一樣的東西。

結論

這篇文章詳細介紹了 Attention 機制的起源,雖然現在在做自然語言處理時使用的大多不是這個模型,但透過前面的介紹可以理解為什麼需要推出這個機制,以及 Attention 的核心概念是什麼。

下一篇文章將介紹現在大家使用的 Scaled Dot-Product Attention 的邏輯以及使用例子。

--

--