在神經網絡中,權重初始化是一個關鍵步驟,它影響著模型的訓練效率和最終性能。使用正態分布作為初始值是一種常見且有效的策略,尤其是在深度學習中。
原理
-
為何使用分布初始化?
- 如果所有權重初始化為相同的值(如全零初始化),那么網絡中的各個神經元將會在初始時刻學習到相同的東西,導致梯度下降時更新步調一致,無法打破對稱性,從而影響模型的學習能力。
- 使用隨機分布(如正態分布)可以為網絡提供多樣化的初始化條件,有助于模型更快地收斂。
-
為何選擇正態分布?
- 正態分布(高斯分布)是一種自然選擇,因為它廣泛存在于自然界和社會現象中,且其數學性質良好,易于操作。
- 正態分布可以通過調整其均值和標準差來控制初始化參數的范圍,從而影響模型的學習過程。
-
為何標準化(如除以sqrt(n))?
- 在較深的網絡中,未標準化的權重初始化可能導致梯度爆炸或消失問題。為了解決這一問題,研究者提出了不同策略,其中一種是使網絡各層的輸出具有相近的方差。
- Xavier初始化(也稱為Glorot初始化)和He初始化是兩種著名的基于此原則的初始化方法。對于ReLU及其變種激活函數,He初始化建議權重應從標準差為
sqrt(2/n)
的正態分布中抽取,其中n
是前一層的神經元數量。這有助于保持信號在整個網絡中的傳遞,并加速訓練過程。
具體示例
以下是一個使用Python和NumPy庫,根據He初始化原則從正態分布中初始化權重的簡單示例:
import numpy as npdef he_initialization(layer_input_size, layer_output_size):"""使用He初始化方法從正態分布中生成權重矩陣。參數:layer_input_size -- 前一層神經元的數量layer_output_size -- 當前層神經元的數量返回:W -- 初始化的權重矩陣"""std_dev = np.sqrt(2 / layer_input_size) # He初始化的方差公式W = np.random.normal(loc=0, scale=std_dev, size=(layer_input_size, layer_output_size))return W# 示例:初始化一個擁有100個輸入特征和50個隱藏單元的全連接層權重
input_size = 100
output_size = 50
weights = he_initialization(input_size, output_size)print(weights.shape) # 應輸出 (100, 50),表明我們得到了一個100x50的權重矩陣
這段代碼展示了如何根據He初始化原則,為一個具有特定輸入輸出尺寸的全連接層生成權重矩陣。通過這種方式初始化的權重能夠幫助模型在訓練開始時更有效地傳播梯度,避免了某些初始化策略可能帶來的梯度消失或爆炸問題。