1. 程式人生 > >正則化及dropout

正則化及dropout

綜合Stanford university cs231n 課堂、及google 機器學習簡介課程,進行了小小的記錄~

正則化 regularization

有助於防止出現過擬合

分為:

  • L1 正則化
  • L2 正則化
  • 丟棄正則化
  • 早停法(這不是正式的正則化方法,但可以有效限制過擬合)

dropout 丟棄

在每一次前向傳遞時,每一層都是計算上一個啟用函式的結果乘以權重矩陣,得到下一個啟用函式前的結果。然後將這一層算出來的的神經元的數值,隨機的選取一部分進行置零。

通常,將正則化率設為0.5

一般是在全連線層使用。有時也用在卷積層,不過,不是隨機把某個神經元上啟用函式的結果置零,而是隨機把整個特徵對映置為零。在卷積神經網路裡,有一個維度表示通道,可將某幾個通道整體置零,而不是某幾個元素。

dropout 能夠使模型的魯棒性更好

會使訓練的時間增長


p = 0.5        #probability of keeping a unit active. higher = less dropout
def train_step(X):

    """ X contains the data """

    # forward pass for example 3-layer neural network

    H1 = np.maximum(0, np.dot(W1, X) + b1)
    
    U1 = np.random.rand(*H1.shape) < p        # first dropout mask
    H1 *= U1        # drop


    H2 = np.maximum(0, np.dot(W2, H1) + b2)
    
    U2 = np.random.rand(*H2.shape) < p        # second dropout mask
    H2 *= U2        #drop

    out = np.dot(W3, H2) + b3


    # backward pass: compute gradients...
    # perform parameter update...


def predict(X):
    # ensembled forward pass
    H1 = np.maximum(0, np.dot(W1, X) + b1) * p        # scale the activations
    H2 = np.maximum(0, np.dot(W2, H1) + b2) * p        # scale the activations
    out = np.dot(W3, H2) + b3

通常,在training 訓練階段,給網路新增一些隨機性,以防止過擬合

而在testing 測試階段,不設定隨機,直接將輸出乘以dropout的概率p. 以提高泛化能力