1 參數初始化
神經網絡的參數學習是一個非凸優化問題,在使用梯度下降法進行網絡參數優化時,參數初始值的選取十分關鍵,關系到網絡的優化效率(梯度消失和梯度爆炸問題)和泛化能力(局部最優解問題)。參數初始化的方式通常有以下三種:
-
預訓練初始化:不同的參數初始值會收斂到不同的局部最優解。雖然這些局部最優解在訓練集上的損失比較接近,但是它們的泛化能力差異很大。一 個好的初始值會使得網絡收斂到一個泛化能力高的局部最優解。通常情況下,一個已經在大規模數據上訓練過的模型可以提供一個好的參數初始值,這種初始化方法稱為預訓練初始化(Pre-trained Initialization)。預訓練任務可以為監督學習或無監督學習任務。由於無監督學習任務更容易獲取大規模的訓練數據,因此被廣泛采用。
-
固定值初始化:對於一些特殊的參數,我們可以根據經驗用一個特殊的固定值來進行初始化。比如偏置(Bias)通常用 0 來初始化。在 LSTM 網絡的遺忘門中,偏置通常初始化為 1 或 2,使得時序上的梯度變大。對於使用 ReLU 的神經元,有時也可以將偏置設為 0.01,使得 ReLU 神經元在訓練初期更容易激活,從而獲得一定的梯度來進行誤差反向傳播。
-
隨機初始化:在線性模型的訓練(比如感知器和 Logistic 回歸)中,一般將參數全部初始化為 0。但是這在神經網絡的訓練中會存在一些問題。因為如果參數都為 0,在第一遍前向計算時,所有的隱藏層神經元的激活值都相同;在反向傳播時,所有權重的更新也都相同,這樣會導致隱藏層神經元沒有區分性。這種現象也稱為對稱權重現象。為了打破這個平衡,比較好的方式是對每個參數都隨機初始化(Random Initialization),使得不同神經元之間的區分性更好。
雖然預訓練初始化通常具有更好的收斂性和泛化性,但是靈活性不夠,不能在目標任務上任意地調整網絡結構。因此,好的隨機初始化方法對訓練神經網絡模型來說依然十分重要。這里我們介紹三類常用的隨機初始化方法:基於固定方差的參數初始化、基於方差縮放的參數初始化和正交初始化方法。
1.1 基於固定方差的參數初始化
一種簡單的隨機初始化方法是從一個固定均值(通常為 0)和方差 \(sigma^2\) 的分布中采樣來生成參數的初始值。基於固定方差的參數初始化方法主要有以下兩種:
(1)高斯分布初始化:使用一個高斯分布 \(N(0, \sigma^2)\) 對每個參數進行隨機初始化。
(2)均勻分布初始化:在一個給定的區間 \([-r, r]\) 內采用均勻分布來初始化參數。假設隨機變量 \(x\) 在區間 \([a, b]\) 內均勻分布,則其方差為
因此,若使用區間為 \([-r, r]\) 的均勻分布來采樣,並滿足 \(var(x) = \sigma^2\) 時,則 \(r\) 的取值為
在基於固定方差的隨機初始化方法中,比較關鍵的是如何設置方差 \(\sigma^2\)。如果參數范圍取的太小,一是會導致神經元的輸出過小,經過多層之后信號就慢慢消失了;二是還會使得 Sigmoid 型激活函數丟失非線性的能力。以 Sigmoid 型函數為例,在 0 附近基本上是近似線性的。這樣多層神經網絡的優勢也就不存在了。如果參數范圍取得太大,會導致輸入狀態過大。對於 Sigmoid 型激活函數來說,激活值變得飽和,梯度接近 0,從而導致梯度消失問題。
為了降低固定方差對網絡性能以及優化效率的影響,基於固定方差的隨機初始化方法一般需要配合逐層歸一化來使用。
1.2 基於方差縮放的參數初始化
要高效地訓練神經網絡,給參數選取一個合適的隨機初始化區間是非常重 要的。一般而言,參數初始化的區間應該根據神經元的性質進行差異化的設置。如果一個神經元的輸入連接很多,它的每個輸入連接上的權重就應該小一些,以避免神經元的輸出過大(當激活函數為 ReLU 時)或過飽和(當激活函數為 Sigmoid 函數時)。
初始化一個深度網絡時,為了緩解梯度消失或爆炸問題,我們盡可能保持每個神經元的輸入和輸出的方差一致,即 \(var(a^{(l)}) = var(a^{(l-1)})\),當然也有 \(var(z^{(l)}) = var(z^{(l-1)})\),根據神經元的連接數量來自適應地調整初始化分布的方差,這類方法稱為方差縮放(Variance Scaling)。
1.2.1 Xavier 初始化
假設在一個神經網絡中,第 \(l\) 層的一個神經元 \(a_i^{(l)}\) ,其接收前一層的 \(M_{l-1}\) 個神經元的輸出 \(a_j^{(l-1)}, 1 \leq j \leq M_{l-1}\),
其中 \(f(\cdot)\) 為激活函數,\(w_{ij}^{(l)}\) 為參數,\(M_{l-1}\) 是第 \(l-1\) 層神經元個數。
在初始化階段,將每個權重及每個輸出視為隨機變量,可做如下假設和推斷:
- 網絡輸入的每個元素 \(x_1, x_2, \cdots\) 獨立同分布;
- 同層的權重 \(w_{ij}\) 獨立同分布,且期望 \(E(w) = 0\);
- 每層的權重 \(w\) 和輸入 \(a\) 隨機初始化且相互獨立,所以兩者之積構成的隨機變量 \(w_{i1}a_1, w_{i2}a_2, \cdots\) 亦相互獨立同分布;
- 根據上面的計算,同層的 \(a_1, a_2, \cdots\) 也獨立同分布。
需要注意的是,上面獨立同分布的假設僅在初始化階段成立,當網絡開始訓練,根據反向傳播公式,權重更新后不再相互獨立。
由於 \(w_{ij}\) 已經承載了大多數的權重,這里設 \(b^{(l)} = 0\):
即:
(1)當激活函數 \(f(\cdot)\) 為恆等函數時,即 \(f(x) = x\),假設 \(E(a^{(l-1)}) = 0\),則上面公式為:
也就是說,輸入信號的方差在經過該神經元后被放大或縮小了 \(M_{l-1}var(w^{(l)})\) 倍。為了使得在經過多層網絡后,信號不被過分放大或過分減弱,我們盡可能保持每個神經元的輸入和輸出的方差一致。這樣 \(M_{l-1}var(w^{(l)})\) 設為 1 比較合理,即
同理,為了使得在反向傳播中,誤差信號也不被放大或縮小,需要將 \(w^{(l)}\) 的方差保持為
作為折中,同時考慮信號在前向和反向傳播中都不被放大或縮小,可以設置
在計算出參數的理想方差后,可以通過高斯分布或均勻分布來隨機初始化參數。若采用高斯分布來隨機初始化參數,連接權重 \(w^{(l)}\) 可以按 \(N(0, \frac{2}{M_{l-1} + M_{l}})\) 的高斯分布進行初始化。若采用區間為 \([−r, r]\) 的均分分布來初始化 \(w^{(l)}\),則 \(r\) 的取值為 \(\sqrt{\frac{6}{M_{l-1} + M_{l}}}\)。這種根據每層的神經元數量來自動計算初始化參數方差的方法稱為Xavier 初始化。
(2)當激活函數 \(f(\cdot)\) 為 Tanh 函數時,Xavier 初始化也適用。這是因為神經元的參數和輸入的絕對值通常比較小,處於激活函數的線性區間,且線性區間斜率為 1,這時候 tanh 函數可以視為線性函數。參數初始化采用高斯分布或者均勻分布與恆等函數情況下相同。
(3)當激活函數 \(f(\cdot)\) 為 Logistic 函數時,在線性區間斜率為 0.25,即 \(f(x) = 0.25x\),因此
因此初始化參數方差為 \(16 \times \frac{2}{M_{l-1} + M_l}\),遵循的高斯分布為 \(N(0, 16 \times \frac{2}{M_{l-1} + M_{l}})\),均勻分布的 \(r\) 取值為 \(4 \times \sqrt{\frac{6}{M_{l-1} + M_{l}}}\)。
1.2.2 He 初始化
當第 \(l\) 層神經元使用 ReLU 激活函數時,通常有一半的神經元輸出為 0,
如果假定 \(w^{(l)}\) 來自某個關於原點對稱的分布,因為 \(E(w^{(l-1)}) = 0\),且 \(b^{(l-1)} = 0\),則可以認為 \(z^{(l-1)}\) 分布的期望為 0,且關於原點 0 對稱。
對於一個關於原點 0 對稱的分布,經過 ReLU 后,僅保留大於 0 的部分,則有
上式進一步可得
類似的,需要放縮系數為 1, 即
因此當使用 ReLU 激活函數時,若使用高斯分布來初始化參數 \(w^{(l)}\),其方差我 \(\frac{2}{M_{l-1}}\);若采用區間為 \([-r, r]\) 的均勻分布來初始化參數,則 \(r = \sqrt{\frac{6}{M_{l-1}}}\)。
下表給出了 Xavier 初始化和 He 初始化的具體設置情況
1.3 正交初始化
暫略
2 批量歸一化(Batch Normalization)
逐層歸一化(Layer-wise Normalization)是將傳統機器學習中的數據歸一化方法應用到深度神經網絡中,對神經網絡中隱藏層的輸入進行歸一化,從而使得網絡更容易訓練。
這里的逐層歸一化方法是指可以應用在深度神經網絡中的任何一個中間層。實際上並不需要對所有層進行歸一化。
常用的逐層歸一化方法有:批量歸一化、層歸一化、權重歸一化和局部響應歸一化。下面着重介紹批量歸一化。
2.1 批量歸一化
對於一個深度神經網絡,令第 \(l\) 層的凈輸入為 \(z^{(l)}\),神經元的輸出為 \(a^{(l)}\) ,即
其中,\(f(\cdot)\) 是激活函數,\(W\) 和 \(b\) 是可學習的參數。
為了提高優化效率,就要使得凈輸入 \(z^{(l)}\) 的分布一致,比如都歸一化到標准正態分布。雖然歸一化操作也可以應用在輸入 \(a^{(l-1)}\) 上,但歸一化 \(z^{(l)}\) 更加有利 於優化(吳恩達的講解中說歸一化 \(a^{(l-1)}\) 還是 \(z^{(l)}\) 有一定的爭論,但是在實踐中一般歸一化 \(z^{(l)}\) )。因此,在實踐中歸一化操作一般應用在仿射變換(Affine Transforma- tion)\(Wa^{(l-1)} + b\) 之后、激活函數之前,即
其中 \(E[z^{(l)}]\) 和 \(var(z^{(l)})\) 是指當前參數下,\(z^{(l)}\) 的每一維在整個訓練集上的期望和方差。因為目前主要的優化算法是基於小批量的隨機梯度下降法, Batch 歸一化通常和訓練集的 Mini-Batch 一起使用,所以准確的計算 \(z^{(l)}\) 的期望和方差是不可行的。因此,\(z^{(l)}\) 的期望和方差通常用當前小批量樣本集的均值和方差近似估計。
給定一個包含 \(K\) 個樣本的小批量樣本集合,第 \(l\) 層神經元的凈輸入 \(z^{(1, l)}, z^{(2, l)}, \cdots, z^{(K, l)}\) 的均值和方差為
對凈輸入 \(z^{(l)}\) 的標准歸一化會使得其取值集中到 0 附近,如果使用 Sigmoid 型激活函數時,這個取值區間剛好是接近線性變換的區間,減弱了神經網絡的非線性性質。因此,為了使得歸一化不對網絡的表示能力造成負面影響,可以通過一個附加的縮放和平移變換改變取值區間。
其中 \(\gamma\) 和 \(\beta\) 分別代表縮放和平移的參數向量。從最保守的角度考慮,可以通過標准歸一化的逆變換來使得歸一化后的變量可以被還原為原來的值。當 \(\gamma = \sqrt{\sigma_B^2}, \beta = \mu_B\) 時,\(\hat{z}^{(l)} = z^{(l)}\)。
批量歸一化操作可以看作一個特殊的神經層,加在每一層非線性激活函數之前,即
其中因為批量歸一化本身具有平移變量,所以仿射變換 \(Wa^{(l-1)}\) 不再需要偏置參數。
參考
1.《神經網絡和深度學習》邱錫鵬
2. 網絡權重初始化方法總結(下):Lecun、Xavier與He Kaiming
3.《改善深度神經網絡》吳恩達