Classes 2 深度學習
1 深度學習實踐
1.1 訓練集、驗證集、測試集(Train / Dev / Test sets)
對訓練執行算法,通過驗證集或簡單交叉驗證集選擇最好的模型。
在機器學習發展的小資料量時代,常見做法是将所有資料三七分,就是人們常說的 70%驗證集,30%測試集,如果沒有明确設定驗證集,也可以按照 60%訓練,20%驗證和 20%測試集來劃分。

- 假設我們有 100 萬條資料,其中 1 萬條作為驗證集,1 萬條作為測試集,100 萬裡取 1 萬,比例是 1%,即:訓練集占 98%,驗證集和測試集各占 1%。對于資料量過百萬的應用,訓練集可以占到 99.5%,驗證和測試集各占 0.25%,或者驗證集占 0.4%,測試集占 0.1%
- 通常将樣本分成訓練集,驗證集和測試集三部分,資料集規模相對較小,适用傳統的劃分比例,資料集規模較大的,驗證集和測試集要小于資料總量的 20%或 10%
- 要確定驗證集和測試集的資料來自同一分布
1.2 偏差與方差
- 欠拟合:高偏差 high bias
- 過拟合:高方差 high variance
1.3 機器學習基礎
- 高偏差解決方法:欠拟合,增大網絡模型、更多的時間訓練、更好的優化方法
- 高方差解決方法:過拟合,增加訓練資料、減小網絡模型、加入正則化
1.4 正則化
深度學習可能存在過拟合問題——高方差,有兩個解決方法,一個是正則化,另一個是準備更多的資料。但準備更多的資料比較耗時耗力。
以邏輯回歸損失函數為例:
- L0正則:參數為零的個數,難求解
- L1正則:各個參數絕對值之和,側重于讓其為0(LASSO)
- L2正則: 各個參數的平方的和的開方值,側重于讓參數稀疏化(Ridge)
實作參數的稀疏有什麼好處嗎?
- 可以簡化模型,避免過拟合。因為一個模型中真正重要的參數可能并不多,如果考慮所有的參數起作用,那麼可以對訓練資料可以預測的很好,但是對測試資料就不行了
- 參數變少可以使整個模型獲得更好的可解釋性
參數值越小代表模型越簡單嗎?
- 是的。為什麼參數越小,說明模型越簡單呢,這是因為越複雜的模型,越是會嘗試對所有的樣本進行拟合,甚至包括一些異常樣本點,這就容易造成在較小的區間裡預測值産生較大的波動,這種較大的波動也反映了在這個區間裡的導數很大,而隻有較大的參數值才能産生較大的導數。是以複雜的模型,其參數值會比較大。
總結
- L1會趨向于産生少量的特征,而其他的特征都是0,而L2會選擇更多的特征,這些特征都會接近于0。Lasso在特征選擇時候非常有用,而Ridge就隻是一種規則化而已
- 在所有特征中隻有少數特征起重要作用的情況下,選擇Lasso L1比較合适,因為它能自動選擇特征。而如果所有特征中,大部分特征都能起作用,而且起的作用很平均,那麼使用Ridge L2也許更合适
- 一般傾向于選擇L2正則
𝜆是正則化參數,通常使用驗證集或交叉驗證集來配置這個參數,嘗試各種各樣的資料,尋找最好的參數,要考慮訓練集之間的權衡,把參數設定為較小值,這樣可以避免過拟合
如果正則化參數𝜆變得很大,參數𝑊很小,𝑧也會相對變小,此時忽略𝑏的影響,𝑧會相對變小,實際上,𝑧的取值範圍很小,曲線函數𝑡𝑎𝑛ℎ會相對呈線性,整個神經網絡會計算離線性函數近的值,這個線性函數非常簡單,并不是一個極複雜的高度非線性函數,不會發生過拟合。
1.5 dropout正則化
實作方式:反向随機失活(inverted dropout)
在測試階段,當我們評估一個神經網絡時,也就是用綠線框标注的反向随機失活方法,使測試階段變得更容易
反向随機失活(inverted dropout)方法通過除以 keep-prob,確定激活值a的期望值不變。
在測試階段,并未使用 dropout,自然也就不用抛硬币來決定失活機率,以及要消除哪些隐藏單元,因為在測試階段進行預測時,不期望輸出結果是随機的。
dropout好處:
- 不要依賴于任何一個特征,因為該單元的輸入可能随時被清除, 将産生收縮權重的平方範數的效果。将産生收縮權重的平方範數的效果。
- 每個單元,它不能依靠任何特征,因為特征都有可能被随機清除,或者說該單元的輸入也都可能被随機清除,将産生收縮權重的平方範數的效果。
dropout缺點:
- 代價函數𝐽不再被明确定義
使用經驗:
- dropout 是一種正則化方法,它有助于預防過拟合。
- 是以除非算法過拟合,不然是不會使用 dropout 的,是以它在其它領域應用得比較少,主要存在于計算機視覺領域
隻有存在過拟合時,才決定是否使用dropout。如果不存在過拟合,使用它并不一定能夠提升模型性能。
1.6 其它正則化方法
1.資料擴增(data augmentation)
方法:水準垂直翻轉、随機裁剪、随機放大裁剪、輕微形變
2.early stopping
驗證集性能有多少次疊代都沒有變化時,使用early stop,在此時停止。
優點:
-
隻運作一次梯度下降,可以找出𝑤的較小值,中間值和較大
值,而無需嘗試𝐿2正則化超級參數𝜆的很多值
缺點:
- 不能獨立地處理這兩個問題,因為提早停止梯度下降,也就是停止了優化代價函數𝐽,因為現在你不再嘗試降低代價函數𝐽,是以代價函數𝐽的值可能不夠小。
建議還是使用L2正則化來代替early stopping。
1.7 歸一化輸入
标準化
标準化需要兩個步驟:
- 零均值
- 歸一化方差
吳恩達深度學習課程筆記-Classes 2
確定所有特征都在相似範圍内,通常可以幫助學習算法運作得更快。
1.8 梯度消失/爆炸
訓練神經網絡,尤其是深度神經所面臨的一個問題就是梯度消失或梯度爆炸,導數或坡度有時會變得非常大,或者非常小,甚至于以指數方式變小,這加大了訓練的難度。
1.9 神經網絡的權重初始化
- 随機高斯 初始化變量,然後除以每層節點數的平方根
- 設定的權重矩陣既不會增長過快,也不會太快下降到 0,進而訓練出一個權重或梯度不會增長或消失過快的深度網絡,也可以加快收斂速度。
2 優化方法
2.1 mini-batch gradient descent
batch: 每次都拿全部的樣本進行梯度更新來訓練網絡,導緻速度很慢。
mini-batch: 把訓練集分割為小一點的子集,然後用子集進行訓練。
- batch: 訓練耗時,曲線更平滑
- mini-batch: 訓練更快,曲線有噪聲,增大mini-batch數,曲線會平滑些
mini-batch = m ----> batch
mini-batch = 1 ----> sgd
2.2 指數權重平均數
做偏差修正,可以讓平均數運算更加準确。初始時候預測結果不準确,導緻前期結果有一段不準确。使用偏差修正能夠解決這類問題。
2.3 動量梯度下降算法 Momentum
計算梯度的指數權重平均數,并利用該梯度更新權重。比一般的梯度下降算法要快。
等高線縱軸方向波動小些,橫軸方向移動快些。
2.4 RMSprop
root mean square prop
減緩𝑏方向的學習,即縱軸方向,同時加快,至少不是減緩橫軸方向的學習。
與動量梯度下降有些相似,但是偏導數的平方項,且在進行參數更新的時候,除以開方數。
在橫軸方向或者在例子中的𝑊方向,我們希望學習速度快,而在垂直方向,也就是例子中的𝑏方向,希望減緩縱軸上的擺動,是以有了𝑆𝑑𝑊和𝑆𝑑𝑏,我們希望𝑆𝑑𝑊會相對較小,是以我們要除以一個較小的數,而希望𝑆𝑑𝑏又較大,是以要除以較大的數字,這樣就可以減緩縱軸上的變化。
2.5 Adam優化算法
Adam 優化算法基本上就是将 Momentum 和 RMSprop 結合在一起。
2.6 學習率衰減
加快學習算法的一個辦法就是随時間慢慢減少學習率,将之稱為學習率衰減。
減少𝑎的本質在于,在學習初期,能承受較大的步伐,但當開始收斂的時候,小一些的學習率能步伐小一些
3 超參數調試
3.1 參數選擇
- 區域網格搜尋
吳恩達深度學習課程筆記-Classes 2 -
尺度範圍搜尋
用對數标尺搜尋超參數的方式會更合理,是以這裡不使用線性軸,分别依次取0.0001,0.001,0.01,0.1,1,在對數軸上均勻随機取點。
3.2 超參數調試實踐
- 熊貓方式:每次隻訓練一個或幾個模型,然後參數優化
- 魚籽方式:每次訓練多個模型,每個模型參數不同
吳恩達深度學習課程筆記-Classes 2
這兩種方式的選擇,是由你擁有的計算資源決定的,如果你擁有足夠的計算機去平行試驗許多模型,那絕對采用魚子醬方式,嘗試許多不同的超參數,看效果怎麼樣
3.3 batch normal
Batch歸一化會使你的參數搜尋問題變得很容易,使神經網絡對超參數的選擇更加穩定,超參數的範圍會更加龐大,工作效果也很好,也會是你的訓練更加容易
- 加快學習速度: 類似于邏輯回歸輸入歸一化
- 隐藏層:以就會影響𝑤, 𝑏的訓練。簡單來說,這就是 Batch 歸一化的作用。盡管嚴格來說,真正歸一化的不是𝑎,而是𝑧,深度學習文獻中有一些争論,關于在激活函數之前是否應該将值𝑧歸一化,或是否應該在應用激活函數𝑎後再規範值。實踐中,經常做的是歸一化𝑧,就是卷積層之後,激活函數之前。
吳恩達深度學習課程筆記-Classes 2
Batch 歸一化的作用是它适用的歸一化過程,不隻是輸入層,甚至同樣适用于神經網絡中的深度隐藏層。應用 Batch 歸一化了一些隐藏單元值中的平均值和方差,不過訓練輸入和這些隐藏單元值的一個差別是,也許不想隐藏單元值必須是平均值 0 和方差 1,标準化後還可以加兩個參數alpha與beta進行調節,也可以調節其均值與方內插補點不再是标準的0與1。
為什麼有效:
- 歸一化可以加快學習速度
- 可以使權重比網絡更滞後或更深層,減少了“Covariate shift”的問題(前一層參數改變影響後面的層)。Batch 歸一化減少了輸入值改變的問題,它的确使這些值變得更穩定,減弱了前層參數的作用與後層參數的作用之間的聯系,它使得網絡每層都可以自己學習,稍稍獨立于其它層,這有助于加速整個網絡的學習
-
輕微正則化的效果:在 mini-batch 計算中,由均值
和方差縮放的,因為在 mini-batch 上計算的均值和方差,而不是在整個資料集上,均值和方差有一些小的噪聲,對每一層的激活值加了少許噪聲。正則化效果,因為給隐藏單元添加了噪音,這迫使後部單元不過分依賴任何一個隐藏單元。
總結:
- 在訓練時,𝜇和𝜎2是在整個 mini-batch 上計算出來的包含了像是 64 或28 或其它一定數量的樣本
- 在測試時,可能需要逐一處理樣本,方法是根據訓練集估算𝜇和𝜎2,估算的方式有很多種,理論上可以在最終的網絡中運作整個訓練集來得到𝜇和𝜎2,但在實際操作中,我通常運用指數權重平均來追蹤在訓練過程中你看到的𝜇和𝜎2的值。訓練時候每個batch計算一個均值與方差,再基于指數權重平均的形式(優化算法中之前用到過)跟蹤最新的均值與方差。
3.4 Softmax分類器
Softmax将邏輯回歸推廣到C類上,當C==2時,等同于邏輯回歸。
輸出是多元向量,次元與類别數一緻,表明屬于每一類的機率值,相加為1。
softmax激活函數分為以下步驟:
- 線性激活 --> z=wx+b
- 求幂指數 --> tmp = e^z
- 歸一化 --> a = tmp / total(tmp)
吳恩達深度學習課程筆記-Classes 2
訓練Softmax:
- 訓練樣本标簽 類似于hardmax形式,屬于哪一類,那個次元向量的index為1
- 損失函數為類似于邏輯回歸的損失函數 -y log y'
吳恩達深度學習課程筆記-Classes 2
損失函數所做的就是它找到訓練集中的真實類别,然後試圖使該類别相應的機率盡可能地高。這就是統計學中的極大似然估計。
3.5 深度學習架構
挑選原則:
- 便于程式設計
- 運作速度要快,訓練等
- 是否真的開放:不僅需要開源,而且需要良好的管理
- 對應的程式設計語言:Python,Java 還是 C++
- 對應的任務應用:計算機視覺、自然語言處理或者線上廣告