【深度學(xué)習(xí)入門到進(jìn)階】必看系列,含激活函數(shù)、優(yōu)化策略、損失函數(shù)、模型調(diào)優(yōu)、歸一化算法、卷積模型、序列模型、預(yù)訓(xùn)練模型、對抗神經(jīng)網(wǎng)絡(luò)等
專欄詳細(xì)介紹:【深度學(xué)習(xí)入門到進(jìn)階】必看系列,含激活函數(shù)、優(yōu)化策略、損失函數(shù)、模型調(diào)優(yōu)、歸一化算法、卷積模型、序列模型、預(yù)訓(xùn)練模型、對抗神經(jīng)網(wǎng)絡(luò)等
本專欄主要方便入門同學(xué)快速掌握相關(guān)知識。聲明:部分項目為網(wǎng)絡(luò)經(jīng)典項目方便大家快速學(xué)習(xí),后續(xù)會不斷增添實戰(zhàn)環(huán)節(jié)(比賽、論文、現(xiàn)實應(yīng)用等)
專欄訂閱:深度學(xué)習(xí)入門到進(jìn)階專欄
1.歸一化基礎(chǔ)知識點(diǎn)
1.1 歸一化作用
歸一化是一種數(shù)據(jù)處理方式,能將數(shù)據(jù)經(jīng)過處理后限制在某個固定范圍內(nèi)。
歸一化存在兩種形式,
- 一種是在通常情況下,將數(shù)處理為 [0, 1] 之間的小數(shù),其目的是為了在隨后的數(shù)據(jù)處理過程中更便捷。例如,在圖像處理中,就會將圖像從 [0, 255] 歸一化到 [0, 1]之間,這樣既不會改變圖像本身的信息儲存,又可加速后續(xù)的網(wǎng)絡(luò)處理。
- 其他情況下,也可將數(shù)據(jù)處理到 [-1, 1] 之間,或其他的固定范圍內(nèi)。另一種是通過歸一化將有量綱表達(dá)式變成無量綱表達(dá)式。
那么什么是量綱,又為什么需要將有量綱轉(zhuǎn)化為無量綱呢?具體舉一個例子。當(dāng)我們在做對房價的預(yù)測時,收集到的數(shù)據(jù)中,如房屋的面積、房間的數(shù)量、到地鐵站的距離、住宅附近的空氣質(zhì)量等,都是量綱,而他們對應(yīng)的量綱單位分別為平方米、個數(shù)、米、AQI等。這些量綱單位的不同,導(dǎo)致數(shù)據(jù)之間不具有可比性。同時,對于不同的量綱,數(shù)據(jù)的數(shù)量級大小也是不同的,比如房屋到地鐵站的距離可以是上千米,而房屋的房間數(shù)量一般只有幾個。經(jīng)過歸一化處理后,不僅可以消除量綱的影響,也可將各數(shù)據(jù)歸一化至同一量級,從而解決數(shù)據(jù)間的可比性問題。
-
歸一化可以將有量綱轉(zhuǎn)化為無量綱,同時將數(shù)據(jù)歸一化至同一量級,解決數(shù)據(jù)間的可比性問題。在回歸模型中,自變量的量綱不一致會導(dǎo)致回歸系數(shù)無法解讀或錯誤解讀。在KNN、Kmeans等需要進(jìn)行距離計算的算法中,量綱的量級不同可能會導(dǎo)致?lián)碛休^大量級的特征在進(jìn)行距離計算時占主導(dǎo)地位,從而影響學(xué)習(xí)結(jié)果。
-
數(shù)據(jù)歸一化后,尋求最優(yōu)解的過程會變得平緩,可以更快速的收斂到最優(yōu)解。詳解請參見3.為什么歸一化能提高求解最優(yōu)解的速度。
1.2 歸一化提高求解最優(yōu)解的速度
我們提到一個對房價進(jìn)行預(yù)測的例子,假設(shè)自變量只有房子到地鐵站的距離x1和房子內(nèi)房間的個數(shù)x2,因變量為房價,預(yù)測公式和損失函數(shù)分別為
y = θ 1 x 1 + θ 2 x 2 J = ( θ 1 x 1 + θ 2 x 2 ? y l a b e l ) 2 \begin{array}{l}y=\theta_1x_1+\theta_2x_2\\ J=(\theta_1x_1+\theta_2x_2-y_{label})^2\end{array} y=θ1?x1?+θ2?x2?J=(θ1?x1?+θ2?x2??ylabel?)2?
在未歸一化時,房子到地鐵站的距離的取值在0~5000之間,而房間個數(shù)的取值范圍僅為0~10。假設(shè)x1=1000,x2=3, 那么損失函數(shù)的公式可以寫為:
J = ( 1000 θ 1 + 3 θ 2 ? y l a b e l ) 2 J=\left(1000\theta_1+3\theta_2-y_{label}\right)^2 J=(1000θ1?+3θ2??ylabel?)2
可將該損失函數(shù)尋求最優(yōu)解過程可視化為下圖:圖1: 損失函數(shù)的等高線,圖1(左)為未歸一化時,圖1(右)為歸一化
在圖1中,左圖的紅色橢圓代表歸一化前的損失函數(shù)等高線,藍(lán)色線段代表梯度的更新,箭頭的方向代表梯度更新的方向。尋求最優(yōu)解的過程就是梯度更新的過程,其更新方向與登高線垂直。由于x1和 x2的量級相差過大,損失函數(shù)的等高線呈現(xiàn)為一個瘦窄的橢圓。因此如圖1(左)所示,瘦窄的橢圓形會使得梯度下降過程呈之字形呈現(xiàn),導(dǎo)致梯度下降速度緩慢。
當(dāng)數(shù)據(jù)經(jīng)過歸一化后, x 1 ′ = 1000 ? 0 5000 ? 0 = 0.2 , x 2 ′ = 3 ? 0 10 ? 0 = 0.3 , x_1^{'}=\frac{1000-0}{5000-0}=0.2,x_2^{'}=\frac{3-0}{10-0}=0.3, x1′?=5000?01000?0?=0.2,x2′?=10?03?0?=0.3,,那么損失函數(shù)的公式可以寫為:
J ( x ) = ( 0.2 θ 1 + 0.3 θ 2 ? y l a b e l ) 2 J(x)=\left(0.2\theta_1+0.3\theta_2-y_{label}\right)^2 J(x)=(0.2θ1?+0.3θ2??ylabel?)2
我們可以看到,經(jīng)過歸一化后的數(shù)據(jù)屬于同一量級,損失函數(shù)的等高線呈現(xiàn)為一個矮胖的橢圓形(如圖1(右)所示),求解最優(yōu)解過程變得更加迅速且平緩,因此可以在通過梯度下降進(jìn)行求解時獲得更快的收斂。
1.3 歸一化類型
1.3.1 Min-max normalization (Rescaling):
x ′ = x ? m i n ( x ) m a x ( x ) ? m i n ( x ) x^{'}=\dfrac{x-min(x)}{max(x)-min(x)}\quad\quad x′=max(x)?min(x)x?min(x)?
歸一化后的數(shù)據(jù)范圍為 [0, 1],其中 min(x)、max(x)分別求樣本數(shù)據(jù)的最小值和最大值。
1.3.2 Mean normalization:
x ′ = x ? m e a n ( x ) m a x ( x ) ? m i n ( x ) x^{'}=\dfrac{x-mean(x)}{max(x)-min(x)}\quad\text{} x′=max(x)?min(x)x?mean(x)?
1.3.3 Z-score normalization (Standardization):標(biāo)準(zhǔn)化
x ′ = x ? μ σ x^{'}=\dfrac{x-\mu}{\sigma} x′=σx?μ?
歸一化后的數(shù)據(jù)范圍為實數(shù)集,其中 μ、σ分別為樣本數(shù)據(jù)的均值和標(biāo)準(zhǔn)差。
1.3.4 非線性歸一化:
-
對數(shù)歸一化:
x ′ = lg ? x lg ? m a x ( x ) x^{'}=\dfrac{\lg x}{\lg max(x)} x′=lgmax(x)lgx? -
反正切函數(shù)歸一化:
x ′ = arctan ? ( x ) ? 2 π x^{'}=\arctan(x)*\dfrac{2}{\pi}\quad x′=arctan(x)?π2?
歸一化后的數(shù)據(jù)范圍為 [-1, 1]
- 小數(shù)定標(biāo)標(biāo)準(zhǔn)化(Demical Point Normalization):
x ′ = x 1 0 j x^{'}=\dfrac{x}{10^{j}} x′=10jx?
歸一化后的數(shù)據(jù)范圍為 [-1, 1],j為使 m a x ( ∣ x ′ ∣ ) < 1 max(|x'|)<1 max(∣x′∣)<1的最小整數(shù)。
1.4 不同歸一化的使用條件
-
Min-max歸一化和mean歸一化適合在最大最小值明確不變的情況下使用,比如圖像處理時,灰度值限定在 [0, 255] 的范圍內(nèi),就可以用min-max歸一化將其處理到[0, 1]之間。在最大最小值不明確時,每當(dāng)有新數(shù)據(jù)加入,都可能會改變最大或最小值,導(dǎo)致歸一化結(jié)果不穩(wěn)定,后續(xù)使用效果也不穩(wěn)定。同時,數(shù)據(jù)需要相對穩(wěn)定,如果有過大或過小的異常值存在,min-max歸一化和mean歸一化的效果也不會很好。如果對處理后的數(shù)據(jù)范圍有嚴(yán)格要求,也應(yīng)使用min-max歸一化或mean歸一化。
-
Z-score歸一化也可稱為標(biāo)準(zhǔn)化,經(jīng)過處理的數(shù)據(jù)呈均值為0,標(biāo)準(zhǔn)差為1的分布。在數(shù)據(jù)存在異常值、最大最小值不固定的情況下,可以使用標(biāo)準(zhǔn)化。標(biāo)準(zhǔn)化會改變數(shù)據(jù)的狀態(tài)分布,但不會改變分布的種類。特別地,神經(jīng)網(wǎng)絡(luò)中經(jīng)常會使用到z-score歸一化,針對這一點(diǎn),我們將在后續(xù)的文章中進(jìn)行詳細(xì)的介紹。
-
非線性歸一化通常被用在數(shù)據(jù)分化程度較大的場景,有時需要通過一些數(shù)學(xué)函數(shù)對原始值進(jìn)行映射,如對數(shù)、反正切等。
在查找資料的時候,我看到很多文章都提出了:“在分類、聚類算法中,需要使用距離來度量相似性的時候,z-score歸一化也就是標(biāo)準(zhǔn)化的效果比歸一化要好,但是對于這個觀點(diǎn)并沒有給出足夠的技術(shù)支持。因此,我選取了KNN分類網(wǎng)絡(luò)搜索了相關(guān)論文,在論文Comparative Analysis of KNN Algorithm using Various Normalization Techniques [1] 中,在K值不同的情況下,對于相同的數(shù)據(jù)分別進(jìn)行min-max歸一化和z-score歸一化,得到的結(jié)果如下圖所示:圖2: 對于不同的K值,相同數(shù)據(jù)集不同歸一化方式下的預(yù)測精確度
由此可以看到,至少對于KNN分類問題,z-score歸一化和min-max歸一化的選擇會受到數(shù)據(jù)集、K值的影響,對于其他的分類和聚類算法,哪一種歸一化的方法更好仍有待驗證。最好的選擇方法就是進(jìn)行實驗,選擇在當(dāng)前實驗條件下,能夠使模型精度更高的一種。
1.5 歸一化和標(biāo)準(zhǔn)化的聯(lián)系與區(qū)別
談到歸一化和標(biāo)準(zhǔn)化可能會存在一些概念的混淆,我們都知道歸一化是指normalization,標(biāo)準(zhǔn)化是指standardization,但根據(jù)wiki上對feature scaling方法的定義,standardization其實就是z-score normalization,也就是說標(biāo)準(zhǔn)化其實是歸一化的一種,而一般情況下,我們會把z-score歸一化稱為標(biāo)準(zhǔn)化,把min-max歸一化簡稱為歸一化。在下文中,我們也是用標(biāo)準(zhǔn)化指代z-score歸一化,并使用歸一化指代min-max歸一化。
其實,歸一化和標(biāo)準(zhǔn)化在本質(zhì)上都是一種線性變換。在4.歸一化類型中,我們提到了歸一化和標(biāo)準(zhǔn)化的公式,對于歸一化的公式,在數(shù)據(jù)給定的情況下,可以令a=max(x)?min(x)、b=min(x),則歸一化的公式可變形為:
x ′ = x ? b a = x a ? b a = x a ? c x^{'}=\dfrac{x-b}{a}=\dfrac{x}{a}-\dfrac{a}=\dfrac{x}{a}-c x′=ax?b?=ax??ab?=ax??c
標(biāo)準(zhǔn)化的公式與變形后的歸一化類似,其中的μ和σ在數(shù)據(jù)給定的情況下,可以看作常數(shù)。因此,標(biāo)準(zhǔn)化的變形與歸一化的類似,都可看作對x按比例a進(jìn)行縮放,再進(jìn)行c個單位的平移。由此可見,歸一化和標(biāo)準(zhǔn)化的本質(zhì)都是一種線性變換,他們都不會因為對數(shù)據(jù)的處理而改變數(shù)據(jù)的原始數(shù)值排序。
那么歸一化和標(biāo)準(zhǔn)化又有什么區(qū)別呢?
-
歸一化不會改變數(shù)據(jù)的狀態(tài)分布,但標(biāo)準(zhǔn)化會改變數(shù)據(jù)的狀態(tài)分布;
-
歸一化會將數(shù)據(jù)限定在一個具體的范圍內(nèi),如 [0, 1],但標(biāo)準(zhǔn)化不會,標(biāo)準(zhǔn)化只會將數(shù)據(jù)處理為均值為0,標(biāo)準(zhǔn)差為1。
References:【1】Comparative Analysis of KNN Algorithm using Various Normalization Techniques;Amit Pandey,Achin Jain.
2. 層歸一化
神經(jīng)網(wǎng)絡(luò)的學(xué)習(xí)過程本質(zhì)上是在學(xué)習(xí)數(shù)據(jù)的分布,如果沒有進(jìn)行歸一化的處理,那么每一批次的訓(xùn)練數(shù)據(jù)的分布是不一樣的,
- 從大的方向上來看,神經(jīng)網(wǎng)絡(luò)則需要在這多個分布當(dāng)中找到平衡點(diǎn),
- 從小的方向上來看 ,由于每層的網(wǎng)絡(luò)輸入數(shù)據(jù)分布在不斷地變化 ,那么會導(dǎo)致每層網(wǎng)絡(luò)都在找平衡點(diǎn),顯然網(wǎng)絡(luò)就變得難以收斂 。
當(dāng)然我們可以對輸入數(shù)據(jù)進(jìn)行歸一化處理(例如對輸入圖像除以255),但這也僅能保證輸入層的數(shù)據(jù)分布是一樣的,并不能保證每層網(wǎng)絡(luò)輸入數(shù)據(jù)分布是一樣的,所以在網(wǎng)絡(luò)的中間我們也是需要加入歸一化的處理。
歸一化定義:數(shù)據(jù)標(biāo)準(zhǔn)化(Normalization),也稱為歸一化,歸一化就是將需要處理的數(shù)據(jù)在通過某種算法經(jīng)過處理后,將其限定在需要的一定的范圍內(nèi)
2.1 層歸一化產(chǎn)生原因
- 一般的批歸一化(Batch Normalization,BN)算法對mini-batch數(shù)據(jù)集過分依賴,無法應(yīng)用到在線學(xué)習(xí)任務(wù)中(此時mini-batch數(shù)據(jù)集包含的樣例個數(shù)為1),在遞歸神經(jīng)網(wǎng)絡(luò)(Recurrent neural network,RNN)中BN的效果也不明顯 ;
- RNN多用于自然語言處理任務(wù),網(wǎng)絡(luò)在不同訓(xùn)練周期內(nèi)輸入的句子,句子長度往往不同,在RNN中應(yīng)用BN時,在不同時間周期使用mini-batch數(shù)據(jù)集的大小都需要不同,計算復(fù)雜,而且如果一個測試句子比訓(xùn)練集中的任何一個句子都長,在測試階段RNN神經(jīng)網(wǎng)絡(luò)預(yù)測性能會出現(xiàn)嚴(yán)重偏差。如果更改為使用層歸一化,就可以有效的避免這個問題。
層歸一化:通過計算在一個訓(xùn)練樣本上某一層所有的神經(jīng)元的均值和方差來對神經(jīng)元進(jìn)行歸一化。
μ ← 1 H ∑ i = 1 H x i σ ← 1 H ∑ i = 1 H ( x i ? μ D ) 2 + ? ? y = f ( g σ ( x ? μ ) + b ) \mu\leftarrow\dfrac{1}{H}\sum_{i=1}^{H}x_i\\ \sigma\leftarrow\sqrt{\dfrac{1}{H}\sum_{i=1}^{H}(x_i-\mu_D)^2+\epsilon}\\ \vdots\\ y=f(\dfrac{g}{\sigma}(x-\mu)+b) μ←H1?∑i=1H?xi?σ←H1?∑i=1H?(xi??μD?)2+???y=f(σg?(x?μ)+b)
相關(guān)參數(shù)含義:
-
x : 該層神經(jīng)元的向量表示
-
H : 層中隱藏神經(jīng)元個數(shù)
-
? : 添加較小的值到方差中以防止除零
-
g: 再縮放參數(shù)(可訓(xùn)練),新數(shù)據(jù)以g2為方差
-
b: 再平移參數(shù)(可訓(xùn)練),新數(shù)據(jù)以b為偏差
-
f:激活函數(shù)
算法作用
- 加快網(wǎng)絡(luò)的訓(xùn)練收斂速度 在深度神經(jīng)網(wǎng)絡(luò)中,如果每層的數(shù)據(jù)分布都不一樣,將會導(dǎo)致網(wǎng)絡(luò)非常難以收斂和訓(xùn)練(如綜述所說難以在多種數(shù)據(jù)分布中找到平衡點(diǎn)),而每層數(shù)據(jù)的分布都相同的情況,訓(xùn)練時的收斂速度將會大幅度提升。
控制梯度爆炸和防止梯度消失 我們常用的梯度傳遞的方式是由深層神經(jīng)元往淺層傳播,如果用f′i和O′i分別表示第i層對應(yīng)的激活層導(dǎo)數(shù)和輸出導(dǎo)數(shù),那么對于H層的神經(jīng)網(wǎng)絡(luò),第一層的導(dǎo)數(shù) F 1 ′ = ∏ i = 1 H f i ′ ? O i ′ F_1'=\prod_{i=1}^{H}f_i'*O_i' F1′?=∏i=1H?fi′??Oi′?,那么對于 f i ′ ? O i ′ f_i'*O_i' fi′??Oi′?恒大于1的情況,如 f i ′ ? O i ′ = 2 f_i'*O_i'=2 fi′??Oi′?=2的情況,使得結(jié)果指數(shù)上升,發(fā)生梯度爆炸,對于 f i ′ ? O i ′ f_i'*O_i' fi′??Oi′?恒小于1,如 f i ′ ? O i ′ = 0.25 f_i'*O_i'=0.25 fi′??Oi′?=0.25導(dǎo)致結(jié)果指數(shù)下降,發(fā)生梯度消失的現(xiàn)象,底層神經(jīng)元梯度幾乎為0。采用歸一化算法后,可以使得f_i’*O_i’ f i ′ ? O i ′ f_i'*O_i' fi′??Oi′?的結(jié)果不會太大也不會太小,有利于控制梯度的傳播。
在飛槳框架案例如下:
paddle.nn.LayerNorm(normalized_shape, epsilon=1e-05, weight_attr=None, bias_attr=None, name=None);
該接口用于構(gòu)建 LayerNorm 類的一個可調(diào)用對象
核心參數(shù)的含義:
-
normalized_shape (int|list|tuple) - 期望對哪些維度進(jìn)行變換。如果是一個整數(shù),會將最后一個維度進(jìn)行規(guī)范化。
-
epsilon (float, 可選) - 對應(yīng)?-為了數(shù)值穩(wěn)定加在分母上的值。默認(rèn)值:1e-05
2.2 應(yīng)用案例
import paddle
import numpy as np
np.random.seed(123)
x_data = np.random.random(size=(2, 2, 2, 3)).astype('float32')
x = paddle.to_tensor(x_data)
layer_norm = paddle.nn.LayerNorm(x_data.shape[1:])
layer_norm_out = layer_norm(x)
print(layer_norm_out)
# input
# Tensor(shape=[2, 2, 2, 3], dtype=float32, place=CPUPlace, stop_gradient=True,
# [[[[0.69646919, 0.28613934, 0.22685145],
# [0.55131477, 0.71946895, 0.42310646]],
# [[0.98076421, 0.68482971, 0.48093191],
# [0.39211753, 0.34317800, 0.72904968]]],
# [[[0.43857226, 0.05967790, 0.39804426],
# [0.73799539, 0.18249173, 0.17545176]],
# [[0.53155136, 0.53182757, 0.63440096],
# [0.84943181, 0.72445530, 0.61102349]]]])
# output:
# Tensor(shape=[2, 2, 2, 3], dtype=float32, place=CPUPlace, stop_gradient=True,
# [[[[ 0.71878898, -1.20117974, -1.47859287],
# [ 0.03959895, 0.82640684, -0.56029880]],
# [[ 2.04902983, 0.66432685, -0.28972855],
# [-0.70529866, -0.93429095, 0.87123591]]],
# [[[-0.21512909, -1.81323946, -0.38606915],
# [ 1.04778552, -1.29523218, -1.32492554]],
# [[ 0.17704056, 0.17820556, 0.61084229],
# [ 1.51780486, 0.99067575, 0.51224011]]]])
對于一般的圖片訓(xùn)練集格式為 ( N , C , H , W ) (N,C,H,W) (N,C,H,W)的數(shù)據(jù),在LN變換中,我們對后三個維度進(jìn)行歸一化。因此實例的輸入shape就是后三維x_data.shape[1:]。也就是我們固定了以每張圖片為單位,對每張圖片的所有通道的像素值統(tǒng)一進(jìn)行了Z-score歸一化。
2.3應(yīng)用場景
層歸一化在遞歸神經(jīng)網(wǎng)絡(luò)RNN中的效果是受益最大的,它的表現(xiàn)優(yōu)于批歸一化,特別是在動態(tài)長序列和小批量的任務(wù)當(dāng)中 。例如在論文Layer Normalization所提到的以下任務(wù)當(dāng)中:
-
圖像與語言的順序嵌入(Order embedding of images and language)
-
教機(jī)器閱讀和理解(Teaching machines to read and comprehend)
-
Skip-thought向量(Skip-thought vectors)
-
使用DRAW對二值化的MNIST進(jìn)行建模(Modeling binarized MNIST using DRAW)
-
手寫序列生成(Handwriting sequence generation)
-
排列不變MNIST(Permutation invariant MNIST)
但是,研究表明,由于在卷積神經(jīng)網(wǎng)絡(luò)中,LN會破壞卷積所學(xué)習(xí)到的特征,致使模型無法收斂,而對于BN算法,基于不同數(shù)據(jù)的情況,同一特征歸一化得到的數(shù)據(jù)更不容易損失信息,所以在LN和BN都可以應(yīng)用的場景,BN的表現(xiàn)通常要更好。文章來源:http://www.zghlxwxcb.cn/news/detail-539080.html
文獻(xiàn):Ba J L , Kiros J R , Hinton G E . Layer Normalization[J]. 2016.文章來源地址http://www.zghlxwxcb.cn/news/detail-539080.html
到了這里,關(guān)于深度學(xué)習(xí)基礎(chǔ)入門篇[七]:常用歸一化算法、層次歸一化算法、歸一化和標(biāo)準(zhǔn)化區(qū)別于聯(lián)系、應(yīng)用案例場景分析。的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!