在經過前面3節關于 Transformer 論文的解讀之后,相信你對提出 Transformer 架構的這篇論文有了一定的了解了,你可以點擊下面的鏈接復習一下前3節的內容。
《Attention is all you need》通俗解讀,徹底理解版:part1
《Attention is all you need》通俗解讀,徹底理解版:part2
《Attention is all you need》通俗解讀,徹底理解版:注意力機制的運算
總的來說,這篇論文雖然重要且經典,但很多關于Transformer 架構的技術細節并沒有介紹的很清楚,因此讀起來有些晦澀。
之前的幾節文章在通讀這篇論文時,采用的是原文+注解的方式來進行的。這么做的目的也很簡單:幫助你了解這篇論文中每一部分的寫作意圖是什么。
至于論文中沒有詳細闡述的技術細節內容,本專欄后續會繼續完善。本節開始解讀一下論文的3.3節,主要是 FFN 層。
3.3 節:Position-wise Feed-Forward Networks (FFN)
In addition to attention sub-layers, each of the layers in our encoder and decoder contains a fully connected feed-forward network, which is applied to each position separately and identically. This consists of two linear transformations with a ReLU activation in between. FFN(x) = max(0, xW1 + b1)W2 + b2 While the linear transformations are the same across different positions, they use different parameters from layer to layer. Another way of describing this is as two convolutions with kernel size 1. The dimensionality of input and output is dmodel = 512, and the inner-layer has dimensionality df f = 2048.
關于 FFN 層,作者就在第 3.3節寫了上面一段話(真的非常簡單😓)。
每次看到這,都會觸發我感慨一下:我之前也發表過英文論文,在自己發布的論文中,尤其是自己原創的內容時,恨不得將每一處細節都介紹清楚,恨不得把文章寫的篇幅超長,以此來體現我的文章的專業和創新性(😅)。
作者這種一筆帶過的寫法真的讓人不太習慣。不過后來和其他人聊這個話題,有些人說可能是限于發表期刊的篇幅要求,導致很多細節不能寫的過多(😝)。
作者在這一段就介紹了 FFN 層的基本結構,并且默認讀者對于其中的算法是非常了解的。
在注意力層后面,無論是encoder結構還是decoder結構中,都設計了一個全連接前饋網絡層( fully connected feed-forward network),也就是 FFN 層(如下紅框所示)。
FFN 層實際上就是一個線性變換層,用來完成輸入數據到輸出數據的維度變換(細節這里不介紹,相關鏈接暫時留白)。
這個FFN層是一個順序結構:包括一個全連接層(FC) + relu激活層 + 第二個全連接層,其公式可以表示為:FFN(x) = max(0, xW1 + b1)W2 + b2。
上式中,xW1 + b1?為第一個全連接層的計算公式,max(0, xW1 + b1)?為 relu 的計算公式,max(0, xW1 + b1)W2 + b2?則為第二個全連接層的計算公式。
隨后作者提到,添加這個 FFN 層的作用,主要是通過第一個FC層將輸入詞向量的512維變換到2048維,隨后通過第二個FC層再將2048維變換回512維,從而保證 FFN 的輸入輸出維度一致。
FFN 層的結構展開可以表示如下:
為什么要加 FFN?
你可能會有疑惑?既然 FFN 的輸入和輸出的維度都一樣,那為什么還要加這個結構呢?
首先從 FFN 中添加的 Relu 激活函數看起。如果你學過《AI視覺入門專欄》的話,肯定對Relu 這一類的激活函數非常熟悉。
Relu 激活函數的重要作用是為模型施加非線性因素,從而可以使模型擬合出更加復雜的關系。
關于線性和非線性的內容,可以參考這里?和?這里。
因為 FFN 層由兩個線性變換層(FC)和一個非線性激活函數(ReLU)組成,通過在兩個 FC 中間添加非線性變換(這是非常常見的操作),可以增加模型的表達能力,使模型能夠捕捉到復雜的特征和模式。
怎么理解“使模型能夠捕捉到復雜的特征和模式”呢?這就得看 Relu 前后的兩個的 FC 層了:FC層線性變換的主要作用可以理解為數據的升維和降維,這一點通過 FC 的算法就可以看出來。
設想一下,原始輸入的特征維度為512維,也就是 FFN 之前的注意力層提取了單詞(token)的512維特征。
但很多時候512維不夠用,我們希望模型可以提取出更多維度的特征,于是,通過 FFN 兩個相鄰 FC 層的運算,可以將 512 維擴展到2048維( FFN 的隱層),隨后再降維到512維作為 FFN 的輸出。
這種維度的一升一降,帶來了兩個變化:
-
增加了兩個可學習的權值矩陣,也就是上面表達公式中的兩個?W?矩陣。通過和權值矩陣的相乘將輸入 512 維度向量映射到隱層的 2048 維度空間中,使得輸入數據可以完成更加豐富的特征表達和運算。
-
雖然FFN的輸入輸出維度都是512,但是輸出的512維度特征和輸入的512為特征是不一樣的。輸出的512維度特征是在隱層空間(2048)的基礎上進一步融合得到的。可以說,輸出的512維比輸入的512維具有更加豐富和準確的特征表示。
如果把 FFN 中的隱層 2048維看做 2048 個極具智慧的頭腦,那么經過這 2048 個極具智慧的大腦的頭腦風暴后,將輸入512維特征進行了再加工,那么很明顯輸出就更具有代表性了。
所以,總結一下 FFN 的作用:
-
增強特征提取能力:這主要就是 FC 的線性變換到 2048 的高維空間帶來的好處。
-
提高計算效率:這一點是 FC 算法決定的。FC 層的計算是可以并行的,這就使 FFN 層可以在GPU上高效地并行計算。相對于傳統的循環神經網絡(RNN)中由于時間步長的依賴導致無法并行的情況,基于 Transformer 結構的計算便可以大幅完成并行優化,從而極大提高模型的訓練和推理效率。
-
防止模型退化:這一點主要是在 FFN 中引入了 Relu 這種非線性激活函數帶來的。如果沒有 FFN 層的存在, Transformer 模型可能會退化為簡單的線性變換模型,從而失去捕捉復雜特征的能力。FFN 層通過引入非線性變換,保證了模型能夠保持其表達能力,有效捕捉到輸入數據中的復雜特征。
我的技術專欄已經有幾百位朋友加入了。如果你也希望了解AI技術,學習AI視覺或者大語言模型,戳下面的鏈接加入吧,這可能是你學習路上非常重要的一次點擊呀
CV視覺入門第三版(細化版)完成
我的Transformer專欄努力更新中
最后,送一句話給大家:生活不止眼前,還有詩和遠方,共勉~