tensorflow和pytorch中的參數初始化調用方法


  神經網絡中最重要的就是參數了,其中包括權重項$W$和偏置項$b$。 我們訓練神經網絡的最終目的就是得到最好的參數,使得目標函數取得最小值。參數的初始化也同樣重要,因此微調受到很多人的重視,

  只列一些常用的!

Tensorflow

常數初始化

tf.constant_initializer(value)

value取0,則代表的是全0初始化,也可以表示為 tf.zeros_initializer() 

value取1,則代表的是全1初始化,也可以表示為 tf.ones_initializer() 

隨機均勻初始化器

tf.random_uniform_initializer(minval=0, maxval=None) 

不需要指定最小值和最大值的均勻初始化: 

tf.uniform_unit_scaling_initializer(factor=1.0) 

隨機正態初始化器

(均值為0,方差為1)

tf.random_normal_initializer(mean=0.0, stddev=1.0) 

截斷正態分布初始化器

(均值為0,方差為1)

tf.truncated_normal_initializer(mean=0.0, stddev=1.0) 

正交矩陣初始化器

tf.orthogonal_initializer() 

  生成正交矩陣的隨機數。當需要生成的參數是2維時,這個正交矩陣是由均勻分布的隨機數矩陣經過SVD分解而來。

Xavier uniform 初始化器

tf.glorot_uniform_initializer() 

  初始化為與輸入輸出節點數相關的均勻分布隨機數,和xavier_initializer()是一個東西

  假設均勻分布的區間是[-limit, limit],則

$$limit=\sqrt{\frac{6}{fan_in + fan_out}}$$

其中的fan_in和fan_out分別表示輸入單元的結點數和輸出單元的結點數。

Xavier normal 初始化器

tf.glorot_normal_initializer() 

  初始化為與輸入輸出節點數相關的截斷正太分布隨機數

$$stddev = \sqrt{\frac{2}{fan\_in + fan\_out}}$$

其中的fan_in和fan_out分別表示輸入單元的結點數和輸出單元的結點數。

變尺度正態、均勻分布

tf.variance_scaling_initializer(scale=1.0,mode="fan_in", distribution="truncated_normal")
  • scale: 縮放尺度
  • mode: 有3個值可選,分別是 “fan_in”, “fan_out” 和 “fan_avg”,用於控制計算標准差 stddev的值
  • distribution: 2個值可選,”normal”或“uniform”,定義生成的tensor的分布是截斷正太分布還是均勻分布

distribution選‘normal’的時候,生成的是截斷正太分布,標准差 stddev = sqrt(scale / n), n的取值根據mode的不同設置而不同:

  • mode = "fan_in", n為輸入單元的結點數;         
  • mode = "fan_out",n為輸出單元的結點數;
  • mode = "fan_avg",n為輸入和輸出單元結點數的平均值;

distribution選 ‘uniform’,生成均勻分布的隨機數tensor,最大值 max_value和 最小值 min_value 的計算公式:

  • max_value = sqrt(3 * scale / n)
  • min_value = -max_value

he初始化

  如果使用relu激活函數,最好使用He初始化,因為在ReLU網絡中,假定每一層有一半的神經元被激活,另一半為0,所有要保持variance不變。

tf.contrib.layers.variance_scaling_initializer()

Xavier初始化

如果激活函數用sigmoid和tanh,最好用xavier初始化器,

Xavier初始化的基本思想是保持輸入和輸出的方差一致,這樣就避免了所有輸出值都趨向於0.

from tensorflow.contrib.layers import xavier_initializer

 

pytorch

PyTorch 中參數的默認初始化在各個層的 reset_parameters() 方法中。例如:nn.Linear 和 nn.Conv2D,都是在 [-limit, limit] 之間的均勻分布(Uniform distribution),其中 limit 是$\frac{1}{\sqrt{fan\_in}}$ ,fan_in是指參數張量(tensor)的輸入單元的數量

下面是幾種常見的初始化方式

常數初始化

nn.init.constant_(w, 0.3)

均勻分布

nn.init.uniform_(w)

正態分布

nn.init.normal_(w, mean=0, std=1)

xavier_uniform 初始化

  Xavier初始化的基本思想是保持輸入和輸出的方差一致,這樣就避免了所有輸出值都趨向於0。這是通用的方法,適用於任何激活函數。

# 默認方法
for m in model.modules():
    if isinstance(m, (nn.Conv2d, nn.Linear)):
        nn.init.xavier_uniform_(m.weight)

 也可以使用 gain 參數來自定義初始化的標准差來匹配特定的激活函數:

for m in model.modules():
    if isinstance(m, (nn.Conv2d, nn.Linear)):
        nn.init.xavier_uniform_(m.weight(), gain=nn.init.calculate_gain('relu'))

xavier_normal 初始化

nn.init.xavier_normal_(w)

kaiming_uniform 初始化

nn.init.kaiming_uniform_(w, mode='fan_in', nonlinearity='relu')

kaiming_normal 初始化

  He initialization的思想是:在ReLU網絡中,假定每一層有一半的神經元被激活,另一半為0。推薦在ReLU網絡中使用。

for m in model.modules():
    if isinstance(m, (nn.Conv2d, nn.Linear)):
        nn.init.kaiming_normal_(m.weight, mode='fan_in')

正交初始化(Orthogonal Initialization)

  主要用以解決深度網絡下的梯度消失、梯度爆炸問題,在RNN中經常使用的參數初始化方法。

for m in model.modules():
    if isinstance(m, (nn.Conv2d, nn.Linear)):
        nn.init.orthogonal(m.weight)

Batchnorm Initialization

  在非線性激活函數之前,我們想讓輸出值有比較好的分布(例如高斯分布),以便於計算梯度和更新參數。Batch Normalization 將輸出值強行做一次 Gaussian Normalization 和線性變換:

for m in model:
    if isinstance(m, nn.BatchNorm2d):
        nn.init.constant(m.weight, 1)
        nn.init.constant(m.bias, 0)

 

參考

【知乎文章】權重/參數初始化

【CSDN文章】pytorch中的參數初始化方法總結

【CSDN文章】tensorflow 學習筆記(九)- 參數初始化(initializer)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM