深度學習 —參數初始化以及損失函數
文章目錄
- 深度學習 ---參數初始化以及損失函數
- 一,參數初始化
- 1.1 固定值初始化
- 1.1.1 全0初始化
- 1.1.2 全1初始化
- 1.3 任意常數初始化
- 1.2 隨機初始化
一,參數初始化
神經網絡的參數初始化是訓練深度學習模型的關鍵步驟之一。初始化參數(通常是權重和偏置)會對模型的訓練速度、收斂性以及最終的性能產生重要影響。
1.1 固定值初始化
固定值初始化是指在神經網絡訓練開始時,將所有權重或偏置初始化為一個特定的常數值。這種初始化方法雖然簡單,但在實際深度學習應用中通常并不推薦。
1.1.1 全0初始化
方面 | 內容 |
---|---|
方法 | 將所有權重初始化為零。 |
缺點 | 1. 對稱性破壞:每個神經元在每一層中都會執行相同的計算,模型無法學習。 2. 權重更新一致:在反向傳播時,所有神經元會收到相同的梯度,導致權重更新完全一致。 3. 降低表達能力:同一層的神經元會保持相同的功能,極大降低模型的表達能力。 |
應用場景 | 通常不用來初始化權重,但可以用來初始化偏置。 |
對稱性問題 | - 現象:同一層的所有神經元具有完全相同的初始權重和偏置。 - 后果:在反向傳播時,所有神經元會收到相同的梯度,導致權重更新完全一致;無論訓練多久,同一層的神經元本質上會保持相同的功能(相當于“一個神經元”的多個副本),極大降低模型的表達能力。 |
import torch
import torch.nn as nndef test004():linear = nn.Linear(in_features=6, out_features=4)nn.init.zeros_(linear.weight)print(linear.weight)if __name__ == "__main__":test004()
1.1.2 全1初始化
全1初始化會導致網絡中每個神經元接收到相同的輸入信號,進而輸出相同的值,這就無法進行學習和收斂。所以全1初始化只是一個理論上的初始化方法,但在實際神經網絡的訓練中并不適用
import torch
import torch.nn as nndef test003():linear = nn.Linear(in_features=6, out_features=4)nn.init.ones_(linear.weight)print(linear.weight)if __name__ == "__main__":test003()
1.3 任意常數初始化
將所有參數初始化為某個非零的常數(如 0.1,-1 等)。雖然不同于全0和全1,但這種方法依然不能避免對稱性破壞的問題
import torch
import torch.nn as nndef test002():linear = nn.Linear(in_features=6, out_features=4)nn.init.constant_(linear.weight, 0.63)print(linear.weight)passif __name__ == "__main__":test002()
1.2 隨機初始化
方面 | 內容 |
---|---|
方法 | 使用隨機數生成器為每個權重分配一個隨機值。通常從某個分布(如正態分布或均勻分布)中采樣。例如: - 均勻分布:從 [?a,a][-a, a][?a,a] 中隨機采樣,其中 aaa 是一個小的常數。 - 正態分布:從均值為0、標準差為 σ\sigmaσ 的正態分布中采樣。 |
優點 | 1. 打破對稱性:每個神經元的初始權重不同,避免了所有神經元執行相同計算的問題。 2. 加速收斂:隨機初始化可以避免梯度消失或梯度爆炸的問題,使訓練過程更加穩定。 3. 提高模型表達能力:不同的初始權重使得每個神經元能夠學習不同的特征,增強了模型的表達能力。 |
缺點 | 1. 選擇合適的范圍:如果隨機初始化的范圍過大或過小,可能會導致訓練不穩定或收斂緩慢。例如,范圍過大可能導致梯度爆炸,范圍過小可能導致梯度消失。 2. 需要調整超參數:需要選擇合適的分布和范圍,這可能需要一些實驗和調優。 |
應用場景 | 適用于大多數神經網絡的權重初始化,尤其是深層網絡。正態分布和均勻分布是最常用的初始化方法。 |
注意事項 | 1. 小范圍初始化:通常選擇較小的隨機范圍,例如 [?0.01,0.01][-0.01, 0.01][?0.01,0.01] 或標準差為0.01的正態分布。 2. 根據網絡深度調整:對于較深的網絡,可能需要更小的初始化范圍,以避免梯度消失或爆炸。 3. 結合激活函數:不同的激活函數可能需要不同的初始化策略。例如,ReLU 激活函數通常需要使用 He 初始化(正態分布,標準差為 2/n\sqrt{2/n}2/n?),而 Sigmoid 或 Tanh 激活函數通常使用 Xavier 初始化(均勻分布或正態分布,范圍根據輸入和輸出維度調整)。 |
def test01():model =nn.Linear(8,1)print(model.weight)#均勻分步初始化nn.init.normal_(model.weight,mean=0,std=0.01)print(model.weight)#正態分布初始化# 均值為0,標準差為0.01nn.init.normal_(model.weight,mean=0,std=0.01)print(model.weight)
if __name__ == '__main__':test01()