零基礎(chǔ)入門深度學(xué)習(xí)(10) - Transformer (3/3)

時(shí)隔八年,再次提筆續(xù)寫這個(gè)系列。毫無(wú)疑問(wèn),智能時(shí)代已經(jīng)到來(lái),AGI(通用人工智能)似乎也不再是遙不可及的夢(mèng)想。大模型,作為目前最接近實(shí)現(xiàn)AGI的技術(shù),甚至已經(jīng)可以寫代碼了!這對(duì)于程序員真是數(shù)十年未有之大變局,因此學(xué)好、用好大模型,就將一步跨過(guò)JavaScript、Java、C++直接走到鄙視鏈的頂端,用自然語(yǔ)言編程,成為超級(jí)程序員。希望這個(gè)系列幫助你快速?gòu)牧慊A(chǔ)達(dá)到真入門級(jí)水平,理解大模型才能用好大模型。零基礎(chǔ)意味著你不需要太多的數(shù)學(xué)知識(shí),只要會(huì)寫程序就行了。雖然文中會(huì)有很多公式你也許看不懂,但同時(shí)也會(huì)有更多的代碼,程序員的你一定能看懂的(我周圍是一群狂熱的Clean Code程序員,所以我寫的代碼也不會(huì)很差)。

往期回顧

在前面的文章中,我們介紹了全連接神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)等,可以它們看做是不同結(jié)構(gòu)的神經(jīng)網(wǎng)絡(luò)。本文將繼續(xù)從結(jié)構(gòu)這個(gè)角度出發(fā),介紹一種新的、極其重要的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu):Transformer。從時(shí)間來(lái)看,它也不是那么新,畢竟是2017年出現(xiàn)的,到現(xiàn)在(2025年)也將近十年了。然而,沒(méi)有一個(gè)更新的網(wǎng)絡(luò)結(jié)構(gòu)比它還成功,也說(shuō)明其結(jié)構(gòu)設(shè)計(jì)是極為優(yōu)秀的。Transformer出現(xiàn)后,用了5年左右的時(shí)間,逐漸取代卷積神經(jīng)網(wǎng)絡(luò)成為當(dāng)紅一哥,又用另外5年開辟了一個(gè)全新的時(shí)代:大模型時(shí)代??梢哉f(shuō),目前所有的大模型,都是以Transformer結(jié)構(gòu)為基礎(chǔ)的各種變體。如果您剛剛開始學(xué)習(xí)AI,可以嘗試快速跳過(guò)Transformer之前的部分,把主要的精力放在Transformer的學(xué)習(xí)上。

由于Transformer內(nèi)容較多,為了保持一個(gè)良好的節(jié)奏,我將整個(gè)內(nèi)容分成三個(gè)部分。第一部分比較簡(jiǎn)單,是一些基礎(chǔ)知識(shí)的介紹;第二部分重點(diǎn)講述transformer的注意力機(jī)制,這也是它的核心部分;第三部分講述模型的整體結(jié)構(gòu),以及訓(xùn)練和推理。

Transformer整體結(jié)構(gòu)

Transformer總體上采用的是編碼器+解碼器的結(jié)構(gòu),這是當(dāng)時(shí)(2017年)解決seq2seq(序列到序列)問(wèn)題最好的架構(gòu)。機(jī)器翻譯就是一個(gè)典型的seq2seq問(wèn)題,這類問(wèn)題的重點(diǎn)是輸入序列Token和輸出序列Token不存在嚴(yán)格的一對(duì)一關(guān)系。例如英譯中翻譯,輸出的中文詞和輸入的英文單詞并不存在嚴(yán)格的一一對(duì)應(yīng)關(guān)系,且兩個(gè)序列長(zhǎng)度也不一樣。因此,必須整體性的理解輸入序列,以及整體性的生成輸出序列,而不能把序列的每個(gè)Token拆出來(lái)單獨(dú)處理。故而,稱其為序列到序列問(wèn)題。

編碼器+解碼器結(jié)構(gòu)正是為這種seq2seq問(wèn)題而設(shè)計(jì)的(當(dāng)然,今天這種結(jié)構(gòu)的應(yīng)用范圍已經(jīng)遠(yuǎn)不止seq2seq,我們將在未來(lái)的文章中陸續(xù)介紹),總的來(lái)說(shuō),編碼器負(fù)責(zé)輸入序列的理解,即將輸入序列映射到語(yǔ)義空間的一系列Token中;解碼器負(fù)責(zé)輸出序列的生成,即以語(yǔ)義空間的一系列Token為前置條件,生成輸出序列的Token。這種結(jié)構(gòu)的信息流如下圖所示:

Transformer的模型結(jié)構(gòu)遵循上述原理,如下圖所示:

可以看到,Transformer的架構(gòu)比之前我們介紹的CNN、RNN都要復(fù)雜的多(這也是我們將其分成三篇文章來(lái)介紹的原因),但有了之前兩篇文章學(xué)習(xí)的基礎(chǔ),理解這個(gè)模型結(jié)構(gòu)并不困難,我們接下來(lái)將逐個(gè)部分拆解介紹。

編碼器結(jié)構(gòu)

編碼器負(fù)責(zé)接收輸入序列inputs,輸出是編碼到語(yǔ)義空間中的一系列Tokens,編碼器的輸入和輸出Tokens 數(shù)量相等。首先,inputs經(jīng)過(guò)Input Embedded,成為詞向量的序列。然后,按照每個(gè)Token的位置不同加上對(duì)應(yīng)的位置編碼 Positional Encoding,成為后續(xù)Transformer層的輸入。這些操作具體內(nèi)容我們已經(jīng)在本系列的第一篇文章中詳細(xì)介紹過(guò)了,不再贅述。

編碼器的層由Multi-Head Attention、Add & Norm、Feed Forward等子層組成。其中,Multi-Head AttentionFeed Forward我們已經(jīng)在本系列的第二篇文章中的多頭注意力按位置前饋網(wǎng)絡(luò)兩節(jié)中詳細(xì)介紹過(guò)了,不再贅述。我們下面詳細(xì)介紹一下Add & Norm,它的計(jì)算公式是:
\text{AddNorm(x)} = \text{LayerNorm}(x + \text{Sublayer}(x))

這里\text{Sublayer}(x) 指代任意子層,如Multi-Head AttentionFeed Forward。Add & Norm包含了兩個(gè)重要的設(shè)計(jì):殘差網(wǎng)絡(luò)層歸一化,接下來(lái)我們分別介紹。

我們看到編碼器的每個(gè)子層都采用了殘差網(wǎng)絡(luò)設(shè)計(jì),即子層的輸入和輸出之間有直連。這種設(shè)計(jì)使得子層學(xué)習(xí)的并不是輸入到輸出的映射,而是輸入和輸出的殘差的映射,即:
Y = X + \text{Sublayer}(X)

因此,
\text{Sublayer}(x) = Y - X

這種設(shè)計(jì)最早出現(xiàn)在ResNet中,它的優(yōu)勢(shì)是在訓(xùn)練時(shí)可以將梯度通過(guò)直連路線直接傳遞到對(duì)應(yīng)的組件,從而根本上解決了深度神經(jīng)網(wǎng)絡(luò)中的梯度消失問(wèn)題。在未出現(xiàn)殘差網(wǎng)絡(luò)之前,最深的深度神經(jīng)網(wǎng)絡(luò)只能達(dá)到20層左右,超過(guò)這個(gè)深度,就會(huì)由于梯度消失導(dǎo)致網(wǎng)絡(luò)的低層得不到訓(xùn)練,但殘差網(wǎng)絡(luò)的深度卻可以達(dá)到100層以上。因此Transformer也借鑒了ResNet這個(gè)優(yōu)秀的設(shè)計(jì)。

層歸一化對(duì)模型的訓(xùn)練收斂是不可或缺的。某一層輸出的變化往往導(dǎo)致下一層輸入之和的強(qiáng)相關(guān)變化,尤其當(dāng)使用ReLU單元時(shí),其輸出可能產(chǎn)生顯著波動(dòng)。這表明,若固定每層輸入之和的均值與方差,可緩解協(xié)變量偏移問(wèn)題。通過(guò)加入層歸一化算子,可以保證訓(xùn)練穩(wěn)定性,加速模型收斂,以及減少模型參數(shù)初始化的影響。層歸一化的計(jì)算公式如下:
\begin{align} \text{LayerNorm}(x) &= \frac{x-\mu}{\sqrt{\sigma^2+\epsilon}}*\gamma+\beta \\ \mu &= \frac{1}{Dx}\sum_{i=1}^{D_x}x_i \\ \sigma^2 &= \frac{1}{Dx}\sum_{i=1}^{D_x}(x_i-\mu)^2 \end{align}

其中 \mu 是單個(gè)Token所有維度的均值,\sigma 是單個(gè)所有維度的標(biāo)準(zhǔn)差。因此,當(dāng)序列長(zhǎng)度為 S 時(shí),需要計(jì)算的 \mu\sigma 都是S個(gè)。\gamma\beta 是模型的可學(xué)習(xí)參數(shù),對(duì)歸一化后的Token的每個(gè)維度進(jìn)行仿射變換(縮放和平移),使得歸一化后的數(shù)據(jù)分布,更符合激活函數(shù)中的非線性變化。因此,當(dāng)每個(gè)Token的維度為 D_x 時(shí),\gamma\beta 數(shù)量都是 D_x 個(gè)。

LayerNorm示例代碼如下:

import numpy as np

# 維度定義
S = 3          # 序列長(zhǎng)度
Dx = 4         # 輸入維度
eps = 1e-5

# 模型可學(xué)習(xí)參數(shù)定義
W_gamma = np.ones(Dx)
W_beta = np.zeros(Dx)

# 輸入定義
X=np.array([[0.312, 0.395, -1.343, 2.102],
       [1.232, 2.567, -0.123, 0.838],
       [2.134, -3.123, 0.123, -0.271]])
       
       
def layer_norm(x):
    # Layer Normalization層實(shí)現(xiàn)
    mean = x.mean(-1, keepdims=True)
    std = x.std(-1, keepdims=True)
    y = (x - mean) / (std + eps)
    output = y * gamma + beta
    return output
    

# 測(cè)試
print(layer_norm(X))

將上述子層串聯(lián)在一起,就可以得到一個(gè)編碼器層,一個(gè)完整的Transformer編碼器包含 N_x 個(gè)編碼器層。

解碼器結(jié)構(gòu)

解碼器負(fù)責(zé)生成新的序列。Transformer解碼器按照自回歸的方式工作:解碼器根據(jù)當(dāng)前輸入序列 token_{[1..i-1]} 輸出下一個(gè) token_i,再將token_i加入到輸入序列中,解碼器根據(jù)新的輸入序列 token_{[1..i]} 輸出下一個(gè) token_{i+1},如此循環(huán)直到整個(gè)序列生成完畢。如下圖所示:

注意里面有兩個(gè)特殊的Token:[start]和[end],前者作為解碼器輸入的第一個(gè)Token,標(biāo)識(shí)解碼開始,解碼器輸出新序列的第一個(gè)Token;后者是解碼器輸出的最后一個(gè)Token,標(biāo)志整個(gè)序列生成完畢。

解碼器的結(jié)構(gòu)和編碼器非常相似,除了兩點(diǎn)不同:第一點(diǎn)不同,解碼器只能根據(jù)已經(jīng)生成的Token去生成新的Token,因此需要使用因果注意力機(jī)制,即用Masked Multi-Head Attention替代了編碼器中的Multi-Head Attention。因果注意力機(jī)制已在系列的上一篇文章中已經(jīng)詳細(xì)介紹過(guò),本文不再贅述。

第二點(diǎn)不同,解碼器在生成每個(gè)Token時(shí),需要將編碼器的輸出序列也作為輸入序列的一部分,因此需要一個(gè)額外的Multi-Head Attention子層實(shí)現(xiàn)編碼器和解碼器的交叉注意力機(jī)制。具體來(lái)說(shuō),解碼器根據(jù)上一子層Masked Multi-Head Attention的輸出投影 \mathbf{q} 向量,根據(jù)編碼器對(duì)應(yīng)層的輸出投影 \mathbf{k}\mathbf{v} 向量,再根據(jù)注意力公式進(jìn)行計(jì)算,從而使得解碼器輸出的Token可以融合編碼器輸出Token的信息。

一個(gè)完整的Transformer解碼器包含 N_x 個(gè)解碼器層,在Transformer的設(shè)計(jì)中,編碼器和解碼器層數(shù)相同。這樣,每個(gè)解碼器層都可以將對(duì)應(yīng)的編碼器層輸出作為輸入,從而可以同步頂層、中層和低層信息。

解碼器最終如何輸出詞表中的詞呢?當(dāng)解碼器的最后一個(gè)Transformer層輸出后,這個(gè)輸出經(jīng)過(guò)一次線性變換Linear,將維度從詞向量維度 Dx 變?yōu)樵~表的大小 V,再經(jīng)過(guò)帶溫度Softmax歸一化后,使之產(chǎn)生概率的意義。即最后的輸出Output Probabilities是一個(gè)向量,其維度是詞表大小 V,這個(gè)向量的每個(gè)元素對(duì)應(yīng)詞表中的詞的預(yù)測(cè)概率。對(duì)這個(gè)概率進(jìn)行采樣,就可以輸出對(duì)應(yīng)的詞。

帶溫度的Softmax公式如下:

\text{Softmax}(x_i) = \frac{e^{x_i / T}}{\sum_{j=1}^{n} e^{x_j / T}}

其中:

  • x_i 是詞表中第 i 個(gè) 詞對(duì)應(yīng)的logit。
  • T 是溫度參數(shù)。
  • n 是詞表的總數(shù)。

當(dāng)溫度 T 接近 0 時(shí),概率分布會(huì)變得非常尖銳,模型的輸出的確定性加強(qiáng)。特別的,當(dāng)T=0時(shí),模型只會(huì)輸出具有最高logit的詞,輸出是完全確定的。當(dāng) T 取值增大時(shí),概率分布會(huì)變得更加平滑,模型輸出的隨機(jī)性加強(qiáng),會(huì)表現(xiàn)出更多的創(chuàng)造力。

Transformer與RNN的對(duì)比

自注意力機(jī)制同RNN相比,擁有兩個(gè)巨大的優(yōu)勢(shì):

  • 更強(qiáng)的長(zhǎng)距離依賴能力。學(xué)習(xí)長(zhǎng)距離依賴能力的一個(gè)關(guān)鍵因素是前向和反向信號(hào)在網(wǎng)絡(luò)中需要穿越的路徑長(zhǎng)度。這些路徑在輸入和輸出序列的任意位置組合之間的長(zhǎng)度越短,學(xué)習(xí)長(zhǎng)距離依賴就越容易。自注意力層由于是Token之間兩兩直接計(jì)算權(quán)重,因此是一步操作連接所有到位置,而循環(huán)層則需要 O(n) 順序操作。
  • 并行訓(xùn)練能力。自注意力機(jī)制可以在訓(xùn)練時(shí)同時(shí)并行計(jì)算所有Token,而循環(huán)層每計(jì)算當(dāng)前Token都要先計(jì)算出上一個(gè)Token,無(wú)法并行計(jì)算。因此,雖然自注意力層的計(jì)算量大于循環(huán)層,但由于訓(xùn)練時(shí)可以并行計(jì)算,反而更加高效。
  • 更具有可解釋性。通過(guò)檢查模型中的注意力分布,可以觀察到各個(gè)注意力頭明顯學(xué)會(huì)了執(zhí)行不同的任務(wù),許多還表現(xiàn)出與句子的句法和語(yǔ)義結(jié)構(gòu)相關(guān)的行為。如下圖所示:

因此,Transformer要比RNN強(qiáng)大的多,可以處理非常復(fù)雜的任務(wù)。例如,現(xiàn)在最強(qiáng)的Transformer模型,已經(jīng)可以生成上千行的代碼,最長(zhǎng)可處理的序列可長(zhǎng)達(dá)上百萬(wàn)個(gè)Tokens。當(dāng)然,Transformer也付出了代價(jià),同RNN向比,其劣勢(shì)主要包括:

  • 計(jì)算復(fù)雜度與序列長(zhǎng)度成平方關(guān)系。由于Transformer對(duì)序列中每個(gè)Token都要兩兩計(jì)算注意力權(quán)重,導(dǎo)致其計(jì)算復(fù)雜度與序列長(zhǎng)度是 O(n^2),這是目前限制Transformer處理更長(zhǎng)序列的主要瓶頸。而RNN的計(jì)算復(fù)雜度則為O(n),因此在生成或理解長(zhǎng)序列時(shí),RNN的算力需求要小得多(但實(shí)際上沒(méi)什么用,因?yàn)镽NN對(duì)長(zhǎng)距離依賴學(xué)習(xí)能力太差,導(dǎo)致它處理不了長(zhǎng)序列)。

Transformer和RNN的故事遠(yuǎn)沒(méi)有結(jié)束,結(jié)合二者優(yōu)點(diǎn),很可能是未來(lái)新模型結(jié)構(gòu)的出路。

小節(jié)

Transformer出現(xiàn)后,經(jīng)過(guò)不斷的發(fā)展,現(xiàn)已成為最重要的模型。從2017年開始,總體沿著三條路線發(fā)展,如下圖所示:

  • 效率優(yōu)化路線:期望解決 O(n^2) 計(jì)算復(fù)雜度問(wèn)題,主要嘗試與RNN相結(jié)合,既能保留并行訓(xùn)練、長(zhǎng)距離建模能力強(qiáng)的優(yōu)點(diǎn),又能像RNN一樣將計(jì)算復(fù)雜度降至 O(n)。
  • 長(zhǎng)文本路線:期望能夠支持更長(zhǎng)的上下文,將上下文長(zhǎng)度擴(kuò)展至100萬(wàn)以上,直至無(wú)限長(zhǎng)度。
  • 多模態(tài)路線:在同一個(gè)模型Transformer中,支持更多的模態(tài)。目前的多模態(tài)模型已經(jīng)可以支持聲音、圖像、文本、視頻的輸入和生成,未來(lái)還可能支持更多的模態(tài)。

我們會(huì)在后續(xù)的文章中更詳細(xì)的介紹相關(guān)信息,敬請(qǐng)期待。

參考資料

  1. Attenion Is All You Need
  2. Transformer Normalization

相關(guān)文章

零基礎(chǔ)入門深度學(xué)習(xí)(8) - Transformer (1/3)
零基礎(chǔ)入門深度學(xué)習(xí)(9) - Transformer (2/3)
零基礎(chǔ)入門深度學(xué)習(xí)(10) - Transformer (3/3)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容