第十三章_優化算法

文章目錄

第一十三章 優化算法

13.1 CPU 和 GPU 的區別?

  
概念:
  
CPU 全稱是 central processing unit,CPU 是一塊超大規模的集成電路,是一臺計算機的運 算和控制核心,它的主要功能是解釋計算機指令和處理計算機軟件中的數據。

  
GPU 全稱是 graphics processing unit,GPU 是將計算機系統,所需要的顯示信息進行轉換 的驅動,並向顯示器提供掃描信號,控制顯示器的正確顯示,是連接顯示器和個人電腦主板的 重要元件,是人機對話的重要設備之一。

  
緩存:
  
CPU 有大量的緩存結構,目前主流的 CPU 芯片上都有四級緩存,這些緩存結構消耗了大 量的晶體管,在運行的時候需要大量的電力。反觀 GPU 的緩存就很簡單,目前主流的 GPU 芯 片最多有兩層緩存。CPU 消耗在晶體管上的空間和能耗,GPU 都可以用來做成 ALU 單元,也 因此 GPU 比 CPU 的效率要高一些。

  
響應方式:
  
對 CPU 來說,要求的是實時響應,對單任務的速度要求很高,所以就要用很多層緩存的 辦法來保證單任務的速度。對 GPU 來說大家不關心第一個像素什麼時候計算完成,而是都關 心最後一個像素什麼時候計算出來,所以 GPU 就把所有的任務都排好,然後再批處理,這樣 對緩存的要求就很低了。舉個不恰當的例子,在點擊 10 次鼠標的時候,CPU 要每一次點擊都 要及時響應,而 GPU 會等第 10 次點擊後,再一次性批處理響應。

  
浮點運算:
  
CPU 除了負責浮點整形運算外,還有很多其他的指令集的負載,比如像多媒體解碼,硬 件解碼等,所以 CPU 是個多才多藝的東西,而 GPU 基本上就是隻做浮點運算的,也正是因爲 只做浮點運算,所以設計結構簡單,也就可以做的更快。另外顯卡的 GPU 和單純爲了跑浮點 高性能運算的 GPU 還是不太一樣,顯卡的 GPU 還要考慮配合圖形輸出顯示等方面,而有些專 用 GPU 設備,就是一個 PCI 卡上面有一個性能很強的浮點運算 GPU,沒有顯示輸出的,這樣 的 GPU 就是爲了加快某些程序的浮點計算能力。CPU 注重的是單線程的性能,也就是延遲, 對於 CPU 來說,要保證指令流不中斷,所以 CPU 需要消耗更多的晶體管和能耗用在控制部分, 於是CPU分配在浮點計算的功耗就會變少。GPU注重的是吞吐量,單指令能驅動更多的計算, 所以相比較而言 GPU 消耗在控制部分的能耗就比較少,因此也就可以把電省下來的資源給浮 點計算使用。

  
應用方向:
  
像操作系統這一類應用,需要快速響應實時信息,需要針對延遲優化,所以晶體管數量和能耗都需要用在分支預測,亂序執行上,低延遲緩存等控制部分,而這都是 CPU 的所擅長的。 對於像矩陣一類的運算,具有極高的可預測性和大量相似運算的,這種高延遲,高吞吐的架構 運算,就非常適合 GPU。

  
淺顯解釋:
  
一塊 CPU 相當於一個數學教授,一塊 GPU 相當於 100 個小學生。
  
第一回合,四則運算,一百個題。教授拿到卷子一道道計算。100 個小學生各拿一道題。 教授剛開始計算到第二題的時候,小學生就集體交卷了。
  
第二回合,高等函數,一百個題。當教授搞定後。一百個小學生可能還不知道該做些什麼。
  
這兩個回合就是 CPU 和 GPU 的區別了。

13.2 如何解決訓練樣本少的問題

  
要訓練一個好的 CNN 模型,通常需要很多訓練數據,尤其是模型結構比較複雜的時候, 比如 ImageNet 數據集上訓練的模型。雖然深度學習在 ImageNet 上取得了巨大成功,但是一個 現實的問題是,很多應用的訓練集是較小的,如何在這種情況下應用深度學習呢?有三種方法 可供讀者參考。

  
(1)可以將 ImageNet 上訓練得到的模型做爲起點,利用目標訓練集和反向傳播對其進 行繼續訓練,將模型適應到特定的應用。ImageNet 起到預訓練的作用。
  
(2)如果目標訓練集不夠大,也可以將低層的網絡參數固定,沿用 ImageNet 上的訓練集 結果,只對上層進行更新。這是因爲底層的網絡參數是最難更新的,而從 ImageNet 學習得到 的底層濾波器往往描述了各種不同的局部邊緣和紋理信息,而這些濾波器對一般的圖像有較好 的普適性。
  
(3)直接採用 ImageNet 上訓練得到的模型,把最高的隱含層的輸出作爲特徵表達,代 替常用的手工設計的特徵。

13.3 什麼樣的樣本集不適合用深度學習?

  
(1)數據集太小,數據樣本不足時,深度學習相對其它機器學習算法,沒有明顯優勢。
  
(2)數據集沒有局部相關特性,目前深度學習表現比較好的領域主要是圖像/語音 /自然語言處理等領域,這些領域的一個共性是局部相關性。圖像中像素組成物體,語音 信號中音位組合成單詞,文本數據中單詞組合成句子,這些特徵元素的組合一旦被打亂, 表示的含義同時也被改變。對於沒有這樣的局部相關性的數據集,不適於使用深度學習算 法進行處理。舉個例子:預測一個人的健康狀況,相關的參數會有年齡、職業、收入、家 庭狀況等各種元素,將這些元素打亂,並不會影響相關的結果。

13.4 有沒有可能找到比已知算法更好的算法?

  
沒有免費的午餐定理:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-5ZiuiXOO-1575791537827)(./img/ch13/figure_13_4_1.png)]

圖 13.4 沒有免費的午餐(黑點:訓練樣本;白點:測試樣本)

  
對於訓練樣本(黑點),不同的算法 A/B 在不同的測試樣本(白點)中有不同的表現,這表示:對於一個學習算法A,若它在某些問題上比學習算法B更好,則必然存在一些問題, 在那裏B比A好。
  
也就是說:對於所有問題,無論學習算法 A 多聰明,學習算法 B 多笨拙,它們的期望性 能相同。
  
但是:沒有免費午餐定力假設所有問題出現機率相同,實際應用中,不同的場景,會有不 同的問題分佈,所以,在優化算法時,針對具體問題進行分析,是算法優化的核心所在。

13.5 何爲共線性, 跟過擬合有啥關聯?

  
共線性:多變量線性迴歸中,變量之間由於存在高度相關關係而使迴歸估計不準確。
  
產生問題:共線性會造成冗餘,導致過擬合。
  
解決方法:排除變量的相關性、加入權重正則。

13.6 廣義線性模型是怎被應用在深度學習中?

  
深度學習從統計學角度,可以看做遞歸的廣義線性模型。
  
廣義線性模型相對於經典的線性模型(y=wx+b)(y=wx+b),核心在於引入了連接函數 g()g(\cdot),形式變爲: y=g1(wx+b)y=g-1(wx+b)
  
深度學習時遞歸的廣義線性模型,神經元的激活函數,即爲廣義線性模型的鏈接函數。邏 輯迴歸(廣義線性模型的一種)的 Logistic 函數即爲神經元激活函數中的 Sigmoid 函數,很多 類似的方法在統計學和神經網絡中的名稱不一樣,容易引起困惑。

13.7 造成梯度消失的原因?

  
神經網絡的訓練中,通過改變神經元的權重,使網絡的輸出值儘可能逼近標籤以降低誤差 值,訓練普遍使用 BP 算法,核心思想是,計算出輸出與標籤間的損失函數值,然後計算其相 對於每個神經元的梯度,進行權值的迭代。
  
梯度消失會造成權值更新緩慢,模型訓練難度增加。造成梯度消失的一個原因是,許多激 活函數將輸出值擠壓在很小的區間內,在激活函數兩端較大範圍的定義域內梯度爲 00。造成學 習停止。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-2OiSVvHW-1575791537830)(./img/ch13/figure_13_7_1.png)]

圖 13.7 sigmoid 函數的梯度消失

13.8 權值初始化方法有哪些?

  
權值初始化的方法主要有:常量初始化(constant)、高斯分佈初始化(gaussian)、 positive_unitball 初始化、均勻分佈初始化(uniform)、xavier 初始化、msra 初始化、雙線性初 始化(bilinear)。

  
1. 常量初始化(constant)
  
把權值或者偏置初始化爲一個常數,具體是什麼常數,可以自己定義。

  
2. 高斯分佈初始化(gaussian)
  
需要給定高斯函數的均值與標準差。

  
3. positive_unitball 初始化
  
讓每一個神經元的輸入的權值和爲 11,例如:一個神經元有 100100 個輸入,讓這 100100 個輸入
的權值和爲 11. 首先給這 100100 個權值賦值爲在(0,1)(0,1)之間的均勻分佈,然後,每一個權值再 除以它們的和就可以啦。這麼做,可以有助於防止權值初始化過大,從而防止激活函數(sigmoid 函數)進入飽和區。所以,它應該比較適合 simgmoid 形的激活函數。

  
4. 均勻分佈初始化(uniform)
  
將權值與偏置進行均勻分佈的初始化,用 min 與 max 控制它們的的上下限,默認爲(0,1)(0,1)

  
5. xavier 初始化
  
對於權值的分佈:均值爲 00,方差爲(11 / 輸入的個數)的均勻分佈。如果我們更注重前
向傳播的話,我們可以選擇 fan_in,即正向傳播的輸入個數;如果更注重後向傳播的話,我們選擇 fan_out, 因爲在反向傳播的時候,fan_out 就是神經元的輸入個數;如果兩者都考慮的話, 就選 average = (fan_in + fan_out) /22。對於 ReLU 激活函數來說,XavierFiller 初始化也是很適合。關於該初始化方法,具體可以參考文章1、文章2,該方法假定激活函數是線性的。

  
6. msra 初始化
  
對於權值的分佈:基於均值爲 00,方差爲( 22/輸入的個數)的高斯分佈;它特別適合 ReLU 激活函數,該方法主要是基於 Relu 函數提出的,推導過程類似於 xavier。

  
7. 雙線性初始化(bilinear)
  
常用在反捲積神經網絡裏的權值初始化。

13.9 啓發式優化算法中,如何避免陷入局部最優解?

  
啓發式算法中,局部最優值的陷入無法避免。啓發式,本質上是一種貪心策略,這也在客 觀上決定了不符合貪心規則的更好(或者最優)解會錯過。
  
簡單來說,避免陷入局部最優就是兩個字:隨機。
  
具體實現手段上,可以根據所採用的啓發式框架來靈活地加入隨機性。比如遺傳裏面,可 以在交叉變異時,可以在控制人口策略中,也可以在選擇父本母本樣本時;禁忌裏面,可以在 禁忌表的長度上體現,也可以在解禁策略中使用,等等。這些都要結合具體問題特定的算例集, 需要反覆嘗試摸索纔行。參數的敏感性是一個問題,建議不要超過 33 個參數,參數越不敏感越好。不同算例集用不同種子運行多次(100100 次左右纔有統計意義),統計平均性能即可。需注 意全局的隨機重啓通常來說不是一個好辦法,因爲等於主動放棄之前搜索結果,萬不得已不要 用,或者就是不用。

  
三個原則應該把握:越隨機越好;越不隨機越好;二者平衡最好。

  
1. 越隨機越好
  
沒有隨機性,一定會陷入局部最優。爲了獲得更大的找到最優解的期望,算法中一定要有
足夠的隨機性。具體體現爲魯棒性較好,搜索時多樣性較好。算法的每一步選擇都可以考慮加入隨機性,但要控制好概率。比如,某個貪心策略下,是以概率 $1 $做某一動作,可以考慮將其 改爲以概率 0.9990.999 做之前的操作,以剩餘概率做其他操作。具體參數設置需調試。

  
2. 越不隨機越好
  
隨機性往往是對問題內在規律的一種妥協。即沒有找到其內在規律,又不知道如何是好, 爲了獲得更好的多樣性,逼不得已加入隨機。因此,對給定問題的深入研究纔是根本:分辨出 哪些時候,某個動作就是客觀上能嚴格保證最優的——這點至關重要,直接決定了算法性能。 最好的算法一定是和問題結構緊密相連的,範範地套用某個啓發式的框架不會有出色的性能。 當然,如果不是追求性能至上,而是考慮到開發效率實現成本這些額外因素,則另當別論。

  
3. 二者平衡最好
  
通常情況下,做好第一點,可以略微改善算法性能;做好第二點,有希望給算法帶來質的提高。而二者調和後的平衡則會帶來質的飛躍。

  
貪心是“自強不息”的精進,不放過任何改進算法的機會;多樣性的隨機是“厚德載物”的一分包 容,給那些目前看似不那麼好的解一些機會。調和好二者,不偏頗任何一方纔能使算法有出色 的性能。要把握這種平衡,非一朝一夕之功,只能在反覆試驗反思中去細細品味。
  
要結合具體問題而言,範範空談無太大用。

13.10 凸優化中如何改進 GD 方法以防止陷入局部最優解?

  
在對函數進行凸優化時,如果使用導數的方法(如:梯度下降法/GD,牛頓法等)來尋找最優解,有可能陷入到局部最優解而非全局最優解。
  
爲了防止得到局部最優,可以對梯度下降法進行一些改進,防止陷入局部最優。
  
但是請注意,這些方法只能保證以最大的可能找到全局最優,無法保證 100%100\%得到全局最優。

  
(1)incremental GD/stochastic GD
  
在 GD 中,是需要遍歷所有的點之後才計算 ww 的變化的;但是,在 stochastic GD 中,每輸入一個點,就根據該點計算下一步的 ww,這樣,不僅可以從 batch training 變成 online training 方法,而且每次是按照單點的最優方向而不是整體的最優方向前進,從而相當於在朝目標前進的路上多拐了好多彎,有可能逃出局部最優。

  
(2)momentum 方法
  
momentum 相當與記憶住上一次的更新。在每次的更新中,都要加一個 kk 倍的上一次更新 量。這樣,也不再是按照標準路線前進,每次的步驟都容易受到上一次的影響,從而可能會逃 出局部最優。另外,也會加大步長,從而加快收斂。

13.11 常見的損失函數?

  
機器學習通過對算法中的目標函數進行不斷求解優化,得到最終想要的結果。分類和迴歸 問題中,通常使用損失函數或代價函數作爲目標函數。
  
損失函數用來評價預測值和真實值不一樣的程度。通常損失函數越好,模型的性能也越好。
  
損失函數可分爲經驗風險損失函數和結構風險損失函數。經驗風險損失函數指預測結果和 實際結果的差別,結構風險損失函數是在經驗風險損失函數上加上正則項。

  
下面介紹常用的損失函數:

  
1)010-1 損失函數
  
如果預測值和目標值相等,值爲 00,如果不相等,值爲 11
Cannot read property 'type' of undefined

  
一般的在實際使用中,相等的條件過於嚴格,可適當放寬條件:
Cannot read property 'type' of undefined

  
2)絕對值損失函數
  
010-1 損失函數相似,絕對值損失函數表示爲:
L(Y,f(x))=Yf(x). L(Y,f(x))=|Y-f(x)|.

  
3)平方損失函數
L(Yf(x))=N(Yf(x))2. L(Y|f(x))=\sum_{N}(Y-f(x))^2.

  
這點可從最小二乘法和歐幾里得距離角度理解。最小二乘法的原理是,最優擬合曲線應該 使所有點到迴歸直線的距離和最小。

  
4)loglog 對數損失函數
L(Y,P(YX))=logP(YX). L(Y,P(Y|X))=-logP(Y|X).

  
常見的邏輯迴歸使用的就是對數損失函數,有很多人認爲邏輯迴歸的損失函數式平方損失, 其實不然。邏輯迴歸它假設樣本服從伯努利分佈,進而求得滿足該分佈的似然函數,接着取對 數求極值等。邏輯迴歸推導出的經驗風險函數是最小化負的似然函數,從損失函數的角度看, 就是 loglog 損失函數。

  
5)指數損失函數
  
指數損失函數的標準形式爲:
L(Yf(x))=exp[yf(x)]. L(Y|f(x))=exp[-yf(x)].

  
例如 AdaBoost 就是以指數損失函數爲損失函數。

  
6)Hinge 損失函數
  
Hinge 損失函數的標準形式如下:
L(y)=max(0,1ty). L(y)=max(0, 1-ty).

  
其中 yy 是預測值,範圍爲(1,1)(-1,1), tt 爲目標值,其爲1-111
  
在線性支持向量機中,最優化問題可等價於:
minw,bi=1N(1yi(wxi+b))+λw2 \underset{w,b}{min}\sum_{i=1}^{N}(1-y_i(wx_i+b))+\lambda \lVert w^2 \rVert

  
1mi=1Nl(wxi+byi))+w2 \frac{1}{m}\sum_{i=1}^{N}l(wx_i+by_i))+\lVert w^2 \rVert

  
其中l(wxi+byi))l(wx_i+by_i))是Hinge損失函數,w2\lVert w^2 \rVert可看做爲正則化項。

13.14 如何進行特徵選擇(feature selection)?

13.14.1 如何考慮特徵選擇

  
當數據預處理完成後,我們需要選擇有意義的特徵輸入機器學習的算法和模型進行訓練。通常來說,從兩個方面考慮來選擇特徵:

  
(1)特徵是否發散:如果一個特徵不發散,例如方差接近於 00,也就是說樣本在這個特 徵上基本上沒有差異,這個特徵對於樣本的區分並沒有什麼用。
  
(2)特徵與目標的相關性:這點比較顯見,與目標相關性高的特徵,應當優選選擇。除移除低方差法外,本文介紹的其他方法均從相關性考慮。

13.14.2 特徵選擇方法分類

  
根據特徵選擇的形式又可以將特徵選擇方法分爲 33 種:

  
(1)Filter:過濾法,按照發散性或者相關性對各個特徵進行評分,設定閾值或者待選擇
閾值的個數,選擇特徵。
  
(2)Wrapper:包裝法,根據目標函數(通常是預測效果評分),每次選擇若干特徵,或
者排除若干特徵。
  
(3)Embedded:嵌入法,先使用某些機器學習的算法和模型進行訓練,得到各個特徵的權值係數,根據係數從大到小選擇特徵。類似於 Filter 方法,但是是通過訓練來確定特徵的優劣。

13.14.3 特徵選擇目的

  
(1)減少特徵數量、降維,使模型泛化能力更強,減少過擬合;
  
(2)增強對特徵和特徵值之間的理解。拿到數據集,一個特徵選擇方法,往往很難同時完成這兩個目的。通常情況下,選擇一種自己最熟悉或者最方便的特徵選擇方法(往往目的是降維,而忽略了對特徵和數據理解的目的)。 本文將結合 Scikit-learn 提供的例子介紹幾種常用的特徵選擇方法,它們各自的優缺點和問題。

13.15 梯度消失/梯度爆炸原因,以及解決方法

13.15.1 爲什麼要使用梯度更新規則?

  
在介紹梯度消失以及爆炸之前,先簡單說一說梯度消失的根源—–深度神經網絡和反向傳 播。目前深度學習方法中,深度神經網絡的發展造就了我們可以構建更深層的網絡完成更復雜 的任務,深層網絡比如深度卷積網絡,LSTM 等等,而且最終結果表明,在處理複雜任務上, 深度網絡比淺層的網絡具有更好的效果。但是,目前優化神經網絡的方法都是基於反向傳播的 思想,即根據損失函數計算的誤差通過梯度反向傳播的方式,指導深度網絡權值的更新優化。 這樣做是有一定原因的,首先,深層網絡由許多非線性層堆疊而來,每一層非線性層都可以視 爲是一個非線性函數 f(x)f(x)f(x)f(x)非線性來自於非線性激活函數),因此整個深度網絡可以視爲是一個複合的非線性多元函數:
F(x)=fn(f3(f2(f1(x)θ1+b)θ2+b))F(x)=f_n(\cdots f_3(f_2(f_1(x)*\theta_1+b)*\theta_2+b)\cdots)

  
我們最終的目的是希望這個多元函數可以很好的完成輸入到輸出之間的映射,假設不同的輸入,輸出的最優解是g(x)g(x) ,那麼,優化深度網絡就是爲了尋找到合適的權值,滿足 Loss=L(g(x),F(x))Loss=L(g(x),F(x))取得極小值點,比如最簡單的損失函數:
Loss=g(x)f(x)22. Loss = \lVert g(x)-f(x) \rVert^2_2.

  
假設損失函數的數據空間是下圖這樣的,我們最優的權值就是爲了尋找下圖中的最小值點, 對於這種數學尋找最小值問題,採用梯度下降的方法再適合不過了。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-MHrcVTXf-1575791537831)(./img/ch13/figure_13_15_1.png)]

圖 13.15.1

13.15.2 梯度消失、爆炸原因?

  
梯度消失與梯度爆炸其實是一種情況,看接下來的文章就知道了。兩種情況下梯度消失經 常出現,一是在深層網絡中,二是採用了不合適的損失函數,比如 sigmoid。梯度爆炸一般出 現在深層網絡和權值初始化值太大的情況下,下面分別從這兩個角度分析梯度消失和爆炸的原因。

  
(1)深層網絡角度
  
對激活函數進行求導,如果此部分大於 11,那麼層數增多的時候,最終的求出的梯度更新 將以指數形式增加,即發生梯度爆炸,如果此部分小於 11,那麼隨着層數增多,求出的梯度更 新信息將會以指數形式衰減,即發生了梯度消失
  
從深層網絡角度來講,不同的層學習的速度差異很大,表現爲網絡中靠近輸出的層學習的 情況很好,靠近輸入的層學習的很慢,有時甚至訓練了很久,前幾層的權值和剛開始隨機初始 化的值差不多。因此,梯度消失、爆炸,其根本原因在於反向傳播訓練法則,屬於先天不足, 另外多說一句,Hinton 提出 capsule 的原因就是爲了徹底拋棄反向傳播,如果真能大範圍普及, 那真是一個革命。

  
(2)激活函數角度
  
計算權值更新信息的時候需要計算前層偏導信息,因此如果激活函數選擇不合適,比如使用 sigmoid,梯度消失就會很明顯了,原因看下圖,左圖是sigmoid的損失函數圖,右邊是其倒數的圖像,如果使用 sigmoid 作爲損失函數,其梯度是不可能超過 0.250.25 的,這樣經過鏈式求導之後,很容易發生梯度消失。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-UBphCtEj-1575791537832)(./img/ch13/figure_13_15_2.png)]

圖 13.15.2 sigmod函數與其導數

13.15.3 梯度消失、爆炸的解決方案

  
方案1-預訓練加微調
  
此方法來自Hinton在2006年發表的一篇論文,Hinton爲了解決梯度的問題,提出採取無監督逐層訓練方法,其基本思想是每次訓練一層隱節點,訓練時將上一層隱節點的輸出作爲輸入,而本層隱節點的輸出作爲下一層隱節點的輸入,此過程就是逐層“預訓練”(pre-training);在預訓練完成後,再對整個網絡進行“微調”(fine-tunning)。Hinton在訓練深度信念網絡(Deep Belief Networks中,使用了這個方法,在各層預訓練完成後,再利用BP算法對整個網絡進行訓練。此思想相當於是先尋找局部最優,然後整合起來尋找全局最優,此方法有一定的好處,但是目前應用的不是很多了。

  
方案2-梯度剪切、正則
  
梯度剪切這個方案主要是針對梯度爆炸提出的,其思想是設置一個梯度剪切閾值,然後更新梯度的時候,如果梯度超過這個閾值,那麼就將其強制限制在這個範圍之內。這可以防止梯度爆炸。
  
另外一種解決梯度爆炸的手段是採用權重正則化(weithts regularization)比較常見的是l1l1正則,和l2l2正則,在各個深度框架中都有相應的API可以使用正則化。

  
方案3-relu、leakrelu、elu等激活函數
  
Relu
  
思想也很簡單,如果激活函數的導數爲1,那麼就不存在梯度消失爆炸的問題了,每層的網絡都可以得到相同的更新速度,relu就這樣應運而生。
  
relu函數的導數在正數部分是恆等於1的,因此在深層網絡中使用relu激活函數就不會導致梯度消失和爆炸的問題。
relu的主要貢獻在於:
  
(1)解決了梯度消失、爆炸的問題
  
(2)計算方便,計算速度快
  
(3)加速了網絡的訓練

  
同時也存在一些缺點:
  
(1)由於負數部分恆爲0,會導致一些神經元無法激活(可通過設置小學習率部分解決);
  
(2)輸出不是以0爲中心的。

  
leakrelu 
  
leakrelu就是爲了解決relu的0區間帶來的影響,其數學表達爲:leakrelu=max(kx,0)=max(k*x,0)其中kk是leak係數,一般選擇0.010.01或者0.020.02,或者通過學習而來。

  
方案4-batchnorm
  
Batchnorm是深度學習發展以來提出的最重要的成果之一了,目前已經被廣泛的應用到了各大網絡中,具有加速網絡收斂速度,提升訓練穩定性的效果,Batchnorm本質上是解決反向傳播過程中的梯度問題。Batchnorm全名是Batch Normalization,簡稱BN,即批規範化,通過規範化操作將輸出信號xx規範化到均值爲00,方差爲11保證網絡的穩定性。

  
方案5-殘差結構  
  
事實上,就是殘差網絡的出現導致了Imagenet比賽的終結,自從殘差提出後,幾乎所有的深度網絡都離不開殘差的身影,相比較之前的幾層,幾十層的深度網絡,在殘差網絡面前都不值一提,殘差可以很輕鬆的構建幾百層,一千多層的網絡而不用擔心梯度消失過快的問題,原因就在於殘差的捷徑(shortcut)部分。

  
方案6-LSTM
  
LSTM全稱是長短期記憶網絡(long-short term memory networks),是不那麼容易發生梯度消失的,主要原因在於LSTM內部複雜的“門”(gates)。

13.16 深度學習爲什麼不用二階優化

  1. 二階優化方法可以用到深度學習網絡中,比如DistBelief,《Large-scale L-BFGS using MapReduce》.採用了數據並行的方法解決了海量數據下L-BFGS算法的可用性問題。
  2. 二階優化方法目前還不適用於深度學習訓練中,主要存在問題是:
    (1)最重要的問題是二階方法的計算量大,訓練較慢。
    (2)求導不易,實現比SGD這類一階方法複雜。
    (3)另外其優點在深度學習中無法展現出來,主要是二階方法能夠更快地求得更高精度的解,這在淺層模型是有益的,但是在神經網絡這類深層模型中對參數的精度要求不高,相反 相對而言不高的精度對模型還有益處,能夠提高模型的泛化能力。
    (4)穩定性。題主要明白的一點事,越簡單的東西往往越robust,對於優化算法也是這樣。梯度下降等一階算法只要步長不選太大基本都不會出問題,但二階方法遍地是坑,數值穩定性啊等等。

13.17 怎樣優化你的深度學習系統?

  
你可能有很多想法去改善你的系統,比如,你可能想我們去收集更多的訓練數據吧。或者你會說,可能你的訓練集的多樣性還不夠,你應該收集更多不同姿勢的貓咪圖片,或者更多樣化的反例集。或者你想再用梯度下降訓練算法,訓練久一點。或者你想嘗試用一個完全不同的優化算法,比如Adam優化算法。或者嘗試使用規模更大或者更小的神經網絡。或者你想試試dropout或者正則化。或者你想修改網絡的架構,比如修改激活函數,改變隱藏單元的數目之類的方法。

  
當你嘗試優化一個深度學習系統時,你通常可以有很多想法可以去試,問題在於,如果你做出了錯誤的選擇,你完全有可能白費6個月的時間,往錯誤的方向前進,在6個月之後才意識到這方法根本不管用。比如,我見過一些團隊花了6個月時間收集更多數據,卻在6個月之後發現,這些數據幾乎沒有改善他們系統的性能。所以,假設你的項目沒有6個月的時間可以浪費,如果有快速有效的方法能夠判斷哪些想法是靠譜的,或者甚至提出新的想法,判斷哪些是值得一試的想法,哪些是可以放心捨棄的。

  
我希望在這門課程中,可以教給你們一些策略,一些分析機器學習問題的方法,可以指引你們朝着最有希望的方向前進。這門課中,我會和你們分享我在搭建和部署大量深度學習產品時學到的經驗和教訓,我想這些內容是這門課程獨有的。比如說,很多大學深度學習課程很少提到這些策略。事實上,機器學習策略在深度學習的時代也在變化,因爲現在對於深度學習算法來說能夠做到的事情,比上一代機器學習算法大不一樣。我希望這些策略能幫助你們提高效率,讓你們的深度學習系統更快投入實用。

13.18 爲什麼要設置單一數字評估指標?

  
無論你是調整超參數,或者是嘗試不同的學習算法,或者在搭建機器學習系統時嘗試不同手段,你會發現,如果你有一個單實數評估指標,你的進展會快得多,它可以快速告訴你,新嘗試的手段比之前的手段好還是差。所以當團隊開始進行機器學習項目時,我經常推薦他們爲問題設置一個單實數評估指標。

  
我發現很多機器學習團隊就是這樣,有一個定義明確的開發集用來測量查準率和查全率,再加上這樣一個單一數值評估指標,有時我叫單實數評估指標,能讓你快速判斷分類器或者分類器更好。所以有這樣一個開發集,加上單實數評估指標,你的迭代速度肯定會很快,它可以加速改進您的機器學習算法的迭代過程。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xJO8sPhO-1575791537833)(./img/ch13/figure_13_18_1.png)]

圖 13.8.1

13.19 滿足和優化指標(Satisficing and optimizing metrics)

  
要把你顧及到的所有事情組合成單實數評估指標有時並不容易,在那些情況裏,我發現有時候設立滿足和優化指標是很重要的,讓我告訴你是什麼意思吧。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-cSNb7P19-1575791537835)(./img/ch13/figure_13_19_1.png)]

圖 13.9.1

  
假設你已經決定你很看重貓分類器的分類準確度,這可以是分數或者用其他衡量準確度的指標。但除了準確度之外,我們還需要考慮運行時間,就是需要多長時間來分類一張圖。分類器需要8080毫秒,需要9595毫秒,C需要15001500毫秒,就是說需要1.51.5秒來分類圖像。

  
你可以這麼做,將準確度和運行時間組合成一個整體評估指標。所以成本,比如說,總體成本是,這種組合方式可能太刻意,只用這樣的公式來組合準確度和運行時間,兩個數值的線性加權求和。

  
你還可以做其他事情,就是你可能選擇一個分類器,能夠最大限度提高準確度,但必須滿足運行時間要求,就是對圖像進行分類所需的時間必須小於等於100100毫秒。所以在這種情況下,我們就說準確度是一個優化指標,因爲你想要準確度最大化,你想做的儘可能準確,但是運行時間就是我們所說的滿足指標,意思是它必須足夠好,它只需要小於100100毫秒,達到之後,你不在乎這指標有多好,或者至少你不會那麼在乎。所以這是一個相當合理的權衡方式,或者說 將準確度和運行時間結合起來的方式。實際情況可能是,只要運行時間少於 100 毫秒,你的用 戶就不會在乎運行時間是 100 毫秒還是 50 毫秒,甚至更快。

  
通過定義優化和滿足指標,就可以給你提供一個明確的方式,去選擇“最好的”分類器。在 這種情況下分類器 B 最好,因爲在所有的運行時間都小於 100 毫秒的分類器中,它的準確度最好。

  
總結一下,如果你需要顧及多個指標,比如說,有一個優化指標,你想盡可能優化的,然 後還有一個或多個滿足指標,需要滿足的,需要達到一定的門檻。現在你就有一個全自動的方 法,在觀察多個成本大小時,選出"最好的"那個。現在這些評估指標必須是在訓練集或開發集 或測試集上計算或求出來的。所以你還需要做一件事,就是設立訓練集、開發集,還有測試集。 在下一個視頻裏,我想和大家分享一些如何設置訓練、開發和測試集的指導方針,我們下一個 視頻繼續。

13.20 怎樣劃分訓練/開發/測試集

  
設立訓練集,開發集和測試集的方式大大影響了你或者你的團隊在建立機器學習應用方面取得進展的速度。同樣的團隊,即使是大公司裏的團隊,在設立這些數據集的方式,真的會讓團隊的進展變慢而不是加快,我們看看應該如何設立這些數據集,讓你的團隊效率最大化。

  
我建議你們不要這樣,而是讓你的開發集和測試集來自同一分佈。我的意思是這樣,你們要記住,我想就是設立你的開發集加上一個單實數評估指標,這就是像是定下目標,然後告訴你的團隊,那就是你要瞄準的靶心,因爲你一旦建立了這樣的開發集和指標,團隊就可以快速迭代,嘗試不同的想法,跑實驗,可以很快地使用開發集和指標去評估不同分類器,然後嘗試選出最好的那個。所以,機器學習團隊一般都很擅長使用不同方法去逼近目標,然後不斷迭代,不斷逼近靶心。所以,針對開發集上的指標優化。

  
所以我建議你們在設立開發集和測試集時,要選擇這樣的開發集和測試集,能夠反映你未來會得到的數據,認爲很重要的數據,必須得到好結果的數據,特別是,這裏的開發集和測試集可能來自同一個分佈。所以不管你未來會得到什麼樣的數據,一旦你的算法效果不錯,要嘗試收集類似的數據,而且,不管那些數據是什麼,都要隨機分配到開發集和測試集上。因爲這樣,你才能將瞄準想要的目標,讓你的團隊高效迭代來逼近同一個目標,希望最好是同一個目標。

  
我們還沒提到如何設立訓練集,我們會在之後的視頻裏談談如何設立訓練集,但這個視頻的重點在於,設立開發集以及評估指標,真的就定義了你要瞄準的目標。我們希望通過在同一分佈中設立開發集和測試集,你就可以瞄準你所希望的機器學習團隊瞄準的目標。而設立訓練集的方式則會影響你逼近那個目標有多快,但我們可以在另一個講座裏提到。我知道有一些機器學習團隊,他們如果能遵循這個方針,就可以省下幾個月的工作,所以我希望這些方針也能幫到你們。

  
接下來,實際上你的開發集和測試集的規模,如何選擇它們的大小,在深度學習時代也在變化,我們會在下一個視頻裏提到這些內容。

13.21 如何劃分開發/測試集大小

  
你可能聽說過一條經驗法則,在機器學習中,把你取得的全部數據用70/3070/30比例分成訓練集和測試集。或者如果你必須設立訓練集、開發集和測試集,你會這麼分60%60\%訓練集,20%20\%開發集,20%20\%測試集。在機器學習的早期,這樣分是相當合理的,特別是以前的數據集大小要小得多。所以如果你總共有100個樣本,這樣70/3070/30或者60/20/2060/20/20分的經驗法則是相當合理的。如果你有幾千個樣本或者有一萬個樣本,這些做法也還是合理的。

  
但在現代機器學習中,我們更習慣操作規模大得多的數據集,比如說你有11百萬個訓練樣本,這樣分可能更合理,98%98\%作爲訓練集,1%1\%開發集,1%1\%測試集,我們用和縮寫來表示開發集和測試集。因爲如果你有11百萬個樣本,那麼1%1\%就是10,00010,000個樣本,這對於開發集和測試集來說可能已經夠了。所以在現代深度學習時代,有時我們擁有大得多的數據集,所以使用小於20%20\%的比例或者小於30%30\%比例的數據作爲開發集和測試集也是合理的。而且因爲深度學習算法對數據的胃口很大,我們可以看到那些有海量數據集的問題,有更高比例的數據劃分到訓練集裏,那麼測試集呢?

  
總結一下,在大數據時代舊的經驗規則,這個70/3070/30不再適用了。現在流行的是把大量數據分到訓練集,然後少量數據分到開發集和測試集,特別是當你有一個非常大的數據集時。以前的經驗法則其實是爲了確保開發集足夠大,能夠達到它的目的,就是幫你評估不同的想法,然後選出還是更好。測試集的目的是評估你最終的成本偏差,你只需要設立足夠大的測試集,可以用來這麼評估就行了,可能只需要遠遠小於總體數據量的30%30\%

  
所以我希望本視頻能給你們一點指導和建議,讓你們知道如何在深度學習時代設立開發和測試集。接下來,有時候在研究機器學習的問題途中,你可能需要更改評估指標,或者改動你的開發集和測試集,我們會講什麼時候需要這樣做。

13.22 什麼時候該改變開發/測試集和指標?

  
我們來看一個例子,假設你在構建一個貓分類器,試圖找到很多貓的照片,向你的愛貓人士用戶展示,你決定使用的指標是分類錯誤率。所以算法和分別有3%錯誤率和5%錯誤率,所以算法似乎做得更好。

  
但我們實際試一下這些算法,你觀察一下這些算法,算法由於某些原因,把很多色情圖像分類成貓了。如果你部署算法,那麼用戶就會看到更多貓圖,因爲它識別貓的錯誤率只有3%3\%,但它同時也會給用戶推送一些色情圖像,這是你的公司完全不能接受的,你的用戶也完全不能接受。相比之下,算法有5%5\%的錯誤率,這樣分類器就得到較少的圖像,但它不會推送色情圖像。所以從你們公司的角度來看,以及從用戶接受的角度來看,算法實際上是一個更好的算法,因爲它不讓任何色情圖像通過。

  
那麼在這個例子中,發生的事情就是,算法A在評估指標上做得更好,它的錯誤率達到3%3\%,但實際上是個更糟糕的算法。在這種情況下,評估指標加上開發集它們都傾向於選擇算法,因爲它們會說,看算法A的錯誤率較低,這是你們自己定下來的指標評估出來的。但你和你的用戶更傾向於使用算法,因爲它不會將色情圖像分類爲貓。所以當這種情況發生時,當你的評估指標無法正確衡量算法之間的優劣排序時,在這種情況下,原來的指標錯誤地預測算法A是更好的算法這就發出了信號,你應該改變評估指標了,或者要改變開發集或測試集。在這種情況下,你用的分類錯誤率指標可以寫成這樣:

  
但粗略的結論是,如果你的評估指標無法正確評估好算法的排名,那麼就需要花時間定義一個新的評估指標。這是定義評估指標的其中一種可能方式(上述加權法)。評估指標的意義在於,準確告訴你已知兩個分類器,哪一個更適合你的應用。就這個視頻的內容而言,我們不需要太注重新錯誤率指標是怎麼定義的,關鍵在於,如果你對舊的錯誤率指標不滿意,那就不要一直沿用你不滿意的錯誤率指標,而應該嘗試定義一個新的指標,能夠更加符合你的偏好,定義出實際更適合的算法。

  
所以方針是,如果你在指標上表現很好,在當前開發集或者開發集和測試集分佈中表現很好,但你的實際應用程序,你真正關注的地方表現不好,那麼就需要修改指標或者你的開發測試集。換句話說,如果你發現你的開發測試集都是這些高質量圖像,但在開發測試集上做的評估無法預測你的應用實際的表現。因爲你的應用處理的是低質量圖像,那麼就應該改變你的開發測試集,讓你的數據更能反映你實際需要處理好的數據。

  
但總體方針就是,如果你當前的指標和當前用來評估的數據和你真正關心必須做好的事情關係不大,那就應該更改你的指標或者你的開發測試集,讓它們能更夠好地反映你的算法需要處理好的數據。

13.23 設置評估指標的意義?

  
評估指標的意義在於,準確告訴你已知兩個分類器,哪一個更適合你的應用。就這個視頻的內容而言,我們不需要太注重新錯誤率指標是怎麼定義的,關鍵在於,如果你對舊的錯誤率指標不滿意,那就不要一直沿用你不滿意的錯誤率指標,而應該嘗試定義一個新的指標,能夠更加符合你的偏好,定義出實際更適合的算法。

13.24 什麼是可避免偏差?

  
http://www.ai-start.com/dl2017/lesson3-week1.html

  
所以要給這些概念命名一下,這不是廣泛使用的術語,但我覺得這麼說思考起來比較流暢。就是把這個差值,貝葉斯錯誤率或者對貝葉斯錯誤率的估計和訓練錯誤率之間的差值稱爲可避免偏差,你可能希望一直提高訓練集表現,直到你接近貝葉斯錯誤率,但實際上你也不希望做到比貝葉斯錯誤率更好,這理論上是不可能超過貝葉斯錯誤率的,除非過擬合。而這個訓練錯誤率和開發錯誤率之前的差值,就大概說明你的算法在方差問題上還有多少改善空間。

  
可避免偏差這個詞說明了有一些別的偏差,或者錯誤率有個無法超越的最低水平,那就是說如果貝葉斯錯誤率是7.5%7.5\%。你實際上並不想得到低於該級別的錯誤率,所以你不會說你的訓練錯誤率是8%8\%,然後8%8\%就衡量了例子中的偏差大小。你應該說,可避免偏差可能在0.5%0.5\%左右,或者0.5%0.5\%是可避免偏差的指標。而這個2%2\%是方差的指標,所以要減少這個2%2\%比減少這個0.5%0.5\%空間要大得多。而在左邊的例子中,這7%7\%衡量了可避免偏差大小,而2%2\%衡量了方差大小。所以在左邊這個例子裏,專注減少可避免偏差可能潛力更大。

13.25 什麼是TOP5錯誤率?

  
top1就是你預測的label取最後概率向量裏面最大的那一個作爲預測結果,你的預測結果中概率最大的那個類必須是正確類別纔算預測正確。而top5就是最後概率向量最大的前五名中出現了正確概率即爲預測正確。

  
ImageNet 項目是一個用於物體對象識別檢索大型視覺數據庫。截止20162016年,ImageNet 已經對超過一千萬個圖像的url進行手動註釋,標記圖像的類別。在至少一百萬張圖像中還提供了邊界框。自20102010年以來,ImageNet 舉辦一年一度的軟件競賽,叫做 ImageNet 大尺度視覺識別挑戰(ImageNet Large Scale Visual Recognition Challenge,ILSVRC)。主要內容是通過算法程序實現正確分類和探測識別物體與場景,評價標準就是Top-5 錯誤率。

  
Top-5 錯誤率
  
ILSRVRC(ImageNet 圖像分類大賽) 比賽設置如下:10001000類圖像分類問題,訓練數據集126126萬張圖像,驗證集55萬張,測試集1010萬張(標註未公佈)。評價標準採用 top-5 錯誤率——即對一張圖像預測55個類別,只要有一個和人工標註類別相同就算對,否則算錯。

13.26 什麼是人類水平錯誤率?

  
人類水平錯誤率的定義,就是如果你想要替代或估計貝葉斯錯誤率,那麼一隊經驗豐富的醫生討論和辯論之後,可以達到0.5%0.5\%的錯誤率。我們知道貝葉斯錯誤率小於等於0.5%0.5\%,因爲有些系統,這些醫生團隊可以達到0.5%0.5\%的錯誤率。所以根據定義,最優錯誤率必須在0.5%0.5\%以下。我們不知道多少更好,也許有一個更大的團隊,更有經驗的醫生能做得更好,所以也許比0.5%0.5\%好一點。但是我們知道最優錯誤率不能高於0.5%0.5\%,那麼在這個背景下,我就可以用0.5%0.5\%估計貝葉斯錯誤率。所以我將人類水平定義爲0.5%0.5\%,至少如果你希望使用人類水平錯誤來分析偏差和方差的時候,就像上個視頻那樣。

  
現在,爲了發表研究論文或者部署系統,也許人類水平錯誤率的定義可以不一樣,你可以使用1%,只要你超越了一個普通醫生的表現,如果能達到這種水平,那系統已經達到實用了。也許超過一名放射科醫生,一名醫生的表現,意味着系統在一些情況下可以有部署價值了。

13.27 可避免偏差、幾大錯誤率之間的關係?

  
要了解爲什麼這個很重要,我們來看一個錯誤率分析的例子。比方說,在醫學圖像診斷例子中,你的訓練錯誤率是5%5\%,你的開發錯誤率是6%6\%。而在上一張幻燈片的例子中,我們的人類水平表現,我將它看成是貝葉斯錯誤率的替代品,取決於你是否將它定義成普通單個醫生的表現,還是有經驗的醫生或醫生團隊的表現,你可能會用1%1\%0.7%0.7\%0.5%0.5\%。同時也回想一下,前面視頻中的定義,貝葉斯錯誤率或者說貝葉斯錯誤率的估計和訓練錯誤率直接的差值就衡量了所謂的可避免偏差,這(訓練誤差與開發誤差之間的差值)可以衡量或者估計你的學習算法的方差問題有多嚴重。

  
所以在這個第一個例子中,無論你做出哪些選擇,可避免偏差大概是4%4\%,這個值我想介於……,如果你取1%1\%就是4%4\%,如果你取0.5%0.5\%就是4.5%4.5\%,而這個差距(訓練誤差與開發誤差之間的差值)是1%1\%。所以在這個例子中,我得說,不管你怎麼定義人類水平錯誤率,使用單個普通醫生的錯誤率定義,還是單個經驗豐富醫生的錯誤率定義或經驗豐富的醫生團隊的錯誤率定義,這是4%4\%還是4.5%4.5\%,這明顯比都比方差問題更大。所以在這種情況下,你應該專注於減少偏差的技術,例如培訓更大的網絡。

13.28 怎樣選取可避免偏差及貝葉斯錯誤率?

  
就是比如你的訓練錯誤率是0.7%,所以你現在已經做得很好了,你的開發錯誤率是0.8%0.8\%。在這種情況下,你用0.5%0.5\%來估計貝葉斯錯誤率關係就很大。因爲在這種情況下,你測量到的可避免偏差是0.2%0.2\%,這是你測量到的方差問題0.1%0.1\%的兩倍,這表明也許偏差和方差都存在問題。但是,可避免偏差問題更嚴重。在這個例子中,我們在上一張幻燈片中討論的是0.5%0.5\%,就是對貝葉斯錯誤率的最佳估計,因爲一羣人類醫生可以實現這一目標。如果你用0.70.7代替貝葉斯錯誤率,你測得的可避免偏差基本上是0%0\%,那你就可能忽略可避免偏差了。實際上你應該試試能不能在訓練集上做得更好。

13.29 怎樣減少方差?

  
如果你的算法方差較高,可以嘗試下面的技巧:

  
(1)增加訓練數據:只要你可以獲得大量數據和足夠的算力去處理數據,這就是一種解決高方差問題最簡單,最可靠的方式。
  
(2)正則化(L2, L1, dropout):這種技巧減少方差的同時,增加了偏差。
  
(3)提前停止(例如,根據開發集的錯誤率來提前停止梯度下降):這種技巧減少方差的同時增加的偏差。提前停止技巧很像正則化方法,一些論文作者也叫他正則化技巧。
  
(4)特徵選擇來減少輸入特徵的數量或類型:這種技巧可能會處理好方差問題,但是同時會增大偏差。稍微減少特徵數量(比如從1000個特徵減少到900個特徵)不太可能對偏差產生大的影響。大量減少特徵數量(比如從10001000減少到100100-減少1010倍)可能產生較大偏差,因爲去掉了很多有用的特徵。(注:可能會欠擬合)。在現代的深度學習中,數據量很大,人們對待特徵選擇的態度出現了轉變,現在我們更加傾向於使用全部的特徵,讓算法自己選擇合適的特徵。但是當訓練集比較小時,特徵選擇非常有用。
  
(5)縮小模型(例如減少網絡層數和神經元數量):謹慎使用。這種技巧可以減少方差,同時也可能增加偏差。然而,我並不推薦使用這種技巧來解決方差問題。添加正則化通常會獲得更好的分類性能。縮小模型的優點在於減少計算成本,以更快的速度來訓練模型。如果模型的訓練速度非常重要,那麼就想盡一切方法來縮小模型。但是如果目標是減少方差,不是那麼在意計算成本,可以考慮添加正則化。

13.30 貝葉斯錯誤率的最佳估計

  
對於這樣的問題,更好的估計貝葉斯錯誤率很有必要,可以幫助你更好地估計可避免偏差和方差,這樣你就能更好的做出決策,選擇減少偏差的策略,還是減少方差的策略。

13.31 舉機器學習超過單個人類表現幾個例子?

  
現在,機器學習有很多問題已經可以大大超越人類水平了。例如,我想網絡廣告,估計某個用戶點擊廣告的可能性,可能學習算法做到的水平已經超越任何人類了。還有提出產品建議,向你推薦電影或書籍之類的任務。我想今天的網站做到的水平已經超越你最親近的朋友了。還有物流預測,從到開車需要多久,或者預測快遞車從開到需要多少時間。或者預測某人會不會償還貸款,這樣你就能判斷是否批准這人的貸款。我想這些問題都是今天的機器學習遠遠超過了單個人類的表現。

  
除了這些問題,今天已經有語音識別系統超越人類水平了,還有一些計算機視覺任務,一些圖像識別任務,計算機已經超越了人類水平。但是由於人類對這種自然感知任務非常擅長,我想計算機達到那種水平要難得多。還有一些醫療方面的任務,比如閱讀ECG或診斷皮膚癌,或者某些特定領域的放射科讀圖任務,這些任務計算機做得非常好了,也許超越了單個人類的水平。

13.32如何改善你的模型?

  
你們學過正交化,如何設立開發集和測試集,用人類水平錯誤率來估計貝葉斯錯誤率以及如何估計可避免偏差和方差。我們現在把它們全部組合起來寫成一套指導方針,如何提高學習算法性能的指導方針。

  
首先,你的算法對訓練集的擬合很好,這可以看成是你能做到可避免偏差很低。還有第二件事你可以做好的是,在訓練集中做得很好,然後推廣到開發集和測試集也很好,這就是說方差不是太大。

  1. 總結一下前幾段視頻我們見到的步驟,如果你想提升機器學習系統的性能,我建議你們看看訓練錯誤率和貝葉斯錯誤率估計值之間的距離,讓你知道可避免偏差有多大。換句話說,就是你覺得還能做多好,你對訓練集的優化還有多少空間。

  2. 然後看看你的開發錯誤率和訓練錯誤率之間的距離,就知道你的方差問題有多大。換句話說,你應該做多少努力讓你的算法表現能夠從訓練集推廣到開發集,算法是沒有在開發集上訓練的。

  3. 用盡一切辦法減少可避免偏差

  4. 比如使用規模更大的模型,這樣算法在訓練集上的表現會更好,或者訓練更久。

  5. 使用更好的優化算法,比如說加入momentum或者RMSprop,或者使用更好的算法,比如Adam。你還可以試試尋找更好的新神經網絡架構,或者說更好的超參數。這些手段包羅萬有,你可以改變激活函數,改變層數或者隱藏單位數,雖然你這麼做可能會讓模型規模變大。

  6. 或者試用其他模型,其他架構,如循環神經網絡和卷積神經網絡。

  
在之後的課程裏我們會詳細介紹的,新的神經網絡架構能否更好地擬合你的訓練集,有時也很難預先判斷,但有時換架構可能會得到好得多的結果。

13.33 理解誤差分析

  
如果你希望讓學習算法能夠勝任人類能做的任務,但你的學習算法還沒有達到人類的表現,那麼人工檢查一下你的算法犯的錯誤也許可以讓你瞭解接下來應該做什麼。這個過程稱爲錯誤分析,我們從一個例子開始講吧。

  
假設你正在調試貓分類器,然後你取得了90%90\%準確率,相當於10%10\%錯誤,,在你的開發集上做到這樣,這離你希望的目標還有很遠。也許你的隊員看了一下算法分類出錯的例子,注意到算法將一些狗分類爲貓,你看看這兩隻狗,它們看起來是有點像貓,至少乍一看是。所以也許你的隊友給你一個建議,如何針對狗的圖片優化算法。試想一下,你可以針對狗,收集更多的狗圖,或者設計一些只處理狗的算法功能之類的,爲了讓你的貓分類器在狗圖上做的更好,讓算法不再將狗分類成貓。所以問題在於,你是不是應該去開始做一個項目專門處理狗?這項目可能需要花費幾個月的時間才能讓算法在狗圖片上犯更少的錯誤,這樣做值得嗎?或者與其花幾個月做這個項目,有可能最後發現這樣一點用都沒有。這裏有個錯誤分析流程,可以讓你很快知道這個方向是否值得努力。

  
那這個簡單的人工統計步驟,錯誤分析,可以節省大量時間,可以迅速決定什麼是最重要的,或者最有希望的方向。實際上,如果你觀察100100個錯誤標記的開發集樣本,也許只需要551010分鐘的時間,親自看看這100100個樣本,並親自統計一下有多少是狗。根據結果,看看有沒有佔到5%5\%50%50\%或者其他東西。這個在551010分鐘之內就能給你估計這個方向有多少價值,並且可以幫助你做出更好的決定,是不是把未來幾個月的時間投入到解決錯誤標記的狗圖這個問題。

  
所以總結一下,進行錯誤分析,你應該找一組錯誤樣本,可能在你的開發集裏或者測試集裏,觀察錯誤標記的樣本,看看假陽性(false positives)和假陰性(false negatives),統計屬於不同錯誤類型的錯誤數量。在這個過程中,你可能會得到啓發,歸納出新的錯誤類型,就像我們看到的那樣。如果你過了一遍錯誤樣本,然後說,天,有這麼多Instagram濾鏡或Snapchat濾鏡,這些濾鏡干擾了我的分類器,你就可以在途中新建一個錯誤類型。總之,通過統計不同錯誤標記類型佔總數的百分比,可以幫你發現哪些問題需要優先解決,或者給你構思新優化方向的靈感。在做錯誤分析的時候,有時你會注意到開發集裏有些樣本被錯誤標記了,這時應該怎麼做呢?我們下一個視頻來討論。

13.34 爲什麼值得花時間查看錯誤標記數據?

  
最後我講幾個建議:
  
首先,深度學習研究人員有時會喜歡這樣說:“我只是把數據提供給算法,我訓練過了,效果拔羣”。這話說出了很多深度學習錯誤的真相,更多時候,我們把數據餵給算法,然後訓練它,並減少人工干預,減少使用人類的見解。但我認爲,在構造實際系統時,通常需要更多的人工錯誤分析,更多的人類見解來架構這些系統,儘管深度學習的研究人員不願意承認這點。
  
其次,不知道爲什麼,我看一些工程師和研究人員不願意親自去看這些樣本,也許做這些事情很無聊,坐下來看100或幾百個樣本來統計錯誤數量,但我經常親自這麼做。當我帶領一個機器學習團隊時,我想知道它所犯的錯誤,我會親自去看看這些數據,嘗試和一部分錯誤作鬥爭。我想就因爲花了這幾分鐘,或者幾個小時去親自統計數據,真的可以幫你找到需要優先處理的任務,我發現花時間親自檢查數據非常值得,所以我強烈建議你們這樣做,如果你在搭建你的機器學習系統的話,然後你想確定應該優先嚐試哪些想法,或者哪些方向。

13.35 快速搭建初始系統的意義?

  
一般來說,對於幾乎所有的機器學習程序可能會有5050個不同的方向可以前進,並且每個方向都是相對合理的可以改善你的系統。但挑戰在於,你如何選擇一個方向集中精力處理。即使我已經在語音識別領域工作多年了,如果我要爲一個新應用程序域構建新系統,我還是覺得很難不花時間去思考這個問題就直接選擇方向。所以我建議你們,如果你想搭建全新的機器學習程序,就是快速搭好你的第一個系統,然後開始迭代。我的意思是我建議你快速設立開發集和測試集還有指標,這樣就決定了你的目標所在,如果你的目標定錯了,之後改也是可以的。但一定要設立某個目標,然後我建議你馬上搭好一個機器學習系統原型,然後找到訓練集,訓練一下,看看效果,開始理解你的算法表現如何,在開發集測試集,你的評估指標上表現如何。當你建立第一個系統後,你就可以馬上用到之前說的偏差方差分析,還有之前最後幾個視頻討論的錯誤分析,來確定下一步優先做什麼。特別是如果錯誤分析讓你瞭解到大部分的錯誤的來源是說話人遠離麥克風,這對語音識別構成特殊挑戰,那麼你就有很好的理由去集中精力研究這些技術,所謂遠場語音識別的技術,這基本上就是處理說話人離麥克風很遠的情況。

  
建立這個初始系統的所有意義在於,它可以是一個快速和粗糙的實現(quick and dirty implementation),你知道的,別想太多。初始系統的全部意義在於,有一個學習過的系統,有一個訓練過的系統,讓你確定偏差方差的範圍,就可以知道下一步應該優先做什麼,讓你能夠進行錯誤分析,可以觀察一些錯誤,然後想出所有能走的方向,哪些是實際上最有希望的方向。

13.36 爲什麼要在不同的劃分上訓練及測試?

  
深度學習算法對訓練數據的胃口很大,當你收集到足夠多帶標籤的數據構成訓練集時,算法效果最好,這導致很多團隊用盡一切辦法收集數據,然後把它們堆到訓練集裏,讓訓練的數據量更大,即使有些數據,甚至是大部分數據都來自和開發集、測試集不同的分佈。在深度學習時代,越來越多的團隊都用來自和開發集、測試集分佈不同的數據來訓練,這裏有一些微妙的地方,一些最佳做法來處理訓練集和測試集存在差異的情況,我們來看看。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-cqlHviip-1575791537836)(./img/ch13/figure_13_36_1.png)]

圖 13.36 Cat app example

  
假設你在開發一個手機應用,用戶會上傳他們用手機拍攝的照片,你想識別用戶從應用中上傳的圖片是不是貓。現在你有兩個數據來源,一個是你真正關心的數據分佈,來自應用上傳的數據,比如右邊的應用,這些照片一般更業餘,取景不太好,有些甚至很模糊,因爲它們都是業餘用戶拍的。另一個數據來源就是你可以用爬蟲程序挖掘網頁直接下載,就這個樣本而言,可以下載很多取景專業、高分辨率、拍攝專業的貓圖片。如果你的應用用戶數還不多,也許你只收集到10,00010,000張用戶上傳的照片,但通過爬蟲挖掘網頁,你可以下載到海量貓圖,也許你從互聯網上下載了超過2020萬張貓圖。而你真正關心的算法表現是你的最終系統處理來自應用程序的這個圖片分佈時效果好不好,因爲最後你的用戶會上傳類似右邊這些圖片,你的分類器必須在這個任務中表現良好。現在你就陷入困境了,因爲你有一個相對小的數據集,只有10,00010,000個樣本來自那個分佈,而你還有一個大得多的數據集來自另一個分佈,圖片的外觀和你真正想要處理的並不一樣。但你又不想直接用這10,00010,000張圖片,因爲這樣你的訓練集就太小了,使用這2020萬張圖片似乎有幫助。但是,困境在於,這2020萬張圖片並不完全來自你想要的分佈,那麼你可以怎麼做呢?

  
這裏有一種選擇,你可以做的一件事是將兩組數據合併在一起,這樣你就有2121萬張照片,你可以把這2121萬張照片隨機分配到訓練、開發和測試集中。爲了說明觀點,我們假設你已經確定開發集和測試集各包含25002500個樣本,所以你的訓練集有205000205000個樣本。現在這麼設立你的數據集有一些好處,也有壞處。好處在於,你的訓練集、開發集和測試集都來自同一分佈,這樣更好管理。但壞處在於,這壞處還不小,就是如果你觀察開發集,看看這25002500個樣本其中很多圖片都來自網頁下載的圖片,那並不是你真正關心的數據分佈,你真正要處理的是來自手機的圖片。

  
我建議你走另外一條路,就是這樣,訓練集,比如說還是205,000205,000張圖片,我們的訓練集是來自網頁下載的200,000200,000張圖片,然後如果需要的話,再加上50005000張來自手機上傳的圖片。然後對於開發集和測試集,這數據集的大小是按比例畫的,你的開發集和測試集都是手機圖。而訓練集包含了來自網頁的2020萬張圖片,還有50005000張來自應用的圖片,開發集就是25002500張來自應用的圖片,測試集也是25002500張來自應用的圖片。這樣將數據分成訓練集、開發集和測試集的好處在於,現在你瞄準的目標就是你想要處理的目標,你告訴你的團隊,我的開發集包含的數據全部來自手機上傳,這是你真正關心的圖片分佈。我們試試搭建一個學習系統,讓系統在處理手機上傳圖片分佈時效果良好。缺點在於,當然了,現在你的訓練集分佈和你的開發集、測試集分佈並不一樣。但事實證明,這樣把數據分成訓練、開發和測試集,在長期能給你帶來更好的系統性能。我們以後會討論一些特殊的技巧,可以處理 訓練集的分佈和開發集和測試集分佈不一樣的情況。

13.37 如何解決數據不匹配問題?

  
如果您的訓練集來自和開發測試集不同的分佈,如果錯誤分析顯示你有一個數據不匹配的問題該怎麼辦?這個問題沒有完全系統的解決方案,但我們可以看看一些可以嘗試的事情。如果我發現有嚴重的數據不匹配問題,我通常會親自做錯誤分析,嘗試瞭解訓練集和開發測試集的具體差異。技術上,爲了避免對測試集過擬合,要做錯誤分析,你應該人工去看開發集而不是測試集。

  
但作爲一個具體的例子,如果你正在開發一個語音激活的後視鏡應用,你可能要看看……我想如果是語音的話,你可能要聽一下來自開發集的樣本,嘗試弄清楚開發集和訓練集到底有什麼不同。所以,比如說你可能會發現很多開發集樣本噪音很多,有很多汽車噪音,這是你的開發集和訓練集差異之一。也許你還會發現其他錯誤,比如在你的車子裏的語言激活後視鏡,你發現它可能經常識別錯誤街道號碼,因爲那裏有很多導航請求都有街道地址,所以得到正確的街道號碼真的很重要。當你瞭解開發集誤差的性質時,你就知道,開發集有可能跟訓練集不同或者更難識別,那麼你可以嘗試把訓練數據變得更像開發集一點,或者,你也可以收集更多類似你的開發集和測試集的數據。所以,比如說,如果你發現車輛背景噪音是主要的錯誤來源,那麼你可以模擬車輛噪聲數據,我會在下一張幻燈片裏詳細討論這個問題。或者你發現很難識別街道號碼,也許你可以有意識地收集更多人們說數字的音頻數據,加到你的訓練集裏。

  
現在我知道這張幻燈片只給出了粗略的指南,列出一些你可以做的嘗試,這不是一個系統化的過程,我想,這不能保證你一定能取得進展。但我發現這種人工見解,我們可以一起嘗試收集更多和真正重要的場合相似的數據,這通常有助於解決很多問題。所以,如果你的目標是讓訓練數據更接近你的開發集,那麼你可以怎麼做呢?

  
你可以利用的其中一種技術是人工合成數據(artificial data synthesis),我們討論一下。在解決汽車噪音問題的場合,所以要建立語音識別系統。也許實際上你沒那麼多實際在汽車背景噪音下錄得的音頻,或者在高速公路背景噪音下錄得的音頻。但我們發現,你可以合成。所以假設你錄製了大量清晰的音頻,不帶車輛背景噪音的音頻,“The quick brown fox jumps over the lazy dog”(音頻播放),所以,這可能是你的訓練集裏的一段音頻,順便說一下,這個句子在AI測試中經常使用,因爲這個短句包含了從a到z所有字母,所以你會經常見到這個句子。但是,有了這個“the quick brown fox jumps over the lazy dog”這段錄音之後,你也可以收集一段這樣的汽車噪音,(播放汽車噪音音頻)這就是汽車內部的背景噪音,如果你一言不發開車的話,就是這種聲音。如果你把兩個音頻片段放到一起,你就可以合成出"the quick brown fox jumps over the lazy dog"(帶有汽車噪聲),在汽車背景噪音中的效果,聽起來像這樣,所以這是一個相對簡單的音頻合成例子。在實踐中,你可能會合成其他音頻效果,比如混響,就是聲音從汽車內壁上反彈疊加的效果。

  
但是通過人工數據合成,你可以快速製造更多的訓練數據,就像真的在車裏錄的那樣,那就不需要花時間實際出去收集數據,比如說在實際行駛中的車子,錄下上萬小時的音頻。所以,如果錯誤分析顯示你應該嘗試讓你的數據聽起來更像在車裏錄的,那麼人工合成那種音頻,然後餵給你的機器學習算法,這樣做是合理的。

  
現在我們要提醒一下,人工數據合成有一個潛在問題,比如說,你在安靜的背景裏錄得10,00010,000小時音頻數據,然後,比如說,你只錄了一小時車輛背景噪音,那麼,你可以這麼做,將這11小時汽車噪音回放10,00010,000次,併疊加到在安靜的背景下錄得的10,00010,000小時數據。如果你這麼做了,人聽起來這個音頻沒什麼問題。但是有一個風險,有可能你的學習算法對這1小時汽車噪音過擬合。特別是,如果這組汽車裏錄的音頻可能是你可以想象的所有汽車噪音背景的集合,如果你只錄了一小時汽車噪音,那你可能只模擬了全部數據空間的一小部分,你可能只從汽車噪音的很小的子集來合成數據。

  
所以,總而言之,如果你認爲存在數據不匹配問題,我建議你做錯誤分析,或者看看訓練集,或者看看開發集,試圖找出,試圖瞭解這兩個數據分佈到底有什麼不同,然後看看是否有辦法收集更多看起來像開發集的數據作訓練。

  
我們談到其中一種辦法是人工數據合成,人工數據合成確實有效。在語音識別中。我已經看到人工數據合成顯著提升了已經非常好的語音識別系統的表現,所以這是可行的。但當你使用人工數據合成時,一定要謹慎,要記住你有可能從所有可能性的空間只選了很小一部分去模擬數據。

  
所以這就是如何處理數據不匹配問題,接下來,我想和你分享一些想法就是如何從多種類型的數據同時學習。

13.38 梯度檢驗注意事項?

  
首先,不要在訓練中使用梯度檢驗,它只用於調試。我的意思是,計算所有值的是一個非常漫長的計算過程,爲了實施梯度下降,你必須使用和 backprop來計算,並使用backprop來計算導數,只要調試的時候,你纔會計算它,來確認數值是否接近。完成後,你會關閉梯度檢驗,梯度檢驗的每一個迭代過程都不執行它,因爲它太慢了。

  
第二點,如果算法的梯度檢驗失敗,要檢查所有項,檢查每一項,並試着找出bug,也就是說,如果與dθ[i]d\theta[i]的值相差很大,我們要做的就是查找不同的ii值,看看是哪個導致與的值相差這麼多。舉個例子,如果你發現,相對某些層或某層的或的值相差很大,但是的各項非常接近,注意的各項與和的各項都是一一對應的,這時,你可能會發現,在計算參數的導數的過程中存在bug。反過來也是一樣,如果你發現它們的值相差很大,的值與的值相差很大,你會發現所有這些項目都來自於或某層的,可能幫你定位bug的位置,雖然未必能夠幫你準確定位bug的位置,但它可以幫助你估測需要在哪些地方追蹤bug。

  
第三點,在實施梯度檢驗時,如果使用正則化,請注意正則項。如果代價函數,這就是代價函數J的定義,等於與相關的函數的梯度,包括這個正則項,記住一定要包括這個正則項。

  
第四點,梯度檢驗不能與dropout同時使用,因爲每次迭代過程中,dropout會隨機消除隱藏層單元的不同子集,難以計算dropout在梯度下降上的代價函數J。因此dropout可作爲優化代價函數的一種方法,但是代價函數J被定義爲對所有指數極大的節點子集求和。而在任何迭代過程中,這些節點都有可能被消除,所以很難計算代價函數。你只是對成本函數做抽樣,用dropout,每次隨機消除不同的子集,所以很難用梯度檢驗來雙重檢驗dropout的計算,所以我一般不同時使用梯度檢驗和dropout。如果你想這樣做,可以把dropout中的keepprob設置爲1.01.0,然後打開dropout,並寄希望於dropout的實施是正確的,你還可以做點別的,比如修改節點丟失模式確定梯度檢驗是正確的。實際上,我一般不這麼做,我建議關閉dropout,用梯度檢驗進行雙重檢查,在沒有dropout的情況下,你的算法至少是正確的,然後打開dropout。

  
最後一點,也是比較微妙的一點,現實中幾乎不會出現這種情況。當和接近0時,梯度下降的實施是正確的,在隨機初始化過程中……,但是在運行梯度下降時,和變得更大。可能只有在和接近00時,backprop的實施纔是正確的。但是當和變大時,它會變得越來越不準確。你需要做一件事,我不經常這麼做,就是在隨機初始化過程中,運行梯度檢驗,然後再訓練網絡,和會有一段時間遠離00,如果隨機初始化值比較小,反覆訓練網絡之後,再重新運行梯度檢驗。

  
這就是梯度檢驗,恭喜大家,這是本週最後一課了。回顧這一週,我們講了如何配置訓練集,驗證集和測試集,如何分析偏差和方差,如何處理高偏差或高方差以及高偏差和高方差並存的問題,如何在神經網絡中應用不同形式的正則化,如正則化和dropout,還有加快神經網絡訓練速度的技巧,最後是梯度檢驗。這一週我們學習了很多內容,你可以在本週編程作業中多多練習這些概念。祝你好運,期待下週再見。

13.39什麼是隨機梯度下降?

  
隨機梯度下降,簡稱SGD,是指梯度下降算法在訓練集上,對每一個訓練數據都計算誤差並更新模型。
對每一個數據都進行模型更新意味着隨機梯度下降是一種在線機器學習算法

  
優點:

  • 頻繁的更新可以給我們一個模型表現和效率提升的即時反饋。
  • 這可能是最容易理解和實現的一種方式,尤其對於初學者。
  • 較高的模型更新頻率在一些問題上可以快速的學習。
  • 這種伴有噪聲的更新方式能讓模型避免局部最優(比如過早收斂)。

  
缺點:

  • 這種方式相比其他來說,計算消耗更大,在大數據集上花費的訓練時間更多。
  • 頻繁的更新產生的噪聲可能導致模型參數和模型誤差來回跳動(更大的方差)。
  • 這種伴有噪聲的更新方式也能讓算法難以穩定的收斂於一點。

13.40什麼是批量梯度下降?

  
批量梯度下降對訓練集上每一個數據都計算誤差,但只在所有訓練數據計算完成後才更新模型。
  
對訓練集上的一次訓練過程稱爲一代(epoch)。因此,批量梯度下降是在每一個訓練epoch之後更新模型。

  
優點:

  • 更少的模型更新意味着比SGD有更高的計算效率。
  • 在一些問題上可以得到更穩定的誤差梯度和更穩定的收斂點。
  • 誤差計算和模型更新過程的分離有利於並行算法的實現。

  
缺點:

  • 更穩定的誤差梯度可能導致模型過早收斂於一個不是最優解的參數集。
  • 每一次epoch之後才更新會增加一個累加所有訓練數據誤差的複雜計算。
  • 通常來說,批量梯度下降算法需要把所有的訓練數據都存放在內存中。
  • 在大數據集上,訓練速度會非常慢。

13.41什麼是小批量梯度下降?

  
小批量梯度下降把訓練集劃分爲很多批,對每一批(batch)計算誤差並更新參數。
  
可以選擇對batch的梯度進行累加,或者取平均值。取平均值可以減少梯度的方差。
  
小批量梯度下降在隨機梯度下降的魯棒性和批量梯度下降的效率之間取得平衡。是如今深度學習領域最常見的實現方式。

  
優點:

  • 比批量梯度下降更快的更新頻率有利於更魯棒的收斂,避免局部最優。
  • 相比隨機梯度下降更具計算效率。
  • 不需要把所有數據放入內存中。

  
缺點:

  • 小批量梯度下降給算法增加了一個超參數batch size。
  • 和批量梯度下降一樣,每一個batch上的誤差需要累加。

13.42怎麼配置mini-batch梯度下降

  
Mini-batch梯度下降對於深度學習大部分應用是最常用的方法。
  
Mini-batch sizes,簡稱爲 “batch sizes”,是算法設計中需要調節的參數。比如對應於不同GPU或CPU硬件(32,64,128,256,)(32,64,128,256,\cdots)的內存要求。
  
batch size是學習過程中的“滑塊”。

  
(1)較小的值讓學習過程收斂更快,但是產生更多噪聲。
  
(2)較大的值讓學習過程收斂較慢,但是準確的估計誤差梯度。

  
建議1:batch size的默認值最好是3232
  
batch size通常從1到幾百之間選擇,比如3232是一個很好的默認值,超過1010的值可以充分利用矩陣*矩陣相對於矩陣*向量的加速優勢。
——Practical recommendations for gradient-based training of deep architectures, 2012

  
建議2:調節batch size時,最好觀察模型在不同batch size下的訓練時間和驗證誤差的學習曲線
  
相比於其他超參數,它可以被單獨優化。在其他超參數(除了學習率)確定之後,在對比訓練曲線(訓練誤差和驗證誤差對應於訓練時間)。

  
建議3:調整其他所有超參數之後再調整batch size和學習率
  
batch size和學習率幾乎不受其他超參數的影響,因此可以放到最後再優化。batch size確定之後,可以被視爲固定值,從而去優化其他超參數(如果使用了動量超參數則例外)。

13.43 局部最優的問題

  
在深度學習研究早期,人們總是擔心優化算法會困在極差的局部最優,不過隨着深度學習理論不斷髮展,我們對局部最優的理解也發生了改變。我向你展示一下現在我們怎麼看待局部最優以及深度學習中的優化問題。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-U4JNddTJ-1575791537837)(./img/ch13/figure_13_43_1.png)]

圖 13.43.1

  
這是曾經人們在想到局部最優時腦海裏會出現的圖,也許你想優化一些參數,我們把它們稱之爲和,平面的高度
就是損失函數。在圖中似乎各處都分佈着局部最優。梯度下降法或者某個算法可能困在一個局部最優中,而不會抵達
全局最優。如果你要作圖計算一個數字,比如說這兩個維度,就容易出現有多個不同局部最優的圖,而這些低維的圖
曾經影響了我們的理解,但是這些理解並不正確。事實上,如果你要創建一個神經網絡,通常梯度爲零的點並不是這
個圖中的局部最優點,實際上成本函數的零梯度點,通常是鞍點。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Qzd5cuEl-1575791537838)(./img/ch13/figure_13_43_2.png)]

圖 13.43.2

  
也就是在這個點,這裏是和,高度即成本函數的值。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-0akREH8w-1575791537839)(./img/ch13/figure_13_43_3.png)]

圖 13.43.3

  
但是一個具有高維度空間的函數,如果梯度爲00,那麼在每個方向,它可能是凸函數,也可能是凹函數。如果你在22萬維空間中,那麼想要得到局部最優,所有的22萬個方向都需要是這樣,但發生的機率也許很小,也許是,你更有可能遇到有些方向的曲線會這樣向上彎曲,另一些方向曲線向下彎,而不是所有的都向上彎曲,因此在高維度空間,你更可能碰到鞍點。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-s8IsjDgc-1575791537839)(./img/ch13/figure_13_43_4.png)]

圖 13.43.4

  
就像下面的這種:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-eZaCpfWP-1575791537840)(./img/ch13/figure_13_43_5.png)]

圖 13.43.5

  
而不會碰到局部最優。至於爲什麼會把一個曲面叫做鞍點,你想象一下,就像是放在馬背上的馬鞍一樣,如果這是馬,這是馬的頭,這就是馬的眼睛,畫得不好請多包涵,然後你就是騎馬的人,要坐在馬鞍上,因此這裏的這個點,導數爲00的點,這個點叫做鞍點。我想那確實是你坐在馬鞍上的那個點,而這裏導數爲00
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-o1JVt2Nt-1575791537841)(./img/ch13/figure_13_43_6.png)]

圖 13.43.6

  
所以我們從深度學習歷史中學到的一課就是,我們對低維度空間的大部分直覺,比如你可以畫出上面的圖,並不能應用到高維度空間中。適用於其它算法,因爲如果你有22萬個參數,那麼函數有22萬個維度向量,你更可能遇到鞍點,而不是局部最優點。

  
如果局部最優不是問題,那麼問題是什麼?結果是平穩段會減緩學習,平穩段是一塊區域,其中導數長時間接近於00,如果你在此處,梯度會從曲面從從上向下下降,因爲梯度等於或接近00,曲面很平坦,你得花上很長時間慢慢抵達平穩段的這個點,因爲左邊或右邊的隨機擾動,我換個筆墨顏色,大家看得清楚一些,然後你的算法能夠走出平穩段(紅色筆)。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Sh7iiku2-1575791537841)(./img/ch13/figure_13_43_7.png)]

圖 13.43.7

  
我們可以沿着這段長坡走,直到這裏,然後走出平穩段。
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-zv35Dmrw-1575791537842)(./img/ch13/figure_13_43_8.png)]

圖 13.43.8

  
所以此次視頻的要點是,首先,你不太可能困在極差的局部最優中,條件是你在訓練較大的神經網絡,存在大量參數,並且成本函數被定義在較高的維度空間。

  
第二點,平穩段是一個問題,這樣使得學習十分緩慢,這也是像Momentum或是RMSprop,Adam這樣的算法,能夠加速學習算法的地方。在這些情況下,更成熟的優化算法,如Adam算法,能夠加快速度,讓你儘早往下走出平穩段。

  
因爲你的網絡要解決優化問題,說實話,要面臨如此之高的維度空間,我覺得沒有人有那麼好的直覺,知道這些空間長什麼樣,而且我們對它們的理解還在不斷髮展,不過我希望這一點能夠讓你更好地理解優化算法所面臨的問題。

13.44 提升算法性能思路

  
這個列表裏提到的思路並完全,但是一個好的開始。 
  
我的目的是給出很多可以嘗試的思路,希望其中的一或兩個你之前沒有想到。你經常只需要一個好的想法就能得到性能提升。
  
如果你能從其中一個思路中得到結果,請在評論區告訴我。我很高興能得知這些好消息。
  
如果你有更多的想法,或者是所列思路的拓展,也請告訴我,我和其他讀者都將受益!有時候僅僅是一個想法或許就能使他人得到突破。

1. 通過數據提升性能 
2. 通過算法提升性能 
3. 通過算法調參提升性能 
4. 通過嵌套模型提升性能

  
通常來講,隨着列表自上而下,性能的提升也將變小。例如,對問題進行新的架構或者獲取更多的數據,通常比調整最優算法的參數能帶來更好的效果。雖然並不總是這樣,但是通常來講是的。

  
我已經把相應的鏈接加入了博客的教程中,相應網站的問題中,以及經典的Neural Net FAQ中。
  
部分思路只適用於人工神經網絡,但是大部分是通用的。通用到足夠你用來配合其他技術來碰撞出提升模型性能的方法。
OK,現在讓我們開始吧。

  1. 通過數據提升性能

  
對你的訓練數據和問題定義進行適當改變,你能得到很大的性能提升。或許是最大的性能提升。

  
以下是我將要提到的思路:
  
獲取更多數據、創造更多數據、重放縮你的數據、轉換你的數據、特徵選取、重架構你的問題

  
1)獲取更多數據
  
你能獲取更多訓練數據嗎? 
  
你的模型的質量通常受到你的訓練數據質量的限制。爲了得到最好的模型,你首先應該想辦法獲得最好的數據。你也想盡可能多的獲得那些最好的數據。
  
有更多的數據,深度學習和其他現代的非線性機器學習技術有更全的學習源,能學得更好,深度學習尤爲如此。這也是機器學習對大家充滿吸引力的很大一個原因(世界到處都是數據)。

  
2) 創造更多數據
  
上一小節說到了有了更多數據,深度學習算法通常會變的更好。有些時候你可能無法合理地獲取更多數據,那你可以試試創造更多數據。
  
如果你的數據是數值型向量,可以隨機構造已有向量的修改版本。
  
如果你的數據是圖片,可以隨機構造已有圖片的修改版本(平移、截取、旋轉等)。
  
如果你的數據是文本,類似的操作……
  
這通常被稱作數據擴增(data augmentation)或者數據生成(data generation)。
  
你可以利用一個生成模型。你也可以用一些簡單的技巧。例如,針對圖片數據,你可以通過隨機地平移或旋轉已有圖片獲取性能的提升。如果新數據中包含了這種轉換,則提升了模型的泛化能力。
  
這也與增加噪聲是相關的,我們習慣稱之爲增加擾動。它起到了與正則化方法類似的作用,即抑制訓練數據的過擬合。

  
3)重縮放(rescale)你的數據
  
這是一個快速獲得性能提升的方法。 當應用神經網絡時,一個傳統的經驗法則是:重縮放(rescale)你的數據至激活函數的邊界。
  
如果你在使用sigmoid激活函數,重縮放你的數據到0和1的區間裏。如果你在使用雙曲正切(tanh)激活函數,重縮放數據到-1和1的區間裏。
  
這種方法可以被應用到輸入數據(x)和輸出數據(y)。例如,如果你在輸出層使用sigmoid函數去預測二元分類的結果,應當標準化y值,使之成爲二元的。如果你在使用softmax函數,你依舊可以通過標準化y值來獲益。
  
這依舊是一個好的經驗法則,但是我想更深入一點。我建議你可以參考下述方法來創造一些訓練數據的不同的版本:
  
歸一化到0和1的區間。
  
重放縮到-1和1的區間
  
標準化(譯者注:標準化數據使之成爲零均值,單位標準差)
  
然後對每一種方法,評估你的模型的性能,選取最好的進行使用。如果你改變了你的激活函數,重複這一過程。
  
在神經網絡中,大的數值累積效應(疊加疊乘)並不是好事,除上述方法之外,還有其他的方法來控制你的神經網絡中數據的數值大小,譬如歸一化激活函數和權重,我們會在以後討論這些技術。

  
4)數據變換
  
這裏的數據變換與上述的重縮放方法類似,但需要更多工作。你必須非常熟悉你的數據。通過可視化來考察離羣點。
  
猜測每一列數據的單變量分佈。
  
列數據看起來像偏斜的高斯分佈嗎?考慮用Box-Cox變換調整偏態。
  
列數據看起來像指數分佈嗎?考慮用對數變換。
  
列數據看起來有一些特徵,但是它們被一些明顯的東西遮蓋了,嘗試取平方或者開平方根來轉換數據
  
你能離散化一個特徵或者以某種方式組合特徵,來更好地突出一些特徵嗎?
  
依靠你的直覺,嘗試以下方法。
  
你能利用類似PCA的投影方法來預處理數據嗎?
  
你能綜合多維特徵至一個單一數值(特徵)嗎?
  
你能用一個新的布爾標籤去發現問題中存在一些有趣的方面嗎?
  
你能用其他方法探索出目前場景下的其他特殊結構嗎?
  
神經網層擅長特徵學習(feature engineering)。它(自己)可以做到這件事。但是如果你能更好的發現問題到網絡中的結構,神經網層會學習地更快。你可以對你的數據就不同的轉換方式進行抽樣調查,或者嘗試特定的性質,來看哪些有用,哪些沒用。

  
5)特徵選擇
  
一般說來,神經網絡對不相關的特徵是具有魯棒的(校對注:即不相關的特徵不會很大影響神經網絡的訓練和效果)。它們會用近似於0的權重來弱化那些沒有預測能力的特徵的貢獻。

  
儘管如此,這些無關的數據特徵,在訓練週期依舊要耗費大量的資源。所以你能去除數據裏的一些特徵嗎?
  
有許多特徵選擇的方法和特徵重要性的方法,這些方法能夠給你提供思路,哪些特徵該保留,哪些特徵該剔除。最簡單的方式就是對比所有特徵和部分特徵的效果。同樣的,如果你有時間,我建議在同一個網絡中嘗試選擇不同的視角來看待你的問題,評估它們,來看看分別有怎樣的性能。
  
或許你利用更少的特徵就能達到同等甚至更好的性能。而且,這將使模型變得更快!
  
或許所有的特徵選擇方法都剔除了同樣的特徵子集。很好,這些方法在沒用的特徵上達成了一致。
  
或許篩選過後的特徵子集,能帶給特徵工程的新思路。
  

  
6)重新架構你的問題
  
有時候要試試從你當前定義的問題中跳出來,想想你所收集到的觀察值是定義你問題的唯一方式嗎?或許存在其他方法。或許其他構建問題的方式能夠更好地揭示待學習問題的結構。
  
我真的很喜歡這個嘗試,因爲它迫使你打開自己的思路。這確實很難,尤其是當你已經對當前的方法投入了大量的時間和金錢時。
  
但是咱們這麼想想,即使你列出了3-5個可供替代的建構方案,而且最終還是放棄了它們,但這至少說明你對當前的方案更加自信了。
  
看看能夠在一個時間窗(時間週期)內對已有的特徵/數據做一個合併。
  
或許你的分類問題可以成爲一個迴歸問題(有時候是迴歸到分類)。
  
或許你的二元輸出可以變成softmax輸出?
  
或許你可以轉而對子問題進行建模。
  
仔細思考你的問題,最好在你選定工具之前就考慮用不同方法構建你的問題,因爲此時你對解決方案並沒有花費太多的投入。除此之外,如果你在某個問題上卡住了,這樣一個簡單的嘗試能釋放更多新的想法。

  1. 通過算法提升性能

  
機器學習當然是用算法解決問題。
  
所有的理論和數學都是描繪了應用不同的方法從數據中學習一個決策過程(如果我們這裏只討論預測模型)。
  
你已經選擇了深度學習來解釋你的問題。但是這真的是最好的選擇嗎?在這一節中,我們會在深入到如何最大地發掘你所選擇的深度學習方法之前,接觸一些算法選擇上的思路。

下面是一個簡要列表:

  • 對算法進行抽樣調查
  • 借鑑已有文獻
  • 重採樣方法

下面我解釋下上面提到的幾個方法:

  
1)對算法進行抽樣調查
  
其實你事先無法知道,針對你的問題哪個算法是最優的。如果你知道,你可能就不需要機器學習了。那有沒有什麼數據(辦法)可以證明你選擇的方法是正確的?

  
讓我們來解決這個難題。當從所有可能的問題中平均來看各算法的性能時,沒有哪個算法能夠永遠勝過其他算法。所有的算法都是平等的,下面是在no free lunch theorem中的一個總結。

  
或許你選擇的算法不是針對你的問題最優的那個 
  
我們不是在嘗試解決所有問題,算法世界中有很多新熱的方法,可是它們可能並不是針對你數據集的最優算法。
  
我的建議是收集(證據)數據指標。接受更好的算法或許存在這一觀點,並且給予其他算法在解決你的問題上“公平競爭”的機會。
  
抽樣調查一系列可行的方法,來看看哪些還不錯,哪些不理想。
  
首先嚐試評估一些線性方法,例如邏輯迴歸(logistic regression)和線性判別分析(linear discriminate analysis)。
  
評估一些樹類模型,例如CART, 隨機森林(Random Forest)和Gradient Boosting。
  
評估一些實例方法,例如支持向量機(SVM)和K-近鄰(kNN)。
  
評估一些其他的神經網絡方法,例如LVQ, MLP, CNN, LSTM, hybrids等

  
選取性能最好的算法,然後通過進一步的調參和數據準備來提升。尤其注意對比一下深度學習和其他常規機器學習方法,對上述結果進行排名,比較他們的優劣。

  
很多時候你會發現在你的問題上可以不用深度學習,而是使用一些更簡單,訓練速度更快,甚至是更容易理解的算法。

  
2)借鑑已有文獻
  
方法選擇的一個捷徑是借鑑已有的文獻資料。可能有人已經研究過與你的問題相關的問題,你可以看看他們用的什麼方法。
  
你可以閱讀論文,書籍,博客,問答網站,教程,以及任何能在谷歌搜索到的東西。
  
寫下所有的想法,然後用你的方式把他們研究一遍。
  
這不是複製別人的研究,而是啓發你想出新的想法,一些你從沒想到但是卻有可能帶來性能提升的想法。
  
發表的研究通常都是非常讚的。世界上有非常多聰明的人,寫了很多有趣的東西。你應當好好挖掘這個“圖書館”,找到你想要的東西。

  
3)重採樣方法
  
你必須知道你的模型效果如何。你對模型性能的估計可靠嗎?
  
深度學習模型在訓練階段非常緩慢。這通常意味着,我們無法用一些常用的方法,例如k層交叉驗證,去估計模型的性能。

  
或許你在使用一個簡單的訓練集/測試集分割,這是常規套路。如果是這樣,你需要確保這種分割針對你的問題具有代表性。單變量統計和可視化是一個好的開始。

  
或許你能利用硬件來加速估計的過程。例如,如果你有集羣或者AWS雲端服務(Amazon Web Services)賬號,你可以並行地訓練n個模型,然後獲取結果的均值和標準差來得到更魯棒的估計。

  
或許你可以利用hold-out驗證方法來了解模型在訓練後的性能(這在早停法(early stopping)中很有用,後面會講到)。

  
或許你可以先隱藏一個完全沒用過的驗證集,等到你已經完成模型選擇之後再使用它。
  
而有時候另外的方式,或許你能夠讓數據集變得更小,以及使用更強的重採樣方法。
  
有些情況下你會發現在訓練集的一部分樣本上訓練得到的模型的性能,和在整個數據集上訓練得到的模型的性能有很強的相關性。也許你可以先在小數據集上完成模型選擇和參數調優,然後再將最終的方法擴展到全部數據集上。

  
或許你可以用某些方式限制數據集,只取一部分樣本,然後用它進行全部的建模過程。

  1. 通過算法調參提升性能

  
這通常是工作的關鍵所在。你經常可以通過抽樣調查快速地發現一個或兩個性能優秀的算法。但是如果想得到最優的算法可能需要幾天,幾周,甚至幾個月。

爲了獲得更優的模型,以下是對神經網絡算法進行參數調優的幾點思路:

  • 診斷(Diagnostics)
  • 權重初始化(Weight Initialization)
  • 學習速率(Learning Rate)
  • 激活函數
  • 網絡拓撲(Network Topology)
  • 批次和週期(Batches and Epochs)
  • 正則化
  • 優化和損失
  • 早停法

  
你可能需要訓練一個給定“參數配置”的神經網絡模型很多次(3-10次甚至更多),才能得到一個估計性能不錯的參數配置。這一點幾乎適用於這一節中你能夠調參的所有方面。

  
1)診斷
  
如果你能知道爲什麼你的模型性能不再提高了,你就能獲得擁有更好性能的模型。 
  
你的模型是過擬合還是欠擬合?永遠牢記這個問題。永遠。 
  
模型總是會遇到過擬合或者欠擬合,只是程度不同罷了。一個快速瞭解模型學習行爲的方法是,在每個週期,評估模型在訓練集和驗證集上的表現,並作出圖表。

  
如果訓練集上的模型總是優於驗證集上的模型,你可能遇到了過擬合,你可以使用諸如正則化的方法。

  
如果訓練集和驗證集上的模型都很差,你可能遇到了欠擬合,你可以提升網絡的容量,以及訓練更多或者更久。

  
如果有一個拐點存在,在那之後訓練集上的模型開始優於驗證集上的模型,你可能需要使用早停法。
  
經常畫一畫這些圖表,學習它們來了解不同的方法,你能夠提升模型的性能。這些圖表可能是你能創造的最有價值的(模型狀態)診斷信息。
  
另一個有用的診斷是網絡模型判定對和判定錯的觀察值。
  
對於難以訓練的樣本,或許你需要更多的數據。
  
或許你應該剔除訓練集中易於建模的多餘的樣本。
  
也許可以嘗試對訓練集劃分不同的區域,在特定區域中用更專長的模型。

  
2)權重初始化
  
經驗法則通常是:用小的隨機數進行初始化。
  
在實踐中,這可能依舊效果不錯,但是對於你的網絡來說是最佳的嗎?對於不同的激活函數也有一些啓發式的初始化方法,但是在實踐應用中並沒有太多不同。
  
固定你的網絡,然後嘗試多種初始化方式。
  
記住,權重是你的模型真正的參數,你需要找到他們。有很多組權重都能有不錯的性能表現,但我們要儘量找到最好的。

  
嘗試所有不同的初始化方法,考察是否有一種方法在其他情況不變的情況下(效果)更優。

  
嘗試用無監督的方法,例如自動編碼(autoencoder),來進行預先學習。

  
嘗試使用一個已經存在的模型,只是針對你的問題重新訓練輸入層和輸出層(遷移學習(transfer learning))
  
需要提醒的一點是,改變權重初始化方法和激活函數,甚至優化函數/損失函數緊密相關。

  
3)學習率
  
調整學習率很多時候也是行之有效的時段。

以下是可供探索的一些想法:

  
實驗很大和很小的學習率

  
格點搜索文獻裏常見的學習速率值,考察你能學習多深的網絡。

  
嘗試隨週期遞減的學習率

  
嘗試經過固定週期數後按比例減小的學習率。

  
嘗試增加一個動量項(momentum term),然後對學習速率和動量同時進行格點搜索。

  
越大的網絡需要越多的訓練,反之亦然。如果你添加了太多的神經元和層數,適當提升你的學習速率。同時學習率需要和訓練週期,batch size大小以及優化方法聯繫在一起考慮。

  
4)激活函數
  
你或許應該使用修正激活函數(rectifier activation functions)。他們也許能提供更好的性能。
  
在這之前,最早的激活函數是sigmoid和tanh,之後是softmax, 線性激活函數,或者輸出層上的sigmoid函數。我不建議嘗試更多的激活函數,除非你知道你自己在幹什麼。
  
嘗試全部三種激活函數,並且重縮放你的數據以滿足激活函數的邊界。
  
顯然,你想要爲輸出的形式選擇正確的傳遞函數,但是可以考慮一下探索不同表示。例如,把在二元分類問題上使用的sigmoid函數切換到迴歸問題上使用的線性函數,然後後置處理你的輸出。這可能需要改變損失函數使之更合適。詳情參閱數據轉換那一節。

  
5)網絡拓撲
  
網絡結構的改變能帶來好處。
  
你需要多少層以及多少個神經元?抱歉沒有人知道。不要問這種問題…
  
那怎麼找到適用你的問題的配置呢?去實驗吧。

  
嘗試一個隱藏層和許多神經元(廣度模型)。

  
嘗試一個深的網絡,但是每層只有很少的神經元(深度模型)。

  
嘗試上述兩種方法的組合。

  
借鑑研究問題與你的類似的論文裏面的結構。

  
嘗試拓撲模式(扇出(fan out)然後扇入(fan in))和書籍論文裏的經驗法則(下有鏈接)

  
選擇總是很困難的。通常說來越大的網絡有越強的代表能力,或許你需要它。越多的層數可以提供更強的從數據中學到的抽象特徵的能力。或許需要它。
  
深層的神經網絡需要更多的訓練,無論是訓練週期還是學習率,都應該相應地進行調整。

  
6)Batches和週期
  
batch size大小會決定最後的梯度,以及更新權重的頻度。一個週期(epoch)指的是神經網絡看一遍全部訓練數據的過程。
  
你是否已經試驗了不同的批次batch size和週期數? 之前,我們已經討論了學習率,網絡大小和週期之間的關係。
  
在很深的網絡結構裏你會經常看到:小的batch size配以大的訓練週期。
  
下面這些或許能有助於你的問題,也或許不能。你要在自己的數據上嘗試和觀察。

  
嘗試選取與訓練數據同大小的batch size,但注意一下內存(批次學習(batch learning))

  
嘗試選取1作爲batch size(在線學習(online learning))

  
嘗試用格點搜索不同的小的batch size(8,16,32,…)

  
分別嘗試訓練少量週期和大量週期。

  
考慮一個接近無窮的週期值(持續訓練),去記錄到目前爲止能得到的最佳的模型。
  
一些網絡結構對batch size更敏感。我知道多層感知器(Multilayer Perceptrons)通常對batch size是魯棒的,而LSTM和CNNs比較敏感,但是這只是一個說法(僅供參考)。

  
7)正則化
正則化是一個避免模型在訓練集上過擬合的好方法。
  
神經網絡裏最新最熱的正則化技術是dropout方法,你是否試過?dropout方法在訓練階段隨機地跳過一些神經元,驅動這一層其他的神經元去捕捉鬆弛。簡單而有效。你可以從dropout方法開始。

  
格點搜索不同的丟失比例。

  
分別在輸入,隱藏層和輸出層中試驗dropout方法

  
dropout方法也有一些拓展,比如你也可以嘗試drop connect方法。

  
也可以嘗試其他更傳統的神經網絡正則化方法,例如:

  
權重衰減(Weight decay)去懲罰大的權重

  
激活約束(Activation constraint)去懲罰大的激活值

  
你也可以試驗懲罰不同的方面,或者使用不同種類的懲罰/正則化(L1, L2, 或者二者同時)

  
8)優化和損失
  
最常見是應用隨機梯度下降法(stochastic gradient descent),但是現在有非常多的優化器。你試驗過不同的優化(方法)過程嗎?隨機梯度下降法是默認的選擇。先好好利用它,配以不同的學習率和動量。

  
許多更高級的優化方法有更多的參數,更復雜,也有更快的收斂速度。 好與壞,是不是需要用,取決於你的問題。

  
爲了更好的利用好一個給定的(優化)方法,你真的需要弄明白每個參數的意義,然後針對你的問題通過格點搜索不同的的取值。困難,消耗時間,但是值得。

  
我發現了一些更新更流行的方法,它們可以收斂的更快,並且針對一個給定網絡的容量提供了一個快速瞭解的方式,例如:

  • ADAM
  • RMSprop

  
你還可以探索其他優化算法,例如,更傳統的(Levenberg-Marquardt)和不那麼傳統的(genetic algorithms)。其他方法能夠爲隨機梯度下降法和其他類似方法提供好的出發點去改進。

  
要被優化的損失函數與你要解決的問題高度相關。然而,你通常還是有一些餘地(可以做一些微調,例如迴歸問題中的均方誤(MSE)和平均絕對誤差(MAE)等),有時候變換損失函數還有可能獲得小的性能提升,這取決於你輸出數據的規模和使用的激活函數。

  
9)Early Stopping/早停法
  
一旦訓練過程中出現(驗證集)性能開始下降,你可以停止訓練與學習。這可以節省很多時間,而且甚至可以讓你使用更詳盡的重採樣方法來評估你的模型的性能。

  
早停法是一種用來避免模型在訓練數據上的過擬合的正則化方式,它需要你監測模型在訓練集以及驗證集上每一輪的效果。一旦驗證集上的模型性能開始下降,訓練就可以停止。

  
如果某個條件滿足(衡量準確率的損失),你還可以設置檢查點(Checkpointing)來儲存模型,使得模型能夠繼續學習。檢查點使你能夠早停而非真正的停止訓練,因此在最後,你將有一些模型可供選擇。

  1. 通過嵌套模型提升性能

  
你可以組合多個模型的預測能力。剛纔提到了算法調參可以提高最後的性能,調參之後這是下一個可以提升的大領域。
  
事實上,你可以經常通過組合多個“足夠好的”模型來得到優秀的預測能力,而不是通過組合多個高度調參的(脆弱的)模型。

你可以考慮以下三個方面的嵌套方式:

  • 組合模型
  • 組合視角
  • 堆疊(Stacking)

  
1)組合模型
  
有時候我們乾脆不做模型選擇,而是直接組合它們。
  
如果你有多個不同的深度學習模型,在你的研究問題上每一個都表現的還不錯,你可以通過取它們預測的平均值來進行組合。
  
模型差異越大,最終效果越好。例如,你可以應用非常不同的網絡拓撲或者不同的技術。
  
如果每個模型都效果不錯但是不同的方法/方式,嵌套後的預測能力將更加魯棒。
  
每一次你訓練網絡,你初始化不同的權重,然後它會收斂到不同的最終權重。你可以多次重複這一過程去得到很多網絡,然後把這些網絡的預測值組合在一起。
  
它們的預測將會高度相關,但是在那些難以預測的特徵上,它會給你一個意外的小提升。

  
2)組合視角
  
同上述類似,但是從不同視角重構你的問題,訓練你的模型。
  
同樣,目標得到的是效果不錯但是不同的模型(例如,不相關的預測)。得到不同的模型的方法,你可以依賴我們在數據那一小節中羅列的那些非常不同的放縮和轉換方法。
  
你用來訓練模型的轉換方法越不同,你構建問題的方式越不同,你的結果被提升的程度就越高。
  
簡單使用預測的均值將會是一個好的開始。

  
3)stacking/堆疊
  
你還可以學習如何最佳地組合多個模型的預測。這稱作堆疊泛化(stacked generalization),或者簡短來說就叫堆疊。
  
通常上,你使用簡單線性迴歸方法就可以得到比取預測平均更好的結果,像正則化的迴歸(regularized regression),就會學習如何給不同的預測模型賦權重。基線模型是通過取子模型的預測均值得到的,但是應用學習了權重的模型會提升性能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章