天天看點

解碼自然語言處理之 Transformers

作者:冷凍工廠

自 2017 年推出以來,Transformer 已成為機器學習領域的一支重要力量,徹底改變了翻譯和自動完成服務的功能。

最近,随着 OpenAI 的 ChatGPT、GPT-4 和 Meta 的 LLama 等大型語言模型的出現,Transformer 的受歡迎程度進一步飙升。這些引起了巨大關注和興奮的模型都是建立在 Transformer 架構的基礎上的。通過利用 Transformer 的力量,這些模型在自然語言了解和生成方面取得了顯着的突破。

盡管有很多很好的資源可以解釋Transformer的工作原理,但我發現自己處于這樣的境地:我了解其機制如何在數學上工作,但發現很難直覺地解釋Transformer如何工作。

在這篇博文[1]中,我的目标是在不依賴代碼或數學的情況下提供Transformer如何工作的進階解釋。我的目标是避免混淆技術術語以及與以前的架構進行比較。雖然我會盡量讓事情變得簡單,但這并不容易,因為Transformer相當複雜,但我希望它能讓人們更好地直覺地了解它們的作用以及如何做到這一點。

什麼是Transformer?

Transformer 是一種神經網絡架構,非常适合涉及處理序列作為輸入的任務。也許在這種情況下,序列最常見的例子是句子,我們可以将其視為有序的單詞集。

這些模型的目的是為序列中的每個元素建立數字表示;封裝有關元素及其相鄰上下文的基本資訊。然後,所得的數字表示可以傳遞到下遊網絡,下遊網絡可以利用這些資訊來執行各種任務,包括生成和分類。

通過建立如此豐富的表示,這些模型使下遊網絡能夠更好地了解輸入序列中的底層模式和關系,進而增強它們生成連貫且上下文相關的輸出的能力。

Transformer 的主要優勢在于它們能夠處理序列内的遠端依賴關系,并且效率很高;能夠并行處理序列。這對于機器翻譯、情感分析和文本生成等任務特别有用。

解碼自然語言處理之 Transformers

什麼是注意力 ?

也許 Transformer 架構使用的最重要的機制被稱為注意力,它使網絡能夠了解輸入序列的哪些部分與給定任務最相關。對于序列中的每個标記,注意力機制會識别哪些其他标記對于了解給定上下文中的目前标記很重要。在我們探索如何在變壓器中實作這一點之前,讓我們先從簡單的開始,嘗試了解注意力機制試圖從概念上實作什麼,以建立我們的直覺。

了解注意力的一種方法是将其視為一種用包含有關其相鄰标記資訊的嵌入替換每個标記嵌入的方法;而不是對每個标記使用相同的嵌入,而不管其上下文如何。如果我們知道哪些标記與目前标記相關,捕獲此上下文的一種方法是建立這些嵌入的權重平均值,或者更一般地說,建立線性組合。

解碼自然語言處理之 Transformers

讓我們考慮一個簡單的例子,說明如何查找我們之前看到的句子之一。在應用注意力之前,序列中的嵌入沒有其鄰居的上下文。是以,我們可以将單詞 light 的嵌入可視化為以下線性組合。

解碼自然語言處理之 Transformers

在這裡,我們可以看到我們的權重隻是機關矩陣。應用我們的注意力機制後,我們希望學習一個權重矩陣,以便我們可以用類似于以下的方式表達我們的光嵌入。

解碼自然語言處理之 Transformers

這次,我們為與我們選擇的标記序列中最相關的部分相對應的嵌入賦予了更大的權重;這應該確定在新的嵌入向量中捕獲最重要的上下文。包含目前上下文資訊的嵌入有時被稱為上下文嵌入,這就是我們最終想要建立的。

注意力是如何計算的?

注意力有多種類型,主要差別在于用于執行線性組合的權重的計算方式。在這裡,我們将考慮原始論文中介紹的縮放點積注意力,因為這是最常見的方法。在本節中,假設我們所有的嵌入都已進行位置編碼。

回想一下,我們的目标是使用原始嵌入的線性組合來建立上下文嵌入,讓我們從簡單開始,假設我們可以将所需的所有必要資訊編碼到我們學習的嵌入向量中,而我們需要計算的隻是權重。

為了計算權重,我們必須首先确定哪些标記彼此相關。為了實作這一點,我們需要建立兩個嵌入之間的相似性概念。表示這種相似性的一種方法是使用點積,我們希望學習嵌入,以便較高的分數表明兩個單詞更相似。

解碼自然語言處理之 Transformers

由于對于每個标記,我們需要計算其與序列中每個其他标記的相關性,是以我們可以将其概括為矩陣乘法,這為我們提供了權重矩陣;這通常被稱為注意力分數。為了確定權重總和為 1,我們還應用了 SoftMax 函數。然而,由于矩陣乘法可以産生任意大的數字,這可能會導緻 SoftMax 函數針對較大的注意力分數傳回非常小的梯度;這可能會導緻訓練過程中梯度消失的問題。為了解決這個問題,在應用 SoftMax 之前,将注意力分數乘以縮放因子。

解碼自然語言處理之 Transformers

現在,為了獲得上下文嵌入矩陣,我們可以将注意力分數乘以原始嵌入矩陣;這相當于對我們的嵌入進行線性組合。

解碼自然語言處理之 Transformers

雖然模型有可能學習足夠複雜的嵌入來生成注意力分數和随後的上下文嵌入;我們試圖将大量資訊壓縮到通常很小的嵌入次元中。

是以,為了讓模型學習任務稍微容易一些,讓我們引入一些更容易學習的參數!我們不直接使用嵌入矩陣,而是通過三個獨立的線性層(矩陣乘法);這應該使模型能夠“關注”嵌入的不同部分。如下圖所示:

解碼自然語言處理之 Transformers

從圖像中,我們可以看到線性投影被标記為 Q、K 和 V。在原始論文中,這些投影被命名為 Query、Key 和 Value,據說是受到資訊檢索的啟發。就我個人而言,我從未發現這個類比有助于我的了解,是以我傾向于不關注這一點;我遵循此處的術語是為了與文獻保持一緻,并明确這些線性層是不同的。

現在我們了解了這個過程是如何工作的,我們可以将注意力計算視為具有三個輸入的單個塊,這将被傳遞到 Q、K 和 V。

解碼自然語言處理之 Transformers

當我們将相同的嵌入矩陣傳遞給 Q、K 和 V 時,這稱為自注意力。

什麼是多頭注意力?

在實踐中,我們經常并行使用多個自注意力子產品,以使 Transformer 能夠同時關注輸入序列的不同部分——這稱為多頭注意力。

多頭注意力背後的想法非常簡單,多個獨立自注意力塊的輸出連接配接在一起,然後通過線性層。該線性層使模型能夠學習組合來自每個注意力頭的上下文資訊。

在實踐中,每個自注意力塊中使用的隐藏次元大小通常選擇為原始嵌入大小除以注意力頭的數量;保留嵌入矩陣的形狀。

解碼自然語言處理之 Transformers

Transformer 還由什麼組成?

盡管介紹 Transformer 的論文被命名為“Attention is all you need”,但這有點令人困惑,因為 Transformer 的元件不僅僅是 Attention!

Transformer 還包含以下内容:

  • 前饋神經網絡(FFN):一種兩層神經網絡,獨立應用于批次和序列中的每個标記嵌入。 FFN 塊的目的是将額外的可學習參數引入到轉換器中,這些參數負責確定上下文嵌入是不同的且分散的。原始論文使用了 GeLU 激活函數,但 FFN 的元件可能會根據架構的不同而有所不同。
  • 層歸一化:有助于穩定深度神經網絡(包括 Transformer)的訓練。它标準化每個序列的激活,防止它們在訓練過程中變得太大或太小;這可能會導緻與梯度相關的問題,例如梯度消失或爆炸。這種穩定性對于有效訓練非常深的 Transformer 模型至關重要。
  • 跳過連接配接:與 ResNet 架構一樣,殘差連接配接用于緩解梯度消失問題并提高訓練穩定性。

雖然 Transformer 架構自推出以來一直保持相當穩定,但層歸一化塊的位置可能會根據 Transformer 架構而變化。原始架構(現在稱為後層規範)如下所示:

解碼自然語言處理之 Transformers

如下圖所示,最近架構中最常見的放置是預層規範,它将規範化塊放置在跳躍連接配接内的自注意力和 FFN 塊之前。

解碼自然語言處理之 Transformers

Transformer 有哪些不同類型?

雖然現在有許多不同的Transformer 架構,但大多數可以分為三種主要類型。

編碼器架構

編碼器模型旨在産生可用于下遊任務(例如分類或命名實體識别)的上下文嵌入,因為注意力機制能夠關注整個輸入序列;這是本文到目前為止所探讨的架構類型。最流行的純編碼器Transformer系列是 BERT 及其變體。

将資料傳遞給一個或多個Transformer塊後,我們得到了一個複雜的上下文嵌入矩陣,表示序列中每個标記的嵌入。然而,要将其用于分類等下遊任務,我們隻需要做出一個預測。傳統上,第一個标記被取出并通過分類頭;通常包含 Dropout 和 Linear 層。這些層的輸出可以通過 SoftMax 函數傳遞,将其轉換為類機率。下面描述了一個示例。

解碼自然語言處理之 Transformers

解碼器架構

與編碼器架構幾乎相同,主要差別在于解碼器架構采用屏蔽(或因果)自注意力層,是以注意力機制隻能關注輸入序列的目前和先前元素;這意味着生成的上下文嵌入僅考慮之前的上下文。流行的僅解碼器型号包括 GPT 系列。

解碼自然語言處理之 Transformers

這通常是通過用二進制下三角矩陣屏蔽注意力分數并用負無窮大替換非屏蔽元素來實作的;當通過下面的 SoftMax 操作時,這将確定這些位置的注意力分數等于 0。我們可以更新之前的自注意力圖,将其包括在内,如下所示。

解碼自然語言處理之 Transformers

由于它們隻能從目前位置和向後進行,是以解碼器架構通常用于自回歸任務,例如序列生成。然而,當使用上下文嵌入來生成序列時,與使用編碼器相比,還有一些額外的考慮因素。下面顯示了一個示例。

解碼自然語言處理之 Transformers

我們可以注意到,雖然解碼器為輸入序列中的每個标記生成上下文嵌入,但在生成序列時,我們通常使用與最終标記相對應的嵌入作為後續層的輸入。

此外,将 SoftMax 函數應用于 logits 後,如果不應用過濾,我們将收到模型詞彙表中每個标記的機率分布;這可能非常大!通常,我們希望使用各種過濾政策來減少潛在選項的數量,一些最常見的方法是:

  • Temperature調整:Temperature是一個應用于 SoftMax 操作内部的參數,它會影響生成文本的随機性。它通過改變輸出詞的機率分布來确定模型輸出的創造性或集中度。較高的Temperature使分布變得平坦,使輸出更加多樣化。
  • Top-P 采樣:此方法根據給定的機率門檻值過濾下一個标記的潛在候選者數量,并根據高于此門檻值的候選者重新配置設定機率分布。
  • Top-K 采樣:此方法根據 Logit 或機率得分(取決于實作)将潛在候選者的數量限制為 K 個最有可能的标記

一旦我們改變或減少了下一個标記的潛在候選者的機率分布,我們就可以從中采樣以獲得我們的預測——這隻是從多項分布中采樣。然後将預測的标記附加到輸入序列并回報到模型中,直到生成所需數量的标記,或者模型生成停止标記;表示序列結束的特殊标記。

編碼器-解碼器架構

最初,Transformer 是作為機器翻譯的架構提出的,并使用編碼器和解碼器來實作這一目标;在使用解碼器轉換為所需的輸出格式之前,使用編碼器建立中間表示。雖然編碼器-解碼器轉換器已經變得不太常見,但 T5 等架構示範了如何将問答、摘要和分類等任務建構為序列到序列問題并使用這種方法來解決。

編碼器-解碼器架構的主要差別在于解碼器使用編碼器-解碼器注意力,它在注意力計算期間同時使用編碼器的輸出(作為 K 和 V)和解碼器塊的輸入(作為 Q)。這與自注意力形成對比,自注意力對于所有輸入使用相同的輸入嵌入矩陣。除此之外,整體生成過程與使用僅解碼器架構非常相似。

我們可以将編碼器-解碼器架構可視化,如下圖所示。在這裡,為了簡化圖形,我選擇描繪原始論文中所示的變壓器的後層範數變體;其中層規範層位于注意塊之後。

解碼自然語言處理之 Transformers

希望上面的描述對您了解 Transformer 有所幫助。

Reference

[1]Source: https://towardsdatascience.com/de-coded-transformers-explained-in-plain-english-877814ba6429

繼續閱讀