如何最簡單、通俗地理解GPT的Transformer架構?

qing_yun發表於2023-11-29

來源:與資料同行
OpenAI 最近開了自家的第一屆開發者大會,釋出的GPT-4 Turbo和GPTs等成果令人震撼。雖然國內各種大模型馬不停蹄,但看了這個釋出會,感覺跟ChatGPT的差距又變大了,ChatGPT是真的遙遙領先了。

對於許多人來說,理解其背後的核心技術——Transformer模型仍然是一個挑戰。您是否曾經好奇,是什麼使得GPT能夠如此精準地生成文字、回答問題,甚至編寫程式程式碼?

但Transformer這個東西很難說到底有沒有一種簡單、通俗地理解方式。我大概網上翻了一遍,幾乎都是長篇大論,原因很簡單,Transformer就不是簡單幾句話就能講得清楚的。


放在之前,我個人的觀點是要想系統而又透徹地理解 Transformer,至少要遵循下面這樣一個思路(步驟):


1、首先,瞭解神經網路的基本概念,特別是一些NLP領域的基本知識,比如深度神經網路是如何訓練的,文字是如何被表徵的,序列文字資訊的處理等。

2、Transformer主要解決了什麼問題。重點關注的方面有(自)注意力機制,多頭注意力,Transformer的內部結構。

3、動手實現一個Transformer應用。


第一點屬於要求掌握一些背景知識,而第二點是Transformer的與眾不同之處,第三點是有意向深入學習,甚至想在實踐中用Transformer做點什麼的人去關注。

現在,有了ChatGPT的助力,一切將變得不同。

我將以一種簡單、通俗的方式解釋Transformer模型的基本原理。無論您是AI領域的新手,還是對最新技術保持好奇的專業人士,您都會發現這裡的內容既有啟發性又易於理解。

我的文章共分為四大部分,如下所示,宏觀部分是為了讓你對整體網路框架有所理解,過程部分是讓你知道資料是如何流轉的,微觀部分是對其中出現的基本概念進行更詳細的解釋,這應是全網最通俗的一篇介紹Transformer的文章了:


1、網路結構主要模組介紹(宏觀)
2、Transformer 訓練過程(過程)
3、Transformer 推理過程(過程)
4、核心概念詳解(微觀)

什麼是 Transformer?

在傳統的序列建模方法中,如迴圈神經網路(RNN)和卷積神經網路(CNN),在處理長序列均存在限制。

RNN在處理長序列時容易出現梯度消失或梯度爆炸的問題,模型難以捕捉到長距離的依賴關係,不能平行計算。

而CNN卷積操作通常要求輸入具有固定的尺寸,在處理可變長序列時,為了使序列具有相同的長度,需要對較短的序列進行填充,導致計算效率低下。

2017年穀歌Brain團隊發表了鼎鼎大名的文章“Attention Is All You Need”(注意力就是你所需要的一切),就是這篇文章提出了Transformer網路結構。

如下圖所示,透過自注意力機制(self-attention)等手段來解決上述問題,然後就有了大模型的爆發,讀懂了這張圖,就算入門了吧。


如何最簡單、通俗地理解GPT的Transformer架構?


1、網路結構主要模組介紹


(1)輸入嵌入層(Input Embedding)

  • 輸入(Inputs):這是模型的輸入部分,通常是一串單詞或符號的序列。


  • 輸入嵌入(Input Embedding)這一步將輸入的序列(比如一句話中的每個單詞)轉換為嵌入表示。嵌入表示是一種高維的、能夠捕捉到單詞語義資訊的向量形式。


  • 位置編碼(Positional Encoding ):由於Transformer是不依賴於序列的,位置編碼用於給模型提供關於單詞在序列中位置的資訊。這些編碼是新增到輸入嵌入上的,確保即使在處理同時的輸入時,模型也能利用單詞的順序資訊。


(2)編碼器層(Encoder,左邊)

  • Nx:這表示有N個相同的編碼器層堆疊在一起。每層都有兩個主要子層。第一個是多頭自注意力機制(Multi-Head Attention),第二個是前饋神經網路(Feed Forward)。


  • 多頭自注意力(Multi-Head Attention):注意力機制允許模型在處理每個詞時考慮到輸入序列中的所有詞。多頭部分意味著模型會並行地學習輸入資料的不同表示。


  • 殘差連線和歸一化(Add & Norm):每個注意力層後面都會有殘差連線(Add),後面跟著層歸一化(Norm)。殘差連線有助於避免深層網路中的梯度消失問題,而層歸一化則有助穩定訓練過程並加快收斂速度。


  • 前饋神經網路(Feed Forward):這是一個簡單的全連線神經網路,它對自注意力層的輸出進行處理,它由兩個線性變換和一個非線性啟用函式組成。


(3)解碼器層(Decoder,右側)

  • 解碼器同樣包含多個相同的層,並且每層也有三個主要子層:掩蔽的多頭自注意力機制(Masked Multi-Head Attention)、多頭自注意力機制(Multi-Head Attention)和前饋神經網路(Feed Forward)。


  • 掩蔽多頭自注意力(Masked Multi-Head Attention):這與編碼器中的多頭自注意力機制相似,但有一個關鍵區別:為了保證解碼的順序性,掩蔽操作確保了位置i的預測只能依賴於位置i之前的輸出,不會"看到"未來的資訊。


  • 多頭自注意力(Multi-Head Attention):這個模組接受編碼器的輸出和掩蔽多頭注意力的輸出作為輸入。這樣,解碼器可以關注輸入序列的相關部分,並結合它自己的輸出進行預測。


  • 前饋神經網路(Feed Forward):與編碼器中的相同。每個子層後面同樣跟有加法和歸一化步驟。為每個位置上的向量提供額外的非線性變換。


(4)輸出嵌入層(Output Embedding)

  • 解碼器端的嵌入層將目標序列(在訓練時是正確的輸出序列,在推理時是已經生成的序列)轉換為向量的形式。


(5)輸出過程(Output)

  • 線性層(Linear):解碼器的最後輸出透過一個線性層,這個層的作用是將解碼器層的高維輸出對映到一個更大的詞彙空間,這個空間的每一個維度對應一個可能的輸出單詞。


  • Softmax層線性層的輸出透過Softmax函式轉換成一個機率分佈,這個分佈表示每個可能的下一個單詞的機率。


2、Transformer 訓練過程

Transformer 訓練的目標是透過對輸入序列與目標序列的學習,生成目標序列。訓練過程中,模型對資料的處理過程如下,大體可分為7 個步驟:


(1)序列化和批處理

  • 原始文字資料被轉換成數字化表示(通常是單詞或子詞的索引),然後分成多個批次進行處理。


(2)輸入嵌入

  • 批處理資料透過嵌入層將索引轉換成高維的嵌入向量。


  • 嵌入向量被送入位置編碼模組,該模組加入位置資訊以維持序列的順序。


(3)編碼器堆疊

  • 編碼器的每一層都接收上一層的輸出作為輸入,第一層的輸入是位置編碼後的嵌入向量。


  • 每層編碼器包括一個多頭注意力子層和一個簡單的前饋網路。


  • 多頭注意力子層透過自注意力機制處理序列的每個元素,然後是一個殘差連線和層歸一化。


  • 接著是前饋網路,再次跟隨一個殘差連線和層歸一化。


(4)解碼器堆疊

  • 解碼器的每一層也接收上一層的輸出作為輸入,但解碼器的第一層接收的是目標序列的嵌入向量(在訓練時是正確的序列,採用教師強制)和位置編碼。


  • 解碼器的每一層包含三個主要元件:掩蔽多頭注意力子層(防止位置後看)、編碼器-解碼器注意力子層(將解碼器的注意力集中到編碼器的輸出上)和前饋網路,每個子層後都有殘差連線和層歸一化。


(5)輸出線性層和Softmax

  • 解碼器的輸出透過一個線性層,將維度轉換為詞彙表大小。


  • 接著,Softmax層將線性層的輸出轉換為機率分佈,表示下一個詞的預測。


(6)損失計算

  • 透過比較模型的預測和實際的目標序列,計算交叉熵損失。


  • 這個損失將用於反向傳播過程,用於更新模型的權重。


(7)反向傳播和最佳化

  • 根據損失函式,透過反向傳播計算關於模型引數的梯度。


  • 使用最佳化演算法(如Adam)調整模型引數,以最小化損失函式。


在訓練過程中,以上步驟會重複多次,直到模型收斂或滿足某些效能標準。在整個過程中,編碼器負責理解輸入序列的上下文,而解碼器則用於生成輸出序列,這種生成依賴於編碼器的輸出和之前已經生成的輸出序列。


3、Transformer 推理過程


在推理過程中,我們只有輸入序列,而沒有目標序列作為輸入傳遞給解碼器。Transformer 推理的目標是僅透過輸入序列產生目標序列,大體可分為7 個步驟:


(1)輸入處理

  • 與訓練時類似,輸入文字首先被序列化為索引的形式,然後轉換為嵌入向量,並加上位置編碼。


(2)編碼器處理

  • 編碼器堆疊接收帶有位置編碼的嵌入向量,並透過其所有層進行處理。每一層都包括自注意力和前饋網路,以及殘差連線和層歸一化。


  • 編碼器的最終輸出是一個上下文表示,包含了輸入文字的資訊。


(3)解碼器處理

  • 在推理階段,解碼器通常一次生成一個詞。它以先前生成的詞的嵌入(經過位置編碼)作為輸入。初始時,解碼器可能接收一個起始符號(如 "

  • 解碼器的每一層首先使用掩蔽多頭注意力層防止未來資訊的流入,然後與編碼器的輸出一起處理,使用編碼器-解碼器注意力層將注意力集中到編碼器的輸出,接著是前饋網路。同樣,每個子層後面都跟著殘差連線和層歸一化。


(4)輸出預測

  • 解碼器的輸出透過一個線性層和Softmax層,轉換成對下一個單詞的預測機率分佈。


(5)單詞選擇和序列更新

  • 根據Softmax輸出,選擇機率最高的單詞作為這一步的輸出。


  • 這個選中的單詞被新增到序列中,並用於下一解碼步驟的輸入。


(6)序列生成的終止

  • 這個過程一直重複,直到生成一個終止符號(如 "


(7)後處理

  • 生成的序列可能會經過後處理,例如去除特殊符號,進行必要的解碼(將索引轉換回文字),並返回最終的可讀文字。


在推理過程中,特別是在使用束搜尋(beam search)等策略時,可能會同時考慮多個候選解碼路徑,並選擇整體得分最高的路徑作為最終輸出。這有助於提高翻譯或文字生成的質量。


4、核心概念詳解


(1)輸入嵌入(Input Embedding)


輸入嵌入(Input Embedding)是將詞彙表中的單詞轉換為機器可以理解的數值形式的過程。具體來說,它涉及將每個單詞對映到高維空間中的向量。這個向量捕捉了單詞的語義特徵,使得在這個空間中語義相近的單詞擁有相近的嵌入向量。


舉個例子:


假設我們有一個簡單的詞彙表,包含四個單詞:{'king': 0, 'queen': 1, 'man': 2, 'woman': 3}。在這個詞彙表中,每個單詞都有一個唯一的索引。在轉換為輸入嵌入之前,文字中的每個單詞都會被轉換成對應的索引。例如,句子 "king and queen" 將被轉換為索引的序列 [0, 2, 1]。然後,我們會有一個嵌入矩陣,其中的每一行代表一個單詞的嵌入向量。假設我們的嵌入維度是5,那麼嵌入矩陣可能看起來像這樣:


如何最簡單、通俗地理解GPT的Transformer架構?


當我們要轉換索引序列 [0, 2, 1] 為嵌入向量時,我們只需要選擇對應索引的行。因此,"king and queen" 對應的嵌入向量序列就是:


如何最簡單、通俗地理解GPT的Transformer架構?


這樣,原始的文字資料就被轉換成了模型可以處理的數值型資料。在實際的Transformer模型中,嵌入向量維度通常遠遠大於5,可以是幾百到幾千,以捕捉更豐富的語義資訊。

(2)位置編碼(Positional Encoding)


位置編碼(Positional Encoding)在Transformer模型中,特別是其變體如GPT中,是透過向輸入嵌入中新增一組固定的訊號來實現的。對於每一個位置,都會有一個獨特的位置編碼,該編碼與單詞的嵌入相加,使得模型能夠根據這些嵌入的總和來區分不同位置的單詞。

在原始的Transformer模型中,位置編碼是使用正弦和餘弦函式的固定公式來生成的,每個維度的位置編碼依賴於位置的正弦和餘弦函式:


對於位置pos和維度序號i,位置編碼PE(pos.i)使用以下公式定義,d是嵌入的維度:

PE(pos,2i)=sin(pos/10000^(2i/d))
PE(pos,2i+1)=cos(pos/10000^(2i/d))


下面舉個例子:


假設我們有一個簡單的句子:“Hello world”,我們想要對這個句子進行編碼以輸入到一個基於Transformer的模型中。為了簡化,假設我們的嵌入維度是4,我們只考慮前兩個位置的編碼。

首先,我們將單詞轉換為嵌入向量,假設:


"Hello" -> [1.0, 0.5, 0.3, 0.9]
"world" -> [0.4, 0.2, 0.9, 0.7]


對於位置1("Hello"所在的位置):

PE(1,0)=sin(1/10000^(0/4))=sin(1)
PE(1,1)=cos(1/10000^(1/4))=cos(1)
PE(1,2)=sin(1/10000^(2/4))=sin(1)
PE(1,3)=cos(1/10000^(3/4))=cos(1)


位置 1 編碼為 [0.84, 0.54, 0.84, 0.54],同理,位置 2 編碼為[0.91, -0.42, 0.91, -0.42]。


然後我們將每個單詞的嵌入向量與其對應位置的位置編碼相加:

"Hello" with position encoding -> [1.0 + 0.84, 0.5 + 0.54, 0.3 + 0.84, 0.9 + 0.54]
"world" with position encoding -> [0.4 + 0.91, 0.2 - 0.42, 0.9 + 0.91, 0.7 - 0.42]


經過位置編碼後的向量可能是這樣的:

"Hello" with position encoding -> [1.84, 1.04, 1.14, 1.44]
"world" with position encoding -> [1.31, -0.22, 1.81, 0.28]


(3)多頭自注意力(Multi-Head Attention)


自注意力(Self-Attention),也稱為內部注意力,是一種注意力機制,它能夠在序列內部的單個元素之間建立直接的依賴關係。這意味著模型在處理序列中的每一個元素時,都能考慮到序列中的其他元素,從而獲取更全面的上下文資訊。


如何最簡單、通俗地理解GPT的Transformer架構?


如圖所示,a為輸入的序列,中間的方框是self attention操作,最終輸出的b為依據a每個位置與其它位置關聯程度加權後輸出的序列【1】

從細節來說,需要理解幾個概念:


查詢(Query):查詢是你想要了解的資訊或者你想要從文字中提取的特徵。它類似於你對文字中的某個詞語提出的問題或者你想要了解的內容。

鍵(Key):鍵是文字中每個詞語的表示。它類似於每個詞語的識別符號或者關鍵資訊,用於幫助計算查詢與其他詞語之間的關聯程度。

值(Value):值是與每個詞語相關的具體資訊或特徵。它類似於每個詞語的具體含義或者特徵向量。


在自注意力機制中,具體步驟是:

Step 1:從輸入值a乘以矩陣Wq、Wk和Wv(這三個矩陣是模型引數,需要透過訓練資料來學習)獲取查詢(Q)、鍵(K)、值(V)

Step 2:透過計算查詢(Q)與鍵(K)之間的點積,來衡量查詢與其他詞語之間的關聯程度,

然後,透過對這些關聯程度進行歸一化處理(一般採用softmax歸一化),得到每個詞語的注意力權重。

Step 3:最後,根據這些注意力權重,對每個詞語的值(V)進行加權求和,得到一個新的表示,該表示會更加關注與查詢相關的資訊。

如何最簡單、通俗地理解GPT的Transformer架構?


如圖所示,a11是q1和k1點積計算並歸一化後得到的關聯程度,以此類推,最後再用關聯程度與所有v進行加權求和,就能獲得到與q1關聯最大的資訊b1,而其它的b2、b3、b4也是同樣的計算方式【1】


舉個具體的例子:

在處理句子“貓坐在墊子上”時,自注意力機制允許模型在生成“坐”這個詞的表示時,同時考慮到“貓”、“墊子”和“上”這些詞,而不僅僅是依賴於區域性或前一個詞。透過這種機制,模型能更好地理解語言結構和意義,比如它可以瞭解“貓”是“坐”的主語,而“墊子”是動作發生的地點。


在傳統的自注意力機制中,你只能使用一組查詢(Q)、鍵(K)和值(V)來計算注意力權重。但是,在多頭注意力機制中,你可以使用多組不同的Q、K和V來進行計算。


如何最簡單、通俗地理解GPT的Transformer架構?


每個注意力頭都有自己獨立的一組Q、K和V,它們透過獨立的線性變換來生成。這樣,每個注意力頭可以關注文字中不同的方面和特徵,從而提取更豐富的資訊。最後,多個注意力頭的結果會被拼接在一起,並透過另一個線性變換進行整合,得到最終的輸出。


下面給出一個多頭自注意力的計算過程例子:


以句子“貓坐在墊子上”為例,讓我們簡化並走過多頭自注意力的計算過程。為了簡化,假設我們只有兩個頭,每個頭的維度為2,這意味著我們的嵌入向量也會被縮減為2維。


初始化詞嵌入(這些通常在實際情況下會有更高的維度):

貓 -> [1, 0]
坐 -> [0, 1]
在 -> [1, 1]
墊子 -> [0, 0]
上 -> [1, 1]


隨機初始化Q、K、V矩陣(實際上是訓練出來的):

Q矩陣 = [[1, 0], [0, 1]]
K矩陣 = [[0, 1], [1, 0]]
V矩陣 = [[0, 1], [1, 0]]


讓我們計算頭1的Q、K、V,頭1的Q、K、V(假設與上面相同):

Q(坐) = [0, 1] * [[1, 0], [0, 1]] = [0, 1]
K = [[1, 0], [0, 1], [1, 1], [0, 0], [1, 1]] * [[0, 1], [1, 0]] = [[0, 1], [0, 1], [1, 1], [0, 0], [1, 1]]
V和K相同(簡化情況)


計算注意力權重:

scores = Q(坐) * K^T = [0, 1] * [[0, 0, 1, 0, 1], [1, 1, 1, 0, 1]] = [1, 1, 1, 0, 1]


應用softmax得到注意力權重(假設softmax不改變權重,因為這裡只是示例):

attention_weights = [0.2, 0.2, 0.2, 0, 0.2]


計算加權和:

V * attention_weights = [[0, 1], [0, 1], [1, 1], [0, 0], [1, 1]] * [0.2, 0.2, 0.2, 0, 0.2] = [0.4, 0.8]


這個向量代表了對“坐”這個詞的加權上下文表示,反映了整個句子中不同詞對“坐”詞的貢獻。在多頭自注意力中,每個頭都會進行這樣的計算,然後我們會拼接或整合所有頭的輸出來得到最終的表示。


(4)殘差連線和歸一化(Add & Norm)


每個注意力層後面都會有殘差連線(Add),後面跟著層歸一化(Norm)。


殘差連線(Add):這一步的作用是將子層的輸入直接新增到其輸出,這有助於解決深度網路中的梯度消失問題。它允許模型在深層中學習小的變化,而不會丟失輸入資訊。


假設我們有一個輸入向量 x 和一個透過子層處理得到的輸出向量 y。殘差連線就是簡單地將輸入 x 直接加到輸出 y 上,即z=x+y。


歸一化層(Norm):歸一化步驟是為了加速訓練過程並提高穩定性。它透過規範化每個特徵向量來確保網路中的啟用在訓練過程中保持相同的規模。


舉例:在殘差連線後,我們得到了向量 z。層歸一化會計算 z 的均值和標準差,並用這些引數將 z 歸一化,得到z'=(z-u)/o,其中u是均值,o是標準差。通常,這之後還會有一個縮放和位移操作,通常表示為LN(z)=Yz+B,其中Y和B是看學習的引數。


這兩個步驟的組合對 Transformer 架構至關重要,因為它們允許模型深度增加而不會降低效能。在 NLP 任務如機器翻譯和文字生成中,這種架構已經取得了顯著的成功。


(5)前饋神經網路(Feed Forward)


前饋神經網路(Feed Forward Neural Network,FFNN)是一種基礎的神經網路架構,在這種網路中,資訊僅沿一個方向前進:從輸入節點透過隱藏層(如果有的話)到輸出節點,沒有任何迴圈或反饋。


在Transformer模型的上下文中,前饋神經網路指的是一個由全連線層組成的子網路,它跟在多頭注意力機制之後。通常,這個前饋網路包含兩個線性變換,並且中間有一個非線性啟用函式,如ReLU或GELU。

首先,它可能會將注意力層的輸出透過一個線性層,使得模型能夠重新組合這些特徵。然後,透過非線性啟用函式,如ReLU,增加模型的非線性處理能力。最後,另一個線性層將這些非線性特徵轉換成最終的輸出格式。


相對於多頭自注意力主要關注的是不同輸入成分之間的關聯性,如詞與詞之間的相互作用。而前饋神經網路(FFNN)在這個基礎上進一步作用,它可以:


增加非線性:多頭自注意力是一個相對線性的過程,而前饋神經網路透過啟用函式如ReLU引入非線性,使得模型能夠捕捉更復雜的特徵和更抽象的表示。


整合資訊:前饋神經網路可以將多頭自注意力層學習到的不同方面的資訊整合起來,形成更全面的表徵。


建立新的特徵組合:雖然多頭自注意力可以對特徵進行加權組合,但前饋神經網路能透過權重矩陣建立全新的特徵表示,這些新的特徵可能更適合解決特定任務。


獨立處理每個位置:在Transformer模型中,前饋網路是獨立應用於每個位置的。這意味著每個位置都可以根據自己的上下文資訊經過非線性變換,而不是隻依賴於與其他位置的關係。


總之,雖然多頭自注意力能夠捕捉輸入中的位置關係,前饋神經網路則在此基礎上對每個位置的特徵表示進行進一步的加工和抽象化。兩者結合使得Transformer模型能夠有效處理序列資料,並在多種複雜任務中取得優異表現。


(6)線性層(Linear)


在Transformer模型中,"Linear"這一步驟指的是一個全連線的神經網路層,其作用是將從上一層(比如多頭注意力(Multi-Head Attention)機制或前饋網路(Feed Forward))得到的特徵轉換為最終的輸出格式。


全連線層(Linear Layer)通常執行以下操作:


變換維度:它可以將輸入的特徵向量的維度變換為另一個維度。例如,在解碼器的最後,全連線層會將特徵向量變換為詞彙表大小的向量,每個維度對應於詞彙表中的一個單詞。


學習特徵:透過這種線性變換,模型能夠學習輸入特徵與輸出之間的複雜對映關係。


準備Softmax:在輸出層,這個全連線層的輸出將作為Softmax函式的輸入,Softmax函式隨後將這些線性輸出轉換為機率分佈。


假設我們有一個Transformer模型正在處理一個詞彙表中有10000個單詞的語言模型任務。在模型的某個階段,我們得到了一個特徵向量,該向量的維度為512,這是經過多頭注意力機制處理後的結果。現在,我們希望將這些特徵對映到一個新的向量中,其中每個維度對應於詞彙表中的一個單詞,以便我們可以計算每個單詞作為下一個單詞的機率。


這裡,全連線層(Linear Layer)就起到了作用。全連線層有一個權重矩陣,大小為10000*512。當我們將512維的特徵向量透過這個全連線層時,它會被變換成一個10000維的向量。這個過程可以表示為以下矩陣乘法操作:


輸出向量=權重矩陣*輸入向量+偏置向量,如果用具體的數值來表示它,可以是:輸入向量x是512*1的列向量,權重矩陣W是10000*512的矩陣,偏置向量b是一個10000*1的列向量。


最後的輸出向量是一個10000*1的列向量,它可以被送入Softmax函式來轉換為一個機率分佈,這樣每個元素就代表了了詞彙表中相應單詞作為下一個單詞出現的機率。


(7)Softmax層


Softmax層是一種將一組實數值對映成一組機率分佈的函式,它通常用於神經網路的最後一層,特別是在處理多分類問題時。在Softmax層中,每個數值(通常是模型的輸出)都透過指數函式變為正數,並且被歸一化,使得所有數值之和為1,從而可以被解釋為機率。


Softmax函式可以表示為:

如何最簡單、通俗地理解GPT的Transformer架構?


Softmax層的價值在於:


機率解釋:將模型的輸出轉換為機率分佈,使得每個輸出都可以解釋為某個事件的機率。


可微性:Softmax函式是可微的,這意味著可以透過梯度下降等最佳化演算法來訓練模型。


決策邊界:它在多類別的輸出之間提供了明確的決策邊界。對於給定的輸入,Softmax層會增強最高機率的輸出值,並壓制其他值,使得模型可以更有信心地選擇某個類別。


與損失函式協同:它通常與交叉熵損失函式結合使用,在分類問題中這樣的組合可以高效地進行訓練。


穩定性:使用Softmax函式可以避免數值計算中的穩定性問題,因為它將任意範圍的輸入值轉換為(0,1)範圍內的輸出。


在Transformer模型中,Softmax層用於將解碼器的輸出(每個單詞對應的分數)轉換為下一個單詞的機率分佈,這是生成文字的關鍵步驟。

我對Transformer感興趣,一方面是源於求知的需要,另一方面跟自己當前從事的大模型相關工作有關係。在大家喊著做大模型的時候,還是要靜下來好好理解理解這個新事物,這才有了這篇學習筆記。

轉給有需要的人!

參考文獻:
【1】作者:等壹  來源:知乎  為什麼我還是無法理解transformer?

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027828/viewspace-2995114/,如需轉載,請註明出處,否則將追究法律責任。