cs231n學(xué)習(xí)之神經(jīng)網(wǎng)絡(luò)訓(xùn)練技巧(7)

前言

本文旨在學(xué)習(xí)和記錄,如需轉(zhuǎn)載,請(qǐng)附出處http://www.itdecent.cn/p/beb772848c3b

訓(xùn)練trick

cs231n系列博客之(4),(5),(6)分別介紹了網(wǎng)絡(luò)參數(shù)初始化、Normalization和參數(shù)更新的方法,這一節(jié)主要介紹在神經(jīng)網(wǎng)絡(luò)中其他的訓(xùn)練trick。

1、dropout

dropout是一種簡單而且非常有效的的正則化方法

image.png

dropout在訓(xùn)練時(shí)隨機(jī)刪除神經(jīng)元,被刪除的神經(jīng)元不再參與信息傳遞;訓(xùn)練時(shí)每傳入一次數(shù)據(jù),就會(huì)隨機(jī)刪除一定比率的神經(jīng)元。在測(cè)試的時(shí)候,所有神經(jīng)元都會(huì)工作,但是對(duì)于各個(gè)神經(jīng)元的輸出,要乘上激活比率,這是因?yàn)樵跍y(cè)試時(shí)所有神經(jīng)元都激活,我們期望其輸出測(cè)試時(shí)與訓(xùn)練時(shí)的預(yù)期輸出是一樣的。(例如,在p=0.5情況下,神經(jīng)元必須在測(cè)試減半輸出,才能獲得與訓(xùn)練一樣的輸出,本質(zhì)上來說我們?cè)跍y(cè)試時(shí)考慮到p并保證測(cè)試和訓(xùn)練輸出期望一致。)
dropout一般使用在激活函數(shù)的后面。
dropout實(shí)現(xiàn)

def dropout_forward(x, dropout_param):
    """
    Performs the forward pass for (inverted) dropout.

    Inputs:
    - x: Input data, of any shape
    - dropout_param: A dictionary with the following keys:
      - p: Dropout parameter. We keep each neuron output with probability p.
      - mode: 'test' or 'train'. If the mode is train, then perform dropout;
        if the mode is test, then just return the input.
      - seed: Seed for the random number generator. Passing seed makes this
        function deterministic, which is needed for gradient checking but not
        in real networks.

    Outputs:
    - out: Array of the same shape as x.
    - cache: tuple (dropout_param, mask). In training mode, mask is the dropout
      mask that was used to multiply the input; in test mode, mask is None.

    NOTE: Please implement **inverted** dropout, not the vanilla version of dropout.
    See http://cs231n.github.io/neural-networks-2/#reg for more details.

    NOTE 2: Keep in mind that p is the probability of **keep** a neuron
    output; this might be contrary to some sources, where it is referred to
    as the probability of dropping a neuron output.
    """
    p, mode = dropout_param['p'], dropout_param['mode']
    if 'seed' in dropout_param:
        np.random.seed(dropout_param['seed'])

    mask = None
    out = None
    M,D = x.shape

    if mode == 'train':
        keep_prob = 1- p
        mask = (np.random.rand(M,D)<keep_prob)/keep_prob
        out = x*mask

    elif mode == 'test':
        out = x
    cache = (dropout_param, mask)
    out = out.astype(x.dtype, copy=False)

    return out, cache


def dropout_backward(dout, cache):

    dropout_param, mask = cache
    mode = dropout_param['mode']

    dx = None
    if mode == 'train':
        dx = mask*dout
    elif mode == 'test':
        dx = dout
    return dx

注意:dropout的實(shí)現(xiàn)方式有兩種:1、在訓(xùn)練時(shí)隨機(jī)失活輸出除以keep_prob,測(cè)試不進(jìn)行任何操作;2、訓(xùn)練時(shí)隨機(jī)失活,測(cè)試時(shí)乘以keep_prob。這兩種方法都能實(shí)現(xiàn)訓(xùn)練和測(cè)試時(shí)神經(jīng)元輸出的期望一致。在實(shí)際操作中,由于我們期望測(cè)試時(shí)時(shí)間性能足夠好,所以一般使用第一種方法。
dropout如今在網(wǎng)絡(luò)訓(xùn)練中經(jīng)常被使用,其思想跟集成學(xué)習(xí)很類似,集成學(xué)習(xí)讓多個(gè)模型單獨(dú)學(xué)習(xí),推理時(shí)再把多個(gè)模型綜合。dropout隨機(jī)刪除神經(jīng)元,并且每次讓不同的模型學(xué)習(xí),最后測(cè)試時(shí)所有神經(jīng)元輸出乘以激活比例,達(dá)到了一個(gè)網(wǎng)絡(luò)學(xué)習(xí)多個(gè)模型的目標(biāo)。

2、調(diào)整學(xué)習(xí)率

學(xué)習(xí)率控制著網(wǎng)絡(luò)訓(xùn)練的進(jìn)程,學(xué)習(xí)率如果太小,網(wǎng)絡(luò)訓(xùn)練太慢,時(shí)間消耗大;學(xué)習(xí)率如果太大,網(wǎng)絡(luò)直接發(fā)散。所以如何找到一個(gè)適合網(wǎng)絡(luò)訓(xùn)練的學(xué)習(xí)率尤其重要。


image.png

在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時(shí),我們一般在起初訓(xùn)練時(shí)給較大的學(xué)習(xí)率,這樣擴(kuò)大參數(shù)的搜索范圍;在一段時(shí)間上,給較小的學(xué)習(xí)率,這樣易于收斂。

  1. step decay
    學(xué)習(xí)率在一定epochs下乘以一個(gè)小數(shù)。


    step decay.png
  2. Cosine
    學(xué)習(xí)率采用余弦退火下降的方法:lr_{t}=\frac{1}{2}lr_{0}(1+cos(t\pi/T)),T為最大的epochs
    Cosine.png
  3. linear decay
    學(xué)習(xí)率采用線性下降的方法:lr_{t}=lr_{0}(1-t/T)
    linear decay.png
  4. Inverse Sqrt
    學(xué)習(xí)率采用逆開根號(hào)下降的方法:lr_{t}=\frac{lr_{0}}{\sqrt{t}}
    Inverse sqrt.png
  5. Linear Warmup
    高的初始學(xué)習(xí)會(huì)導(dǎo)致loss劇增,可以在訓(xùn)練初期先線性增加學(xué)習(xí)率,然后再下降,可以預(yù)防該種線性的產(chǎn)生。
    linear warmup

    經(jīng)驗(yàn):如果BatchSize增加2倍,學(xué)習(xí)率也相應(yīng)增加2倍。

3、選擇超參數(shù)

  1. 檢查初始損失值(如果采用softmax分類器,初始損失會(huì)解決log(C),C為類別)
  2. 選擇小樣本訓(xùn)練網(wǎng)絡(luò),使訓(xùn)練精度達(dá)到100%(學(xué)習(xí)率,網(wǎng)絡(luò)初始化,結(jié)構(gòu))
    如果損失值不下降,則學(xué)習(xí)率太小或者很差的初始化;
    如果損失直接到Inf或者Nan,則學(xué)習(xí)率太大或者很差的初始化
  3. 找到一個(gè)學(xué)習(xí)率能夠使loss下降
    使用步驟2找到的模型,使用所有的訓(xùn)練數(shù)據(jù),開啟小的權(quán)重正則化,找到一個(gè)相對(duì)好的學(xué)習(xí)率能夠在100iters內(nèi)衰減。好的學(xué)習(xí)率嘗試:1e-1,1e-2,1e-3,1e-4, 常用的參數(shù)正則化參數(shù)嘗試:1e-4,1e-5,0
  4. 粗網(wǎng)絡(luò)調(diào)節(jié),訓(xùn)練1~5epochs
    選擇一些學(xué)習(xí)率和正則化參數(shù)學(xué)習(xí)3種的模型,訓(xùn)練其在1--5個(gè)epochs
  5. 找到步驟4中最好的模型參數(shù)并訓(xùn)練10~20epochs,此時(shí)不添加任何學(xué)習(xí)率衰減;
  6. 查看損失曲線
    很差的初始化
    image.png

    此時(shí)可以參數(shù)學(xué)習(xí)率衰減
    注意不要在loss還在下降的時(shí)候用學(xué)習(xí)率衰減
    image.png

    精度仍在提高,需要繼續(xù)訓(xùn)練
    image.png

    有過擬合的趨勢(shì),需要增加正則化
    image.png
  7. 調(diào)到步驟5

總結(jié)

  1. 介紹了dropout正則化原理及其實(shí)現(xiàn);
  2. 常見的學(xué)習(xí)率衰減技巧
  3. 調(diào)節(jié)超參數(shù)的方法。

當(dāng)然,神經(jīng)網(wǎng)絡(luò)的訓(xùn)練技巧還有很多,這里介紹的只是cs231n里的一部分,此外還有數(shù)據(jù)增強(qiáng),Dropconnect等技巧。

參考

cs231n課件

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容