文章目錄
- 參數初始化與損失函數
- 一、參數初始化
- 1. 固定值初始化
- 1.1 全零初始化
- 1.2 全1初始化
- 1.3 任意常數初始化
- 2. 隨機初始化
- 2.1 均勻分布初始化
- 2.2 正態分布初始化
- 3. Xavier初始化
- 4. He初始化
- 5. 總結
- 二、損失函數
- 1. 線性回歸損失函數
- 1.1 MAE(Mean Absolute Error)損失
- 1.2 MSE(Mean Squared Error)損失
- 2. CrossEntropyLoss(交叉熵損失)
- 2.1 信息量、信息熵、KL散度
- 2.2 交叉熵損失(CrossEntropyLoss)
- 3. BCELoss(二元交叉熵損失)
- 4. 總結
參數初始化與損失函數
一、參數初始化
在神經網絡中,參數初始化對于模型的訓練效果至關重要。合理的初始化可以加速訓練,避免梯度消失或梯度爆炸問題,甚至影響最終模型的性能。常見的初始化方法如下:
官方文檔參考:Pytorch
1. 固定值初始化
固定值初始化是指在神經網絡訓練開始時,將所有權重或偏置初始化為一個特定的常數值。這種初始化方法雖然簡單,但在實際深度學習應用中并不推薦。
1.1 全零初始化
import torch
import torch.nn as nn# 創建全零初始化的權重
layer = nn.Linear(in_features=10, out_features=5)
torch.zeros_like(layer.weight)
- 問題:全零初始化可能會導致所有神經元的輸出相同,無法產生有效的特征學習,從而無法打破對稱性,阻礙學習過程。
- 總結:全零初始化不推薦用于深度神經網絡,因為會導致訓練停滯。
1.2 全1初始化
全1初始化會導致網絡中每個神經元接收到相同的輸入信號,進而輸出相同的值,這就無法進行學習和收斂,所以全1初始化只是一個理論上的初始化方法,但在實際神經網絡的訓練中并不適用。
layer.weight.data.fill_(1)
- 問題:全1初始化同樣存在對稱性問題,導致每個神經元的梯度更新相同,無法有效學習不同的特征。
- 總結:雖然不如全零初始化明顯問題大,但依然不可取。
1.3 任意常數初始化
將所有參數初始化為某個非0的常數(如0.1.-1等),雖然不同于全0 和全1,但這種方法依然不能避免對稱性破壞的問題
layer.weight.data.fill_(0.01)
- 問題:雖然這能避免全零初始化的問題,但常數初始化可能無法適應不同規模的模型,且并未針對性地利用權重的分布。
- 總結:常數初始化可能對簡單模型有效,但對于深度學習任務,無法保證穩定的訓練效果。
2. 隨機初始化
隨機初始化能夠幫助打破對稱性,使得每個神經元在訓練時能夠有獨立的學習能力。
2.1 均勻分布初始化
方法:將權重初始化為隨機的小值,通常為正態分布或均勻分布中采樣
layer.weight.data.uniform_(-0.1, 0.1)
- 問題:雖然能夠打破對稱性,但可能存在權重值過大或過小導致梯度消失或爆炸的問題。
- 總結:一般用于較簡單模型,對于復雜模型不推薦使用。
2.2 正態分布初始化
layer.weight.data.normal_(mean=0.0, std=0.01)
- 問題:盡管能打破對稱性,過大的方差可能導致梯度爆炸或消失問題。
- 總結:適用于較淺的網絡,仍需調整方差。
3. Xavier初始化
前置知識:
均勻分布:
均勻分布的概率密度函數(PDF):
p(x)={1b?a如果a≤x≤b0其他情況p(x)=\begin{cases}\frac{1}{b?a} & 如果 a≤x≤b\\ 0 & 其他情況 \end{cases} p(x)={b?a1?0?如果a≤x≤b其他情況?
計算期望值(均值):
E[X]=∫abx?p(x)dx=∫abx?1b?adx=a+b2E[X]=∫_a^bx?p(x)?dx=∫_a^bx?\frac{1}{b?a}?dx=\frac{a+b}{2} E[X]=∫ab?x?p(x)?dx=∫ab?x?b?a1??dx=2a+b?
計算方差(二階矩減去均值的平方):
Var(X)=E(X?E(X))2=E[X2]?(E[X])2Var(X)=E(X-E(X))^2=E[X^2]?(E[X])^2 Var(X)=E(X?E(X))2=E[X2]?(E[X])2
-
先計算 E[X2]E[X^2]E[X2]:
E[X2]=∫abx2?1b?adx=b3?a33(b?a)=a2+ab+b23E[X^2]=∫_a^bx^2?\frac{1}{b?a}?dx=\frac{b^3?a^3}{3(b?a)}=\frac{a^2+ab+b^2}{3} E[X2]=∫ab?x2?b?a1??dx=3(b?a)b3?a3?=3a2+ab+b2? -
代入方差公式:
Var(X)=a2+ab+b23?(a+b2)2=(b?a)212Var(X)=\frac{a^2+ab+b^2}{3}?(\frac{a+b}{2})^2=\frac{(b?a)^2}{12} Var(X)=3a2+ab+b2??(2a+b?)2=12(b?a)2?
Xavier 初始化(由 Xavier Glorot 在 2010 年提出)是一種自適應權重初始化方法,專門為解決神經網絡訓練初期的梯度消失或爆炸問題而設計。Xavier 初始化也叫做Glorot初始化。Xavier 初始化的核心思想是根據輸入和輸出的維度來初始化權重,使得每一層的輸出的方差保持一致。具體來說,權重的初始化范圍取決于前一層的神經元數量(輸入維度)和當前層的神經元數量(輸出維度)。
方法:根據輸入和輸出神經元的數量來選擇權重的初始值。
數學原理:
(1) 前向傳播的方差一致性
假設輸入 x 的均值為 0,方差為 σx2σ_x^2σx2?,權重 W的均值為 0,方差為 σW2σ_W^2σW2?,則輸出 z=Wxz=Wxz=Wx的方差為:
Var(z)=nin?Var(W)?Var(x)Var(z)=n_{in}?Var(W)?Var(x) Var(z)=nin??Var(W)?Var(x)
為了使 Var(z)=Var(x),需要:
nin?Var(W)=1?Var(W)=1ninn_{in}?Var(W)=1?????Var(W)=\frac{1}{n_{in}} nin??Var(W)=1?????Var(W)=nin?1?
其中 ninn_{in}nin?是輸入維度(fan_in)。這里乘以 nin 的原因是,輸出 z 是由 nin 個輸入 x 的線性組合得到的,每個輸入 x 都與一個權重 W 相乘。因此,輸出 z 的方差是 nin 個獨立的 Wx 項的方差之和。
(2) 反向傳播的梯度方差一致性
在反向傳播過程中,梯度 ?L?x\frac{?L}{?x}?x?L? 是通過鏈式法則計算得到的,其中 L 是損失函數,x 是輸入,z 是輸出。梯度?L?x\frac{?L}{?x}?x?L?可以表示為:
?L?x=?L?z.?z?x\frac{?L}{?x}=\frac{?L}{?z}.\frac{?z}{?x} ?x?L?=?z?L?.?x?z?
假設 z=Wx,其中 W 是權重矩陣,那么 ?z?x=W\frac{?z}{?x}=W?x?z?=W。因此,梯度 ?L?x\frac{?L}{?x}?x?L?可以寫為: ?L?x=?L?zW\frac{?L}{?x}=\frac{?L}{?z}W?x?L?=?z?L?W
反向傳播時梯度 ?L?x\frac{?L}{?x}?x?L? 的方差應與 ?L?z\frac{?L}{?z}?z?L? 相同,因此:
nout?Var(W)=1?Var(W)=1noutn_{out}?Var(W)=1?????Var(W)=\frac{1}{n_{out}} nout??Var(W)=1?????Var(W)=nout?1?
其中 noutn_{out}nout?是輸出維度(fan_out)。為了保持梯度的方差一致性,我們需要確保每個輸入維度 nin 的梯度方差與輸出維度 nout 的梯度方差相同。因此,我們需要將 W 的方差乘以 nout,以確保梯度的方差在反向傳播過程中保持一致。
(3) 綜合考慮
為了同時平衡前向傳播和反向傳播,Xavier 采用:
Var(W)=2nin+noutVar(W)=\frac{2}{n_{in}+n_{out}} Var(W)=nin?+nout?2?
權重從以下分布中采樣:
均勻分布:
W~U(?6nin+nout,6nin+nout)W\sim\mathrm{U}\left(-\frac{\sqrt{6}}{\sqrt{n_\mathrm{in}+n_\mathrm{out}}},\frac{\sqrt{6}}{\sqrt{n_\mathrm{in}+n_\mathrm{out}}}\right) W~U(?nin?+nout??6??,nin?+nout??6??)
在Xavier初始化中,我們選擇 a=?6nin+nouta=?\sqrt{\frac{6}{n_{in}+n_{out}}}a=?nin?+nout?6?? 和 b=6nin+noutb=\sqrt{\frac{6}{n_{in}+n_{out}}}b=nin?+nout?6??,這樣方差為:
Var(W)=(b?a)212=(26nin+nout)212=4?6nin+nout12=2nin+noutVar(W)=\frac{(b?a)^2}{12}=\frac{(2\sqrt{\frac{6}{n_{in}+n_{out}}})^2}{12}=\frac{4?\frac{6}{nin+nout}}{12}=\frac{2}{n_{in}+n_{out}} Var(W)=12(b?a)2?=12(2nin?+nout?6??)2?=124?nin+nout6??=nin?+nout?2?
正態分布:
W~N(0,2nin+nout)W\sim\mathrm{N}\left(0,\frac{2}{n_\mathrm{in}+n_\mathrm{out}}\right) W~N(0,nin?+nout?2?)
N(0,std2)\mathcal{N}(0, \text{std}^2) N(0,std2)
其中 ninn_{\text{in}}nin? 是當前層的輸入神經元數量,noutn_{\text{out}}nout?是輸出神經元數量。
在前向傳播中,輸出的方差受 ninn_{in}nin? 影響。在反向傳播中,梯度的方差受 noutn_{out}nout? 影響。
優點:平衡了輸入和輸出的方差,適合SigmoidSigmoidSigmoid 和 TanhTanhTanh 激活函數。
應用場景:常用于淺層網絡或使用SigmoidSigmoidSigmoid 、TanhTanhTanh 激活函數的網絡。
代碼演示:
import torch
import torch.nn as nndef test007():# Xavier初始化:正態分布linear = nn.Linear(in_features=6, out_features=4)nn.init.xavier_normal_(linear.weight)print(linear.weight)# Xavier初始化:均勻分布linear = nn.Linear(in_features=6, out_features=4)nn.init.xavier_uniform_(linear.weight)print(linear.weight)if __name__ == "__main__":test007()
打印結果:
Parameter containing:
tensor([[-0.4838, 0.4121, -0.3171, -0.2214, -0.8666, -0.4340],[ 0.1059, 0.6740, -0.1025, -0.1006, 0.5757, -0.1117],[ 0.7467, -0.0554, -0.5593, -0.1513, -0.5867, -0.1564],[-0.1058, 0.5266, 0.0243, -0.5646, -0.4982, -0.1844]],requires_grad=True)
Parameter containing:
tensor([[-0.5263, 0.3455, 0.6449, 0.2807, -0.3698, -0.6890],[ 0.1578, -0.3161, -0.1910, -0.4318, -0.5760, 0.3746],[ 0.2017, -0.6320, -0.4060, 0.3903, 0.3103, -0.5881],[ 0.6212, 0.3077, 0.0783, -0.6187, 0.3109, -0.6060]],requires_grad=True)
4. He初始化
也叫kaiming 初始化。He 初始化的核心思想是調整權重的初始化范圍,使得每一層的輸出的方差保持一致。與 Xavier 初始化不同,He 初始化專門針對 ReLU 激活函數的特性進行了優化。
數學推導
(1) 前向傳播的方差一致性
對于 ReLU 激活函數,輸出的方差為:
Var(z)=12nin?Var(W)?Var(x)Var(z)=\frac{1}{2}n_{in}?Var(W)?Var(x) Var(z)=21?nin??Var(W)?Var(x)
(因為 ReLU 使一半神經元輸出為 0,方差減半)
為使 Var(z)=Var(x),需:
12nin?Var(W)=1?Var(W)=2nin\frac{1}{2}n_{in}?Var(W)=1?????Var(W)=\frac{2}{n_{in}} 21?nin??Var(W)=1?????Var(W)=nin?2?
(2) 反向傳播的梯度一致性
類似地,反向傳播時梯度方差需滿足:
Var(?L?x)=12nout?Var(W)?Var(?L?z)Var(\frac{?L}{?x})=\frac{1}{2}n_{out}?Var(W)?Var(\frac{?L}{?z}) Var(?x?L?)=21?nout??Var(W)?Var(?z?L?)
因此:
Var(W)=2noutVar(W)=\frac{2}{n_{out}} Var(W)=nout?2?
(3) 兩種模式
fan_in
模式(默認):優先保證前向傳播穩定,方差 2nin\frac{2}{n_{in}}nin?2?。fan_out
模式:優先保證反向傳播穩定,方差2nout\frac{2}{n_{out}}nout?2?。
方法:專門為 ReLU 激活函數設計。權重從以下分布中采樣:
均勻分布:
W~U(?6nin,6nin)W\sim\mathrm{U}\left(-\frac{\sqrt{6}}{\sqrt{n_\mathrm{in}}},\frac{\sqrt{6}}{\sqrt{n_\mathrm{in}}}\right) W~U(?nin??6??,nin??6??)
正態分布:
W~N(0,2nin)W\sim\mathrm{N}\left(0,\frac{2}{n_\mathrm{in}}\right) W~N(0,nin?2?)
其中 ninn_{\text{in}}nin? 是當前層的輸入神經元數量。
優點:適用于ReLUReLUReLU 和 LeakyReLULeaky ReLULeakyReLU 激活函數。
應用場景:深度網絡,尤其是使用 ReLU 激活函數時。
代碼演示:
import torch
import torch.nn as nndef test006():# He初始化:正態分布linear = nn.Linear(in_features=6, out_features=4)nn.init.kaiming_normal_(linear.weight, nonlinearity="relu", mode='fan_in')print(linear.weight)# He初始化:均勻分布linear = nn.Linear(in_features=6, out_features=4)nn.init.kaiming_uniform_(linear.weight, nonlinearity="relu", mode='fan_out')print(linear.weight)if __name__ == "__main__":test006()
輸出結果:
Parameter containing:
tensor([[ 1.4020, 0.2030, 0.3585, -0.7419, 0.6077, 0.0178],[-0.2860, -1.2135, 0.0773, -0.3750, -0.5725, 0.9756],[ 0.2938, -0.6159, -1.1721, 0.2093, 0.4212, 0.9079],[ 0.2050, 0.3866, -0.3129, -0.3009, -0.6659, -0.2261]],requires_grad=True)Parameter containing:
tensor([[-0.1924, -0.6155, -0.7438, -0.2796, -0.1671, -0.2979],[ 0.7609, 0.9836, -0.0961, 0.7139, -0.8044, -0.3827],[ 0.1416, 0.6636, 0.9539, 0.4735, -0.2384, -0.1330],[ 0.7254, -0.4056, -0.7621, -0.6139, -0.6093, -0.2577]],requires_grad=True)
5. 總結
合理的參數初始化有助于網絡的訓練穩定性。對于較淺的網絡,隨機初始化或Xavier初始化即可。而對于深度網絡,推薦使用He初始化,以避免梯度消失或爆炸。
二、損失函數
損失函數是機器學習中優化目標的關鍵,選擇合適的損失函數可以幫助模型快速有效地學習任務。
1. 線性回歸損失函數
1.1 MAE(Mean Absolute Error)損失
MAE(Mean Absolute Error,平均絕對誤差)通常也被稱為 L1-Loss,通過對預測值和真實值之間的絕對差取平均值來衡量他們之間的差異。
MAE的公式如下:
MAE=1n∑i=1n∣yi?y^i∣\text{MAE} = \frac{1}{n} \sum_{i=1}^{n} \left| y_i - \hat{y}_i \right| MAE=n1?i=1∑n?∣yi??y^?i?∣
其中:
- nnn 是樣本的總數。
- yiy_i yi? 是第 iii 個樣本的真實值。
- y^i\hat{y}_iy^?i? 是第 iii 個樣本的預測值。
- ∣yi?y^i∣\left| y_i - \hat{y}_i \right|∣yi??y^?i?∣ 是真實值和預測值之間的絕對誤差。
特點:
- 魯棒性:與均方誤差(MSE)相比,MAE對異常值(outliers)更為魯棒,因為它不會像MSE那樣對較大誤差平方敏感。
- 物理意義直觀:MAE以與原始數據相同的單位度量誤差,使其易于解釋。
應用場景:
MAE通常用于需要對誤差進行線性度量的情況,尤其是當數據中可能存在異常值時,MAE可以避免對異常值的過度懲罰。
使用torch.nn.L1Loss
即可計算MAE:
import torch
import torch.nn as nn# 初始化MAE損失函數
mae_loss = nn.L1Loss()# 假設 y_true 是真實值, y_pred 是預測值
y_true = torch.tensor([3.0, 5.0, 2.5])
y_pred = torch.tensor([2.5, 5.0, 3.0])# 計算MAE
loss = mae_loss(y_pred, y_true)
print(f'MAE Loss: {loss.item()}')
1.2 MSE(Mean Squared Error)損失
均方差損失,也叫L2Loss。
MSE(Mean Squared Error,均方誤差)通過對預測值和真實值之間的誤差平方取平均值,來衡量預測值與真實值之間的差異。
MSE的公式如下:
MSE=1n∑i=1n(yi?y^i)2\text{MSE} = \frac{1}{n} \sum_{i=1}^{n} \left( y_i - \hat{y}_i \right)^2 MSE=n1?i=1∑n?(yi??y^?i?)2
其中:
- nnn 是樣本的總數。
- yiy_i yi? 是第 iii 個樣本的真實值。
- y^i\hat{y}_i y^?i? 是第 iii 個樣本的預測值。
- (yi?y^i)2\left( y_i - \hat{y}_i \right)^2(yi??y^?i?)2 是真實值和預測值之間的誤差平方。
特點:
- 平方懲罰:因為誤差平方,MSE 對較大誤差施加更大懲罰,所以 MSE 對異常值更為敏感。
- 凸性:MSE 是一個凸函數(國際的叫法,國內叫凹函數),這意味著它具有一個唯一的全局最小值,有助于優化問題的求解。
應用場景:
MSE被廣泛應用在神經網絡中。
使用 torch.nn.MSELoss 可以實現:
import torch
import torch.nn as nn# 初始化MSE損失函數
mse_loss = nn.MSELoss()# 假設 y_true 是真實值, y_pred 是預測值
y_true = torch.tensor([3.0, 5.0, 2.5])
y_pred = torch.tensor([2.5, 5.0, 3.0])# 計算MSE
loss = mse_loss(y_pred, y_true)
print(f'MSE Loss: {loss.item()}')
2. CrossEntropyLoss(交叉熵損失)
2.1 信息量、信息熵、KL散度
- 信息量:反映一個事件不確定性的大小,常用對數表示。時間發生的概率越低,其信息量越大
- 信息熵:是信息量的期望值,表示系統的平均不確定性。
- KL散度:衡量兩個概率分布的相似度,常用于評估模型的輸出分布與目標分布的差異。KL散度越小,表示兩個分布越接近
2.2 交叉熵損失(CrossEntropyLoss)
loss = F.cross_entropy(pred, target)
- 解釋:交叉熵損失函數用于分類任務,衡量兩個概率分布之間的差異,能夠有效訓練分類模型。
- 總結:交叉熵損失函數常用于多分類任務中,是分類問題的標準損失函數。
3. BCELoss(二元交叉熵損失)
loss = F.binary_cross_entropy(pred, target)
- 解釋:BCELoss用于二分類任務,衡量目標概率分布與預測概率分布之間的差異。
- 總結:當模型處理二分類任務時,BCELoss是最常見的損失函數。
4. 總結
選擇損失函數時,應該根據任務的類型(回歸、分類等)以及對異常值的敏感度來選擇。MAE適合異常值少的任務,MSE適合精度要求高的任務,而交叉熵和BCELoss分別適用于多分類和二分類問題。