為什麼我們需要權重初始化?
在機器學習和深度學習研究中,主要目的是使損失值最小。為了盡快做到這一點,有必要根據我們的問題來啟動權重。這個問題被稱為**"權重初始化"。**我們需要知道的第一件事是,這是一個設計決定。在我們訓練網絡之前,我們需要初始化所有的權重。權重的初始值會對訓練過程産生重大影響。根據深度學習模型在訓練過程中的起點,它可以收斂到不規則損失面中任何可能的局部最小值。
讓我們一起思考。如果我們把所有的權重都從0開始,從時間和成本上來說都是一個糟糕的選擇。還是說全部從0.5開始是有意義的?從錯誤的權重開始是否會導緻梯度下降的爆炸或消失?答案是肯定的!這就是為什麼我們需要初始化。讓我們來總結一下。
為什麼我們需要權重初始化?
權重初始化技術零初始化随機初始化澤維爾初始化H-at-al初始化LeCun初始化
讓我們更深入地研究它們中的每一個!為了簡化問題,讓我對每個初始化技術使用相同的基本模型。
model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(64, 32)), tf.keras.layers.Dense(128, activation='relu', kernel_initializer, bias_initializer) ])
1.零初始化
顧名思義,零初始化就是将所有神經網絡的權重初始化為0。請注意,這樣做的前提是一半的最終權重為正,一半的權重為負。
如果網絡的所有權重都被初始化為零,所有的激活都是零,相應的梯度也是零。事實上,即使權重被初始化為任何其他常數也沒有關系。在這種情況下,激活可能不是零,但它們仍然是相同的。因此,我們可以排除零/常數的初始化。
model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(64, 32)), tf.keras.layers.Dense(128, activation='relu', kernel_initializer='zeros', bias_initializer='zeros') ])
2.随機初始化
當激活函數為Sigmoid時,權重值離0越遠,标準差越大,輸出值就越偏向于接近0和1,然後就會失去梯度。解決這個問題的方法之一是以小标準差的正态分布來初始化權重。一般來說,初始權重以正态分布(高斯分布)随機初始化,其平均值為0,标準差為0.01,如下所示
# With normal distributionsmodel = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(64, 32)), tf.keras.layers.Dense(128, activation='relu', kernel_initializer='RandomNormal', bias_initializer='zeros') ])'''# With Uniform Distributionsmodel = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(64, 32)), tf.keras.layers.Dense(128, activation='relu', kernel_initializer='RandomUniform', bias_initializer='zeros')'''
3.澤維爾(Glorot)初始化
随機初始化對于深度網絡來說很快就會崩潰。其原因是,激活度在幾層之後會迅速下降到零(梯度也是如此)。Xavier初始化的目的是初始化權重,使每一層的方差都是相同的。換句話說,每層輸出的方差必須等于輸入的方差,而且在反向傳播中通過各層之前和之後的梯度方差必須相同。
# With normal distributionsmodel = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(64, 32)), tf.keras.layers.Dense(128, activation='relu', kernel_initializer='glorot_normal', bias_initializer='zeros') ])'''# With Uniform Distributionsmodel = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(64, 32)), tf.keras.layers.Dense(128, activation='relu', kernel_initializer='glorot_uniform', bias_initializer='zeros')'''
4.He-at-al初始化
何凱明提出了一種适合ReLU的初始值,以他的名字命名,稱為何初始值。他的初始化與Xavier的初始化幾乎相似,但與Xavier初始化不同。這種差異與ReLU激活函數的非線性有關,他們對權重使用了不同的縮放系數。
# With normal distributionsmodel = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(64, 32)), tf.keras.layers.Dense(128, activation='relu', kernel_initializer='he_normal', bias_initializer='zeros') ])'''# With Uniform Distributionsmodel = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(64, 32)), tf.keras.layers.Dense(128, activation='relu', kernel_initializer='he_uniform', bias_initializer='zeros')'''
5.LeCun初始化
它也被稱為 "高效反推",考慮到每一層的輸入和輸出的大小。這種方法可用于不一定圍繞零對稱的激活函數,如雙曲切線。它産生的權重是随機選擇的數字乘以方差1/(input_layer_size)。
# With normal distributionsmodel = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(64, 32)), tf.keras.layers.Dense(128, activation='relu', kernel_initializer='lecun_normal', bias_initializer='zeros') ])'''# With Uniform Distributionsmodel = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(64, 32)), tf.keras.layers.Dense(128, activation='relu', kernel_initializer='lecun_uniform', bias_initializer='zeros')'''
我們如何理解好的初始化?如何找到合适的初始化值?參考文獻sebastianraschka.com/pdf/lecture….heartbeat.comet.ml/weight-init…wandb.ai/sauravmahes…medium.com/guidona-sof….koreascience.kr/article/JAK…web.eecs.umich.edu/~justincj/s…sebastianraschka.com/pdf/lecture…bigmeca.minesparis.psl.eu/wp-content/………
我來說兩句