神經網路知識補充
神經網路知識補充
目錄
迴歸與分類的區別
迴歸:目標是預測值要與真實值十分的接近
做法:minimize (pred - y)差距
分類:目標是使得accuracy最高
做法:並不是直接優化accuracy使得其最高,而是將兩個分佈(\(\hat{y}\)|x)與(y|x)的divergence降低
不直接優化accuracy原因:
1.有可能acc在經過訓練後上升,但是還是沒有達到要求的分類(例如一個標籤為1的資料的預測值由0.4提升到0.45,但是由於還是<0.5所以分類還是錯的)——梯度為0
2.有可能為0.499,但是預測值動一點點就>0.5,分類變了——梯度不連續
過擬合
過擬合的識別
如果資料集的類別來源只是兩類:train、test;那麼我們要將test的一部分用於validation進行overfitting的檢測,在訓練的過程中進行overfitting的檢測,一旦開始出現過擬合的現象,就取效果最好的那次並停止train
k-fold
train與validation的劃分比例定,但是每個epoch都要按照比例進行重新劃分,使得所有資料都有機會進行train
過擬合的減小
1.提供更多的資料
2.降低模型的複雜度(類似mnist數字的識別就沒有必要使用resnet152複雜模型)
3.正則化(L1 L2 Dropout)
這裡的weight_decay表示正則化引數
optimizer = torch.oitim.SGD(x.parameters(),lr=0.001,weight_decay=0.7)
動量與學習率衰減
動量
無動量:僅僅考慮梯度的方向,而不考慮歷史移動的方向,會出現梯度變化大的情況。
新增動量:梯度變化的角度、範圍不再那麼刁鑽。
學習率衰減
要進行學習率的衰減,learning rate先大後小,動態變化,前期梯度下降快,後期收斂快
衰減方案1:
scheduler = ReduceROnPlateau(optimizer,mode='min',factor=0.1,patience=10) for epoch in range(XXXX): xxxxxx xxxxxx schedule.step(loss)
patience:是一個耐心值,表示當執行該函式連續10次的時候,loss的值依然沒有發生變化,那麼就需要進行learning rate的調整了(類似每次乘以0.8、0.08等)。
衰減方案2:
每一定數量的epoch進行learning rate的衰減
每30個epoch步進learning rate=learning rate*0.1
scheduler = StepLR(optimizer,step_size=30,gamma=0.1)
提前停止(early stopping)
當出現overfitting的時候就可以停止train了,而不是等到train_loss保持不變的時候。
方法
使用validation來檢測是否出現overfiting
如何知道此時的識別效果是最好的?是一個經驗值
dropout
防止overfitting的一個有效的手段 ——隨機減小connection的數量
例子:引數是斷掉連線的概率
在train的時候使用dropout,而在validation不使用dropout
model.train() # 把module設成訓練模式,對Dropout和BatchNorm有影響
model.eval() # 把module設定為預測模式,對Dropout和BatchNorm模組有影響