切換
舊版
前往
大廳
主題

Deep Learning Note (Topic_2)

Hiteku | 2019-10-14 21:00:12 | 巴幣 2 | 人氣 451


1-1 訓練/開發/測試 集(sets)
在訓練模型時,通常會將整個資料分成三個部分:
    • 訓練集(Train Set)
    • 開發集(Dev Set)又稱保留的交叉驗證集(Hold-out Cross Validation Set)
    • 測試集(Test Set)

上一個時代:通常將所有資料以6/2/2的比例分配。若無開發集,則按7/3的比例進行拆分。
大數據時代:因為樣本數大幅增多,比例則變更為98/1/1、99.5/0.25/0.25或99.5/0.4/0.1。

訓練流程通常如下:
    1. 選擇演算法/超參數等條件。
    2. 使用訓練集對模型進行訓練。
    3. 使用開發集對訓練得到的模型進行評估。
    4. 更換演算法/超參數等條件,return Step.2。直到找到最佳的模型再往下。
    5. 使用測試集對最終得到的模型進行評估,得到對其性能的無偏估計。

通過劃分訓練集、開發集和測試集,可以更快速地對模型進行迭代和選擇,也有助於測量和分析模型的偏差(Bias)與方差(Variance),以便選擇合適的改進方法。

1-2 偏差和方差
偏差(Bias)描述的是學習算法的預測值與真實值之間的誤差,它是由錯誤的預測帶來的。
方差(Variance)描述的是預測值的變化範圍,它是由算法對資料集波動的敏感性帶來的。

▲ 上圖展示了高偏差恰當的偏差與方差高方差三種情況。

高偏差:模型幾乎是一直線,產生大量的錯誤預測,稱低度擬合(Under Fitting)於資料。
高方差:模型完全遵循訓練資料的形狀,一旦資料集發生變化,模型一般化(Generalize)的能力就不是很好,稱過度擬合(Over Fitting)於資料。

雖然從圖可以清楚的分辨,但對於更高維的場景,無法可視化,需通過其他指標來進行判斷。
判斷偏差方差問題的兩個主要指標是訓練集開發集錯誤。
通過比較訓練集開發集錯誤之間的差距,就能評估模型一般化的能力,判斷方差問題。

1-3 基本指南
高偏差:可嘗試更大的網路、訓練更長時間、優化演算法等方法。
高方差:可嘗試獲取更多資料、使用正規化(Regularization)等方法。
(有時選擇不同的神經網絡架構也有利於解決高偏差高方差的問題)

1-4 正規化
解決過度擬合問題通常首選使用正規化,因為獲取更多資料可能會增加成本。
最常見的為L2正規化,即成本函數後額外增加那串。
邏輯回歸:
神經網路:
每次更新W^[l]時,該正規化都讓W^[l]乘一個小於一的係數(1–αλ/m),使W^[l]按比例缩小。
因此L2正規化又稱為權重衰減(Weight Decay)

1-5 正規化為什麼能避免過度擬合?
正規化可以使權重參數W趨於零,從而消除隱藏元素(hidden units)的影響。
使其構造變簡單,而不是複雜的非線性函數,因此不易過度擬合。

1-6 Dropout介紹
這也是一種有效的正規化方法。首先對於網絡的每一層,以一個特定的機率隨機移除一些節點。例如對於每一層,以0.5的機率移除其中的節點,此時得到的結果可能如下圖所示:
這樣相當於每個樣本的訓練都使用了縮水的網路,計算量降低,也有正規化的效果。
缺點是,這樣要提供更多超參數以使用交叉驗證進行搜索。

1-7 了解Dropout
Dropout可以看做是一種自適應的L2正規化。不過使用時成本函數不再是明確定義的。因為每次迭代都會隨機移除不同的節點,成本函數不再能真實地反映整個模型的性能。
在Debug時,可以先別用Dropout,例如節點保留機率設為1。確認成本函數的值隨迭代次數的增加而單調下降,算法及其實現沒有問題,可以收斂;然後再啟用Dropout解決過擬合問題。

1-8 其他正規化方法
獲取更多資料也是解決過度擬合的有效途徑,但成本會增加。資料擴充(Data Augmentation)就是一個可以嘗試的方法,從現有資料中生成新的資料。例如可以將現有訓練圖片通過翻轉、裁剪等方式,生成新的圖片用於訓練。這樣做的成本很低,並能在一定程度上降低過度擬合。

提前終止(Early Stopping)指的是,在梯度下降的過程中,找到合適的開發集錯誤率和訓練集錯誤率(或成本函數),在該次循環處終止訓練。
因為通常會把權重W初始化為接近0的隨機數。隨著迭代次數提升,W會逐漸變大。提前終止訓練,可以得到大小適中的W,此時W的F-範數也適中,類似L2正規化,能避免過度擬合。
優點:只需進行一次梯度下降過程,就相當於比較了不同大小W的影響,無額外的超參數。
缺點:相當於嘗試一次性解決優化成本函數與解決過度擬合兩個問題,解決其中一個問題的同時會影響到另一個問題,帶來更大的複雜度。

1-9 標準化輸入
訓練神經網絡時,提高學習速度的一種技術就是對輸入進行標準化。
由左至右,將圖一的資料減去平均值為圖二,再除以方差(變異數)為圖三。x := x-μ/σ
若使用上述標準化方法處理訓練資料,那麼也要使用相同的方式來縮放訓練集與測試集。
如上圖,若輸入特徵的範圍差距很大,例如X1為1到1000,X2為0到1,則相應成本函數的形狀也會非常不對稱,需使用較小的學習率,梯度下降可能要經過來回震盪才能到達最佳點。
如上圖,進行正規化之後,各輸入參數都設為0均值與方差1,成本函數的形狀會更對稱,可以使用較大的學習率,梯度下降可以快速抵達最佳點。

1-10 梯度消失、爆炸
梯度消失Data Gradient Vanishing)和梯度爆炸(Gradient Exploding)是指在訓練非常深度的網路時,參數的導數變得非常大或非常小,這使得訓練變得難以進行下去。
 
若權重W大於單位矩陣,如1.5。再加上網路L很深,則ŷ將指數性增大而爆炸。
反之,ŷ將指數性遞減而消失。

1-11 權重初始化
合理選擇網路權重的隨機初始化,可以部分解決前面提到的消失與爆炸問題。
每種權重初始化效果不一:
使用tanh激勵函數時效果較佳。
使用RuLU激勵函數時效果較佳。
此外還有等...
對權重初始化方式也可以作為一個超參數進行調整,比如調整分母上的係數等。透過權重初始化可以保證在訓練初期各層的輸出都比較穩定,在一定程度上解決了梯度爆炸或消失的問題。

1-12、1-13 梯度檢查
通過梯度檢查(Gradient Checking)可以檢驗梯度下降實現的正確性,在反向傳播算法中應用有利於儘早發現實現中的錯誤。

為了求得某點的切線斜率,我們分別往上(+ε)跟往下(-ε),ε可以想像為一個極小的變數。
取兩個極近的點,並透過取這兩點的斜率來得到近似於切線斜率的數值k。
最後再透過確認原本偏導的數值與k是否相近來確信反向傳播算法是否運作正確。
當然這是二維的計算方式,更高維的如下:
即變動部分的參數θ,代入函式後得到結果:J(θ),再將結果相減來得出此參數的偏導項。

梯度檢查是一個計算量很大的Debug工具,不要在訓練中使用。若檢查發現到問題,可以透過找出相差很大的值,並進一步找到這些值對應哪一層的什麼參數,以此定位並縮小問題範圍。

1-14 梯度檢查筆記
若使用了正規化,則在進行梯度檢查時,J(θ)中也要包含正規化項。
若使用了Dropout,則難以透過成本函數評估整個網絡的性能,則無法使用梯度檢查。不過能先別用Dropout,通過梯度檢查檢驗實現的正確性,再啟用Dropout;或者固定Dropout移除的節點,在這個固定的網絡上進行訓練與梯度檢查。

可以在網路初始化參數後以及訓練一段時間後分別進行梯度檢查,因為網路的參數通常會隨機初始化為較小的數值,實現中有一些小問題不容易暴露出來,雖然此時梯度下降檢查無誤,但隨著訓練的進行,參數逐漸變大,再次進行梯度檢查就會發現問題。

2-1、2-2 小批量梯度下降
批量梯度下降(左),成本函數的值會隨迭代次數單調遞減。而小批量梯度下降(右),成本函數的值不一定會隨著迭代的小批量數量的增加而單調遞減,而是會出現一些波動。
因為每一個最小批的資料不同,對某一個小批量的優化不一定適用於下一個小批量,但整體趨勢上,成本函數還是逐漸下降的。

在實際應用中,需選擇適中的最小批量,既能從向量化中得到性能提升,又能提高迭代與梯度下降的速度,以得到最快的學習速度。

若訓練集較小,例如樣本小於2000個,則直接使用批量梯度下降
若訓練集較大,小批量的典型值為64到512,通常選擇2的指數,即 64、128、256、512。
此外要確保一個最小批的資料能被記憶體存儲,避免在計算中發生硬碟讀寫。
小批量大小也是一個超參數,可以通過測試不同的大小,找到使梯度下降效率最高的數值。

2-3 指數加權平均
前1/(1-β)天真實溫度的平均值,例如上述β為0.9,紅線表示為前10天的真實溫度平均值。
若β為0.98,則擬合曲線為前50天的真實溫度平均值,如綠線。
若β為0.5,則擬合曲線為前2天的真實溫度平均值,如黃線。
由上述所示,β是一個很重要的參數,它決定了擬合曲線是平滑的還是粗糙的。

2-4 了解指數加權平均
指數加權平均本質上就是用來計算平均數的手段。
首先初始化Vθ=0,然後每次讀取新的θt代入式子Vθ=βVθ+(1-β)θt中去更新Vθ
直接計算平均數需要保存所有最近的資料,計算效率不高。
而指數加權移動平均雖然可能不是最好的計算平均數的方法,但是從計算效率與記憶體使用情況上來看,在實際情況中更樂於使用後者去代替平均值的計算。

2-5 偏差校正
上面介紹了當β為0.98時,擬合曲線應該是綠色那條,但這樣不太準確。因為將V0初始化為0的條件下,擬合曲線應該是紫色那條。
可以使用上圖中右側式子進行修正,即Vt/(1-β^t)。當t=2時,V2就能透過該式進行修正。

不過在實際情況中,有些人在訓練中並不在乎前部分曲線的擬合情況,而是直接使用未修正的。這樣也可以,只是要明白偏差校正的意義,就是為了讓平均數計算得更準確。

2-6 動量梯度下降
一句話概括:計算梯度的指數加權平均值,然後使用該梯度更新權重。
梯度下降:會經過多次的反覆震盪直至達到最佳點,如藍線所示。
動量梯度下降:使用偏導的指數加權平均來更新參數,能讓梯度下降更平緩,如紅線所示。
對於每一次迭代,先計算參數的偏導 dW、db,後計算兩者的指數加權平均 VdW、Vdb,並使用 VdW 與 Vdb 來更新參數 W 和 b。即在第 t 次循環,計算當前小批量的dW和db:
VdW: = β VdW + (1 – β) dW
Vdb: = β Vdb + (1 – β) db
W: = W – α VdW
b : = b – α Vdb
指數加權平均有兩個超參數,學習率 α 和指數加權平均的參數 β。通常取 β= 0.9,相當於平均最近的10次迭代,其值已經預熱,因此不會在計算指數加權平均時進行偏差修正,即計算:

2-7 RMSprop
Root Mean Square Prop,其計算過程為:
在第 t 次循環,計算當前小批量的dW和db。
以上述圖藍線為例,假設圖中水平方向表示參數 W,垂直方向表示參數 b,由圖可見,在 b 的方向存在震盪,我們希望降低 b 方向上的速度,加快 W 方向上的速度。

對應於上面RMSprop的計算過程:
若水平方向的變化小,即 dW 小,則 SdW 小,W 的更新較大,有利加快 W 方向前進;
若垂直方向的變化大,即 db 大,則 Sdb 大,b 的更新較小,有利減慢 b方向的前進。

由此就達到了目的,此時可以選擇較大的學習率,而不必擔心在垂直方向上出現發散。

在實現中,SdW 和 Sdb 可能很小,為了保證數值穩定性,會在計算其平方根時加上一個很小的值 ϵ,例如 10^-8,防止分母接近於零的情況,即:

2-8 Adam優化演算法
Adaptive Moment Estimation,它結合了動量與RMSprop,適用性很強,對各種結構的網絡都具有很好的性能,其過程為:
初始化VdW = 0、SdW = 0、Vdb = 0、Sdb = 0
在第 t 次循環,計算當前小批量的dW和db。
Adam的典型實現中會對指數加權平均進行了誤差修正。
V與S分別代表了梯度下降過程中的兩個moment,即Adam名稱中的m。
Adam優化演算法中包含不少的超參數:
    • 學習率 α:通常需要調優。
    • 指數加權平均參數 β1:通常取 0.9。
    • 數加權平均參數 β2:Adam 的作者建議取 0.999。
    • ϵ: Adam 的作者建議取 10^-8,這個參數對性能沒什麼影響。
在實際訓練中,通常選擇默認的 β1、β2、ϵ,並嘗試一系列的 α,只對 α 進行調優。

2-9 學習率衰減
學習率衰減(Learning Rate Decay)指的是在訓練過程中逐漸減小學習率 α。
在訓練的初始階段,可以使用較大的學習率,提高學習速度,但隨著訓練的進行,梯度下降逐漸接近最佳點,較大的學習率可能導致梯度下降越過最佳點,在附近震盪不會收斂。因此需要隨著訓練的進行,逐漸降低學習率,使得梯度下降能夠收斂到一個較小的範圍。

一種學習率衰減的方法是:
decay_rate為衰減率,是一個需要調優的超參數;
epoch_num為當前迭代的Epoch數量,一個Epoch為完整遍歷乙次的訓練集;
α0為初始學習率。
還可以使用指數衰減的方式:
β是一個小於1的數,例如0.95。
常用的衰減方式還有:
以及:
上面兩式中的k是一個常數,minibatch_num是迭代的小批量數量。

此外還能使用離散的學習率,即為不同的迭代次數區間設置不同的學習率。
有時若訓練的模型數量不多,且訓練時間較長,也可以在訓練過程中手動調整學習率。

2-10 局部最佳化問題
在深度學習領域早期,人們往往會擔心優化演算法陷入了不好的局部最佳。如下圖所示,有很多局部最佳點(藍點),優化演算法很容易陷入局部最佳,而無法抵達全局最佳點(紅點)
不過上圖為方便理解所繪的,實際上會有非常多的參數,例如有20000個參數。對於通過梯度下降找到的梯度為0的點,如果該點是一個局部最佳點,則要求所有20000個參數在該處都是凹函數,且得到極小值,這是一個機率很小的事件。
現實情況是,透過梯度下降找到的點,一些參數在該處是凹函數,有極小值,另一些函數在該處是凸函數,有極大值。稱為 鞍點(Saddle Point)
在訓練過程中,停滯區(Plateau)會影響學習的速度。指的是偏導數為0的一大片區域。
如下圖所示,由於梯度很小,梯度下降算法在停滯區內緩慢移動。
一些像Adam更複雜的演算法,可以加速在停滯區內的移動速度,儘早脫離停滯區的影響。
3-1 調優過程
神經網絡的訓練涉及眾多的超參數,按照調整的優先級,可以劃分如下:
  • 第一優先:學習率 α。
  • 第二優先:動量梯度下降參數 β隱藏單元數量、小批量梯度下降中小批量的大小 ...等。
  • 第三優先:神經網絡的層數、學習率衰減。
對於Adam演算法的超參數,通常使用默認值不會調優:β1= 0.9、β2 = 0.999、ϵ = 10^-8。

早期機器學習,通常使用網格來對超參數進行取樣,使用5*5的網格,等間距的選擇出25個超參數組合,從中選出最好的一組。

使用網格對超參數取樣的方法適用於超參數較少的場景。在深度學習時代,通常會隨機選擇超參數,然後依次嘗試這些參數。
我們很難事先知道哪個超參數對模型的影響更大,隨機選擇可以得到更多樣化的參數組合。
舉例來說:超參數1是學習率α,超參數2是Adam算法中的ϵ。α會對模型有顯著的影響,而ϵ對模型幾乎沒有影響。若使用等間距網格,實際上只會有縱向的5個不同的α的值會對模型產生影響,雖然有25個超參數組合,實際只會得到5個不同的結果。而隨機選擇超參數,25個超參數組合的α都不同,能得到更多的結果,更容易找到最佳的參數值。

選擇超參數時,通常會使用由粗到精(Coarse to Fine)的選擇過程。在一輪隨機採樣後,得到一系列參數(黑點),透過測試發現了幾個參數具有較好的性能(三個圈選處),接下來就縮小搜索範圍(藍色框框),圍繞性能較好的參數進行更多的採樣(藍點),如此反覆。

3-2 使用合適的比例選取超參數
上述所說的隨機選擇超參數,並非全在有效範圍內隨機均勻取值,而是找到合適的比例。
若使用均勻取值的話,那麼0.1~1的機率將佔90%,而0.001~0.1的範圍只佔了10%。
這就十分不合理了,所以我們使用對數標尺來尋找超參數。

例如對β取值,它的範圍是0.9~0.999。將其換成了1−β的形式並對數處理,在[-3, -1]裡取平均即可。透過這樣就能實現0.9~0.99與0.99~0.999取值機率一樣的情況。
因為β是指數加權平均,所以一定要用對數處理一下,才能達到真正的平均。

3-3 Pandas v.s. Caviar
隨著環境的變化,最優的超參數不是一成不變的,即便在某一個時間找到了最好的參數,隨著時間的推移,環境發生改變,例如硬體升級、計算環境發生變化 ...等,一些參數可能無法再發揮原有的作用。因此每隔一段時間,像是幾個月就需要對超參數進行重新搜索,保持參數的配置能達到最優的性能。

常見的超參數的搜索方式主要可以分為兩種:
  • 悉心調優一個模型,適用於資料量很大或計算資源不足,只能同時訓練一個或少量幾個模型的情況,此時需要在模型的訓練過程中手動調整各項參數。
  • 並行訓練多個模型,每個模型使用不同的參數,訓練一段時間後,檢查各個模型的學習情況,選擇最好的那個。
前者就像熊貓照顧孩子,熊貓產子很少,每個孩子都會得到悉心的照料,以保證其存活。
後者像是魚類產子,某些魚類在交配季節會產出上億的卵,但不怎麼照料,存活率很低。

以上兩種方式的選擇,取決於可用的計算資源計算複雜度。如果計算能力足夠,可以並行訓練多個模型從中選擇。如果資料量非常大、模型非常複雜,例如在線廣告、計算機視覺領域的一些場景,通常需要悉心照料單個模型的訓練。

3-4 標準化激勵值
前面有提到標準化有助於提高學習速度。在神經網路中,對其中各層的激勵值進行標準化,也有利於提高下一層參數的學習速度,這就是批量標準化所做的。
大部分時候都是對激勵函數的輸入進行標準化,其批量標準化的計算過程為:
批量標準化的好處就是它適用的不僅是輸入層,同樣也適用於隱藏層。

3-5 實現批量標準化
批量標準化通常應用於小批量梯度下降,也就是將批量分成許多小批量並按上述步驟計算。

需要注意的是,上圖的下半部分Z=Wa+b。若我們對Z進行標準化,那麼得到的結果無論b是多少,都要被減去。因為在計算標準化的過程中要計算z的平均值,然後再減去平均值。所以在小批量中增加任何常數,值都不會發生改變。因此若進行標準化的話,可以不寫常數b。
最後我們用這個公式,轉而就用γ和β來控制了。轉而用β,說明控制參數會影響偏置條件。

除了小批量梯度下降,批量標準化也可用於動量梯度下降、RMSprop或Adam演算法,只需要修改反向傳播時對各參數的更新方式。

3-6 為何批量標準化有效?
批量標準化起作用的一個原因是透過標準化輸入特徵值x可以獲得範圍內的值,起到加速學習的作用,不過還有更深層的原因。就是有助於解決Covariate Shift問題,即網路輸入的分佈發生後,會對網路性能產生影響的現象。

例如要訓練一個分類器用於識別貓的圖片,訓練時只是用了黑貓的圖片,模型能夠很好地分辨黑貓,此時使用其他顏色的貓來測試這個分類器,發現性能下降了。
模型學習了x到y的映射,此時若x的分佈發生了改變,那麼可能需要重新訓練了。

假設一個神經網路有5層,我們只看第3層的話,希望學出w與b來很好的擬合將輸入a映射到y。然而事實上是前面還有兩層w與b,若前兩層的w和b發生了變化,那麼輸入的a也會發生變化。a在不斷變化過程中,就是一個covariate shift問題。

批量標準化做的,就是減少這些隱藏層值分佈變化數量,即不論各層的輸出如何變化,下一層的輸入都具有穩定的平均值和方差。

批量標準化還會有一點正規化的效果。在批量標準化中,每一個小批量都使用該批量的平均值與方差進行了標準化,相比整個資料集的平均值與方差,每個小批量的平均值與方差都有一定的噪聲,減去平均值時引入了加性噪聲,除以方差時引入了乘性噪聲。這些噪聲進而被引入到了各層的激勵值中,由此產生了少量的的正規化效果,使得模型更難以過度擬合

選擇較大的小批量大小可以減小批量平均值與方差的噪聲,從而降低正規化效果。反之可以提高正規化效果。但由於小批量平均值與方差的噪聲很小,所以只有少量的正規化效果。

3-7 測試時的批量標準化
批量標準化將資料以小批量的形式進行處理,但在測試時可能需要對每個樣本逐一處理。
左側是在訓練集中的每個小批量所用的公式,而在測試集時不能這麼做。
在批量標準化的典型實現中,使用各個小批量的平均值與方差的指數加權平均來估計測試中使用的平均值與方差。

3-8 Softmax回歸
其能在多分類中識別是哪一個分類,而不只是二元分類。
這是Softmax在網路沒有隱藏層的情況下做的回歸分類。

3-9 Softmax分類器
這是定義成本函數的方式。因為對於真實的值而言,例如說是cat,那麼對應的y值是1,而ŷ是一個機率值,於是損失函數中y就不起作用。要保證損失函數盡可能的小,就需要y的預測值盡可能的大(雖然不可能大過1),所以這麼寫損失函數還是有一定的實際意義的。

Softmax輸出層實現梯度下降如下圖所示。
反向傳播的關鍵步驟是對最後一層的z進行求導操作:dz^[L] = ŷ − y。

3-10 深度學習框架
選擇框架的標準:
  • 編譯的難易程度,這意味著開發神經網路並對其進行迭代以及將其部署到生產中以供成千上萬的使用者(實際使用),具體取決於您的用途。
  • 運行速度,尤其是對大數據集的訓練,某些框架使您可以比其他框架更有效地運行和訓練神經網路。

3-11 TensorFlow 介紹與練習


※2-3部分圖片與內容取自kkkkkiko的博客
※1-12部分圖片與內容取自Pandora123
※絕大部分圖片與內容取自nex3z's blog
※教材為Andrew Ng的Deep Learning課程。
※擷取至 topic2 week1-3。

送禮物贊助創作者 !
0
留言

創作回應

更多創作