機器學習的問題中,過擬合是乙個很常見的問題。過擬合指的是只能擬合訓練資料,但不能很好地擬合不包含在訓練資料中的其他資料的狀態。機器學習的目標是提高泛化能力,即便是沒有包含在訓練資料裡的未觀測資料,也希望模型可以進行正確的識別。我們可以製作複雜的、表現力強的模型但是相應地,抑制過擬合的技巧也很重要。
發生過擬合的原因,主要有以下兩個。
1、模型擁有大量引數、表現力強。 2、訓練資料少。
權值衰減是一直以來經常被使用的一種抑制過擬合的方法。該方法通過 在學習的過程中對大的權重進行懲罰,來抑制過擬合。很多過擬合原本就是 因為權重引數取值過大才發生的。
神經網路的學習目的是減小損失函式的值。這時,例如為 損失函式加上權重的平方範數(l2範數)。這樣一來,就可以抑制權重變大。 用符號表示的話,如果將權重記為w,l2範數的權值衰減就是 ,然 後將這個 加到損失函式上。這裡,λ是控制正則化強度的超引數。λ 設定得越大,對大的權重施加的懲罰就越重。此外,開頭的 是用於 將 的求導結果變成λw的調整用常量。對於所有權重,權值衰減方法都會為損失函式加上 。因此,在求權 重梯度的計算中,要為之前的誤差反向傳播法的結果加上正則化項的導數λw。
l2範數相當於各個元素的平方和。用數學式表示的話,假設有權重 w = (w1,w 2,…,wn),則l2範數可用計算出來。除了l2範數,還有l1範數、l∞範數等。l1範數是各個元素的絕對值之和,相當於|w1| + |w2| + …+ |wn|。l∞範數也稱為 max範數,相當於各個元素的絕對值中最大的那乙個。
dropout是一種在學習的過程中隨機刪除神經元的方法。訓練時,隨機選出隱藏層的神經元,然後將其刪除。被刪除的神經元不再進行訊號的傳遞, 如圖所示。訓練時,每傳遞一次資料,就會隨機選擇要刪除的神經元。 然後,測試時,雖然會傳遞所有的神經元訊號,但是對於各個神經元的輸出, 要乘上訓練時的刪除比例後再輸出。
dropout的概念圖:左邊是一般的神經網路,右邊是應用了 dropout的網路。dropout通過隨機選擇並刪除神經元,停止向前傳遞訊號。
演算法實現:
class dropout:
def __init__(self, dropout_ratio=0.5):
self.dropout_ratio = dropout_ratio
self.mask = none
def forward(self, x, train_***=true):
if train_***:
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
pytorch實現Dropout與正則化防止過擬合
numpy實現dropout與l1,l2正則化請參考我另一篇部落格 pytorch使用dropout與l2 import torch import matplotlib.pyplot as plt torch.manual seed 1 sets the seed for generating ra...
L0正則化實現原理分析
網上搜部落格,大多數講的都是l0是個np難問題,難於求最優解,或者l1是l0的最優凸近視,但沒有說具體細節。我來分析一下 l0指向量中非零元素的個數,以下我以c 來分析。float a 128 向量a中有128個元素,我們現在用l0正則化來稀疏向量a,使其中的非零元素變為64個。去掉a中原有0值元素...
Flask容器化部署原理與實現
在開發時,我們使用flask run命令啟動的開發伺服器是werkzeug提供的,但是這種方式目的是為了開發,不能很好的擴充套件,不適合生產部署。生產部署,我們需要乙個更強健,效能更高的wsgi伺服器 關於wsgi,可參考wsgi到底是什麼 常用的伺服器有 uwsgi gunicorn等,本文以uw...