官术网_书友最值得收藏!

4.3 實際應用

在4.2節中講述的反向傳播算法理論上比較簡單,但是要高效地學習一個有用的模型,還需要考慮許多實際的問題[48, 185]

4.3.1 數據預處理

數據預處理在許多機器學習算法中都扮演著重要的角色。最常用的兩種數據預處理技術是樣本特征歸一化和全局特征標準化。

如果每個樣本均值的變化與處理的問題無關,就應該將特征均值歸零,減小特征相對于深層神經網絡模型的變化。例如,減去一張圖片的強度均值,可以減少亮度引起的變化。在手寫字符識別任務中,規整圖片的中心可以減少字符位置引起的變化。在語音識別中,倒譜均值歸一化(CMN)[166]是在句子內減去梅爾倒譜系數(MFCC)特征的均值,可以減少聲學信道扭曲帶來的影響。以CMN為列,對于每個句子,樣本歸一化首先要用該句子所有的幀特征估算每維i的均值

其中,T表示該句子中特征幀的個數,然后該句中的所有特征幀減去該均值

全局特征標準化的目標是使用全局轉換縮放每維數據,使得最終的特征向量處于相似的動態范圍內。例如,在圖像處理中,經常將[0, 255]范圍內的像素值縮放到[0, 1]范圍內。在語音識別任務中,對于實數特征,例如MFCC和FBANK,通常會使用一個全局轉換將每維特征歸一化為均值為0,方差為1[12]。兩種數據預處理方法中的全局轉換都只采用訓練數據估算,然后被直接應用到訓練數據集和測試數據集。給定訓練數據集(可能已經使用樣本特征歸一化處理),對每維特征i,計算均值

然后訓練和測試數據中的所有數據可以使用如公式(4.36)所示的方式標準化:

當每維特征被縮放到相似的數值范圍時,后續的處理過程通常能取得較好的結果,所以全局特征標準化是有效的[48]。例如,在DNN訓練中,通過特征歸一化,在所有的權重矩陣維度上使用相同的學習率仍然能得到好的模型。如果不做特征歸一化,能量維或者MFCC特征第一維c0會遮蔽其他維度特征;如果不使用類似AdaGrad[186]的學習率自動調整算法,這些特征維度會在模型參數調整過程中主導學習過程。

4.3.2 模型初始化

4.2節講述的學習算法都始于一個初始模型。因為DNN是一個高度非線性模型,并且相對于模型參數來說,訓練準則是非凸函數,所以初始模型會極大地影響最終模型的性能。

有很多啟發式方法可以初始化DNN模型。這些方法大部分都從以下兩方面出發:第一,初始化的權重必須使隱層神經元節點在sigmoid函數的線性范圍內活動。如果權重過大,許多隱層神經元節點的輸出會趨近于1或者0,并且根據公式(4.25)可知,梯度往往會非常小。相反,如果隱層神經元節點在線性范圍內活動,就可以得到足夠大的梯度(趨近于最大值0.25),使得模型學習的過程更加有效。注意,隱層節點輸出的激發值依賴于輸入值和權重,若輸入特征如4.3.1節所述被歸一化,這里就可以更加簡單地初始化權重。第二,隨機初始化參數也很關鍵。這是因為DNN中的隱層神經元節點是對稱和可互換的。如果所有的模型參數都有相同的值,那么所有的隱層神經元節點都將有相同的輸出,并且在DNN的底層會檢測相同的特征模式。隨機初始化的目的就是打破對稱性。

LeCun和Bottou[48]建議從一個均值為0、標準差為的分布中隨機取值初始化公式(4.1)中定義的?隱層權重,其中N?為與權重連接的輸出節點的個數。對于語音識別系統中的DNN,通常每個隱層有1000~2000個隱層神經元節點,并使用(w;0, 0.05)高斯分布或者一個取值范圍在[?0.05, 0.05]的正態分布隨機初始化權重矩陣;偏差系數b?通常被初始化為0。

4.3.3 權重衰減

和很多機器學習算法類似,過擬合是模型訓練過程中通常會遇到的問題。因為DNN模型與其他機器學習算法相比有更多的模型參數,所以該問題尤為嚴峻。過擬合問題主要是因為通常希望最小化期望損失函數公式(4.7),但是實際上被最小化的是訓練集合中定義的經驗損失。

緩和過擬合問題最簡單的方法就是正則化訓練準則,這樣可以使模型參數不過分地擬合訓練數據,最常用的正則項包括基于L1范數的正則項

和基于L2范數的正則項

其中,Wij是矩陣W中第ij列的值;是將矩陣W?中的所有列串聯起來得到的向量。另外,‖vec(W?)‖2等于‖W?F——矩陣W?的Frobenious范數。在神經網絡文獻中,這些正則項通常被稱為權重衰減(Weight Decay)。

當包含正則項時,訓練準則公式如下:

其中,J(W, b; S)是在訓練集S上優化的經驗損失JMSE(W, b; S)或者JCE(W, b; S),R(W)是前面所述的R1(W)或者R2(W),λ是插值權重或者被稱作正則化權重。另外,

當訓練集的大小相對于DNN模型中的參數量較小時,權重衰減法往往是很有效的。因為在語音識別任務中使用的DNN模型通常有超過一百萬的參數,插值系數λ應該較小(通常在10?4數量級),甚至當訓練數據量較大時被設置為0。

4.3.4 丟棄法

控制過擬合的一種方法是前面所述的權重衰減法。而應用“丟棄法”(Dropout)[187]是另一種流行的做法。Dropout基本的想法是在訓練過程中隨機丟棄每一個隱層中一定比例(稱為丟棄比例,用α表示)的神經元。這意味著即使在訓練過程中有一些神經元被丟棄,剩下的(1?α)的隱層神經元依然需要在每一種隨機組合中有好的表現。這就需要每一個神經元在檢測模式的時候能夠更少地依賴其他神經元。

我們也可以將Dropout認為是一種將隨機噪聲加入訓練數據的手段。因為每一個較高層的神經元都會從較低層中神經元的某種隨機組合那里接收輸入。因此,即使送進深層神經網絡的輸入相同,每一個神經元接收到的激勵也是不同的。在應用Dropout后,深層神經網絡需要浪費一些權重來消除引入的隨機噪聲產生的影響。或者說事實上,Dropout通過犧牲深層神經網絡的容量(Capacity)來得到更一般化的模型結果。

當一個隱層神經元被丟棄時,它的激活值被設置成0,所以誤差信號不會經過它。這意味著除了隨機的Dropout操作,對訓練算法不需要進行任何改變就可以實現Dropout。然而,在測試階段,我們并不會去隨機生成每一個隱層神經元的組合,而是使用所有組合的平均情況。我們只需要簡單地在與Dropout訓練有關的所有權重上乘以(1?α),就可以像使用一個正常的深層神經網絡模型(即沒有應用Dropout的模型)一樣使用新的模型。所以,Dropout可以被解讀為一種在深層神經網絡框架下有效進行模型(幾何(Geometric))平均的方式(與Bagging類似)。

另一種稍微不一樣的實現方式是在訓練過程中,在神經元被丟棄之前將每一個激活值都除以(1?α)。這樣,權重就自動乘以(1?α)。因此,模型在測試階段便不再需要進行權重補償。應用這種方法的另一個好處是我們可以在不同訓練的輪次中使用不同的丟棄比例(Dropout Rate)。經驗表明,通常在取丟棄比例為0.1~0.2時,識別率會有提升。而如果使用將初始的丟棄比例設置得比較大(例如0.5),然后漸漸減小丟棄比例的更智能的訓練流程的話,那么識別的表現可以得到更進一步提高。原因在于使用較大的丟棄比例訓練出的模型,可以被看作使用較小丟棄比例的模型的種子模型。既然結合較大丟棄比例的目標函數更平滑,那么它就更不可能陷入一個非常壞的局部最優解中。

在Dropout訓練階段,我們需要重復對每一層激活取樣得到一個隨機的子集。這必將嚴重拖慢訓練過程。為此,隨機數生成和取樣代碼的運行速度成為縮減訓練時間的決定性因素。當然,也可以選擇文獻[188]中提出的一個快速丟棄訓練算法。這個算法的核心思想是從近似的高斯模型中采樣或直接積分,而不是進行蒙特卡羅采樣。這種近似方法可由中心極限法則和實際經驗證明其有效性,它可以帶來顯著的速度提升和更好的穩定性。該方法也可以擴展到其他類型的噪聲和變換。

4.3.5 批規范化

在數據預處理章節中提到過對輸入數據進行標準化有助于神經網絡的訓練,這個操作一般是在訓練網絡之前基于所有數據計算得到的統計量進行的全局操作。同樣的思想可以被動態地運用于神經網絡訓練過程中。

批規范化(Batch normalization, BN)[189]的提出是為了改善深層神經網絡不容易訓練的問題,具體來講,是為了解決網絡訓練過程中遇到的內部協變量偏移(Internal Covariate Shift, ICF)的問題。ICF指神經網絡每一層的輸入分布在訓練過程中都會不斷變化,從而造成網絡的非線性激活逐漸飽和,使得網絡難以得到有效訓練。究其根本,批規范化有效的原因是它在一定程度上防止了“梯度彌散”。

BN的算法實現非常直接,可以表示為算法4.3。

可以看到相對于傳統使用的數據規范化方法,BN有如下兩個特點:

1.統計量的計算是以mini-batch為單位而不是在所有數據上進行的;

2.引入了兩個額外的超參數γβ,用來對數據進一步地縮放和偏移(scale and shift)。

以mini-batch為單位計算均值和方差使得在網絡訓練過程中可以動態地調整各個隱層輸出的分布,跟現在主流的基于mini-batch的網絡優化方法比較兼容,同時可能帶來的問題是,如果batch size比較小,則會造成統計量估計不穩定。而γβ的引入使得網絡可以還原之前的輸入,從而保證了加入BN操作后的網絡保持原先的容量(capacity)。

總體來講,采用批規范化可以在一定程度上解決網絡訓練中常遇到的梯度問題,從而使訓練深度網絡變得更穩定,同時可以加速網絡訓練過程。

4.3.6 批量塊大小的選擇

參數更新公式(4.14)和公式(4.15)需要從訓練樣本的一個批量集合(batch)中進行經驗的梯度計算。而對批量大小的選擇同時會影響收斂速度和模型結果。

最簡單的批量選擇是使用整個訓練集。如果我們的唯一目標就是最小化訓練集上的損失,利用整個訓練集的梯度估計得到的將是真實的梯度(也就是說方差為0)。即使我們的目標是優化期望的損失,利用整個訓練集進行梯度估計仍然比利用任何其子集得到的方差都要小。這種方法經常被稱為批量訓練(Batch Training)。它有如下優勢:首先,批量訓練的收斂性是眾所周知的;其次,如共軛梯度和L-BFGS[190]等很多加速技術在批量訓練中表現最好;最后,批量訓練可以很容易地在多個計算機間并行。但是,批量訓練需要在模型參數更新前遍歷整個數據集,這對很多大規模的問題來說,即使可以應用并行技術,也是很低效的。

作為另一種選擇,我們可以使用隨機梯度下降(Stoachstic Gradient Decent,SGD)[191]技術,這在機器學習領域中也被稱為在線學習。SGD根據從單個訓練樣本估計得到的梯度來更新模型參數。如果樣本點是獨立同分布的(這一點很容易保證,只要從訓練集中按照均勻分布抽取樣本即可),則可以證明

換句話說,從單個樣本點進行的梯度估計是一個對整個訓練集的無偏估計。然而,估計的方差為

除非所有的樣本都是相同的,也即?Jt(W, b; o, y)=E(?Jt(W, b; o, y))(為簡單起見,我們定義,否則上式取值總是非零的。因為上述算子對梯度的估計是有噪聲的,所以模型參數可能不會在每輪迭代中都嚴格按照梯度變化。這看起來是不利之處,實則是SGD算法與批量訓練算法相比的一個重要優勢。這是因為DNN是高度非線性的,并且是非凸的,目標函數包含很多局部最優,其中不乏很糟的情況。在批量訓練中,無論模型參數初始化在哪一個盆地(Basin)里,都將找到其最低點。這會導致最終模型估計將高度依賴初始模型。然而由于SGD算法的梯度估計帶噪聲,使它可以跳出不好的局部最優,進入一個更好的盆地里。這個性質類似于模擬退火[192]中讓模型參數可以向局部次優而全局較優的方向移動的做法。

SGD通常比批量訓練快得多,尤其表現在大數據集上。這是以下原因導致的:首先,通常在大數據集中,樣例有很多是相似或重復的,用整個數據集估計梯度會造成計算力的浪費。其次,也是更重要的一點是,在SGD訓練中,每看到一個樣本就可以迅速更新參數,新的梯度不是基于舊的模型,而是基于新的模型估計得到的。這使得我們能夠更快速地繼續尋找最優模型。

然而,即使在同一臺計算機上,SGD算法也是難以并行化的。而且,由于對梯度的估計存在噪聲,它不能完全收斂至局部最低點,而是在最低點附近浮動。浮動的程度取決于學習率和梯度估計方差的大小。即使這樣的浮動有時可以減小過擬合的程度,也并不是在各種情況下都令人滿意。

一個基于批量訓練和SGD算法的折中方案是“小批量”(Minibatch)訓練。小批量訓練會從訓練樣本中抽出一小組數據并基于此估計梯度。很容易證明,小批量的梯度估計也是無偏的,而且其估計的方差比SGD算法要小。小批量訓練可以讓我們比較容易地在批量內部進行并行計算,使得它可以比SGD更快地收斂。既然我們在訓練的早期階段比較傾向于較大的梯度估計方差來快速跳出不好的局部最優,在訓練的后期使用較小的方差來落在最低點,那么我們可以在最初選用數量較少的批量,然后換用數量較多的批量。在語音識別任務中,如果我們在早期使用數量為64到256的樣本,而在后期換用數量為1024到8096的樣本,可以學習得到一個更好的模型。而在訓練一個更深的網絡時,在最初階段選用一個數量更少的批量可以得到更好的結果。批量的數量多少可以根據梯度估計方差自動決定,也可以在每一輪通過搜索樣本的一個小子集來決定[193, 194]

4.3.7 取樣隨機化

取樣隨機化(Sample Randomization)與批量訓練是無關的,因為所有的樣本都會被用來估計梯度。而在隨機梯度下降和小批量訓練中,取樣隨機化是十分重要的。這是由于為了得到對梯度的無偏估計,樣本必須是獨立同分布的。如果訓練過程中連續的一些樣本不是隨機從訓練集中取出的(例如,所有樣本都來自同一個說話人),模型的參數將可能會沿著一個方向偏移得太多。

假設整個訓練集都可以被加載進內存,取樣隨機化將變得很容易。只需要對索引數組進行排列,然后根據排列后的索引數組一個一個地抽取樣本即可。索引數組一般比特征要小得多,所以這樣做會比排列特征向量本身要輕量得多。這在每一輪次的完整數據訓練都需要隨機順序不同的情況下尤甚。這樣做也保證了每個樣本在每一輪次的完整數據訓練中都只被送到訓練算法中一次,而不會影響到數據分布。這樣的性質可以進一步保證學習出的模型的一致性。

如果我們使用像語音識別領域中那樣較大規模的訓練集,那么整個訓練集將不可能被載入內存。在這種情況下,我們采用滾動窗的方式每次加載一大塊數據(通常為24~48小時的語音或者8.6M到17.2M個樣本)進內存,然后在窗內隨機取樣。如果訓練數據的來源不同(例如來自不同的語言),則可以在將數據送進深層神經網絡訓練工具之前對音頻樣本列表文件進行隨機化。

4.3.8 慣性系數

眾所周知,如果模型更新是基于之前的所有梯度(更加全局的視野),而不是僅基于當前的梯度(局部視野),收斂速度是可以被提升的。使用這個結論的一個例子是Nesterov加速梯度算法(Nesterov’s Accelerated Gradient Algorithm)[195],它已經被證明在滿足凸條件下是最優的。在DNN訓練中,這樣的效果通常采用一個簡單的技巧——慣性系數來達到。當應用慣性系數時,公式(4.16)和公式(4.17)變成

其中,ρ是慣性系數,在應用SGD或者小批量訓練的條件下,其取值通常為0.9~0.99[3]。慣性系數會使參數更新變得平滑,還能減少梯度估計的方差。在實踐中,反向傳播算法在誤差表面(Error Surface)有一個非常窄的極小點的時候,通常會出現參數估計不斷擺動的問題,而慣性系數的使用可以有效地緩解此問題,并因此加速訓練。

上述慣性系數的定義在批量大小相同時可以表現得很好。而有的時候我們會想要使用可變的批量大小。例如,我們會希望類似在4.3.6節中討論的那樣,最初使用較小的批量,而在后面使用較大的批量。在第15章將要討論的序列鑒別性訓練中,每一個批量可能因為文本長度不同而使用不同的大小。在這些情況下,上述對慣性系數的定義便不再可用。既然慣性系數可以被考慮成一種有限脈沖響應(Finite Impulse Response,FIR)濾波器,我們可以定義在相同層面下的慣性系數為ρs,并推出在不同批量大小Mb的條件下的慣性系數取值為

ρ=exp(Mbρs)  (4.48)

4.3.9 學習率和停止準則

訓練DNN中的一個難點是選擇合適的學習策略。理論顯示,當學習率按照如下公式設置時,SGD能夠漸進收斂[191]

其中,t是當前樣本的數量,c是一個常量。實際上,這種學習率將很快變得很小,導致這種衰減策略收斂很慢。

請注意,學習率和批量大小的綜合作用會最終影響學習行為。像我們在4.3.6節中討論的那樣,我們在開始幾次完整的數據迭代中用更小的批量數量,在后面的數據中使用更大的批量數量。既然批量大小是一個變量,我們可以定義每一幀的學習率為

并將模型更新公式變為

與原始的學習率定義相比,上述改變也減少了一次矩陣除法。

使用這個新的更新公式時,我們可以憑經驗確定學習策略。首先確定批量大小及一個大的學習率。然后訓練數百個小批量數據組,這在多核CPU或GPU上通常要花費數分鐘,我們在這些小批量訓練上監視訓練準則變化,然后減少批量中的數據數量、學習率或者兩個同時減小,以使?sMb結果減半,直到訓練準則獲得明顯的改善。然后把學習率除以2作為下一個完整數據迭代輪次的初始學習率。我們會運行一個較大的訓練數據子集,把?sMb的值增加四到八倍。請注意,這個階段的模型參數已經被調整到一個相對好的位置,因此增加?sMb將不會導致發散,而會提高訓練速度。這個調整過程在文獻[193]中的模型已經可以自動進行。

我們發現兩個有用的確定其余學習率的策略。第1個策略是如果觀察到訓練準則在大的訓練子集或開發集上有波動的情況,就把批量大小加倍,并將學習率減少1/4,同時,在學習率小于一個閾值或者整體數據的訓練迭代次數已經達到預設次數的時候停止訓練。第2個策略是在訓練準則波動時減少學習率到一個很小的數,并在訓練集或開發集上再次出現訓練準則波動時停止訓練。對于從頭開始訓練的語音識別任務,我們發現在實際情況下,?s對深層和淺層網絡分別取值0.8e?4和0.3e?3,在第2階段取值1.25e?2,在第3階段取值0.8e?6,效果很好。超參數的搜索也可以自動使用隨機搜索技術[185]或者貝葉斯優化技術[196]

4.3.10 網絡結構

網絡結構可以被認為是另外需要確定的參數。既然每層都可以被認為是前一層的特征抽取器,那么每層節點的數量都應該足夠大以獲取本質的模式。這在模型底層是特別重要的,因為開始層的特征變化比其他層更大,它需要比其他層更多的節點來模擬特征模式。然而,如果某層節點太大,它容易在訓練數據上過擬合。一般來說,寬且淺的模型容易過擬合,深且窄的模型容易欠擬合。事實上,如果有一層很小(通常被稱為瓶頸),模型性能將有重大的下降,特別是當瓶頸層接近輸入層時。如果每層都有相同數量的節點,則添加更多的層可能把模型從過擬合轉為欠擬合。這是因為附加的層對模型參數施加了額外的限制。由這個現象,我們可以先在只有一個隱層的神經網絡上優化每層的節點個數,然后疊加更多的相同節點個數的隱層。在語音識別任務中,我們發現擁有5~7層,每層擁有1000~3000個節點的DNN效果很好。相對一個窄且淺的模型,通常在一個寬且深的模型上更容易找到一個好的配置。這是因為在寬且深的模型上有更多性能相似的局部最優點。

4.3.11 可復現性與可重啟性

在DNN訓練中,模型參數都是被隨機初始化的,而且模型樣本都是以隨機的順序進入訓練器的。這不可避免地增加了我們對訓練結果可復現性的擔心。如果我們的目標是對比兩個算法或者模型,我們可以多次運行實驗,每次用一個新的隨機種子并記錄平均的結果及標準的誤差。但在一些其他情況下,我們可能要求在運行兩次訓練后獲得恰好完全一樣的模型及測試結果。這可以通過在模型初始化及訓練樣本隨機化時使用相同的隨機種子來實現。

當訓練集很大的時候,通常需要在中間停止訓練并在最后的檢查點繼續訓練。這時,我們需要在訓練工具中嵌入一些機制,來保證從檢查點重新開始將產生和訓練沒有中斷時完全一樣的結果。一個簡單的訣竅是在檢查點的文件中保存所有必要的信息,包括模型參數、當前隨機數、參數梯度、慣性系數等。另一個需要保存更少數據的有效方法是在每個檢查點都重置所有的學習參數。

[1]深層神經網絡這個術語首次在語音識別中出現是在文獻[13] 中。在文獻[12] 中,早期使用的術語“深度置信網絡”(Deep Belief Network)被更加合適的術語“深層神經網絡”(Deep Neural Network)所代替。深層神經網絡這個術語最開始用來指代多隱層感知器,然后被延伸成有深層結構的任意神經網絡。

[2]雖然反向傳播這個術語是在1986 年的文獻[47]中才被確定的,但是作為一個多階段動態系統最優化方法,這個算法的產生其實可以追溯到1969 年的文獻[184]。

[3]在實踐中,我們發現如果在第一輪訓練之后再應用慣性系數,則可以得到更好的結果。

主站蜘蛛池模板: 城固县| 城口县| 沈阳市| 新龙县| 清水河县| 朝阳市| 丽水市| 吉安市| 贵港市| 丹巴县| 靖西县| 永顺县| 万州区| 柯坪县| 南昌县| 开封县| 阜阳市| 黄浦区| 三江| 梅州市| 邹平县| 繁昌县| 枞阳县| 射阳县| 扶风县| 宁晋县| 阿拉尔市| 英超| 舞钢市| 黄陵县| 泸西县| 姜堰市| 广饶县| 乐亭县| 团风县| 额敏县| 敦化市| 南充市| 蓬莱市| 西平县| 麻江县|