初始化對深度神經網路的收斂有重要影響。優秀的初始化模式可以加速訓練,但是需要小心操作以避免常見的陷阱。deeplearning.ai 最新上線了 AI Notes 欄目,以長文的形式作為《深度學習專項課程》的補充。其具備互動式的 demo,有助於讀者輕鬆掌握深度學習基礎概念。AI Notes 的第一篇教程就是「初始化神經網路」。
這篇教程共包括四部分:有效初始化的重要性、梯度爆炸或消失問題、什麼是恰當的初始化,以及 Xavier 初始化的數學證明。
1. 有效初始化的重要性
要想構建一個機器學習演算法,通常你需要定義一個架構(如 Logistic 迴歸、支援向量機、神經網路),然後訓練它學習引數。以下是訓練神經網路的常見過程:
初始化引數
選擇優化演算法
重複以下步驟:
將輸入向前傳播
計算成本函式
使用反向傳播傳遞成本對引數的梯度
根據優化演算法,基於梯度更新每個引數
之後,給出一個新的資料點,你就可以使用該模型預測其類別了。
初始化步驟對模型的最終效能至關重要,它需要正確的方法。下面給出了一個互動式 demo,你可以嘗試使用不同的方法初始化網路,觀察不同的初始化對網路學習的影響。
在此 demo 中,可以任意選擇輸入資料集、選擇初始化方法,並實時檢視訓練效果。
你注意到當初始化方法為 zero 時,梯度和權重的變化嗎?
用零初始化所有權重,會使得神經元在訓練過程中學習同樣的特徵。
事實上,任意常數初始化方法效能都不好。例如一個具備兩個隱藏單元的神經網路,假設我們將所有偏置初始化為 0,將所有權重初始化為常量 α。如果我們在網路中前向傳播輸入 (x_1,x_2),則兩個隱藏單元的輸出均為 relu(α x_1+α x_2)。因此,兩個神經元在訓練過程中的演化是對稱的,也就阻止了不同的神經元學習不同的特徵。
當使用太小或太大的值初始化權重時,成本函式曲線有什麼變化呢?
儘管打破了對稱性,但使用太小或太大的值初始化權重會分別導致學習緩慢或發散。
因此,選擇恰當的初始化值對於高效訓練而言是必要的。
2. 梯度爆炸或消失問題
考慮以下這個 9 層神經網路:
在優化的每一次迭代中,我們觀察到隨著梯度從輸出層向輸入層傳遞,反向傳播的梯度要麼太大要麼太小。這一結果是合理的,大家不妨考慮以下例子。
假設所有啟用函式都是線性(恆等函式),那麼輸出啟用如下:
其中,L=10,W^[L] 及其它 W 是 2×2 的矩陣,層 [1] 到 [L-1] 都只有兩個神經元。如果我們假設 W^[1] 到 W^[L-1] 都等於 W,則輸出預測為(其中 W^L-1 是矩陣 W 的 L-1 次方,W^[L] 表示第 L 個矩陣)。
那麼當初始化值過小、過大或合適時,結果會如何呢?
案例 1:過大初始化值導致梯度爆炸
考慮當每個權重的初始化值都比恆等矩陣略大的情況。
上式可以簡化為,a^[l] 的值隨著 l 呈指數倍增長。當這些啟用值被用於反向傳播時,就會導致梯度爆炸問題。即,成本對引數的梯度過大,導致成本值在其極小值周圍振盪。
案例 2:過小初始化值導致梯度消失
類似地,考慮每個權重的初始化值略小於恆等矩陣的情況。
上式可簡化為,啟用值 a^[l] 隨著 l 呈指數倍下降。當這些啟用被用於反向傳播時,會導致梯度消失問題。成本關於引數的梯度過小,導致成本在到達極小值之前已經收斂。
總之,用不合適的值進行權重初始化會導致神經網路訓練發散或速度緩慢。雖然我們用簡單的對稱權重矩陣說明梯度爆炸和梯度消失問題,但這一觀察也適用於任意過大或過小的初始化值。
3. 如何找到合適的初始化值
為了阻止梯度爆炸或消失,我們需要堅持以下規則:
啟用值的均值應為零。
每一層啟用值的方差應該保持一致。
在這兩個假設下,反向傳播的梯度訊號就不會在任意層中被過小或過大的值相乘,從而在不出現梯度爆炸或消失等問題。
具體來說,想象一個層 l,其前向傳播是:
我們需要遵循下式:
確保零均值,保持每一層的輸入方差值不變,從而確保不會出現梯度爆炸和消失問題。該方法適用於前向傳播和反向傳播。推薦使用 Xavier 初始化方法(或其變體),對於每一個層 l:
也就是說,層 l 的所有權重是從正態分佈中隨機選取的,該分佈的均值 μ=0,方差 ,其中 n^[l-1] 是層 l-1 中的神經元數量。偏置被初始化為 0。
下面的互動式圖展示了 Xavier 初始化對每一層啟用的影響,下圖展示的是一個五層的全連線神經網路。
在此互動式圖中,你可以載入 MNIST 資料集,選擇初始化方法,執行訓練並觀察不同初始化方法的效果。
Xavier 初始化的數學證明
Xavier 初始化保持每一層的方差不變。我們假設每一層的啟用值是圍繞 0 的正態分佈。有時理解數學證明有助於掌握概念,但沒有數學也可以理解基礎理念。
我們使用第 3 部分介紹的層 l,假設其啟用函式為 tanh。其前向傳播如下所示:
我們目標是推匯出 Var(a^[l-1]) 和 Var(a^[l]) 之間的關係。然後我們將理解如何初始化權重,使得 Var(a^[l-1]) = Var(a^[l])。
假設我們使用合適的值初始化網路,且輸入是經過歸一化的。在訓練的早期,我們處於 tanh 的線性模式。值足夠小,使 tanh(z^[l]) ≈ z^[l],這意味著:
此外,,其中。出於簡潔性考慮,我們假設 b^[l] = 0。因此,逐元素檢視前面的公式 Var(a^[l-1]) = Var(a^[l]) 可以得到:
一個常見的數學 trick 是在方差之外求和。為此,我們必須遵循以下三個假設:
權重獨立,且同分布;
輸入獨立,且同分布;
權重和輸入互相獨立。
從而得到:
另一個常見的數學 trick 是將積的方差轉化為方差的積,公式如下:
使用該公式,以及,得到:
快完成了!第一個假設引出 ,第二個假設引出 ,因為權重是使用零均值進行初始化的,輸入是經過歸一化的。從而得到:
第一個假設表明:
第二個假設引出:
它們都具備同樣的思想:
組合起來,得到:
完成了!如果我們想要各個層的方差保持一致,我們需要。這證明了 Xavier 初始化的方差選擇。
注意,在之前的步驟裡,我們沒有選擇特定層 l。因此,我們證明了該公式適用於所有層。假設 L 是輸出層。在每一層使用該公式,則我們可以將輸出層的方差推導至輸入層的方差:
根據我們的權重初始化方式,輸出和輸入層方差之間的關係將會變化巨大。注意以下三種情況:
因此,為了避免前向傳播訊號的消失或爆炸,我們必須通過初始化,使 n^[l−1]Var(W^[l])=1。
通過以上證明,我們研究了在前向傳播過程中計算的啟用值。同樣的結果也適用於反向傳播梯度。同理,為了避免梯度爆炸或消失,我們必須通過初始化,使 n^[l]Var(W^[l])=1。
結論
在實踐中,機器學習工程師使用 Xavier 初始化時,要麼將權重初始化為或。後一個分佈的方差項是的均值。
以上是 Xavier 初始化的理論證明。Xavier 初始化使用的是 tanh 啟用函式。此外還有大量初始化方法。如果你使用 ReLU 啟用函式,那麼常用的初始化方法是 He 初始化。He 初始化的理論證明要更復雜一些,但它遵循同樣的思維過程。
原文連結:http://www.deeplearning.ai/ai-notes/initialization/