CS224N課程筆記系列,持續(xù)更新中 課程主頁:http://web./class/cs224n/ 1、Neural Networks: Foundations在前面的討論中認(rèn)為,因為大部分?jǐn)?shù)據(jù)是線性不可分的所以需要非線性分類器,不然的話線性分類器在這些數(shù)據(jù)上的表現(xiàn)是有限的。神經(jīng)網(wǎng)絡(luò)就是如下圖所示的一類具有非線性決策分界的分類器?,F(xiàn)在我們知道神經(jīng)網(wǎng)絡(luò)創(chuàng)建的決策邊界,讓我們看看這是如何創(chuàng)建的。 1.1 Neural一個神經(jīng)元是用 個輸入和生成單個輸出的通用的計算單元。不同的神經(jīng)元根據(jù)它們不同的參數(shù)(一般認(rèn)為是神經(jīng)元的權(quán)值)會有不同的輸出。對神經(jīng)元來說一個常見的選擇是“ ”,或者稱為“二元邏輯回歸”單元。這種神經(jīng)元以 維的向量作為輸入,然后計算出一個激活標(biāo)量(輸出) 。這種神經(jīng)元也和一個 維的權(quán)值向量 和一個偏置標(biāo)量 相關(guān)聯(lián)。然后這個神經(jīng)元的輸出是: 我們也可以把上面公式中的權(quán)值和偏置項結(jié)合在一起: 這個公式可以以下圖的形式可視化: 1.2 A Single Layer of Neurons考慮如下圖所示將輸入 作為多個神經(jīng)元的輸入的情況,我們可以把上述的概念擴(kuò)展到多個神經(jīng)元上,如下圖所示。 如果我們定義不同的神經(jīng)元的權(quán)值為、偏置為和相對應(yīng)的激活輸出為: ....讓我們定義簡化公式以便于更好地表達(dá)復(fù)雜的網(wǎng)絡(luò): 我們現(xiàn)在可以將縮放和偏差的輸出寫成: 激活函數(shù) 可以變?yōu)槿缦滦问剑?/p> 那么這些激活的作用是什么呢?我們可以把這些激活看作是一些特征加權(quán)組合的存在的指標(biāo)。然后,我們可以使用這些激活的組合來執(zhí)行分類任務(wù)。 1.3 Feed-forward Computation到目前為止我們知道一個輸入向量如何經(jīng)過一層 單元的變換得到激活輸出 。但是這么做的意思是什么呢?讓我們考慮一個 中的命名實體識別問題作為例子:
其中是激活函數(shù)(例如函數(shù))。「維度分析:」 如果我們使用一個4維的詞向量來表示單個單詞和使用一個5個詞的窗口,然后輸入是 。如果我們在隱藏層使用8個 單元和從激活函數(shù)中生成一個分?jǐn)?shù)輸出,其中,,。 1.4 Maximum Margin Objective Function類似很多的機(jī)器學(xué)習(xí)模型,神經(jīng)網(wǎng)絡(luò)需要一個優(yōu)化目標(biāo)函數(shù),一個我們想要最小化或最大化的誤差。這里我們討論一個常用的誤差度量方法:最大間隔目標(biāo)函數(shù)。使用這個目標(biāo)函數(shù)的背后的思想是保證對“真”標(biāo)簽數(shù)據(jù)的計算得分要比“假”標(biāo)簽數(shù)據(jù)的計算得分要高。 回到前面的例子,如果我們令“真”標(biāo)簽窗口 的計算得分為 ,令“假”標(biāo)簽窗口 的計算得分為 (下標(biāo)表示這個這個窗口 )。 然后,我們對目標(biāo)函數(shù)最大化 或者最小化 。然而,我們修改目標(biāo)函數(shù)來保證誤差僅在 才進(jìn)行計算。這么做的原因是我們僅關(guān)注“真”數(shù)據(jù)要比“假”數(shù)據(jù)的分?jǐn)?shù)要高,才能滿足最大間隔。因此,我們想要如果 誤差為,否則為0 。因此,我們的優(yōu)化的目標(biāo)函數(shù)現(xiàn)在為: 然而,上面的優(yōu)化目標(biāo)函數(shù)是有風(fēng)險的,因為它不能創(chuàng)造一個安全的間隔。我們希望“真”數(shù)據(jù)要比“假”數(shù)據(jù)的得分大于某個正的間隔。換而言之,我們想要誤差在 就開始計算,而不是當(dāng)時才計算。因此,我們修改優(yōu)化目標(biāo)函數(shù)為: 我們可以把這個間隔縮放使得,讓其他參數(shù)在優(yōu)化過程中自動進(jìn)行調(diào)整,并且不會影響模型的表現(xiàn)。如果想更多地了解這方面,可以去讀一下中的函數(shù)間隔和幾何間隔中的相關(guān)內(nèi)容。最后,我們定義在所有訓(xùn)練窗口上的優(yōu)化目標(biāo)函數(shù)為: 按照上面的公式有, 和 。 在這部分我們討論損失函數(shù)為正時,模型中不同參數(shù)時如何訓(xùn)練的。如果損失為 0時,那么不需要再更新參數(shù)。我們一般使用梯度下降(或者像這樣的變體)來更新參數(shù),所以要知道在更新公式中需要的任意參數(shù)的梯度信息: 反向傳播是一種利用微分鏈?zhǔn)椒▌t來計算模型上任意參數(shù)的損失梯度的方法。為了更進(jìn)一步理解反向傳播,我們先看下圖中的一個簡單的網(wǎng)絡(luò) 這里我們使用只有單個隱藏層和單個輸出單元的神經(jīng)網(wǎng)絡(luò)。現(xiàn)在讓我們先建立一些符號定義:
現(xiàn)在我們開始反向傳播:假設(shè)損失函數(shù)為正值,我們想更新參數(shù),我們看到只參與了 和的計算。這點對于理解反向傳播是非常重要的-參數(shù)的反向傳播梯度只和參與了前向計算中的參數(shù)的值有關(guān)系,在隨后的前向計算中和相乘計算得分。我們可以從最大間隔損失看到: 為了簡化我們只分析。所以, 我們可以看到梯度計算最后可以簡化為 ,其中本質(zhì)上是第2層中第個神經(jīng)元反向傳播的誤差。與相乘的結(jié)果,輸入第2層中第個神經(jīng)元中。 我們以下圖為例,讓我們從“誤差共享/分配”的來闡釋一下反向傳播,現(xiàn)在我們要更新: 如果要控制列表的層級,則需要在符號
「偏置更新」 偏置項和其他權(quán)值在數(shù)學(xué)形式是等價的,只是在計算下一層神經(jīng)元輸入時相乘的值是常量1。因此在第層的第個神經(jīng)元的偏置的梯度時。例如在上面的例子中,我們更新的是而不是,那么這個梯度為。 「從到從反向傳播的一般步驟:」
1.6 Training with Backpropagation – Vectorized到目前為止,我們討論了對模型中的給定參數(shù)計算梯度的方法。這里會一般泛化上面的方法,讓我們可以直接一次過更新權(quán)值矩陣和偏置向量。注意這只是對上面模型的簡單地擴(kuò)展,這將有助于更好理解在矩陣-向量級別上進(jìn)行誤差反向傳播的方法。 對更定的參數(shù),我們知道它的誤差梯度是。其中是將映射到的矩陣。因此我們可以確定整個矩陣的梯度誤差為: ![]() 因此我們可以將整個矩陣形式的梯度寫為在矩陣的中反向傳播的誤差向量和前向激活輸出的外積。 現(xiàn)在我們來看看如何能夠計算誤差向量。我們從上面的例子中有,。這可以簡單地改寫為矩陣的形式: ![]() 在上面的公式中運算符是表示向量之間對應(yīng)元素的相乘()。 「計算效率:」 在探索了 element-wise 的更新和 vector-wise 的更新之后,必須認(rèn)識到在科學(xué)計算環(huán)境中,如 MATLAB 或 Python(使用 Numpy / Scipy 庫),向量化運算的計算效率是非常高的。因此在實際中應(yīng)該使用向量化運算。此外,我們也要減少反向傳播中的多余的計算-例如,注意到是直接依賴在上。所以我們要保證使用更新時,要保存用于后面的計算-然后計算層的時候重復(fù)上述的步驟。這樣的遞歸過程是使得反向傳播成為計算上可負(fù)擔(dān)的過程。 2、 Neural Networks: Tips and Tricks2.1 Gradient Check在上一部分中,我們詳細(xì)地討論了如何用基于微積分的方法計算神經(jīng)網(wǎng)絡(luò)中的參數(shù)的誤差梯度/更新。這里我們介紹一種用數(shù)值近似這些梯度的方法-雖然在計算上的低效不能直接用于訓(xùn)練神經(jīng)網(wǎng)絡(luò),這種方法可以非常準(zhǔn)確地估計任何參數(shù)的導(dǎo)數(shù);因此,它可以作為對導(dǎo)數(shù)的正確性的有用的檢查。給定一個模型的參數(shù)向量和損失函數(shù),圍繞的數(shù)值梯度由 得出: ![]() 其中是一個很小的值(一般約為 )。當(dāng)我們使用擾動參數(shù)的第個元素時,就可以在前向傳播上計算誤差。相似地,當(dāng)我們使用擾動參數(shù)的第個元素時,就可以在前向傳播上計算誤差。因此,計算兩次前向傳播,我們可以估計在模型中任意給定參數(shù)的梯度。我們注意到數(shù)值梯度的定義和導(dǎo)數(shù)的定義很相似,其中,在標(biāo)量的情況下: ![]() 當(dāng)然,還是有一點不同-上面的定義僅僅在正向擾動計算梯度。雖然是可以用這種方式定義數(shù)值梯度,但在實際中使用 常??梢愿鼫?zhǔn)確和更穩(wěn)定,因為我們在兩個方向都對參數(shù)擾動。為了更好地逼近一個點附近的導(dǎo)數(shù)/斜率,我們需要在該點的左邊和右邊檢查函數(shù)的行為。也可以使用泰勒定理來表示 有比例誤差,這相當(dāng)小,而導(dǎo)數(shù)定義更容易出錯。 現(xiàn)在你可能會產(chǎn)生疑問,如果這個方法這么準(zhǔn)確,為什么我們不用它而不是用反向傳播來計算神經(jīng)網(wǎng)絡(luò)的梯度?這是因為效率的問題-每當(dāng)我們想計算一個元素的梯度,需要在網(wǎng)絡(luò)中做兩次前向傳播,這樣是很耗費計算資源的。再者,很多大規(guī)模的神經(jīng)網(wǎng)絡(luò)含有幾百萬的參數(shù),對每個參數(shù)都計算兩次明顯不是一個好的選擇。同時在例如SGD這樣的優(yōu)化技術(shù)中,我們需要通過數(shù)千次的迭代來計算梯度,使用這樣的方法很快會變得難以應(yīng)付。這種低效性是我們只使用梯度檢驗來驗證我們的分析梯度的正確性的原因。梯度檢驗的實現(xiàn)如下所示: 2.2 Regularization和很多機(jī)器學(xué)習(xí)的模型一樣,神經(jīng)網(wǎng)絡(luò)很容易過擬合,這令到模型在訓(xùn)練集上能獲得近乎完美的表現(xiàn),但是卻不能泛化到測試集上。一個常見的用于解決過擬合(“高方差問題”)的方法是使用正則化。我們只需要在損失函數(shù)上增加一個正則項,現(xiàn)在的損失函數(shù)如下: 在上面的公式中,是矩陣在神經(jīng)網(wǎng)絡(luò)中的第個權(quán)值矩陣)的范數(shù)和是超參數(shù)控制損失函數(shù)中的權(quán)值的大小。當(dāng)我們嘗試去最小化,正則化本質(zhì)上就是當(dāng)優(yōu)化損失函數(shù)的時候,懲罰數(shù)值太大的權(quán)值(讓權(quán)值的數(shù)值分配更加均衡,防止出現(xiàn)部分權(quán)值特別大的情況)。 由于范數(shù)的二次的性質(zhì)(計算矩陣的元素的平方和),正則項有效地降低了模型的靈活性和因此減少出現(xiàn)過擬合的可能性。增加這樣一個約束可以使用貝葉斯派的思想解釋,這個正則項是對模型的參數(shù)加上一個先驗分布,優(yōu)化權(quán)值使其接近于0-有多接近是取決于的值。 選擇一個合適的值是很重要的,并且需要通過超參數(shù)調(diào)整來選擇。的值太大會令很多權(quán)值都接近于0,則模型就不能在訓(xùn)練集上學(xué)習(xí)到有意義的東西,經(jīng)常在訓(xùn)練、驗證和測試集上的表現(xiàn)都非常差。的值太小,會讓模型仍舊出現(xiàn)過擬合的現(xiàn)象。需要注意的是,偏置項不會被正則化,和不會計算入損失項中-嘗試去思考一下為什么(譯者注:我認(rèn)為偏置項在模型中僅僅是偏移的關(guān)系,使用少量的數(shù)據(jù)就能擬合到這項,而且從經(jīng)驗上來說,偏置值的大小對模型表現(xiàn)沒有很顯著的影響,因此不需要正則化偏置項)。 有時候我們會用到其他類型的正則項,例如正則項,它將參數(shù)元素的絕對值全部加起來-然而,在實際中很少會用正則項,因為會令權(quán)值參數(shù)變得稀疏。在下一部分,我們討論,這是另外一種有效的正則化方法,通過在前向傳播過程隨機(jī)將神經(jīng)元設(shè)為0(譯者注:實際上是通過在每次迭代中忽略它們的權(quán)值來實現(xiàn)“凍結(jié)”部分。這些“凍結(jié)”的不是把它們設(shè)為0,而是對于該迭代,網(wǎng)絡(luò)假定它們?yōu)??!皟鼋Y(jié)”的 不會為此次迭代更新)。 2.3 Dropout是一個非常強(qiáng)大的正則化技術(shù),在論文 《Dropout: A Simple Way to Prevent Neural Networks from Over?tting》中首次提出,下圖展示了如何應(yīng)用在神經(jīng)網(wǎng)絡(luò)上。
這個想法是簡單而有效的-在訓(xùn)練過程中,在每次的前向/反向傳播中我們按照一定概率(1-p)隨機(jī)地“”一些神經(jīng)元子集(或者等價的,我們保持一定概率的神經(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)該如此有效的一個直觀原因是,本質(zhì)上作的是一次以指數(shù)形式訓(xùn)練許多較小的網(wǎng)絡(luò),并對其預(yù)測進(jìn)行平均。 在實際中,在實踐中,我們使用的方式是我們?nèi)∶總€神經(jīng)元層的輸出,并保持概率的神經(jīng)元是激活的,否則將神經(jīng)元設(shè)置為0。然后,在反向傳播中我們僅對在前向傳播中激活的神經(jīng)元回傳梯度。最后,在測試過程,我們使用神經(jīng)網(wǎng)絡(luò)中全部的神經(jīng)元進(jìn)行前向傳播計算。然而,有一個關(guān)鍵的微妙之處,為了使有效地工作,測試階段的神經(jīng)元的預(yù)期輸出應(yīng)與訓(xùn)練階段大致相同-否則輸出的大小可能會有很大的不同,網(wǎng)絡(luò)的表現(xiàn)已經(jīng)不再明確了。因此,我們通常必須在測試階段將每個神經(jīng)元的輸出除以某個值——這留給讀者作為練習(xí)來確定這個值應(yīng)該是多少,以便在訓(xùn)練和測試期間的預(yù)期輸出相等。 2.4 Neuron Units到目前為止,我們討論了含有 sigmoidal neurons 的非線性分類的神經(jīng)網(wǎng)絡(luò)。但是在很多應(yīng)用中,使用其他激活函數(shù)可以設(shè)計更好的神經(jīng)網(wǎng)絡(luò)。下面列出一些常見的激活函數(shù)和激活函數(shù)的梯度定義,它們可以和前面討論過的 sigmoidal 函數(shù)互相替換。 Sigmoid:這是我們討論過的常用選擇,激活函數(shù)為: 其中。
的梯度為 「:」 函數(shù)是函數(shù)之外的另一個選擇,在實際中它能更快地收斂。 和的主要不同在于的輸出范圍在0到1,而 的輸出范圍在-1到1。 其中。
的梯度為: 「:」 有時候函數(shù)有時比函數(shù)的選擇更為優(yōu)先,因為它的計算量更小。然而當(dāng)的值大于 1時,函數(shù)的數(shù)值會飽和(如下圖所示會恒等于1)。激活函數(shù)為:
這個函數(shù)的微分也可以用分段函數(shù)的形式表示: 「:」 函數(shù)是另外一種非線性激活函數(shù),它可以是的另外一種選擇,因為它hard clipped functions那樣過早地飽和: softsign
函數(shù)的微分表達(dá)式為: 其中 是符號函數(shù),根據(jù)的符號返回1或者-1。 「:」函數(shù)是激活函數(shù)中的一個常見的選擇,當(dāng)的值特別大的時候它也不會飽和。在計算機(jī)視覺應(yīng)用中取得了很大的成功: ![]() 函數(shù)的微分是一個分段函數(shù): 「:」 傳統(tǒng)的單元當(dāng)的值小于0時,是不會反向傳播誤差,改善了這一點,當(dāng)的值小于0時,仍然會有一個很小的誤差反向傳播回去。 其中 。
函數(shù)的微分是一個分段函數(shù): 2.5 Data Preprocessing與機(jī)器學(xué)習(xí)模型的情況一樣,要想模型在當(dāng)前任務(wù)上獲得合理的表現(xiàn)的關(guān)鍵步驟是對數(shù)據(jù)進(jìn)行合理的預(yù)處理。 「Mean Subtraction:」 給定一組輸入數(shù)據(jù),一般把中的值減去的平均特征向量來使數(shù)據(jù)零中心化。在實踐中很重要的一點是,只計算訓(xùn)練集的平均值,而且這個在訓(xùn)練集,驗證集和測試集都是減去這個平均值。 「Normalization:」 另外一個常見的技術(shù)(雖然沒有Mean Subtraction常用)是將每個輸入特征維度縮小,讓每個輸入特征維度具有相似的幅度范圍。這是很有用的,因此不同的輸入特征是用不同“單位”度量,但是最初的時候我們經(jīng)常認(rèn)為所有的特征同樣重要。實現(xiàn)方法是將特征除以它們各自在訓(xùn)練集中計算的標(biāo)準(zhǔn)差。 「Whitening:」 相比上述的兩個方法,Whitening沒有那么常用,它本質(zhì)上是數(shù)據(jù)經(jīng)過轉(zhuǎn)換后,特征之間相關(guān)性較低,所有特征具有相同的方差(協(xié)方差陣為1)。首先對數(shù)據(jù)進(jìn)行Mean Subtraction處理,得到。然后我們對進(jìn)行奇異值分解得到矩陣,, ,計算將投影到由的列定義的基上。我們最后將結(jié)果的每個維度除以中的相應(yīng)奇異值,從而適當(dāng)?shù)乜s放我們的數(shù)據(jù)(如果其中有奇異值為0,我們就除以一個很小的值代替)。 2.6 Parameter Initialization讓神經(jīng)網(wǎng)絡(luò)實現(xiàn)最佳性能的關(guān)鍵一步是以合理的方式初始化參數(shù)。一個好的起始方法是將權(quán)值初始化為通常分布在0附近的很小的隨機(jī)數(shù)-在實踐中效果還不錯。在論文《Understanding the difficulty of training deep feedforward neural networks (2010)》研究不同權(quán)值和偏置初始化方案對訓(xùn)練動力(training dynamics)的影響。實驗結(jié)果表明,對于sigmoid和tanh激活單元,當(dāng)一個權(quán)值矩陣以如下的均勻分布的方式隨機(jī)初始化,能夠?qū)崿F(xiàn)更快的收斂和得到更低的誤差: 其中是(fan-in)的輸入單元數(shù), 是 (fan-out)的輸出單元數(shù)。在這個參數(shù)初始化方案中,偏置單元是初始化為 0。這種方法是嘗試保持跨層之間的激活方差以及反向傳播梯度方差。如果沒有這樣的初始化,梯度方差(當(dāng)中含有糾正信息)通常隨著跨層的反向傳播而衰減。 2.7 Learning Strategies訓(xùn)練期間模型參數(shù)更新的速率/幅度可以使用學(xué)習(xí)率進(jìn)行控制。在最簡單的梯度下降公式中,是學(xué)習(xí)率: 你可能會認(rèn)為如果要更快地收斂,我們應(yīng)該對 取一個較大的值-然而,在更快的收斂速度下并不能保證更快的收斂。實際上,如果學(xué)習(xí)率非常高,我們可能會遇到損失函數(shù)難以收斂的情況,因為參數(shù)更新幅度過大,會導(dǎo)致模型越過凸優(yōu)化的極小值點,如下圖所示。在非凸模型中(我們很多時候遇到的模型都是非凸),高學(xué)習(xí)率的結(jié)果是難以預(yù)測的,但是損失函數(shù)難以收斂的可能性是非常高的。
避免損失函數(shù)難以收斂的一個簡答的解決方法是使用一個很小的學(xué)習(xí)率,讓模型謹(jǐn)慎地在參數(shù)空間中迭代-當(dāng)然,如果我們使用了一個太小的學(xué)習(xí)率,損失函數(shù)可能不會在合理的時間內(nèi)收斂,或者會困在局部最優(yōu)點。因此,與任何其他超參數(shù)一樣,學(xué)習(xí)率必須有效地調(diào)整。 深度學(xué)習(xí)系統(tǒng)中最消耗計算資源的是訓(xùn)練階段,一些研究已在嘗試提升設(shè)置學(xué)習(xí)率的新方法。例如, 通過取的神經(jīng)元的平方根的倒數(shù)來縮放權(quán)值(其中)的學(xué)習(xí)率。 還有其他已經(jīng)被證明有效的技術(shù)-這個方法叫 annealing,在多次迭代之后,學(xué)習(xí)率以以下方式降低:保證以一個高的的學(xué)習(xí)率開始訓(xùn)練和快速逼近最小值;當(dāng)越來越接近最小值時,開始降低學(xué)習(xí)率,讓我們可以在更細(xì)微的范圍內(nèi)找到最優(yōu)值。一個常見的實現(xiàn) annealing 的方法是在 [公式] 每次的迭代學(xué)習(xí)后,通過一個因子來降低學(xué)習(xí)率。指數(shù)衰減也是另一個常見的方法,在次迭代后學(xué)習(xí)旅變?yōu)?span>,其中是初始的學(xué)習(xí)率和是超參數(shù)。還有另外一種方法是允許學(xué)習(xí)率隨著時間減少: 在上述的方案中,是一個可調(diào)的參數(shù),代表起始的學(xué)習(xí)率。也是一個可調(diào)參數(shù),表示學(xué)習(xí)率應(yīng)該在該時間點開始減少。在實際中,這個方法是很有效的。在下一部分我們討論另外一種不需要手動設(shè)定學(xué)習(xí)率的自適應(yīng)梯度下降的方法。 2.8 Momentum Updates動量方法,靈感來自于物理學(xué)中的對動力學(xué)的研究,是梯度下降方法的一種變體,嘗試使用更新的“速度”的一種更有效的更新方案。動量更新的偽代碼如下所示: # Computes a standard momentum update2.9 Adaptive Optimization Methods是標(biāo)準(zhǔn)的隨機(jī)梯度下降(SGD)的一種實現(xiàn),但是有一點關(guān)鍵的不同:對每個參數(shù)學(xué)習(xí)率是不同的。每個參數(shù)的學(xué)習(xí)率取決于每個參數(shù)梯度更新的歷史,參數(shù)的更新歷史越稀少,就使用更大的學(xué)習(xí)率加快更新。換句話說,之前很少被更新的參數(shù)就用比現(xiàn)在更大的學(xué)習(xí)率更新。 其中。 在這個技術(shù)中,我們看到如果梯度的歷史的很低,那么學(xué)習(xí)率會非常高。這個技術(shù)的一個簡單的實現(xiàn)如下所示: 其他常見的自適應(yīng)方法有和,其更新規(guī)則如下所示: # Update rule for RMS prop是利用平方梯度的移動平局值,是的一個變體-實際上,和不一樣,它的更新不會單調(diào)變小。更新規(guī)則又是 的一個變體,但是加上了動量更新。 2.10 More reference如果希望了解以上的梯度優(yōu)化算法的具體細(xì)節(jié),可以閱讀這篇文章:An overview of gradient descent optimization algorithms。 |
|
|