1. 程式人生 > 實用技巧 >神經網路知識補充

神經網路知識補充

神經網路知識補充

目錄

迴歸與分類的區別

迴歸:目標是預測值要與真實值十分的接近

做法: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模組有影響