深度學習: 參數初始化
一、總結
一句話總結:
1)、好的開始是成功的一半,為了讓你的模型跑贏在起跑線 ,請慎重對待參數初始化。
2)、tf的初始化器包括:tf.initializers.he_normal()、tf.initializers.truncated_normal()、tf.contrib.layers.xavier_initializer() 這三種。
1、全零初始化 (Zero Initialization)?
將網絡中 所有參數 初始化為 0 。如果所有的參數都是0,那么所有神經元的輸出都將是相同的,那在back propagation的時候,gradient相同,weight update也相同。同一層內所有神經元的行為也是相同的。這顯然不可接受。
2、隨機初始化 (Random Initialization)?
a)、將參數值(通過高斯分布或均勻分布)隨機初始化為 接近0的 一個很小的隨機數(有正有負),從而使對稱失效。
b)、W = tf.Variable(np.random.randn(node_in, node_out)) * 0.001
二、深度學習: 參數初始化
轉自或參考:深度學習: 參數初始化
https://blog.csdn.net/JNingWei/article/details/78835390
Introduction
好的開始是成功的一半。
為了讓你的模型跑贏在起跑線 ε=ε=ε=( ̄▽ ̄) ,請慎重對待參數初始化。
Note:
- tf的初始化器包括:tf.initializers.he_normal()、tf.initializers.truncated_normal()、tf.contrib.layers.xavier_initializer() 這三種。
- 建議采用默認配置。一般不會在這邊想trick,沒啥明顯增益。
API
TensorFlow中自帶關於參數初始化的API,具體使用見 tensorflow: variable初始化。
全零初始化 (Zero Initialization)
將網絡中 所有參數 初始化為 0 。
如果所有的參數都是0,那么所有神經元的輸出都將是相同的,那在back propagation的時候,gradient相同,weight update也相同。同一層內所有神經元的行為也是相同的。
這顯然不可接受。
隨機初始化 (Random Initialization)
將參數值(通過高斯分布或均勻分布)隨機初始化為 接近0的 一個很小的隨機數(有正有負),從而使對稱失效。
W = tf.Variable(np.random.randn(node_in, node_out)) * 0.001
Note:
node_in
、node_out
表示輸入神經元個數
、輸出神經元個數
;- 其中,
np.random.randn(node_in, node_out)
輸出 服從標准正態分布的node_in × node_out
矩陣; - 控制因子:
0.001
,保證參數期望接近0; - 一旦隨機分布選擇不當,就會導致網絡優化陷入困境。
Xavier初始化 (Xavier Initialization)
W = ( tf.Variable(np.random.randn(node_in, node_out)) / np.sqrt(node_in) ) * 0.001
Note:
- 加上了 方差規范化:
/ np.sqrt(node_in)
,維持了 輸入、輸出數據分布方差的一致性,從而更快地收斂。
He初始化 (He Initialization)
W = ( tf.Variable(np.random.randn(node_in, node_out)) / np.sqrt(node_in/2) ) * 0.001
Note:
- 考慮到 非線性映射 (relu) 函數 的影響, 將 方差規范化 的 分母 修改為
np.sqrt(node_in/2)
,能讓Relu網絡更快地收斂。
遷移學習初始化 (Pre-train Initialization)
將 預訓練模型的參數 作為新任務上的初始化參數。
數據敏感初始化
根據自身任務數據集而特別定制的參數初始化方法。