【NLP】Task5:神经网络基础
文章目錄
- 一、前饋神經網絡
- 二、簡單的神經網絡(tensorflow)
- 三、激活函數
- 1、概述
- 2、sigmoid 激活函數
- (1)定義
- (2)特點
- (3)缺點
- 3、tanh函數
- 4、ReLU函數
- 5、Leaky ReLU
- 6、Maxout
- 7、ELU
- 8、激活函數的選擇
- 四、正則化
- 1、參數范數懲罰
- (1)相關定義
- (2)L0正則化
- (3)L1正則化
- (4)L2正則化
- 2、數據擴增(data agumentation)
- 3、噪聲添加
- 4、Dropout
- 5、早期停止(early stopping)
- 五、深度模型中的優化(待完善)
- 1、參數初始化策略
- (1)全零初始化??
- (2)隨機初始化 (Random Initialization)
- (3)Xavier
- (4)MSRA
- (5)bias初始化
- (6)小結
- 2、自適應學習率算法
- 3、batch norm層
- 4、layer norm層
一、前饋神經網絡
概念:前饋神經網絡、網絡層數、輸入層、隱藏層、輸出層、隱藏單元、激活函數
前饋神經網絡:前饋神經網絡是一種最簡單的神經網絡,各神經元分層排列。每個神經元只與前一層的神經元相連。接收前一層的輸出,并輸出給下一層.各層間沒有反饋。
網絡層數:一般是指設置或者搭建的模型有多少層。以上圖為例,網絡層為3。注:一般不包括輸入層。
輸入層:一般指數據輸入模型的一層,如圖中 Layer L1L_1L1? 層。
輸出層:一般指模型的最后一層,即Layer L4L_4L4? 層;
隱藏層:指除開輸入層和輸出層之外的中間層,如圖Layer L2L_2L2? 層和 L3L_3L3? 層;
隱藏單元:一般指隱藏層中的單元結構。
激活函數:一般指加權之后的值到輸出之間函數,通過激活函數將上一層的輸出作為下一層輸入之前進行非線性變化,使模型不再是單一的線性變換。
二、簡單的神經網絡(tensorflow)
前期準備
首先給網絡提供 MMM 個訓練對 (X,Y)(X,Y)(X,Y),XXX 為輸入,YYY 為期望的輸出。輸入通過激活函數 g(h)g(h)g(h) 和隱藏層傳播到輸出層。輸出 Y^\hat{Y}Y^ 是網絡的輸出,得到 error=Y?Y^error=Y-\hat{Y}error=Y?Y^。其損失函數 J(W)J(W)J(W) 如下:
J(W)=12M∑i=1N(Yi?Y^i)2J(W)=\frac{1}{2M}\sum_{i=1}^{N}(Y_i-\hat{Y}_i)^2J(W)=2M1?i=1∑N?(Yi??Y^i?)2
其中,iii 取遍所有輸出層的神經元(1 到 N)。然后可以使用 J(W)J(W)J(W) 的梯度并使用鏈式法則求導,來計算連接第 iii 個輸出層神經元到第 jjj 個隱藏層神經元的權重 WijW_{ij}Wij? 的變化:
ΔWij=?η?J?Wij=η1M?(Yi?Y^i)2?Y^?Y^?hi?hi?Wij=η1M(Yi?Y^i)g′(hi)Oj\Delta W_{ij}=-\eta\frac{\partial{J}}{\partial W_{ij}}=\eta\frac{1}{M}\frac{\partial{(Y_i-\hat{Y}_i)^2}}{\partial{\hat{Y}}} \frac{\partial{\hat{Y}}}{\partial{h_i}} \frac{\partial{h_i}}{\partial{W_{ij}}}=\eta\frac{1}{M}(Y_i-\hat{Y}_i)g'(h_i)O_j ΔWij?=?η?Wij??J?=ηM1??Y^?(Yi??Y^i?)2??hi??Y^??Wij??hi??=ηM1?(Yi??Y^i?)g′(hi?)Oj?
這里,OjO_jOj? 是隱藏層神經元的輸出,hih_ihi? 表示輸出層的輸入值。這很容易理解,但現在怎么更新連接第 nnn 個隱藏層的神經元 kkk 到第 n+1n+1n+1 個隱藏層的神經元 jjj 的權值 WjkW_{jk}Wjk??過程是相同的:將使用損失函數的梯度和鏈式法則求導,但這次計算 WjkW_{jk}Wjk?:
通過二層的全連接網絡,實現 mnist 數據集分類任務。
輸出結果
Epoch: 0 loss: 0.3155866861343384 Epoch: 1000 loss: 0.023114416748285294 Epoch: 2000 loss: 0.017101742327213287 Epoch: 3000 loss: 0.01927866041660309 Epoch: 4000 loss: 0.019498592242598534 Epoch: 5000 loss: 0.017000144347548485 Epoch: 6000 loss: 0.006083908025175333 Epoch: 7000 loss: 0.018798980861902237 Epoch: 8000 loss: 0.04835653677582741 Epoch: 9000 loss: 0.0037784664891660213 Accuracy Train%: 84.58166666666666 Accuracy Test%: 92.65三、激活函數
1、概述
主要作用:提供網絡的非線性建模能力。
假設一個神經網絡中僅包含線性卷積和全連接運算,那么該網絡僅能夠表達線性映射,即無論神經網絡有多少層,輸出都是輸入的線性組合,與沒有隱藏層效果相當。加入(非線性)激活函數之后,深度神經網絡才具備了分層的非線性映射學習能力,幾乎可以逼近任意函數。
激活函數的性質:
- 可微性: 當優化方法是基于梯度的時候,這個性質是必須的。
- 單調性: 當激活函數是單調的時候,單層網絡能夠保證是凸函數。
- 輸出值的范圍: 當激活函數輸出值是 有限 的時候,基于梯度的優化方法會更加 穩定,因為特征的表示受有限權值的影響更顯著;當激活函數的輸出是 無限 的時候,模型的訓練會更加高效,不過在這種情況小,一般需要更小的learning rate
常用的激活函數:
- sigmoid
- tanh
- ReLU
- Leaky ReLU
- Maxout
- ELU
2、sigmoid 激活函數
(1)定義
sigmoidsigmoidsigmoid 函數,即著名的 LogisticLogisticLogistic 函數,是常用的非線性激活函數,可將變量映射到 (0,1)(0,1)(0,1) 之間,公式如下:
f(x)=11+e?xf(x)=\frac{1}{1+e^{-x}}f(x)=1+e?x1?
幾何圖像如下:
(2)特點
能將輸入的連續實值映射到 (0,1)(0,1)(0,1) 之間。特別的,若非常小的負值,輸出為 0;非常大的正值,輸出為1。
(3)缺點
缺點1:梯度爆炸和梯度消失
在深度神經網絡中梯度反向傳播時可能會導致梯度爆炸和梯度消失,其中梯度爆炸發生的概率非常小,而梯度消失發生的概率比較大。
sigmoidsigmoidsigmoid 函數的導數為:
f′(x)=e?x(1+e?x)2=f(x)(1?f(x))f'(x)=\frac{e^{-x}}{(1+e^{-x})^2}=f(x)(1-f(x))f′(x)=(1+e?x)2e?x?=f(x)(1?f(x))
當網絡權值初始化為 (1,+∞)(1,+∞)(1,+∞)區間內的值,則會出現梯度爆炸情況。
sigmoid 的軟飽和性。從上圖可以看到,其兩側導數逐漸趨近于0,具有這種性質的稱為軟飽和激活函數。具體的,飽和又可分為左飽和與右飽和。
lim?n→∞f′(x)=0\lim_{n \to \infty} f'(x)=0 \quadn→∞lim?f′(x)=0
與軟飽和對應的是硬飽和,即
f′(x)=0,當∣x∣>c,其中c為常數。f'(x)=0,當|x|>c,其中 c 為常數。f′(x)=0,當∣x∣>c,其中c為常數。
sigmoidsigmoidsigmoid 的軟飽和性,使得深度神經網絡在二三十年里一直難以有效的訓練,是阻礙神經網絡發展的重要原因。具體來說,由于在后向傳遞過程中,sigmoidsigmoidsigmoid 向下傳導的梯度包含了一個 f′(x)f'(x)f′(x) 因子(sigmoidsigmoidsigmoid 關于輸入的導數),因此一旦輸入落入飽和區, f′(x)f'(x)f′(x) 就會變得接近于 000,導致了向底層傳遞的梯度也變得非常小。此時,網絡參數很難得到有效訓練。這種現象被稱為梯度消失。一般來說,sigmoidsigmoidsigmoid 網絡在 5 層之內就會產生梯度消失現象
缺點2:Sigmoid 的 output 不是0均值(即zero-centered)
其值域在[0,1]之間,函數輸出不是0均值的,權重更新效率降低,因為這會導致后層的神經元的輸入是非0均值的信號,這會對梯度產生影響:假設后層神經元的輸入都為正(e.g. x>0x>0x>0 elementwise in ),那么對w求局部梯度則都為正,這樣在反向傳播的過程中w要么都往正方向更新,要么都往負方向更新,導致有一種捆綁的效果,使得收斂緩慢。 當然了,若按batch去訓練,那么每個batch可能得到不同的符號(正或負),那么相加一下這個問題還是可以緩解。因此,非0均值這個問題雖然會產生一些不好的影響,不過跟上面提到的梯度消失問題相比還是要好很多的。
缺點3:耗時
其解析式中含有冪運算,計算機求解時相對來講比較耗時。對于規模比較大的深度網絡,這會較大地增加訓練時間。
缺點4:梯度彌散(死區)
受現有的梯度下降算法所限(嚴重依賴逐層的梯度計算值),Sigmoid函數對落入 (?∞,?5)∪(5,+∞)(-∞,-5) ∪ (5,+∞)(?∞,?5)∪(5,+∞)的輸入值,梯度計算為 000,發生 梯度彌散。因此該函數存在一正一負 兩塊“死區”[藍框區域]:
3、tanh函數
tanh是雙曲函數中的一種,又名 雙曲正切:
tanh(x)=ex?e?xex+e?x=2sigmoid(2x)?1tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}=2sigmoid(2x)-1tanh(x)=ex+e?xex?e?x?=2sigmoid(2x)?1
導數為:
tanh′(x)=4e?2x(e?2x+1)2=2tanh(x)(1?tanh(x))tanh'(x)=\frac{4 e^{-2x}}{(e^{-2x}+1)^2}=2tanh(x)(1-tanh(x))tanh′(x)=(e?2x+1)24e?2x?=2tanh(x)(1?tanh(x))
優點:
- tanh解決了sigmoid的輸出非“零為中心”的問題。
缺點:
- 依然有sigmoid函數梯度消失的問題。
- 依然指數運算。
4、ReLU函數
ReLU(Rectified Linear Unit,修正線性單元),是一種線性且不飽和的激活函數。公式如下:
f(x)=max(0,x)f(x)=max(0,x)f(x)=max(0,x)
導數如下:
f′(x)={1,if?x>00,if?x≤0f'(x)=\begin{cases} 1, & \text{if $x>0$} \\ 0 , & \text{if $x\leq0$ } \end{cases}f′(x)={1,0,?if?x>0if?x≤0??
優點
- ReLU解決了梯度消失的問題,至少 xxx 在正區間內,神經元不會飽和。
- 由于ReLU線性、非飽和的形式,在SGD中能夠快速收斂。
- 計算速度要快很多。線性計算
缺點
- ReLU的輸出不是“零為中心”(Notzero-centered output)。
- 隨著訓練的進行,可能會出現神經元死亡,權重無法更新的情況。(不可逆轉的死亡)
- 解釋:訓練神經網絡的時候,一旦學習率沒有設置好,第一次更新權重的時候,輸入是負值,那么這個含有ReLU的神經節點就會死亡,再也不會被激活。
- 因為:ReLU的導數在x>0的時候是1,在x<=0的時候是0。如果x<=0,那么ReLU的輸出是0,那么反向傳播中梯度也是0,權重就不會被更新,導致神經元不再學習。 也就是說,這個ReLU激活函數在訓練中將不可逆轉的死亡,導致了訓練數據多樣化的丟失。
- 在實際訓練中,如果學習率設置的太高,可能會發現網絡中40%的神經元都會死掉,且在整個訓練集中這些神經元都不會被激活。所以,設置一個合適的較小的學習率,會降低這種情況的發生。為了解決神經元節點死亡的情況,有人提出了Leaky ReLU、P-ReLU、R-ReLU、ELU等激活函數。
5、Leaky ReLU
Leaky ReLU 是 ReLU 激活函數的改進版本,公式如下:
f(x)={x,if?x>0ax,if?x≤0f(x)=\begin{cases} x, & \text{if $x>0$} \\ ax , & \text{if $x\leq0$ } \end{cases}f(x)={x,ax,?if?x>0if?x≤0??
導數如下:
f(x)={1,if?x>0a,if?x≤0f(x)=\begin{cases} 1, & \text{if $x>0$} \\ a , & \text{if $x\leq0$ } \end{cases}f(x)={1,a,?if?x>0if?x≤0??
優點
- 神經元不會出現死亡的情況。
- 對于所有的輸入,不管是大于等于0還是小于0,神經元不會飽和。
- 由于Leaky ReLU線性、非飽和的形式,在SGD中能夠快速收斂。
- 計算速度要快很多。只有線性關系。
缺點
- Leaky ReLU函數中的 ααα,需要通過先驗知識人工賦值,通常 α=0.01\alpha=0.01α=0.01。
6、Maxout
Maxout 是 ReLU 的推廣,定義如下:
f(x)=max(w1Tx+b1,w2Tx+b2,?,wnTx+bn)f(x)=max(w^T_1x+b_1,w^T_2x+b_2,?,w^T_nx+b_n)f(x)=max(w1T?x+b1?,w2T?x+b2?,?,wnT?x+bn?)
Maxout 網絡能夠近似任意連續函數,且當w2,b2,…,wn,bnw_2,b_2,…,w_n,b_nw2?,b2?,…,wn?,bn?為0時,退化為ReLU。
優點
- Maxout能夠緩解梯度消失
- 規避了ReLU神經元死亡的缺點
缺點
- 增加了參數和計算量。
7、ELU
ELU(Exponential Linear Units,指數線性單元)。它試圖將激活函數的輸出平均值接近零,從而加快學習速度。同時,它還能通過正值的標識來避免梯度消失的問題。
公式如下:
?f(x)={x,if?x>0a(ex?1),otherwise?f(x)=\begin{cases} x, & \text{if $x>0$} \\ a(e^x-1) , & \text{otherwise } \end{cases}f(x)={x,a(ex?1),?if?x>0otherwise??
其中,超參數 α\alphaα 常被設定為 1
導數如下:
?f′(x)={1,if?x>0aex,otherwise?f'(x)=\begin{cases} 1, & \text{if $x>0$} \\ ae^x , & \text{otherwise } \end{cases}f′(x)={1,aex,?if?x>0otherwise??
優點
- 完美解決了死區問題。
- ELU激活函數的輸出均值是接近于零的
缺點
- 計算較復雜。
8、激活函數的選擇
(1)深度學習需要大量時間處理大量數據,模型的收斂速度尤為重要。所以,總體來講,訓練深度神經網絡盡量使用 zero-centered 數據(預處理實現) 和 zero-centered 輸出。
==》盡量選擇輸出具有 zero-centered 特點的激活函數來加速模型的收斂速度。
(2)在使用 ReLU 時,小心設置 learning_rate,而且注意不要出現很多神經元死亡。若不好解決,可嘗試 Leaky ReLU、Maxout 等。
(3)最好不使用 sigmoid、tanh
(4)conv -> bn -> relu 標配的 module。
四、正則化
正則化是選擇模型的一種方法,具體來說,選擇經驗風險與模型復雜度同時較小的模型(防止過擬合),這樣可以較少泛化誤差而不是訓練誤差。
常用正則化方法
- 參數范數懲罰:L1正則化、L2正則化;
- 數據集增強;
- 噪聲添加;
- early stop;
- Dropout層
1、參數范數懲罰
參數范數懲罰通過對目標函數 JJJ 添加一個參數范數懲罰 Ω(θ)Ω(θ)Ω(θ),限制模型的學習能力。
將正則化歐的目標函數記為 J~\tilde{J}J~:
J~(θ;X,y)=J(θ;X,y)+αΩ(θ)\tilde{J}(\theta;X,y)=J(\theta;X,y)+\alphaΩ(θ)J~(θ;X,y)=J(θ;X,y)+αΩ(θ)
其中 α≥0\alpha\geq0α≥0 是權衡范數懲罰項 ΩΩΩ 和標準目標函數 J(X;θ)J(X;θ)J(X;θ) 相對貢獻的超參數,通過調整 α\alphaα 的大小,可以獲得不同的參數選擇偏好。
注意:參數包括模型中每一層仿射變換的權重和偏置,我們通常只對權重做懲罰,而不對偏置做正則懲罰。因為精確擬合偏置所需的數據通常比權重少的多,正則化偏置參數可能會導致明顯的欠擬合。
(1)相關定義
L0范數:權重向量 WWW 中非0的元素的個數,通常表示為 ∣∣W∣∣0||W||_0∣∣W∣∣0?。
L1范數:權值向量 WWW 中各個元素的絕對值之和,通常表示為 ∣∣W∣∣1||W||_1∣∣W∣∣1?。
L2范數:權值向量 WWW 中各個元素的平方的和的開方值,通常表示為 ∣∣W∣∣2||W||_2∣∣W∣∣2?。
任何的規則化算子,如果它在 Wi=0W_i=0Wi?=0 處不可微,并且可以分解為一個“求和”的形式,則該規則化算子就可以實現稀疏。
稀疏的好處
-
特征選擇(Feature Selection):能實現特征的自動選擇
稀疏規則化算子會學習地去掉這些對最終輸出結果沒有關系或者不提供任何信息的特征,也就是把這些特征對應的權重置為0。 -
可解釋性(Interpretability)
非零權重的特征為輸出結果提供的信息是巨大的、決策性的。
(2)L0正則化
從直觀上看,利用非零參數的個數,可以很好的來選擇特征,實現特征稀疏的效果,具體操作時選擇參數非零的特征即可。
但因為L0正則化很難求解,是個NP難問題,因此一般采用L1正則化。L1正則化是L0正則化的最優凸近似,比L0容易求解,并且也可以實現稀疏的效果。
(3)L1正則化
L1范數也稱叫“稀疏規則算子”(Lasso regularization),L1范數和 L0范數 可以實現稀疏,L1因具有比L0更好的優化求解特性而被廣泛應用。
(4)L2正則化
L2范數,在回歸中稱為:“嶺回歸” (Ridge Regression) 或 “權值衰減weight decay”。
讓L2范數的規則項 ∣∣W∣∣2||W||_2∣∣W∣∣2? 最小,可以使得 WWW 的每個元素都很小,都接近于0(不會讓它等于0)。而越小的參數說明模型越簡單,越簡單的模型則越不容易產生過擬合現象。
2、數據擴增(data agumentation)
較少過擬合的最簡單方法:增加訓練集樣本,也稱數據擴增(data agumentation)。但是由于標注數據昂貴,需要通過其他方式增加樣本。
- 圖像處理:旋轉、翻轉、放縮、平移等等。
- GAN(對抗式生成網絡)
3、噪聲添加
噪聲添加:將其直接添加到學習到的權重上。這項技術主要被用于循環神經網絡的情況下。
在某些假設下,施加于權重的噪聲可以被解釋為與更傳統的正則化形式等同,鼓勵要學習的函數保持穩定。
4、Dropout
Dropout:在用前向傳播算法和反向傳播算法訓練模型時,隨機的從全連接DNN網絡中去掉一部分隱含層的神經元。
兩種理解:
- 減少神經元之間復雜的共適應關系:在每次訓練的時候使用dropout,每個神經元有一定的概率被移除,這樣可以使得一個神經元的訓練不依賴于另外一個神經元,同樣也就使得特征之間的協同作用被減弱。 Hinton認為,過擬合可以通過阻止某些特征的協同作用來緩解。
- 多模型效果平均的方式。對于減少測試集中的錯誤,我們可以將多個不同神經網絡的預測結果取平均,而因為dropout的隨機性,在每次dropout后,網絡模型可看成不同結構的神經網絡,而要訓練的參數數目卻是不變的,這就解脫了訓練多個獨立的不同神經網絡的時耗問題。在測試輸出的時候,將輸出權重乘以保留概率1-p%,從而達到類似平均的效果。
左邊的圖為一個完全的全連接層,右邊為應用dropout后的全連接層。
做法
- 訓練階段:每次更新參數之前,每個神經元有一定的概率被丟棄,假設為p%,p可以設為50或者根據驗證集的表現來選取,輸入層的p比較小,保留概率接近于1
- 測試階段不dropout,保留所有單元的權重,而且要乘以保留概率1-p%,為了保證輸出期望一致。
dropout不只用于前饋神經網絡,還可以用于圖模型,比如玻爾茲曼機。
5、早期停止(early stopping)
早期停止是一種交叉驗證策略,將一部分數據集作為驗證集(validation set)。
當我們看到驗證集上的性能越來越差時,就停止對模型的訓練。
五、深度模型中的優化(待完善)
1、參數初始化策略
目的:在訓練中學到有用的信息,需要參數更新時的梯度不為0。而一般來講,參數更新的梯度和反向傳播得到的狀態梯度以及輸入激活值有關。
==》初始化條件:
- 各層激活值不會出現飽和現象(eg: sigmoid、tanh)
- 各層激活值不為0。
(1)全零初始化??
全零初始化:模型無法更新,而且模型權重的相同,導致模型的高度對稱性。
==》需要破壞對稱性
(2)隨機初始化 (Random Initialization)
將參數值(通過高斯分布或均勻分布)隨機初始化為 接近0的 一個很小的隨機數(有正有負),從而使對稱失效。
(3)Xavier
基本思想:保持輸入和輸出的方差一致,這樣就避免了所有輸出值都趨向于0。
(4)MSRA
(5)bias初始化
通常初始化為0(若初始化為0.01等值,可能并不能得到好的提升,反而可能下降)
(6)小結
-
Gaussian
滿足mean=0mean=0mean=0,std=1std=1std=1的高斯分布x~N(mean,std)x~N(mean,std)x~N(mean,std) -
Xavier
定義參數所在層的輸入維度為n,輸出維度為m,那么參數將以均勻分布的方式在[?6m+n,6m+n][-\sqrt{\frac{6}{m+n}},\sqrt{\frac{6}{m+n}}][?m+n6??,m+n6??]的范圍內進行初始化。 -
MSRA
滿足x~N(0,σ2)x~N(0,σ2)x~N(0,σ2) 的高斯分布,其中σ=sqrt(2/n)σ = sqrt(2/n)σ=sqrt(2/n) -
Uniform
滿足min=0,max=1的均勻分布。x~U(min,max)x~U(min,max)x~U(min,max)
2、自適應學習率算法
梯度下降、AdaGrad、RMSProp、Adam;優化算法的選擇
3、batch norm層
提出背景、解決什么問題、層在訓練和測試階段的計算公式
4、layer norm層
參考鏈接:
- TensorFlow實現反向傳播算法詳解
- 詳解機器學習中的梯度消失、爆炸原因及其解決方法
- 梯度爆炸和梯度消失的本質原因
- 深度學習中Dropout原理解析
- 理解神經網絡中的Dropout
總結
以上是生活随笔為你收集整理的【NLP】Task5:神经网络基础的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【LeetCode】687. 最长同值路
- 下一篇: 【工具】ubuntu下在百度云文件