NLP TASK6 神經網絡基礎

學習內容

前饋神經網絡、網絡層數、輸入層、隱藏層、輸出層、隱藏單元、激活函數的概念。
感知機相關;定義簡單的幾層網絡(激活函數sigmoid),遞歸使用鏈式法則來實現反向傳播。
激活函數的種類以及各自的提出背景、優缺點。(和線性模型對比,線性模型的侷限性,去線性化)
深度學習中的正則化(參數範數懲罰:L1正則化、L2正則化;數據集增強;噪聲添加;early stop;Dropout層)、正則化的介紹。
深度模型中的優化:參數初始化策略;自適應學習率算法(梯度下降、AdaGrad、RMSProp、Adam;優化算法的選擇);batch norm層(提出背景、解決什麼問題、層在訓練和測試階段的計算公式);layer norm層。
FastText的原理。
利用FastText模型進行文本分類。

內容筆記

前饋神經網絡

前饋網絡中各個神經元按接受信息的先後分爲不同的組。每一組可以看作
一個神經層。每一層中的神經元接受前一層神經元的輸出,並輸出到下一層神經元。整個網絡中的信息是朝一個方向傳播,沒有反向的信息傳播,可以用一個有向無環路圖表示。前饋網絡包括全連接前饋網絡和卷積神經網絡等。其可以看作一個函數,通過簡單非線性函數的多次複合,實現輸入空間到輸出空間的複雜映射。見下圖
圖一
如上圖所示前饋神經網絡,該網絡公有三層結構,通常輸入層不計入層數,各層定義見圖所示。
激活函數在神經元中也非常重要的。爲了增強網絡的表示能力和學習能
力,激活函數需要具備以下幾點性質:

  1. 連續並可導(允許少數點上不可導)的非線性函數。可導的激活函數可以
    直接利用數值優化的方法來學習網絡參數。
  2. 激活函數及其導函數要儘可能的簡單,有利於提高網絡計算效率。
  3. 激活函數的導函數的值域要在一個合適的區間內,不能太大也不能太小,
    否則會影響訓練的效率和穩定性。

後面會詳細介紹常用的激活函數。

感知機

感知機(perceptron)是二分類的線性分類模型,屬於監督學習算法。原理見下圖

在這裏插入圖片描述
該感知機是通過對輸入進行計算,得出中間信號,再和閾值相比看是否輸出信號。詳細原理見下面的推導:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

激活函數

Sigmoid 型激活函數

Sigmoid型函數是指一類S型曲線函數,爲兩端飽和函數。常用的Sigmoid
型函數有Logistic函數和Tanh函數。

Logistic函數:
σ(x)=11+exp(x)\sigma (x)=\frac{1}{1+exp(-x)}
Logistic函數可以看成是一個“擠壓”函數,把一個實數域的輸入“擠壓”
到(0, 1)。當輸入值在0附近時,Sigmoid型函數近似爲線性函數;當輸入值靠近兩端時,對輸入進行抑制。輸入越小,越接近於0;輸入越大,越接近於1。和感知器使用的階躍激活函數相比,Logistic 函數是連續可導的,其數學性質更好。因爲Logistic函數的性質,使得裝備了Logistic激活函數的神經元具有以下兩點性質:
1)其輸出直接可以看作是概率分佈,使得神經網絡可以更好地和統計學習模型進行結合。
2)其可以看作是一個軟性門(Soft Gate),用來控制其它神經元輸出信息的數量。

Tanh函數:
Tanh函數是也一種Sigmoid型函數。其定義爲
tanh(x)=exp(x)exp(x)exp(x)+exp(x)tanh(x)=\frac{exp(x)-exp(-x)}{exp(x)+exp(-x)}
Tanh函數的輸出是零中心化的(Zero-Centered),而Logistic函數的輸出恆大於0。非零中心化的輸出會使得其後一層的神經元的輸入發生偏置偏移(Bias Shift),並進一步使得梯度下降的收斂速度變慢。
還有Hard-Logistic 和 Hard-Tanh 函數,不詳細介紹。

修正線性單元

修正線性單元(Rectified Linear Unit,ReLU)也叫rectifier函數,是目前深層神經網絡中經常使用的激活函數。ReLU實際上是一個斜坡(ramp)函數,定義爲
ReLU(x)={x,if x00,if x<0 =max(0,x)ReLU(x)=\begin{cases} x, & \text {if $x \geq0$} \\ 0, & \text{if $x<0$ } \end{cases}=max(0,x)
優點採用 ReLU 的神經元只需要進行加、乘和比較的操作,計算上更加高效。ReLU函數被認爲有生物上的解釋性,比如單側抑制、寬興奮邊界(即興奮程度也可以非常高)。Sigmoid型激活函數會導致一個非稀疏的神經網絡,而ReLU卻具有很好的稀疏性,大約50%的神經元會處於激活狀態。在優化方面,相比於Sigmoid型函數的兩端飽和,ReLU函數爲左飽和函數,且在x > 0時導數爲1,在一定程度上緩解了神經網絡的梯度消失問題,加速梯度下降的收斂速度。
缺點 ReLU 函數的輸出是非零中心化的,給後一層的神經網絡引入偏置偏移,會影響梯度下降的效率。此外,ReLU神經元在訓練時比較容易“死亡”。在訓 ReLU 神經元指採用 ReLU練時,如果參數在一次不恰當的更新後,第一個隱藏層中的某個ReLU神經元在 作爲激活函數的神經元。
所有的訓練數據上都不能被激活,那麼這個神經元自身參數的梯度永遠都會是0,在以後的訓練過程中永遠不能被激活。這種現象稱爲死亡ReLU問題
(ReLU Problem),並且也有可能會發生在其它隱藏層。 在實際使用中,爲了避免上述情況,有幾種ReLU的變種也會被廣泛使用。

帶泄露的 ReLU:
帶泄露的ReLU在輸入 x < 0時,保持一個很小的梯度λ。這樣當神經元非激活時也能有一個非零的梯度可以更新參數,避免永遠不能被激活。帶泄露的ReLU的定義如下:
LeakyReLU(x)={x,if x&gt;0γx,if x0=max(0,x)+γmin(0,x)LeakyReLU(x)=\begin{cases} x, &amp; \text{if $x&gt;0$} \\ \gamma x, &amp; \text{if $x \leq 0$} \end{cases}=max(0,x)+\gamma min(0,x)
通常γ\gamma是一個很小的常數,比如0.01。
還有帶參數的 ReLU,ELU,Softplus 函數

Swish 函數是一種自門控(Self-Gated)激活函數。
Maxout單元也是一種分段線性函數。

總之激活函數使得網絡能提供非線性化,爲模型的擬合提供了更多的可能,而不只是線性模型的疊加操作。

深度學習中的正則化

數據增強:
數據增強是提升算法性能、滿足深度學習模型對大量數據的需求的重要工具。數據增強通過向訓練數據添加轉換或擾動來人工增加訓練數據集。數據增強技術如水平或垂直翻轉圖像、裁剪、色彩變換、擴展和旋轉通常應用在視覺表象和圖像分類中。

L1 和 L2 正則化:
L1 和 L2 正則化是最常用的正則化方法。L1 正則化向目標函數添加正則化項,以減少參數的絕對值總和;而 L2 正則化中,添加正則化項的目的在於減少參數平方的總和。根據之前的研究,L1 正則化中的很多參數向量是稀疏向量,因爲很多模型導致參數趨近於 0,因此它常用於特徵選擇設置中。機器學習中最常用的正則化方法是對權重施加 L2 範數約束。
L1正則化定義爲:
在這裏插入圖片描述
L2正則化定義爲:
在這裏插入圖片描述
Dropout:
Bagging 是通過結合多個模型降低泛化誤差的技術,主要的做法是分別訓練幾個不同的模型,然後讓所有模型表決測試樣例的輸出。而 Dropout 可以被認爲是集成了大量深層神經網絡的 Bagging 方法,因此它提供了一種廉價的 Bagging 集成近似方法,能夠訓練和評估值數據數量的神經網絡。
Dropout 指暫時丟棄一部分神經元及其連接。隨機丟棄神經元可以防止過擬合,同時指數級、高效地連接不同網絡架構。神經元被丟棄的概率爲 1 − p,減少神經元之間的共適應。隱藏層通常以 0.5 的概率丟棄神經元。使用完整網絡(每個節點的輸出權重爲 p)對所有 2^n 個 dropout 神經元的樣本平均值進行近似計算。Dropout 顯著降低了過擬合,同時通過避免在訓練數據上的訓練節點提高了算法的學習速度。

早停法:
早停法可以限制模型最小化代價函數所需的訓練迭代次數。早停法通常用於防止訓練中過度表達的模型泛化性能差。如果迭代次數太少,算法容易欠擬合(方差較小,偏差較大),而迭代次數太多,算法容易過擬合(方差較大,偏差較小)。早停法通過確定迭代次數解決這個問題,不需要對特定值進行手動設置。

深度模型中的優化

梯度下降方法:
常見的深度學習模型中的優化學習方法有梯度下降方法,隨機梯度下降方法,小批量下降方法等。該方法的原理都是先定義一個損失函數,然後求得使得該損失函數變化最快的方向最爲參數的迭代方向,準確來說只有一個使函數上升最快的方向,這個方向由梯度給出,與之相反的方向就是下降最快的方向。這就是算法名稱的來源,我們沿着梯度的方向進行下降,所以就叫做梯度下降。區別就是每次選取計算迭代的數據量的不同,分爲梯度下降,批梯度下降,隨機梯度下降等。

動量(Momentum)
隨機梯度下降和小批量梯度下降是機器學習中最常見的優化技術,然而在大規模應用和複雜模型中,算法學習的效率是非常低的。而動量策略旨在加速學習過程,特別是在具有較高曲率的情況下。動量算法利用先前梯度的指數衰減滑動平均值在該方向上進行回退 [26]。該算法引入了變量 v 作爲參數在參數空間中持續移動的速度向量,速度一般可以設置爲負梯度的指數衰減滑動平均值。對於一個給定需要最小化的代價函數,動量可以表達爲:
在這裏插入圖片描述
其中 α 爲學習率,γ ∈ (0, 1] 爲動量係數,v 是速度向量,θ是保持和速度向量方向相同的參數。一般來說,梯度下降算法下降的方向爲局部最速的方向(數學上稱爲最速下降法),它的下降方向在每一個下降點一定與對應等高線的切線垂直,因此這也就導致了 GD 算法的鋸齒現象。雖然 SGD 算法收斂較慢,但動量法是令梯度直接指向最優解的策略之一。在實踐中,γ初始設置爲 0.5,並在初始學習穩定後增加到 0.9。同樣,α 一般也設置地非常小,因爲梯度的量級通常是比較大的。

Nesterov 加速梯度(NAG):
Nesterov 加速梯度(NAG)和經典動量算法非常相似,它是一種一階優化算法,但在梯度評估方面有所不同。在 NAG 中,梯度的評估是通過速度的實現而完成的。NAG 根據參數進行更新,和動量算法一樣,不過 NAG 的收斂速度更好。在批量梯度下降中,與平滑的凸函數相比,NAG 的收斂速度超出 1/k 到 1/(k^2) [27]。但是,在 SGD 中,NAG 無法提高收斂速度。NAG 的更新如下:
在這裏插入圖片描述
動量係數設置爲 0.9。經典的動量算法先計算當前梯度,再轉向更新累積梯度。相反,在 NAG 中,先轉向更新累積梯度,再進行校正。其結果是防止算法速度過快,且增加了反應性(responsiveness)。

Adagrad:
Adagrad 亦稱爲自適應梯度(adaptive gradient),允許學習率基於參數進行調整,而不需要在學習過程中人爲調整學習率。Adagrad 根據不常用的參數進行較大幅度的學習率更新,根據常用的參數進行較小幅度的學習率更新。因此,Adagrad 成了稀疏數據如圖像識別和 NLP 的天然選擇。然而 Adagrad 的最大問題在於,在某些案例中,學習率變得太小,學習率單調下降使得網絡停止學習過程。在經典的動量算法和 Nesterov 中,加速梯度參數更新是對所有參數進行的,並且學習過程中的學習率保持不變。在 Adagrad 中,每次迭代中每個參數使用的都是不同的學習率。
在這裏插入圖片描述
其他AdaDelta,RMS prop,Adam等優化算法,詳見:
https://www.jiqizhixin.com/articles/2017-12-20
https://zhuanlan.zhihu.com/p/32626442

優化算法的選擇:
如果數據是稀疏的,就用自適用方法,即 Adagrad, Adadelta, RMSprop, Adam。
RMSprop, Adadelta, Adam 在很多情況下的效果是相似的。
Adam 就是在 RMSprop 的基礎上加了 bias-correction 和 momentum,
隨着梯度變的稀疏,Adam 比 RMSprop 效果會好。
整體來講,Adam 是最好的選擇。
很多論文裏都會用 SGD,沒有 momentum 等。SGD 雖然能達到極小值,但是比其它算法用的時間長,而且可能會被困在鞍點。

Batch Norm層

背景:
    在深度學習中,由於問題的複雜性,我們往往會使用較深層數的網絡進行訓練,尤其是對深層神經網絡的訓練調參更是困難且複雜。在這個過程中,需要去嘗試不同的學習率、初始化參數方法(例如Xavier初始化)等方式來幫助我們的模型加速收斂。深度神經網絡之所以如此難訓練,其中一個重要原因就是網絡中層與層之間存在高度的關聯性與耦合性。網絡中層與層之間的關聯性會導致如下的狀況:隨着訓練的進行,網絡中的參數也隨着梯度下降在不停更新。一方面,當底層網絡中參數發生微弱變化時,由於每一層中的線性變換與非線性激活映射,這些微弱變化隨着網絡層數的加深而被放大(類似蝴蝶效應);另一方面,參數的變化導致每一層的輸入分佈會發生改變,進而上層的網絡需要不停地去適應這些分佈變化,使得我們的模型訓練變得困難,上述這一現象叫做Internal Covariate Shift。
    Batch Normalization的原論文作者給了Internal Covariate Shift一個較規範的定義:在深層網絡訓練的過程中,由於網絡中參數變化而引起內部結點數據分佈發生變化的這一過程被稱作Internal Covariate Shift。Internal Covariate Shift帶來的問題:
(1)上層網絡需要不停調整來適應輸入數據分佈的變化,導致網絡學習速度的降低。
(2)網絡的訓練過程容易陷入梯度飽和區,減緩網絡收斂速度。

那麼如何減緩Internal Covariate Shift?
ICS產生的原因是由於參數更新帶來的網絡中每一層輸入值分佈的改變,並且隨着網絡層數的加深而變得更加嚴重,因此我們可以通過固定每一層網絡輸入值的分佈來對減緩ICS問題。
(1)白化(Whitening)
白化(Whitening)是機器學習裏面常用的一種規範化數據分佈的方法,主要是PCA白化與ZCA白化。白化是對輸入數據分佈進行變換,進而達到以下兩個目的:
1使得輸入特徵分佈具有相同的均值與方差。其中PCA白化保證了所有特徵分佈均值爲0,方差爲1;而ZCA白化則保證了所有特徵分佈均值爲0,方差相同;
2去除特徵之間的相關性。
通過白化操作,我們可以減緩ICS的問題,進而固定了每一層網絡輸入分佈,加速網絡訓練過程的收斂。
(2)Batch Normalization提出
然後白化有以下兩個問題:

計算成本太高,並且在每一輪訓練中的每一層我們都需要做如此高成本計算的白化操作;
白化過程改變了網絡每一層的分佈,因而改變了網絡層中本身數據的表達能力。底層網絡學習到的參數信息會被白化操作丟失掉。
既然有了上面兩個問題,一方面,我們提出的normalization方法要能夠簡化計算過程;另一方面又需要經過規範化處理後讓數據儘可能保留原始的表達能力。於是就有了簡化+改進版的白化——Batch Normalization。

原理:
該算法本質原理就是這樣:在網絡的每一層輸入的時候,又插入了一個歸一化層,也就是先做一個歸一化處理,然後再進入網絡的下一層。

訓練階段的BN:
在這裏插入圖片描述
測試階段的BN計算:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

Layer Norm層

LN也是對輸出歸一化的。LN也是爲了消除各層的covariate shift,加快收斂速度。LN相對於BN就簡單多了。
在這裏插入圖片描述
它在training和inference時沒有區別,只需要對當前隱藏層計算mean and variance就行
不需要保存每層的moving average mean and variance
不受batch size的限制,可以通過online learning的方式一條一條的輸入訓練數據
LN可以方便的在RNN中使用
LN增加了gain和bias作爲學習的參數,μ和σ分別是該layer的隱層維度的均值和方差

FastText的原理

字符級別的n-gram:
word2vec把語料庫中的每個單詞當成原子的,它會爲每個單詞生成一個向量。這忽略了單詞內部的形態特徵,比如:“apple” 和“apples”,“達觀數據”和“達觀”,這兩個例子中,兩個單詞都有較多公共字符,即它們的內部形態類似,但是在傳統的word2vec中,這種單詞內部形態信息因爲它們被轉換成不同的id丟失了。
爲了克服這個問題,fastText使用了字符級別的n-grams來表示一個單詞。對於單詞“apple”,假設n的取值爲3,則它的trigram有:
“<ap”, “app”, “ppl”, “ple”, “le>”
其中,<表示前綴,>表示後綴。於是,我們可以用這些trigram來表示“apple”這個單詞,進一步,我們可以用這5個trigram的向量疊加來表示“apple”的詞向量。
這帶來兩點好處:

  1. 對於低頻詞生成的詞向量效果會更好。因爲它們的n-gram可以和其它詞共享。
  2. 對於訓練詞庫之外的單詞,仍然可以構建它們的詞向量。我們可以疊加它們的字符級n-gram向量。

模型架構:
在這裏插入圖片描述

Fasttext文本分類範例

數據樣例

fasttext_train.txt,fasttext_test.txt數據格式:
在這裏插入圖片描述

import fasttext
import os
classifier = fasttext.supervised('fasttext_train.txt', 'fasttext.model', label_prefix='__label__')
result = classifier.test('fasttext_test.txt')
print(result.precision)
print(result.recall)

總結

深度學習很多知識點暫時缺乏時間,所以對各個知識點理解不夠深入,僅從表面原理上面進行一定了解,需要進一步深入理解,需要結合實踐分析。

參考文獻

邱錫鵬:《神經網絡與深度學習》
https://blog.csdn.net/hongyesuifeng/article/details/79251390
https://www.jiqizhixin.com/articles/2017-12-20
https://www.jiqizhixin.com/articles/071502
http://ruder.io/optimizing-gradient-descent/index.html#whichoptimizertochoose
https://blog.csdn.net/aliceyangxi1987/article/details/73210204
《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》
https://blog.csdn.net/hjimce/article/details/50866313
https://zhuanlan.zhihu.com/p/34879333
https://www.cnblogs.com/guoyaohua/p/8724433.html
https://blog.csdn.net/c9Yv2cf9I06K2A9E/article/details/79283702

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章