精講部分,主要是對Transformer的深度理解方便日后從底層邏輯進行創新,對于僅應用需求的小伙伴可以跳過這一部分,不影響正常學習。
1.? 殘差模塊?
?何凱明在2015年提出的殘差網絡(ResNet),Transformer在2016年提出時正好踏上了ResNet的東風,所以就順其自然的加上了這一部分以提高特征的提取能力,殘差模塊(Residual Block)是殘差網絡(ResNet)中的核心組件,其設計原理是為了解決深度神經網絡訓練中的退化問題,即隨著網絡層數的增加,網絡的性能反而可能下降。殘差模塊通過引入恒等映射(Identity Mapping)和殘差連接(Residual Connection)來緩解這一問題。殘差模塊是實踐證明有效的模塊對于數學原理的證明目前還沒有較為清晰的推導,我來簡單說一下他的原理。
恒等映射(Identity Mapping)
恒等映射是指輸入直接通過一個“快捷方式”傳遞到后面的層,而不需要經過任何變換。這種設計允許輸入信息在網絡中直接流動,不受中間層的影響。
殘差連接(Residual Connection)
殘差連接是指將輸入 x 直接加到網絡的輸出上。具體來說,如果網絡的輸出是 F(x),那么殘差模塊的最終輸出是 F(x)+x。這種設計使得網絡可以通過學習殘差函數 F(x) 來優化原始函數 H(x),即 H(x)=F(x)+x。
殘差函數(Residual Function)
殘差函數 F(x) 是網絡中需要學習的函數,它表示輸入 x 經過一系列變換后的結果。通過殘差連接,網絡實際上是在學習 F(x) 來逼近目標函數 H(x),而不是直接學習 H(x)。這種設計使得網絡更容易優化,因為 F(x) 只需要學習 H(x) 與 x 之間的差異,即H(x)=F(x)+x≈ x。由此我們可知F(x)趨近于0。
激活函數
在殘差模塊中,通常會在殘差連接之后添加一個激活函數(如ReLU),以引入非線性特性。這樣可以確保網絡的表達能力,同時保持殘差連接的線性特性。
權重層(Weight Layers)
殘差模塊中的權重層可以包括卷積層、全連接層等,用于對輸入進行變換。這些權重層通常包含多個層,如圖中所示的兩個權重層。
當?F(x)?趨近于0時的意義
梯度流:當 F(x) 趨近于0時,殘差塊的輸出 y 將主要由輸入 x 決定。這意味著即使在深層網絡中,梯度也可以直接通過恒等映射傳播回輸入層,從而緩解梯度消失問題。
我們可以從數學角度、非嚴格證明一下它為什么能夠解決梯度消失問題。
假設現在存在一個神經網絡,它由多個殘差結構相連(類似于Transformer的結構)。每個殘差結構被定義為F(x,W),這一結構是由一個復雜結構和一個殘差鏈接并行組成的,其中x代表殘差輸入的數據,W代表該結構中的權重。設xi,xi+1分別代表殘差結構F()的輸入和輸出,設xI代表整個神經網絡的輸入,令relu激活函數為r(y)=max(0,x),簡寫為r()。由此可得:
殘差網絡中的前向傳播過程:
?殘差網絡中的反向傳播過程:
由于“1+”結構的引入,殘差網絡能夠有效地避免梯度消失現象,即在求解過程中梯度不致變為零。這使得深層網絡的梯度可以直接傳遞至淺層,從而使得整個迭代過程更加穩定。此外,殘差網絡在更新梯度時將部分乘法操作轉化為加法操作,這一改變顯著提升了計算效率。
網絡深度:殘差網絡允許構建非常深的網絡,因為即使深層網絡的權重層輸出趨近于0,網絡仍然可以通過恒等映射學習到有效的特征表示。
優化難度:當 F(x) 趨近于0時,優化問題變得相對簡單,因為網絡可以通過調整權重層的輸出來最小化損失函數,即使權重層的輸出很小或接近0。
特征重用:殘差塊允許網絡在深層中重用淺層的特征表示,從而提高模型的表達能力和泛化能力。
2. 層歸一化?
層歸一化是實踐上證明有效的中間過程特征處理方法,在目前大多數網絡結構的重要層后都會加一個歸一化層,Layer Normalization(層歸一化)是一個至關重要的部分,它是一種特定的歸一化技術,它在2016年被提出,用于減少訓練深度神經網絡時的內部協方差偏移(internal covariate shift)。而我們要講的Transformer也是在同年(2016)層歸一化提出不久后發表出來的,所以在構造網絡時也加入了從層歸一化。
歸一化在現在的網絡結構中被廣泛的應用,之后會出一期詳細的進行講解。鏈接會被放到這一位置方便小伙伴們學習。
我們來簡單講一下歸一化在NLP領域的應用。
首先,為什么要進行歸一化操作?
- 減少內部協方差偏移:在深度學習模型訓練過程中,參數的更新會影響后續層的激活分布,這可能導致訓練過程不穩定。Layer Normalization通過規范化每一層的輸出來減輕這種效應,有助于穩定訓練過程。
? - 加速訓練速度:歸一化可以使得梯度更穩定,這通常允許更高的學習率,從而加快模型的收斂速度。
? - 減少對初始值的依賴:由于Layer Normalization使得模型對于輸入數據的分布變化更為魯棒,因此可以減少模型對于參數初始值的敏感性。
? - 允許更深層網絡的訓練:通過規范化每層的激活,Layer Normalization可以幫助訓練更深的網絡結構,而不會那么容易出現梯度消失或爆炸的問題。
接下來,第二個問題為什么要進行層歸一化??
?通過前面的學習我們知道對于自然語言的處理通常是在三個維度上進行的
(batch_ size, vocal_ size, input_ dimensions)或
(batch_ size,time_ step, input_ dimensions )
?
出去特征維度?input_ dimensions還有兩個維度,一個是批次維度,另一個是時間維度或詞表維度
也就對應了兩種歸一化即批歸一化(Batch Normalization)和層歸一化(Layer Normalization)。
那為什么不進行批歸一化呢?其實也不是絕對的,主要是經過以下三方面的考量,為了方便大家理解在說明之前我們先來認識以下這兩種歸一化方式分別是什么邏輯
在自然語言處理(NLP)中,層歸一化(Layer Normalization,LN)比批歸一化(Batch Normalization,BN)更常用,原因如下:
-
變長序列:NLP任務中的輸入序列長度不固定,層歸一化能有效處理變長序列,而批歸一化依賴于批次中的數據均值和方差,可能會受到序列長度變化的影響。換句話說就是在三個批次中提取到的特征分別是(填充,0.5775,0.3798)提取到的數據均值和方差就不準確,即便是將填充替換為某一數字,仍然無法像其他 input_ dimensions數字一樣體現有效的特征信息,故而算出的數據均值和方差也會受到影響
-
小批次訓練:NLP任務中通常使用較小的批次大小,BN在小批次時較小的樣本數很難提取出具有廣泛代表意義的數據均值和方差,導致均值和方差估計不穩定,而LN不依賴于批次大小,適應性更強。
-
RNN和Transformer:尤其在Transformer模型中,層歸一化能夠在每個樣本的特征維度上進行歸一化,避免了批歸一化需要跨樣本計算均值和方差的問題,從而提高了模型的訓練穩定性。
?所以呀基于上述考量我們多采用LN即層歸一化方式。