天天看點

第一次見有人能把生成式AI的“自注意力機制”講的這麼通俗易懂!

作者:AI的新視界

本文将以通俗易懂的講解方式,帶你深入解析生成式AI Transformer架構下的“自注意力機制”背後的運作邏輯,注重向想了解AI算法的非專業人士也能深入的學習和了解人工智能背後的科學原理。

本文将盡可能的以深入淺出地講解把“自注意力機制”這個經典而又抽象的知識給大家講清楚,講明白。在容易了解學習的基礎上保證一定的專業性和技術性。

寫在前面

在之前的文章中,我們已經學習過了“什麼是生成式AI?”,對生成式AI的的三種模型“Transformer、BERT和GPT”也有了初步相對客觀、真實的認識。具體内容從下面藍色連結進行跳轉學習:

愛了愛了!第一次見有人把生成式AI原理講的這麼通俗易懂~

第一次見有人把Transformer、BERT和GPT大模型講的這麼通俗易懂!

我們知道,Transformer是一個通用的模型架構,它可以用于解決一系列“序列到序列”的問題。而後面所提出的BERT和GPT模型勻是基于Transformer架構來進行設計的。為什麼後提出的算法模型都要基于Transformer來建構?,而不能是循環神經網絡(RNN)和是卷積神經網絡的(CNN)?”,這所有的一切都要從Transformer架構下的一個神奇子產品說起。它就是self-attention mechanism,翻譯成中文叫做自注意力機制。

背景知識:

本着知識一定要系統的來學的原則,我想先帶着大家了解一下在自然語音處理領域中,在“序列到序列化問題”上AI算法是如何演進的,以及Transformer為什麼會被提出?它又解決了哪些痛點?

早在Transformer模型被提出之前,人們處理序列化資料主要使用的是RNN和CNN等模型。但這兩種模型在序列化資料上的應用存在一定的局限性。

RNN的局限性:

  1. 難以并行化:RNN模型的計算過程需要順序進行,無法進行并行計算,是以訓練速度較慢。
  2. 難以捕捉長期依賴:由于每個時間步的隐藏狀态都與前一個時間步的隐藏狀态相關,是以模型難以捕捉長期依賴。在處理長序列時,模型容易出現梯度消失或爆炸的問題。

CNN的局限性體:

  1. 由于CNN中視窗大小是固定的,是以無法處理不同長度的文本序列。
  2. CNN隻能捕獲局部特征,無法捕獲序列中長距離的依賴關系。

Transformer相比CNN和RNN所具備的優勢:

  1. 長序列模組化能力強:Transformer模型中的自注意力機制可以直接擷取序列中任意位置的資訊,進而有效地解決了長序列模組化的問題;
  2. 預訓練表現優異:Transformer模型在在大規模無标簽資料上的預訓練表現上優秀,可以學習到句子級别和單詞級别的語義資訊;
  3. 使用了自注意力機制:模型的每個時間步之間可以進行并行計算,可加速模型的訓練;
  4. 通過堆疊多個層可提高模型的表現能力,使用殘差連接配接和層歸一化等技術可以加速模型的收斂

這裡需要客觀認識一點,再好的模型它也會有缺點,不能因為它具備很多優點,就忽視掉它本身的不足。隻有正視這些缺陷,未來才能設計出更好的解決方案,人類社會文明才能不斷進步!

Transformer存在的缺陷:

  1. 訓練代價高昂: Transformer 模型通常需要巨大的訓練資料集和大量的計算資源才能訓練。
  2. 對序列長度敏感: Transformer 模型中的自注意力機制使得模型可以處理變長的輸入序列,但當序列長度增加時,模型的計算複雜度會增加,這會導緻訓練時間和記憶體占用量的增加。
  3. 難以處理長期依賴關系: 如果序列過長,它其實也可能丢失序列中遠離目前位置的關鍵資訊。
  4. 對詞彙表大小敏感: 由于嵌入層需要為每個單詞配置設定單獨的嵌入向量。當詞彙表很大時,模型需要更多的參數和計算資源,模型會變的複雜,在訓練中出現過拟合的問題。
  5. 無法處理複雜的結構資訊: Transformer 模型的自注意力機制适用于序列資料,但當輸入資料是圖形或樹形結構時,需要使用更複雜的注意力機制來考慮節點之間的關系。

這裡大家如果對RNN和CNN不夠了解的話也沒關系,RNN、CNN與Transformer是AI發展下不同時代的産物,其擅長的領域各不相同。Transformer和RNN擅長處理序列資料,CNN擅長處理圖像等空間資料。但他們都可以被應用在自然語言進行中,同樣Transformer也已經不再局限于自然語言處理領域,在圖像領域,如圖像分類、目标檢測和圖像生成等也取得了不錯的成績,感興趣的同學可以學習一下 “Image Transformer”這篇論文,該論文是最先将 Transformer 應用于圖像領域的論文之一。

[論文連結1]: https://arxiv.org/abs/1802.05751           

簡單點,大家可以把一系列“序列到序列的問題”了解為一艘航母,在CNN和RNN時代,航母采用的是“蒸汽彈射”裝置,而到了Transformer時代,航母就裝配了“電磁彈射”裝置。蒸汽彈射技術效率慢,效果差,而電磁彈射技術效率高,且效果好。而“電磁彈射”之間也有很大差異,比如福特号和福建艦,同為電磁彈射,福特号卻事故頻發。一個大模型的好壞不僅僅取決于它所采用的基礎元件,還取決于如何科學合理的進行創造性改進。這也是為什麼GPT4不再開源的原因之一,科技就是生産力。這個比喻也許并不是特别恰當,它有一個非常重要的前提條件,那就是同為自然語言處理應用的情況下。

由于本文主要側重的是對“自注意力機制”的解讀,是以不會過多的深入介紹其他不相關的模型,若大家對這部分算法模型很感興趣,可以持續關注本賬号釋出的内容,這些内容的深入解析後續會為大家一一奉上。

從宏觀角度介紹自注意力機制

自注意力機制是在論文"Attention Is All You Need" 中提出的,論文題目翻譯過來就是“注意力機制是你所需要的一切”,該論文由Google Brain團隊于2017年發表在國際會議NIPS上。

[論文連結2] : https://arxiv.org/abs/1706.03762           
第一次見有人能把生成式AI的“自注意力機制”講的這麼通俗易懂!

圖源論文 Attention is all you need 論文首頁截圖

這篇論文對于自然語言處理領域來說具有劃時代的意義:

  • 其創造性地提出了基于注意力機制的神經網絡模型( Transformer 模型)用于自然語言處理任務;
  • 通過實驗證明,Transformer 模型在機器翻譯任務中取得了最優的效果,并可應用在其他自然語言處理任務;
  • 極大程度的推動了機器學習領域的發展,為後續研究提供了新的思路和方法。
第一次見有人能把生成式AI的“自注意力機制”講的這麼通俗易懂!

圖源論文 Transformer模型在翻譯任務效果更好,訓練成本更低

第一次見有人能把生成式AI的“自注意力機制”講的這麼通俗易懂!

圖源論文 Transformer 的架構圖

想要學習自注意力機制,我們先得了解Transformer的模型架構。如上圖所示,Transformer模型主要由① 位置編碼層、② 前饋網絡、③ 歸一化層等基礎元件構成。

位置編碼層:其被引入是因為Transformer不像RNN那樣處理的是序列中單個元素,它處理的是并行輸入的整個序列元素,是一種可學習的編碼方法,它将位置資訊與輸入向量相結合,為每個輸入向量添加一個唯一的編碼向量,表示其在序列中的順序和位置資訊。

前饋網絡:這個子層對自注意力子層的輸出進行非線性變換,并學習不同次元之間的關系。(注:非線性變換與線性變換相對,變換的函數關系不滿足加法和數乘的運算法則。也就是說,非線性變換對于輸入資料的變換不再是線性的,而可能是曲線形狀的。非線性變換非常重要,因為線性變換隻能進行簡單的變換操作,而不能捕捉到輸入資料之間更為複雜的關系。通過引入非線性變換,以提高模型的表達能力。)

歸一化層:這個層采用層歸一化或者批歸一化的方式對每個子層的輸出進行歸一化處理,以提高模型的訓練穩定性和泛化性能。(注:歸一化處理是指将資料進行線性縮放,将資料映射到特定的區間内,通常是将資料轉化為0到1或-1到1之間的值。歸一化處理在資料預處理和模型訓練中經常被使用,它可以使不同量級的資料處于同一個量級上,消除不同資料之間的量綱影響,提高模型的訓練效率和準确性。歸一化處理的目的是使不同特征之間具有可比性,同時可以消除資料間的噪聲和異常值,使得模型更具有魯棒性。)

Transformer架構是由位置編碼層、編碼器、解碼器、前饋網絡組成。其中編碼器又由多層子層組成,每個子層都包含多頭自注意力子層、前饋子層和歸一化子層三個元件。解碼器也由多層子層組成,每個子層包含多頭自注意力子層、前饋子層、編碼器-解碼器注意力子層和歸一化子層四個元件。

引入自注意力機制的原因是它可以讓編碼器在對特定元素進行編碼時使用輸入序列中其他元素的資訊(可簡單了解為當需要翻譯一個詞時,不僅僅關注了目前的詞資訊,還關注了其他詞的資訊)。然後,Self-Attention 層的輸出會流入前饋網絡。

舉個例子:假如,我們要翻譯下面這個句子:

“This mushroom is so beautiful, but it looks poisonous.”

請問這個句子中的 it 指的是什麼?是指 mushroom還是 beautiful?對人來說,這無疑是一個簡單的問題,但是對于算法來說卻沒那麼簡單。

第一次見有人能把生成式AI的“自注意力機制”講的這麼通俗易懂!

最後一層編碼器中it詞的編碼資訊

可以看到,在對‘it’進行編碼時,有一部分注意力集中在"The mushroom"上,并将它們的部分資訊融入到"it"的編碼中,顔色越深的部分表示注意力得分越多。

從内部介紹自注意力機制

第一次見有人能把生成式AI的“自注意力機制”講的這麼通俗易懂!

點積縮放注意力機制 和 多頭注意力機制

如圖所示,自注意力機制包括“縮放點積注意力機制”,和“多頭注意力機制”,點積縮放注意力機制是一種常見的注意力機制,它通過對查詢向量和鍵向量進行點積運算,得到注意力得分,并通過縮放系數對注意力得分進行調整。它在計算效率和表現效果上都有比較好的表現。

多頭注意力機制則是通過将輸入同時進行多個線性變換,每個變換都有自己的Q、K、V矩陣,并分别計算自己的注意力得分,最後綜合所有變換的輸出得到最終的輸出。是以,多頭注意力機制可以學習到更加豐富和多樣化的特征表示,更好的模型表現能力。

這裡有兩個形象的比喻:

① 我們可以将點積縮放注意力機制比作一名學生,他通過思考和計算得到了某個問題的答案。而多頭注意力機制則可以将這個問題交給多個學生來解決,每個學生都有自己獨特的思考方式和解決方案,最後将所有方案綜合起來,得到更加全面和準确的答案。

② 想象一下,你去看一部懸疑破案題材的電影,點積縮放機制相當于隻看了一次,而多頭注意力機制看了N次電影,如果您隻看一次這部電影,你非常有可能錯過一些重要的細節導緻無法了解整個故事的全貌。而經過多次反複觀看,你也許就能兼顧到不同的微小細節,就能順理成章地推理出案情的發展走勢。

看到這裡,大家可能要說了,“你說的我都懂,可我現在就想知道Q(query)、K(key)和V(value)是幹什麼的?”,别着急,下面為大家解答疑惑。具體來說,給定輸入序列的查詢矩陣Q、鍵矩陣K和值矩陣V。這三個向量,是分别由輸入序列經過3次不同的線性變換得到。給定一個輸入序列X,假設其每個元素的向量表示為x_1, x_2, ..., x_n,則對于查詢序列Q、鍵序列K和值序列V,可以通過對同一輸入X的不同線性變換得到,而Transformer本質上是學習Q、K、V三個矩陣的線性變換矩陣:

著名的Attention-function(注意力函數) 就是通過Q、K、V進行下面的公式計算啦:

  1. 首先計算 Q 和 K 之間的點積,為了防止其結果過大,會除以一個其中為d為K向量的次元, 因為如果次元d太大,點積值也會相應變大,這會導緻softmax函數推到梯度極小的區域,需要加入縮放因子來盡可能的抵消這種影響,保證在反向傳播時,求梯度更加穩定。
  2. 然後利用softmax操作将其結果歸一化為機率分布,再乘以V就得到權重求和的表示。

你可以把這個函數看作是一個權重配置設定函數,它能夠根據輸入的序列和目前處理的位置,計算出一個權重分布,用于表示不同位置的重要性。其中Q用于表示目前處理的位置,而V表示序列中的所有位置,這下應該明白了吧。

使用向量計算 Self-Attention

下面通過一個例子,讓我們看一下如何使用向量計算 Self-Attention。計算 Self-Attention 的步驟如下:

第一次見有人能把生成式AI的“自注意力機制”講的這麼通俗易懂!

圖源網絡 詞向量求得其對應的q,k,v向量

  1. 對編碼器的每個輸入向量(每個詞的詞向量)建立三個向量:Query 向量 q、Key 向量 k和 Value 向量 v。它們是通過詞向量分别和 3 個矩陣、、相乘得到的,而這 3 個矩陣則是通過訓練獲得。(注意,這些向量的維數小于詞向量的維數。新向量的維數為 64,而 Embedding 和編碼器輸入/輸出向量的維數為 512。新向量不一定非要更小,這是為了使多頭注意力計算保持一緻的結構性選擇。)
  2. 計算注意力分數。假設我們正在計算這個例子中第一個詞 “Thinking” 的自注意力。我們需要根據 “Thinking” 這個詞,對句子中的每個詞都計算一個分數。這些分數決定了我們在編碼 “Thinking” 這個詞時,需要對句子中其他位置的每個詞放置多少的注意力;
第一次見有人能把生成式AI的“自注意力機制”講的這麼通俗易懂!

圖源網絡 Thinking詞相對Machines 注意力得分是96

  1. 将每個分數除以縮放因子;
  2. 将這些分數進行 softmax 操作;
第一次見有人能把生成式AI的“自注意力機制”講的這麼通俗易懂!

圖源網絡 對位置詞的注意力分數進行處理

  1. 将每個 softmax 分數分别與每個 Value 向量相乘。這種做法背後的直覺了解是:對于分數高的位置,相乘後的值就越大,我們把更多的注意力放在它們身上;對于分數低的位置,相乘後的值就越小,這些位置的詞可能是相關性不大,我們就可以忽略這些位置的詞。
  2. 将權重 Value 向量(即上一步求得的向量)求和,這樣就得到了自注意力層在這個位置的輸出。
第一次見有人能把生成式AI的“自注意力機制”講的這麼通俗易懂!

圖源網絡 目前位置詞的注意力計算結果

使用矩陣計算Self-Attention

第一次見有人能把生成式AI的“自注意力機制”講的這麼通俗易懂!

圖源網絡 對輸入向量矩陣X求Q、K、V矩陣

如圖所示,具體計算步驟如下:

  1. 計算 Query,Key 和 Value 矩陣。首先,将所有詞向量放到一個X矩陣中,然後分别和 3 個訓練過的權重矩陣(,,)相乘,得到Q、K、V矩陣。X中的每一行,表示輸入句子中的每一個詞的詞向量(長度為 512,在圖中為 4 個方框),本例中有兩個詞,是以矩陣X次元為(2, 512)。矩陣 Q,K 和 V 中的每一行,分别表示 Q向量,K向量和 V 向量(它們的長度都為 64,在圖中為 3 個方框),矩陣次元為(2, 64);
  2. 計算自注意力。由于這裡使用了矩陣進行計算,可以将前面的第 2 步到第 6 步壓縮為一步;
第一次見有人能把生成式AI的“自注意力機制”講的這麼通俗易懂!

圖源網絡 求自注意力得分

多頭注意力機制(Multi-head Attention)

什麼是多頭注意力機制?

多頭注意力機制通過 h 個不同的線性變換對 Q、K 和 V 進行映射;然後,将不同的 Attention 拼接起來;最後,再進行一次線性變換。

第一次見有人能把生成式AI的“自注意力機制”講的這麼通俗易懂!

多頭注意力機制 論文截圖

  1. 在多頭注意力下,我們為每組注意力單獨維護不同的 Query、Key 和 Value 權重矩陣,進而得到不同的 Query、Key 和 Value 矩陣。
第一次見有人能把生成式AI的“自注意力機制”講的這麼通俗易懂!

圖源網絡 多頭注意力計算各自的Q,K,V矩陣

  1. 使用不同的權重矩陣進行 n 次自注意力計算,就可以得到 n個不同的Z矩陣。
第一次見有人能把生成式AI的“自注意力機制”講的這麼通俗易懂!

圖源網絡 8個注意力頭計算得到8個Z矩陣

  1. 将這 n 個矩陣整合為一個矩陣送入前饋神經網絡層。

具體方法如下:

① 将n個矩陣拼接起來 得到;

②将拼接矩陣與權重矩陣與相乘;

第一次見有人能把生成式AI的“自注意力機制”講的這麼通俗易懂!

圖源網絡 拼接各個注意力頭計算得到的矩陣并與權重矩陣相乘

以上就是多頭注意力計算的全過程了,感興趣的同學點開下面的圖看一下,資料是如何在多頭注意力機制被矩陣計算的。

第一次見有人能把生成式AI的“自注意力機制”講的這麼通俗易懂!

圖源網絡 多注意力頭計算Z矩陣的全過程

總結

Transformer是一種非常成功的深度學習模型,被廣泛應用于自然語言處理和其他序列相關的任務。其關鍵在于使用了一種新的注意力機制,使得模型能夠學習到不同位置之間的關系。Transformer的注意力機制是一種自注意力機制,它能夠根據輸入序列中的每個元素自适應地計算權重,進而更好地捕捉輸入序列中的資訊。具體來說,注意力機制的計算分為三個步驟:

  1. 計算Q、K、V矩陣。将輸入序列分别映射到三個不同的向量空間,得到查詢向量Q、鍵向量K和值向量V。
  2. 計算注意力分數。将Q和K進行點積,然後将結果除以一個縮放因子,再通過softmax函數獲得注意力分數。這些分數用于權重V向量,産生權重和,這就是注意力表示。
  3. 計算最終輸出。将每個注意力表示連接配接起來,然後通過一個線性層将其映射到期望的輸出次元。最終的輸出可以看作是所有輸入元素的權重和,權重是通過注意力機制自适應計算的。

關注我,每天一起學習,不一樣的知識!

繼續閱讀