學習自《深度學習入門》
過擬合指的是隻能擬合訓練數據,但不能很好地擬合不包含在訓練數據中的其他數據的狀態。
發生過擬合的原因,主要有以下兩個。
- 模型擁有大量參數、表現力強。
- 訓練數據少
權值衰減是一直以來經常被使用的一種抑制過擬合的方法,。該方法可以簡單地實現,在某種程度上能夠抑制過擬合。但是,如果網絡的模型變得很複雜,只用權值衰減就難以應對了。在這種情況下,我們經常會使用Dropout 方法
Dropout是一種在學習的過程中隨機刪除神經元的方法
訓練時,每傳遞一次數據,隨機選出隱藏層的神經元,然後將其刪除。被刪除的神經元不再進行信號的傳遞
測試時,雖然會傳遞所有的神經元信號,但是對於各個神經元的輸出,要乘上訓練時的刪除比例後再輸出
class Dropout:
def __init__(self, dropout_ratio=0.5):
self.dropout_ratio = dropout_ratio
self.mask = None
def forward(self, x, train_flg=True):
if train_flg:
self.mask = np.random.rand(*x.shape) > self.dropout_ratio
return x * self.mask
else:
return x * (1.0 - self.dropout_ratio)
def backward(self, dout):
return dout * self.mask
這裏的要點是,每次正向傳播時,self.mask中都會以False的形式保存要刪除的神經元。self.mask會隨機生成和x形狀相同的數組,並將值比dropout_ratio大的元素設爲True。反向傳播時的行爲和ReLU相同。也就是說,正向傳播時傳遞了信號的神經元,反向傳播時按原樣傳遞信號;正向傳播時沒有傳遞信號的神經元,反向傳播時信號將停在那
代碼解釋
a=[[1,2,3],
[4,5,6]]
dropout_ratio=0.5
print(np.random.rand(*np.array(a).shape))
mask=np.random.rand(*np.array(a).shape)>0.5
print(mask)
>>>
[[0.03797064 0.24113302 0.23486832]
[0.67104404 0.63273187 0.81895389]]
[[ True False False]
[False True True]]