久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

CS224N課程筆記:神經(jīng)網(wǎng)絡(luò)與反向傳播

 520jefferson 2021-05-25

圖片

NewBeeNLP原創(chuàng)出品  

公眾號(hào)專欄作者@Ryan   

知乎 | 機(jī)器學(xué)習(xí)課程筆記

圖片

CS224N課程筆記系列,,持續(xù)更新中圖片 

課程主頁:http://web./class/cs224n/

1,、Neural Networks: Foundations

在前面的討論中認(rèn)為,因?yàn)榇蟛糠謹(jǐn)?shù)據(jù)是線性不可分的所以需要非線性分類器,不然的話線性分類器在這些數(shù)據(jù)上的表現(xiàn)是有限的,。神經(jīng)網(wǎng)絡(luò)就是如下圖所示的一類具有非線性決策分界的分類器。現(xiàn)在我們知道神經(jīng)網(wǎng)絡(luò)創(chuàng)建的決策邊界,,讓我們看看這是如何創(chuàng)建的,。

圖片

1.1 Neural

一個(gè)神經(jīng)元是用 個(gè)輸入和生成單個(gè)輸出的通用的計(jì)算單元。不同的神經(jīng)元根據(jù)它們不同的參數(shù)(一般認(rèn)為是神經(jīng)元的權(quán)值)會(huì)有不同的輸出,。對(duì)神經(jīng)元來說一個(gè)常見的選擇是“ ”,,或者稱為“二元邏輯回歸”單元。這種神經(jīng)元以 維的向量作為輸入,,然后計(jì)算出一個(gè)激活標(biāo)量(輸出) ,。這種神經(jīng)元也和一個(gè) 維的權(quán)值向量 和一個(gè)偏置標(biāo)量 相關(guān)聯(lián)。然后這個(gè)神經(jīng)元的輸出是:

我們也可以把上面公式中的權(quán)值和偏置項(xiàng)結(jié)合在一起:

這個(gè)公式可以以下圖的形式可視化:

圖片

1.2 A Single Layer of Neurons

考慮如下圖所示將輸入 作為多個(gè)神經(jīng)元的輸入的情況,,我們可以把上述的概念擴(kuò)展到多個(gè)神經(jīng)元上,,如下圖所示。

圖片

如果我們定義不同的神經(jīng)元的權(quán)值為,、偏置為和相對(duì)應(yīng)的激活輸出為:

....

讓我們定義簡化公式以便于更好地表達(dá)復(fù)雜的網(wǎng)絡(luò):

我們現(xiàn)在可以將縮放和偏差的輸出寫成:

激活函數(shù) 可以變?yōu)槿缦滦问剑?/p>

那么這些激活的作用是什么呢,?我們可以把這些激活看作是一些特征加權(quán)組合的存在的指標(biāo),。然后,我們可以使用這些激活的組合來執(zhí)行分類任務(wù),。

1.3  Feed-forward Computation

到目前為止我們知道一個(gè)輸入向量如何經(jīng)過一層 單元的變換得到激活輸出 ,。但是這么做的意思是什么呢?讓我們考慮一個(gè) 中的命名實(shí)體識(shí)別問題作為例子:

圖片這里我們想判斷中心詞 是不是以命名實(shí)體,。在這樣的情況中,,我們不僅僅想要捕獲在單詞向量的窗口中的單詞的出現(xiàn),更是要為了分類而去了解單詞之間的交互信息,。例如,,可能只有是第一個(gè)單詞和是第二個(gè)單詞的時(shí)候, 才是命名實(shí)體,。這種非線性決策通常是不能把輸入直接放到 函數(shù)中,,而是要將輸入經(jīng)過如 中討論中間層的非線性變換(例如 函數(shù)),再將這些結(jié)果放到函數(shù)中,。我們因此能夠使用另一個(gè)矩陣與激活輸出計(jì)算得到可微歸一化的得分用于分類任務(wù):

其中是激活函數(shù)(例如函數(shù)),。「維度分析:」 如果我們使用一個(gè)4維的詞向量來表示單個(gè)單詞和使用一個(gè)5個(gè)詞的窗口,然后輸入是 ,。如果我們?cè)陔[藏層使用8個(gè) 單元和從激活函數(shù)中生成一個(gè)分?jǐn)?shù)輸出,,其中,,

1.4 Maximum Margin Objective Function

類似很多的機(jī)器學(xué)習(xí)模型,,神經(jīng)網(wǎng)絡(luò)需要一個(gè)優(yōu)化目標(biāo)函數(shù),,一個(gè)我們想要最小化或最大化的誤差,。這里我們討論一個(gè)常用的誤差度量方法:最大間隔目標(biāo)函數(shù)。使用這個(gè)目標(biāo)函數(shù)的背后的思想是保證對(duì)“真”標(biāo)簽數(shù)據(jù)的計(jì)算得分要比“假”標(biāo)簽數(shù)據(jù)的計(jì)算得分要高,。

回到前面的例子,,如果我們令“真”標(biāo)簽窗口 的計(jì)算得分為 ,令“假”標(biāo)簽窗口 的計(jì)算得分為 (下標(biāo)表示這個(gè)這個(gè)窗口 ),。

然后,,我們對(duì)目標(biāo)函數(shù)最大化 或者最小化 。然而,,我們修改目標(biāo)函數(shù)來保證誤差僅在 才進(jìn)行計(jì)算,。這么做的原因是我們僅關(guān)注“真”數(shù)據(jù)要比“假”數(shù)據(jù)的分?jǐn)?shù)要高,才能滿足最大間隔,。因此,,我們想要如果 誤差為,否則為0 ,。因此,,我們的優(yōu)化的目標(biāo)函數(shù)現(xiàn)在為:

然而,上面的優(yōu)化目標(biāo)函數(shù)是有風(fēng)險(xiǎn)的,,因?yàn)樗荒軇?chuàng)造一個(gè)安全的間隔,。我們希望“真”數(shù)據(jù)要比“假”數(shù)據(jù)的得分大于某個(gè)正的間隔。換而言之,,我們想要誤差在 就開始計(jì)算,,而不是當(dāng)時(shí)才計(jì)算。因此,,我們修改優(yōu)化目標(biāo)函數(shù)為:

我們可以把這個(gè)間隔縮放使得,,讓其他參數(shù)在優(yōu)化過程中自動(dòng)進(jìn)行調(diào)整,并且不會(huì)影響模型的表現(xiàn),。如果想更多地了解這方面,,可以去讀一下中的函數(shù)間隔和幾何間隔中的相關(guān)內(nèi)容。最后,,我們定義在所有訓(xùn)練窗口上的優(yōu)化目標(biāo)函數(shù)為:

按照上面的公式有,,

在這部分我們討論損失函數(shù)為正時(shí),,模型中不同參數(shù)時(shí)如何訓(xùn)練的,。如果損失為 0時(shí),那么不需要再更新參數(shù),。我們一般使用梯度下降(或者像這樣的變體)來更新參數(shù),,所以要知道在更新公式中需要的任意參數(shù)的梯度信息:

反向傳播是一種利用微分鏈?zhǔn)椒▌t來計(jì)算模型上任意參數(shù)的損失梯度的方法。為了更進(jìn)一步理解反向傳播,我們先看下圖中的一個(gè)簡單的網(wǎng)絡(luò)

圖片

這里我們使用只有單個(gè)隱藏層和單個(gè)輸出單元的神經(jīng)網(wǎng)絡(luò)?,F(xiàn)在讓我們先建立一些符號(hào)定義:

  • 是神經(jīng)網(wǎng)絡(luò)的輸入,。
  • 是神經(jīng)網(wǎng)絡(luò)的輸出。
  • 每層(包括輸入和輸出層)的神經(jīng)元都接收一個(gè)輸入和生成一個(gè)輸出,。第層的第個(gè)神經(jīng)元接收標(biāo)量輸入和生成一個(gè)標(biāo)量激活輸出 ,。
  • 我們把反向傳播誤差在的計(jì)算定義為
  • 第1層認(rèn)為是輸入層而不是第1個(gè)隱藏層,。對(duì)輸入層,,。
  • 是將第k層的輸出映射到第k+1層的輸入的轉(zhuǎn)移矩陣,,因此將這個(gè)新的符號(hào)用在中的例子

現(xiàn)在我們開始反向傳播:假設(shè)損失函數(shù)為正值,,我們想更新參數(shù),,我們看到只參與了 的計(jì)算。這點(diǎn)對(duì)于理解反向傳播是非常重要的-參數(shù)的反向傳播梯度只和參與了前向計(jì)算中的參數(shù)的值有關(guān)系,,在隨后的前向計(jì)算中和相乘計(jì)算得分,。我們可以從最大間隔損失看到:

為了簡化我們只分析。所以,,

我們可以看到梯度計(jì)算最后可以簡化為 ,,其中本質(zhì)上是第2層中第個(gè)神經(jīng)元反向傳播的誤差。相乘的結(jié)果,,輸入第2層中第個(gè)神經(jīng)元中,。

我們以下圖為例,讓我們從“誤差共享/分配”的來闡釋一下反向傳播,,現(xiàn)在我們要更新

圖片

如果要控制列表的層級(jí),,則需要在符號(hào)-前使用空格。如下:

  1. 我們從 的1的誤差信號(hào)開始反向傳播,。
  2. 然后我們把誤差與把映射到 的神經(jīng)元的局部梯度相乘,。在這個(gè)例子中梯度正好等于1 ,則誤差仍然為1,。所以有 ,。
  3. 這里誤差信號(hào)1已經(jīng)到達(dá)。我們現(xiàn)在需要分配誤差信號(hào)使得誤差的“誤差共享”到達(dá),。
  4. 現(xiàn)在在 的誤差為(在的誤差信號(hào)為),。因此在 的誤差為
  5. 與第2步的做法相同,,我們把在 的誤差 映射到 的神經(jīng)元的局部梯度相乘,。在這里局部梯度為
  6. 因此在的誤差是,我們將其定義為,。
  7. 最后,,我們通過將上面的誤差與參與前向計(jì)算的相乘,把誤差的“誤差共享”分配到,。
  8. 所以,,對(duì)于的梯度損失可以計(jì)算為。注意我們使用這個(gè)方法得到的結(jié)果是和之前微分的方法的結(jié)果是完全一樣的,。因此,,計(jì)算網(wǎng)絡(luò)中的相應(yīng)參數(shù)的梯度誤差既可以使用鏈?zhǔn)椒▌t也可以使用誤差共享和分配的方法-這兩個(gè)方法能得到相同結(jié)果。

「偏置更新」 偏置項(xiàng)和其他權(quán)值在數(shù)學(xué)形式是等價(jià)的,,只是在計(jì)算下一層神經(jīng)元輸入時(shí)相乘的值是常量1,。因此在第層的第個(gè)神經(jīng)元的偏置的梯度時(shí)。例如在上面的例子中,,我們更新的是而不是,,那么這個(gè)梯度為

「從到從反向傳播的一般步驟:」

  • 我們有從向后傳播的誤差,,如下圖所示

    圖片

  • 我們通過把與路徑上的權(quán)值相乘,,將這個(gè)誤差反向傳播到

  • 因此在接收的誤差是,。

  • 然而,,在前向計(jì)算可能出下圖的情況,會(huì)參與下一層中的多個(gè)神經(jīng)元的計(jì)算,。那么第層的第個(gè)神經(jīng)元的誤差也要使用上一步方法將誤差反向傳播到 上,。

  • 因此現(xiàn)在在接收的誤差是

  • 實(shí)際上,,我們可以把上面誤差和簡化為,。

  • 現(xiàn)在我們有在正確的誤差,然后將其與局部梯度相乘,,把誤差信息反向傳到第層的第個(gè)神經(jīng)元上,。

  • 因此到達(dá)的誤差為

1.6 Training with Backpropagation – Vectorized

到目前為止,,我們討論了對(duì)模型中的給定參數(shù)計(jì)算梯度的方法,。這里會(huì)一般泛化上面的方法,讓我們可以直接一次過更新權(quán)值矩陣和偏置向量,。注意這只是對(duì)上面模型的簡單地?cái)U(kuò)展,,這將有助于更好理解在矩陣-向量級(jí)別上進(jìn)行誤差反向傳播的方法。

對(duì)更定的參數(shù),,我們知道它的誤差梯度是,。其中是將映射到的矩陣,。因此我們可以確定整個(gè)矩陣的梯度誤差為:

圖片

因此我們可以將整個(gè)矩陣形式的梯度寫為在矩陣的中反向傳播的誤差向量和前向激活輸出的外積。

現(xiàn)在我們來看看如何能夠計(jì)算誤差向量,。我們從上面的例子中有,,。這可以簡單地改寫為矩陣的形式:

圖片

在上面的公式中運(yùn)算符是表示向量之間對(duì)應(yīng)元素的相乘(),。

「計(jì)算效率:」 在探索了 element-wise 的更新和 vector-wise 的更新之后,,必須認(rèn)識(shí)到在科學(xué)計(jì)算環(huán)境中,如 MATLAB 或 Python(使用 Numpy / Scipy 庫),,向量化運(yùn)算的計(jì)算效率是非常高的,。因此在實(shí)際中應(yīng)該使用向量化運(yùn)算。此外,,我們也要減少反向傳播中的多余的計(jì)算-例如,,注意到是直接依賴在上。所以我們要保證使用更新時(shí),,要保存用于后面的計(jì)算-然后計(jì)算層的時(shí)候重復(fù)上述的步驟。這樣的遞歸過程是使得反向傳播成為計(jì)算上可負(fù)擔(dān)的過程,。

2,、 Neural Networks: Tips and Tricks

2.1 Gradient Check

在上一部分中,我們?cè)敿?xì)地討論了如何用基于微積分的方法計(jì)算神經(jīng)網(wǎng)絡(luò)中的參數(shù)的誤差梯度/更新,。這里我們介紹一種用數(shù)值近似這些梯度的方法-雖然在計(jì)算上的低效不能直接用于訓(xùn)練神經(jīng)網(wǎng)絡(luò),,這種方法可以非常準(zhǔn)確地估計(jì)任何參數(shù)的導(dǎo)數(shù);因此,,它可以作為對(duì)導(dǎo)數(shù)的正確性的有用的檢查,。給定一個(gè)模型的參數(shù)向量和損失函數(shù),圍繞的數(shù)值梯度由 得出:

圖片

其中是一個(gè)很小的值(一般約為 ),。當(dāng)我們使用擾動(dòng)參數(shù)的第個(gè)元素時(shí),,就可以在前向傳播上計(jì)算誤差。相似地,,當(dāng)我們使用擾動(dòng)參數(shù)的第個(gè)元素時(shí),,就可以在前向傳播上計(jì)算誤差。因此,,計(jì)算兩次前向傳播,,我們可以估計(jì)在模型中任意給定參數(shù)的梯度。我們注意到數(shù)值梯度的定義和導(dǎo)數(shù)的定義很相似,,其中,,在標(biāo)量的情況下:

圖片

當(dāng)然,還是有一點(diǎn)不同-上面的定義僅僅在正向擾動(dòng)計(jì)算梯度,。雖然是可以用這種方式定義數(shù)值梯度,,但在實(shí)際中使用 常??梢愿鼫?zhǔn)確和更穩(wěn)定,因?yàn)槲覀冊(cè)趦蓚€(gè)方向都對(duì)參數(shù)擾動(dòng),。為了更好地逼近一個(gè)點(diǎn)附近的導(dǎo)數(shù)/斜率,,我們需要在該點(diǎn)的左邊和右邊檢查函數(shù)的行為。也可以使用泰勒定理來表示 比例誤差,,這相當(dāng)小,,而導(dǎo)數(shù)定義更容易出錯(cuò)。

現(xiàn)在你可能會(huì)產(chǎn)生疑問,,如果這個(gè)方法這么準(zhǔn)確,,為什么我們不用它而不是用反向傳播來計(jì)算神經(jīng)網(wǎng)絡(luò)的梯度?這是因?yàn)樾实膯栴}-每當(dāng)我們想計(jì)算一個(gè)元素的梯度,,需要在網(wǎng)絡(luò)中做兩次前向傳播,,這樣是很耗費(fèi)計(jì)算資源的。再者,,很多大規(guī)模的神經(jīng)網(wǎng)絡(luò)含有幾百萬的參數(shù),,對(duì)每個(gè)參數(shù)都計(jì)算兩次明顯不是一個(gè)好的選擇。同時(shí)在例如SGD這樣的優(yōu)化技術(shù)中,,我們需要通過數(shù)千次的迭代來計(jì)算梯度,,使用這樣的方法很快會(huì)變得難以應(yīng)付。這種低效性是我們只使用梯度檢驗(yàn)來驗(yàn)證我們的分析梯度的正確性的原因,。梯度檢驗(yàn)的實(shí)現(xiàn)如下所示:

def eval_numerical_gradient(f, x):
    '''
    a naive implementation of numerical gradient of f at x
    - f should be a function that takes a single argument
    - x is the point (numpy array) to evaluate the gradient  
    at
    '''

    
    f(x) = f(x) # evaluate function value at original point
    grad = np.zeros(x.shape)
    h = 0.00001
    
    # iterate over all indexes in x
    it = np.nditer(x, flags=['multi_index',
                     op_flags=['readwrite'])
                     
    while not it.finished:
    
        # evaluate function at x+h
        ix = it.multi_index
        old_value = x[ix]
        x[ix] = old_value + h # increment by h
        fxh_left = f(x) # evaluate f(x + h)
        x[ix] = old_value - h # decrement by h
        fxh_right = f(x) # evaluate f(x - h)
        # restore to previous value (very important!)
        x[ix] = old_value 
        
        # compute the partial derivative
        # the slope
        grad[ix] = (fxh_left - fxh_right) / (2 * h)
        it.iternext() # step to next dimension
    return grad

2.2 Regularization

和很多機(jī)器學(xué)習(xí)的模型一樣,,神經(jīng)網(wǎng)絡(luò)很容易過擬合,這令到模型在訓(xùn)練集上能獲得近乎完美的表現(xiàn),,但是卻不能泛化到測試集上,。一個(gè)常見的用于解決過擬合(“高方差問題”)的方法是使用正則化。我們只需要在損失函數(shù)上增加一個(gè)正則項(xiàng),,現(xiàn)在的損失函數(shù)如下:

在上面的公式中,,是矩陣在神經(jīng)網(wǎng)絡(luò)中的第個(gè)權(quán)值矩陣)的范數(shù)和是超參數(shù)控制損失函數(shù)中的權(quán)值的大小。當(dāng)我們嘗試去最小化,,正則化本質(zhì)上就是當(dāng)優(yōu)化損失函數(shù)的時(shí)候,,懲罰數(shù)值太大的權(quán)值(讓權(quán)值的數(shù)值分配更加均衡,防止出現(xiàn)部分權(quán)值特別大的情況),。

由于范數(shù)的二次的性質(zhì)(計(jì)算矩陣的元素的平方和),,正則項(xiàng)有效地降低了模型的靈活性和因此減少出現(xiàn)過擬合的可能性。增加這樣一個(gè)約束可以使用貝葉斯派的思想解釋,,這個(gè)正則項(xiàng)是對(duì)模型的參數(shù)加上一個(gè)先驗(yàn)分布,,優(yōu)化權(quán)值使其接近于0-有多接近是取決于的值。

選擇一個(gè)合適的值是很重要的,,并且需要通過超參數(shù)調(diào)整來選擇,。的值太大會(huì)令很多權(quán)值都接近于0,,則模型就不能在訓(xùn)練集上學(xué)習(xí)到有意義的東西,經(jīng)常在訓(xùn)練,、驗(yàn)證和測試集上的表現(xiàn)都非常差,。的值太小,會(huì)讓模型仍舊出現(xiàn)過擬合的現(xiàn)象,。需要注意的是,,偏置項(xiàng)不會(huì)被正則化,和不會(huì)計(jì)算入損失項(xiàng)中-嘗試去思考一下為什么(譯者注:我認(rèn)為偏置項(xiàng)在模型中僅僅是偏移的關(guān)系,,使用少量的數(shù)據(jù)就能擬合到這項(xiàng),,而且從經(jīng)驗(yàn)上來說,偏置值的大小對(duì)模型表現(xiàn)沒有很顯著的影響,,因此不需要正則化偏置項(xiàng)),。

有時(shí)候我們會(huì)用到其他類型的正則項(xiàng),例如正則項(xiàng),,它將參數(shù)元素的絕對(duì)值全部加起來-然而,,在實(shí)際中很少會(huì)用正則項(xiàng),因?yàn)闀?huì)令權(quán)值參數(shù)變得稀疏,。在下一部分,,我們討論,這是另外一種有效的正則化方法,,通過在前向傳播過程隨機(jī)將神經(jīng)元設(shè)為0(譯者注:實(shí)際上是通過在每次迭代中忽略它們的權(quán)值來實(shí)現(xiàn)“凍結(jié)”部分,。這些“凍結(jié)”的不是把它們?cè)O(shè)為0,,而是對(duì)于該迭代,,網(wǎng)絡(luò)假定它們?yōu)??!皟鼋Y(jié)”的 不會(huì)為此次迭代更新),。

2.3 Dropout

是一個(gè)非常強(qiáng)大的正則化技術(shù),在論文 《Dropout: A Simple Way to Prevent Neural Networks from Over?tting》中首次提出,,下圖展示了如何應(yīng)用在神經(jīng)網(wǎng)絡(luò)上,。

圖片

這個(gè)想法是簡單而有效的-在訓(xùn)練過程中,在每次的前向/反向傳播中我們按照一定概率(1-p)隨機(jī)地“”一些神經(jīng)元子集(或者等價(jià)的,,我們保持一定概率的神經(jīng)元是激活的),。然后,在測試階段,,我們將使用全部的神經(jīng)元來進(jìn)行預(yù)測,。使用神經(jīng)網(wǎng)絡(luò)一般能從數(shù)據(jù)中學(xué)到更多有意義的信息,更少出現(xiàn)過擬合和通常在現(xiàn)今的任務(wù)上獲得更高的整體表現(xiàn),。這種技術(shù)應(yīng)該如此有效的一個(gè)直觀原因是,,本質(zhì)上作的是一次以指數(shù)形式訓(xùn)練許多較小的網(wǎng)絡(luò),,并對(duì)其預(yù)測進(jìn)行平均。

在實(shí)際中,,在實(shí)踐中,,我們使用的方式是我們?nèi)∶總€(gè)神經(jīng)元層的輸出,并保持概率的神經(jīng)元是激活的,,否則將神經(jīng)元設(shè)置為0,。然后,在反向傳播中我們僅對(duì)在前向傳播中激活的神經(jīng)元回傳梯度,。最后,,在測試過程,我們使用神經(jīng)網(wǎng)絡(luò)中全部的神經(jīng)元進(jìn)行前向傳播計(jì)算,。然而,,有一個(gè)關(guān)鍵的微妙之處,為了使有效地工作,,測試階段的神經(jīng)元的預(yù)期輸出應(yīng)與訓(xùn)練階段大致相同-否則輸出的大小可能會(huì)有很大的不同,,網(wǎng)絡(luò)的表現(xiàn)已經(jīng)不再明確了。因此,,我們通常必須在測試階段將每個(gè)神經(jīng)元的輸出除以某個(gè)值——這留給讀者作為練習(xí)來確定這個(gè)值應(yīng)該是多少,,以便在訓(xùn)練和測試期間的預(yù)期輸出相等。

2.4 Neuron Units

到目前為止,,我們討論了含有 sigmoidal neurons 的非線性分類的神經(jīng)網(wǎng)絡(luò),。但是在很多應(yīng)用中,使用其他激活函數(shù)可以設(shè)計(jì)更好的神經(jīng)網(wǎng)絡(luò),。下面列出一些常見的激活函數(shù)和激活函數(shù)的梯度定義,,它們可以和前面討論過的 sigmoidal 函數(shù)互相替換。

Sigmoid:這是我們討論過的常用選擇,,激活函數(shù)為:

其中,。

圖片

的梯度為

:」 函數(shù)是函數(shù)之外的另一個(gè)選擇,在實(shí)際中它能更快地收斂,。的主要不同在于的輸出范圍在0到1,,而 的輸出范圍在-1到1。

其中,。

圖片

的梯度為:

:」 有時(shí)候函數(shù)有時(shí)比函數(shù)的選擇更為優(yōu)先,,因?yàn)樗挠?jì)算量更小。然而當(dāng)的值大于 1時(shí),,函數(shù)的數(shù)值會(huì)飽和(如下圖所示會(huì)恒等于1),。激活函數(shù)為:

圖片

這個(gè)函數(shù)的微分也可以用分段函數(shù)的形式表示:

:」 函數(shù)是另外一種非線性激活函數(shù),它可以是的另外一種選擇,,因?yàn)樗黨ard clipped functions那樣過早地飽和:

softsign

圖片

函數(shù)的微分表達(dá)式為:

其中 是符號(hào)函數(shù),,根據(jù)的符號(hào)返回1或者-1,。

:」函數(shù)是激活函數(shù)中的一個(gè)常見的選擇,當(dāng)的值特別大的時(shí)候它也不會(huì)飽和,。在計(jì)算機(jī)視覺應(yīng)用中取得了很大的成功:

圖片

函數(shù)的微分是一個(gè)分段函數(shù):

:」 傳統(tǒng)的單元當(dāng)的值小于0時(shí),,是不會(huì)反向傳播誤差,改善了這一點(diǎn),,當(dāng)的值小于0時(shí),,仍然會(huì)有一個(gè)很小的誤差反向傳播回去。

其中 ,。

圖片

函數(shù)的微分是一個(gè)分段函數(shù):

0 \k & \text { : otherwise } \end{array}\right. ' data-formula-type='block-equation'>

2.5 Data Preprocessing

與機(jī)器學(xué)習(xí)模型的情況一樣,,要想模型在當(dāng)前任務(wù)上獲得合理的表現(xiàn)的關(guān)鍵步驟是對(duì)數(shù)據(jù)進(jìn)行合理的預(yù)處理。

「Mean Subtraction:」 給定一組輸入數(shù)據(jù),,一般把中的值減去的平均特征向量來使數(shù)據(jù)零中心化,。在實(shí)踐中很重要的一點(diǎn)是,只計(jì)算訓(xùn)練集的平均值,,而且這個(gè)在訓(xùn)練集,,驗(yàn)證集和測試集都是減去這個(gè)平均值。

「Normalization:」 另外一個(gè)常見的技術(shù)(雖然沒有Mean Subtraction常用)是將每個(gè)輸入特征維度縮小,,讓每個(gè)輸入特征維度具有相似的幅度范圍,。這是很有用的,因此不同的輸入特征是用不同“單位”度量,,但是最初的時(shí)候我們經(jīng)常認(rèn)為所有的特征同樣重要,。實(shí)現(xiàn)方法是將特征除以它們各自在訓(xùn)練集中計(jì)算的標(biāo)準(zhǔn)差。

「Whitening:」 相比上述的兩個(gè)方法,,Whitening沒有那么常用,,它本質(zhì)上是數(shù)據(jù)經(jīng)過轉(zhuǎn)換后,特征之間相關(guān)性較低,,所有特征具有相同的方差(協(xié)方差陣為1),。首先對(duì)數(shù)據(jù)進(jìn)行Mean Subtraction處理,,得到,。然后我們對(duì)進(jìn)行奇異值分解得到矩陣,, ,,計(jì)算投影到由的列定義的基上。我們最后將結(jié)果的每個(gè)維度除以中的相應(yīng)奇異值,,從而適當(dāng)?shù)乜s放我們的數(shù)據(jù)(如果其中有奇異值為0,,我們就除以一個(gè)很小的值代替)。

2.6 Parameter Initialization

讓神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)最佳性能的關(guān)鍵一步是以合理的方式初始化參數(shù),。一個(gè)好的起始方法是將權(quán)值初始化為通常分布在0附近的很小的隨機(jī)數(shù)-在實(shí)踐中效果還不錯(cuò),。在論文《Understanding the difficulty of training deep feedforward neural networks (2010)》研究不同權(quán)值和偏置初始化方案對(duì)訓(xùn)練動(dòng)力(training dynamics)的影響,。實(shí)驗(yàn)結(jié)果表明,對(duì)于sigmoid和tanh激活單元,,當(dāng)一個(gè)權(quán)值矩陣以如下的均勻分布的方式隨機(jī)初始化,,能夠?qū)崿F(xiàn)更快的收斂和得到更低的誤差:

其中(fan-in)的輸入單元數(shù), (fan-out)的輸出單元數(shù),。在這個(gè)參數(shù)初始化方案中,,偏置單元是初始化為 0。這種方法是嘗試保持跨層之間的激活方差以及反向傳播梯度方差,。如果沒有這樣的初始化,,梯度方差(當(dāng)中含有糾正信息)通常隨著跨層的反向傳播而衰減。

2.7 Learning Strategies

訓(xùn)練期間模型參數(shù)更新的速率/幅度可以使用學(xué)習(xí)率進(jìn)行控制,。在最簡單的梯度下降公式中,,是學(xué)習(xí)率:

你可能會(huì)認(rèn)為如果要更快地收斂,我們應(yīng)該對(duì) 取一個(gè)較大的值-然而,,在更快的收斂速度下并不能保證更快的收斂,。實(shí)際上,如果學(xué)習(xí)率非常高,,我們可能會(huì)遇到損失函數(shù)難以收斂的情況,,因?yàn)閰?shù)更新幅度過大,會(huì)導(dǎo)致模型越過凸優(yōu)化的極小值點(diǎn),,如下圖所示,。在非凸模型中(我們很多時(shí)候遇到的模型都是非凸),高學(xué)習(xí)率的結(jié)果是難以預(yù)測的,,但是損失函數(shù)難以收斂的可能性是非常高的,。

圖片

避免損失函數(shù)難以收斂的一個(gè)簡答的解決方法是使用一個(gè)很小的學(xué)習(xí)率,讓模型謹(jǐn)慎地在參數(shù)空間中迭代-當(dāng)然,,如果我們使用了一個(gè)太小的學(xué)習(xí)率,,損失函數(shù)可能不會(huì)在合理的時(shí)間內(nèi)收斂,或者會(huì)困在局部最優(yōu)點(diǎn),。因此,,與任何其他超參數(shù)一樣,學(xué)習(xí)率必須有效地調(diào)整,。

深度學(xué)習(xí)系統(tǒng)中最消耗計(jì)算資源的是訓(xùn)練階段,,一些研究已在嘗試提升設(shè)置學(xué)習(xí)率的新方法。例如,, 通過取的神經(jīng)元的平方根的倒數(shù)來縮放權(quán)值(其中)的學(xué)習(xí)率,。

還有其他已經(jīng)被證明有效的技術(shù)-這個(gè)方法叫 annealing,在多次迭代之后,學(xué)習(xí)率以以下方式降低:保證以一個(gè)高的的學(xué)習(xí)率開始訓(xùn)練和快速逼近最小值,;當(dāng)越來越接近最小值時(shí),,開始降低學(xué)習(xí)率,讓我們可以在更細(xì)微的范圍內(nèi)找到最優(yōu)值,。一個(gè)常見的實(shí)現(xiàn) annealing 的方法是在 [公式] 每次的迭代學(xué)習(xí)后,,通過一個(gè)因子來降低學(xué)習(xí)率。指數(shù)衰減也是另一個(gè)常見的方法,,在次迭代后學(xué)習(xí)旅變?yōu)?span>,,其中是初始的學(xué)習(xí)率和是超參數(shù)。還有另外一種方法是允許學(xué)習(xí)率隨著時(shí)間減少:

在上述的方案中,,是一個(gè)可調(diào)的參數(shù),,代表起始的學(xué)習(xí)率。也是一個(gè)可調(diào)參數(shù),,表示學(xué)習(xí)率應(yīng)該在該時(shí)間點(diǎn)開始減少,。在實(shí)際中,這個(gè)方法是很有效的,。在下一部分我們討論另外一種不需要手動(dòng)設(shè)定學(xué)習(xí)率的自適應(yīng)梯度下降的方法,。

2.8 Momentum Updates

動(dòng)量方法,靈感來自于物理學(xué)中的對(duì)動(dòng)力學(xué)的研究,,是梯度下降方法的一種變體,,嘗試使用更新的“速度”的一種更有效的更新方案。動(dòng)量更新的偽代碼如下所示:

# Computes a standard momentum update
# on parameters x
v = mu * v - alpha * grad_x
x += v

2.9 Adaptive Optimization Methods

是標(biāo)準(zhǔn)的隨機(jī)梯度下降(SGD)的一種實(shí)現(xiàn),,但是有一點(diǎn)關(guān)鍵的不同:對(duì)每個(gè)參數(shù)學(xué)習(xí)率是不同的,。每個(gè)參數(shù)的學(xué)習(xí)率取決于每個(gè)參數(shù)梯度更新的歷史,參數(shù)的更新歷史越稀少,就使用更大的學(xué)習(xí)率加快更新,。換句話說,,之前很少被更新的參數(shù)就用比現(xiàn)在更大的學(xué)習(xí)率更新。

其中,。

在這個(gè)技術(shù)中,,我們看到如果梯度的歷史的很低,那么學(xué)習(xí)率會(huì)非常高,。這個(gè)技術(shù)的一個(gè)簡單的實(shí)現(xiàn)如下所示:

# Assume the gradient dx and parameter vector x
cache += dx ** 2
x += -learning_rate * dx / np.sqrt(cache + 1e-8)

其他常見的自適應(yīng)方法有,,其更新規(guī)則如下所示:

# Update rule for RMS prop
cache = decay_rate * cache + (1 - decay_rate) * dx ** 2
x += -learning_rate * dx / (np.sqrt(cache) + eps)

# Update rule for Adam
m = beta * m + (1 - beta1) * dx
v = beta * v + (1 - beta2) * (dx ** 2)
x += -learning_rate * m / (np.sqrt(v) + eps)

是利用平方梯度的移動(dòng)平局值,是的一個(gè)變體-實(shí)際上,,和不一樣,,它的更新不會(huì)單調(diào)變小,。更新規(guī)則又是 的一個(gè)變體,,但是加上了動(dòng)量更新。

2.10 More reference

如果希望了解以上的梯度優(yōu)化算法的具體細(xì)節(jié),,可以閱讀這篇文章:An overview of gradient descent optimization algorithms,。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多