【深度學習筆記】第 4 課:模型性能評估

training set 訓練集  validation set 驗證集  test set測試集  這些與衡量你作的怎麼樣有關算法

當你知道怎麼衡量你在一個問題的表現,問題就解決了一半。(衡量表現的重要性網絡

每一個你將創建的分類器都會嘗試記住訓練集,而且它一般在這方面會作的很好很好機器學習

你的工做 是幫助它泛化到新的數據上函數

因此咱們怎麼用測量泛化能力代替測量分類其記住數據的能力工具

最簡單的方法就是從訓練集中取出一個小的子集性能

如今用它訓練和測量測試數據上的錯誤,問題解決了,你的分類器如今不能欺騙你了學習

由於它從未見過測試數據,因此它不可能記住數據測試

但仍然有一個我呢提,由於訓練一個分類器一般是一個反覆試錯的過程優化

你嘗試一個分類器 測量它的性能,你嘗試另外一個,再測量,再另外一個,再另外一個spa

你調整這個模型,探索參數,測量

最終 你獲得了你認爲完美的分類器,最後你當心的把測試數據從訓練數據中分離

而且只測量在測試數據上的性能

如今你在一個真實的生產環境中部署你的系統,你獲得了更多的數據,你在新數據上給性能打分

它幾乎作很差,可能發生了什麼呢?

發生的是: 你的分類器已經經過你的眼睛,間接地看到了測試數據

每次你決定用哪一個分類器時, 調整哪一個參數時,你確實給了分類器測試集的信息

只有一點點,但它加起來,因此隨着時間的流逝 隨着你進行不少次不少次實驗

你的測試數據滲透進你的訓練數據

因此咱們能作什麼?  有不少方法能夠解決這個問題,這裏給一個最簡單的

從你的訓練集裏再取出一部分,把它藏起來,不要看它直到你作出了最後的決定

你能夠用你的驗證集去測量實際偏差,可能驗證集會滲透進訓練集,可是那沒有關係

由於你最老是有這個測試集的,你能夠依靠它去實際測量真正的性能

 

過擬合與數據集大小

在這裏不討論交叉驗證,可是若是在你的課程中從未遇到,強烈建議你去學習它,交叉驗證是深度學習的關鍵

深度學習有不少旋鈕你能夠調節,你將會一遍又一遍的調整他們,

你要當心在你的測試集上過擬合,用驗證集,你的驗證集和測試集須要多大呢?

視狀況而定,你的驗證集越大,你的數會越精確

想像一下你的驗證集只有六個實例 精確度爲66%

如今你調整你的模型,性能從66%提高到83%,這些可信嗎?

固然不能,這只是一個實例的標籤改變了,它可能只是噪聲

你的測試集越大 噪聲越少 測量越準確

這是個頗有用的經驗法則

在你的驗證集上影響了30個實例的改變,這樣或那樣的方式

一般是有統計學意義的,一般是能夠信任的

想象你的驗證集裏有3000個實例,假定你信任30的規則,你能夠相信哪一個水平的準確性的提高?

當你獲得從80%到81%這1%的提高,更有說服力 有30個實例從不正確到正確

這是個很強大的信號 不論你在作的是什麼 確實提高了你的準確率

這是爲何對大多數分類器任務,人們傾向於用超過3000個實例作驗證集,

這使得準確率的第一個小數位是有效數字,給你足夠的分辨率去看到小的改進

若是你的類是不平衡的 例如

若是一些重要的類別很罕見 它的啓發式就再也不是好的

壞消息 你只須要更多的數據

如今 若是你的訓練集很小 分出3000個實例也是不少的數據,咱們以前提過的交叉驗證

是一個可能的方法來緩解這個問題,可是交叉驗證多是一個漫長的過程

所以得到更多的數據每每是正確的解決方法

對邏輯分類器作最優化

回到訓練模型上來,利用梯度降低法訓練邏輯迴歸很是有效

一方面 你是直接優化你所關心的偏差  這是個很是棒的主意

這就是爲何在應用時 許多機器學習的研究工做 都是關於設計好的損失函數,用於作最優化。

但正如你在做業中運行模型時可能遇到的那樣,它存在最大的問題是它很是難以規模化

隨機梯度降低法

解決梯度降低算法 難以 規模化的問題很簡單,你要計算這個梯度

這裏有一個經驗法則:若是計算這個操做須要n次浮點運算,那麼計算這個梯度則須要三倍計算量

正如以前那樣,損失函數很是巨大,它取決於你數據集的沒一個元素

若是你的數據集較大 那會是很是打的計算量,但咱們指望能訓練大量的數據,由於實際問題中

有更多的數據總會有更多的收穫  由於梯度降低比較直接,要實現它須要不少步

這意味着你要遍歷的整個數據集上百次,這並很差,所以咱們打算偷個懶

與其計算損失 還不如直接計算它的估計值,一個很是差的估計,其實是差的慘不忍睹

這個估計差到你會懷疑爲啥它還能有效,但這樣就是可行,

由於咱們又花了時間讓它沒那麼差。咱們將要使用的估計值是隨機從數據集中抽取的很小一部分的平均損失

通常在1到1000個樣本左右,說到 隨機 由於這很是重要,若是你選樣本時不夠隨機

那它就徹底再也不有效,所以咱們將取出數據集中很是小的一片,計算那些樣本的損失和導數

並假設那個導數就是進行梯度降低正確的方向。

它並非每次都是正確的方向,實際上它偶爾還會增長實際的損失,而不是減小它,

但咱們經過每次執行很是很是小的步幅,屢次執行這個過程來補償它

所以每一步變得更容易計算,但咱們也付出了代價,相比於一大步,咱們須要走不少小步

總的來講咱們仍是贏了好多。事實上,相比於梯度降低,這樣作異常有效

這種技術便叫作隨機梯度降低,這是深度學習的核心

由於隨機梯度降低在數據和模型尺寸方面擴展性很好,咱們指望同時有大量的數據和大模型

隨機梯度降低 簡稱 SGD 則很是棒且容易規模化

但因爲它本質上是一個很是差的優化器,碰巧它又是惟一足夠快的

實際中能解決不少問題

動量法與使用學習率調節降低

以前讓輸入零均值同方差,這對SGD很重要,用方差較小的隨機權重來進行初始化。

下面學習更多重要的技巧,這應該包括了實現SGD所須要的全部技巧

第一個是動量(momentum)

回憶一下 在SGD裏,雖然咱們每次只是往隨機方向走一小步

但積累起來,就能帶咱們來到損失函數的極小值處

其實,先前走過的步子還積累了關於前進方向的知識,咱們也能夠把這方面知識利用起來

一個省事的方式是保持梯度的移動平均,用移動平均代替當前一批數據的方向

這種動量技術頗有效 經常會有更好的收斂性

第二個是學習率衰減

回憶一下 用SGD代替梯度降低時,在接近目標的時候 咱們的步子要走的更小和更有噪聲,多小的步子呢?

這其實也是個研究領域,不過 步子隨着不斷訓練而愈來愈小,這樣作老是有好處的

有些人喜歡用學習率的指標衰減 有些人喜歡每當損失到達停滯時變小 方法不少

但要記住的關鍵一點,是隨着時間流逝而減少它的值

超空間參數

調整學習率經常讓人以爲奇怪,好比 你可能認爲更高的學習率表明你能學習更多,或者學得更快

但這並非真的。事實上 若是你在訓練模型的時候下降學習率,可以更快地獲得一個更好的模型

它也可能變得更糟,你也許會但願經過觀察損失曲線,得知模型的訓練速度

越高的學習率在開始的時候學的很快,可是過了一會就會放緩了

而較低的學習率能讓模型繼續訓練並變得更好

這張圖對於每個訓練神經網絡的人來講都很是熟悉,永遠不要相信模型的訓練速度

這和你的模型訓練的有多好基本沒有關係

這也是爲何人們認爲SGD是黑魔法

你還有不少超參數能夠調節:

初始化權重(initialization parameters)

學習率(learning rate parameters)

衰減比(decay)

動量(momentum)

而且你要確保他們 是正確的

在實際訓練的時候 狀況會好不少

可是仍是要記住一件事情,當訓練出現問題的時候,首先應該想到 下降學習率

對於小模型來講還有不少好的解決辦法,遺憾的是 目前尚未一個讓人徹底滿意的很是大的模型。

咱們將會介紹一個AdaGrad模型 可以讓事情變得簡單一點。

AdaGrad是SGD的優化版本,它使用了動量來防止過擬合,並且學習率可以自動衰減

使用AdaGrad可以下降訓練過程對超參數的敏感度,可是它的準確率比使用動量的SGD低一些

若是你只是但願它可以使用,AdaGrad仍然是一個很是好的選擇

歸納一下:

咱們有一個很是簡單的線性模型 它能夠計算機率,咱們也能夠用它來進行分類

咱們如今知道該如何在大量的數據之上,使用SGD之類的算法優化它的參數

儘管它只是一個簡單的線性模型,如今咱們已經有了咱們須要的全部的工具,是時候去進行更深刻的學習了

相關文章
相關標籤/搜索