什么叫過擬合和欠擬合?
我們在模型訓練的時候,通過把數據劃分成訓練集和測試集,然后選擇Loss函數來評估訓練效果怎么樣,其loss函數在訓練集上的值叫訓練誤差,在測試集上叫泛化誤差,當訓練誤差比較大的時候,可能說明模型參數量比較小,難以擬合所有數據特征,稱為欠擬合。反之當訓練誤差比較小,但是泛化誤差比較大的時候,說明模型雖然在訓練集上有不錯的表現,但是在未見過的測試集上表現較差的這種現象稱過擬合。
那什么是正則化呢,花書上說“凡是能夠減少泛化誤差的方法”都叫正則化。因此正則化是防止過擬合和提高模型泛化性能的一類方法的統稱。
本文記錄一下,經典的正則化方法有以下幾種:
● Dropout - 在全連接層中隨機丟棄部分神經元節點,產生一個簡化了的網絡結構
● L1/L2正則化 - 在原始的損失函數中增加L1/L2的懲罰項,從而限制產生較大的權重w
● Batch normalization - 控制隱層的輸出在一個穩定的范圍內
● 數據增強 - 通過增加數據集多樣性的方式避免過擬合
● Early stopping - 在達到模型過擬合的階段前停止訓練模型
1 Dropout (隨機失效)
Dropout通過隨機地將一些神經元的輸出置零,迫使模型不依賴于特定的神經元,從而增強了模型的泛化能力。這樣,每個神經元都將學習到與其他神經元合作的特征,而不是過度依賴于某些特定的神經元。
在PyTorch中,可以通過在網絡層中添加torch.nn.Dropout層來實現Dropout。例如:
import torch
import torch.nn as nn
if __name__ == '__main__':
# 創建一個4行5列的矩陣
matrix = torch.randn(4, 5)
# 定義Dropout層,設置p參數為0.2,表示將20%的元素設置為0
dropout = nn.Dropout(p=0.2)
# 應用Dropout層
matrix_dropout = dropout(matrix)
print("原始矩陣:")
print(matrix)
print()
print("應用Dropout后的矩陣:")
print(matrix_dropout)
輸出:
原始矩陣:
tensor([[ 0.1143, -1.0621, 0.7031, -0.7662, -1.1596],
[-0.8340, -0.8210, -0.8747, 1.3130, -2.2559],
[-0.6311, 0.4332, 2.6923, 0.0424, 1.1330],
[ 1.7028, 0.3254, 0.1760, 1.9037, -0.2492]])
應用Dropout后的矩陣:
tensor([[ 0.1429, -1.3276, 0.8788, -0.9577, -1.4495],
[-1.0425, -1.0262, -1.0934, 1.6413, -2.8199],
[-0.0000, 0.5415, 3.3653, 0.0000, 0.0000],
[ 0.0000, 0.4068, 0.2201, 0.0000, -0.3115]])
數一數剛剛好4個0。在舉一個例子,在實際網絡中應用也比較簡單。
import torch
import torch.nn as nn
# 定義一個簡單的神經網絡
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.fc1 = nn.Linear(100, 64)
self.dropout = nn.Dropout(0.5)
self.fc2 = nn.Linear(64, 10)
def forward(self, x):
x = self.fc1(x)
x = self.dropout(x)
x = torch.relu(x)
x = self.fc2(x)
return x
# 創建網絡實例
net = Net()
# 在訓練過程中使用dropout
net.train()
# 在測試過程中禁用dropout
net.eval()
在訓練過程中,通過調用net.train()啟用Dropout層,而在測試過程中,通過調用net.eval()禁用Dropout層。這是因為在訓練過程中,Dropout層會隨機丟棄神經元的輸出,而在測試過程中,我們希望保留所有神經元的輸出來獲得更準確的預測結果。
2 L1/L2正則化
Loss函數:
2.1 為什么L1,L2正則可以解決過擬合問題?
答:模型的復雜度和參數的數量和參數的范圍決定,擬合過程中通常都傾向于讓權值盡可能小,最后構造一個所有參數都比較小的模型。因為一般認為參數值小的模型比較簡單,能適應不同的數據集,也在一定程度上避免了過擬合現象。可以設想一下對于一個線性回歸方程,若參數很大,那么只要數據偏移一點點,就會對結果造成很大的影響;但如果參數足夠小,數據偏移得多一點也不會對結果造成什么影響,專業一點的說法是抗擾動能力強。
L1正則:
其中,λ是正則化系數,控制正則化的強度;||w||?表示參數向量w的L1范數。
L2正則:
其中,λ是正則化系數,控制正則化的強度;||w||?表示參數向量w的L2范數。
給定特征X,訓練模型得到的能滿足測試集和驗證集w值,可能有多個(求導的解不止一組),有的w值比較大,有的w值比較小,為了降低模型的復雜度,我們需要限制一下w的值,即想求解到比較小的w值,因此我們在損失函數后面直接加上了λ(w),由于梯度下降,為了使得總體L值小,那么后面的w也要比較小,從而得到使得模型的復雜度降低,從而解決過擬合問題。
2.2 為啥對參數w進行限制,不對參數B進行限制呢
因為B只能是曲線上下移動,不能降低復雜度
2.3 訓練時如何確定λ值
考慮二維的情況,即只有兩個權值和 ,此時對于梯度下降法,求解函數的過程可以畫出等值線,同時L1正則化的函數也可以在二維平面上畫出來。如下圖:
圖中彩色圓圈線是Loss中前半部分待優化項的等高線,就是說在同一條線上其取值相同,且越靠近中心其值越小。
黑色菱形區域是L1正則項限制。帶有正則化的loss函數的最優解要在黑色菱形區域和彩色圓圈線之間折中,也就是說最優解出現在圖中優化項等高線與正則化區域相交處。從圖中可以看出,當待優化項的等高線逐漸向正則項限制區域擴散時,L1正則化的交點大多在坐標軸上,則很多特征維度上其參數w為0,因此會產生稀疏解;而正則化前面的系數,可以控制圖形的大小。越小,約束項的圖形越大(上圖中的黑色方框);越大,約束項的圖形就越小,可以小到黑色方框只超出原點范圍一點點,這是最優點的值中的可以取到很小的值。
同時L2正則化的函數也可以在二維平面上畫出來。如下圖:
圖中彩色一圈一圈的線是Loss中前半部分待優化項的等高線,就是說在同一條線上其取值相同,且越靠近中心其值越小。圖中黑色圓形區域是L2正則項限制。帶有正則化的loss函數的最優解要在loss函數和正則項之間折中,也就是說最優解出現在圖中優化項等高線與正則化區域相交處。從圖中可以看出,當待優化項的等高線逐漸向正則項限制區域擴散時L2正則化的交點大多在非坐標軸上,二維平面下L2正則化的函數圖形是個圓,與方形相比,被磨去了棱角。因此與相交時使得或等于零的機率小了許多,這就是為什么L2正則化不具有稀疏性的原因。
一般來說,λ的確定,從0開始,逐漸增大λ。在訓練集上學習到參數,然后在測試集上驗證誤差。反復進行這個過程,直到測試集上的誤差最小。一般的說,隨著λ從0開始增大,測試集的誤分類率應該是先減小后增大,交叉驗證的目的,就是為了找到誤分類率最小的那個位置。建議一開始將正則項系數λ設置為0,先確定一個比較好的learning rate。然后固定該learning rate,給λ一個值(比如1.0),然后根據validation accuracy,將λ增大或者減小10倍,增減10倍是粗調節,當你確定了λ的合適的數量級后,比如λ= 0.01,再進一步地細調節,比如調節為0.02,0.03,0.009之類。