日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

理解深度學(xué)習(xí)中的學(xué)習(xí)率及多種選擇策略

 預(yù)見未來的我 2018-02-14

學(xué)習(xí)率是最影響性能的超參數(shù)之一,如果我們只能調(diào)整一個超參數(shù),那么最好的選擇就是它。相比于其它超參數(shù)學(xué)習(xí)率以一種更加復(fù)雜的方式控制著模型的有效容量,當(dāng)學(xué)習(xí)率最優(yōu)時,模型的有效容量最大。從手動選擇學(xué)習(xí)率到使用預(yù)熱機(jī)制,本文介紹了很多學(xué)習(xí)率的選擇策略。

這篇文章記錄了我對以下問題的理解:

  • 學(xué)習(xí)速率是什么?學(xué)習(xí)速率有什么意義?

  • 如何系統(tǒng)地獲得良好的學(xué)習(xí)速率?

  • 我們?yōu)槭裁匆谟?xùn)練過程中改變學(xué)習(xí)速率?

  • 當(dāng)使用預(yù)訓(xùn)練模型時,我們該如何解決學(xué)習(xí)速率的問題?

本文的大部分內(nèi)容都是以 fast.ai 研究員寫的內(nèi)容 [1], [2], [5] 和 [3] 為基礎(chǔ)的。本文是一個更為簡潔的版本,通過本文可以快速獲取這些文章的主要內(nèi)容。如果您想了解更多詳情,請參閱參考資料。

首先,什么是學(xué)習(xí)速率?

學(xué)習(xí)速率是指導(dǎo)我們該如何通過損失函數(shù)的梯度調(diào)整網(wǎng)絡(luò)權(quán)重的超參數(shù)。學(xué)習(xí)率越低,損失函數(shù)的變化速度就越慢。雖然使用低學(xué)習(xí)率可以確保我們不會錯過任何局部極小值,但也意味著我們將花費(fèi)更長的時間來進(jìn)行收斂,特別是在被困在高原區(qū)域的情況下。

下述公式表示了上面所說的這種關(guān)系。

new_weight = existing_weight — learning_rate * gradient

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

采用小學(xué)習(xí)速率(頂部)和大學(xué)習(xí)速率(底部)的梯度下降。來源:Coursera 上吳恩達(dá)(Andrew Ng)的機(jī)器學(xué)習(xí)課程。

一般而言,用戶可以利用過去的經(jīng)驗(yàn)(或其他類型的學(xué)習(xí)資料)直觀地設(shè)定學(xué)習(xí)率的最佳值。

因此,想得到最佳學(xué)習(xí)速率是很難做到的。下圖演示了配置學(xué)習(xí)速率時可能遇到的不同情況。

不同學(xué)習(xí)速率對收斂的影響(圖片來源:cs231n)

此外,學(xué)習(xí)速率對模型收斂到局部極小值(也就是達(dá)到最好的精度)的速度也是有影響的。因此,從正確的方向做出正確的選擇意味著我們可以用更短的時間來訓(xùn)練模型。

Less training time, lesser money spent on GPU cloud compute. :)

有更好的方法選擇學(xué)習(xí)速率嗎?

在「訓(xùn)練神經(jīng)網(wǎng)絡(luò)的周期性學(xué)習(xí)速率」[4] 的 3.3 節(jié)中,Leslie N. Smith 認(rèn)為,用戶可以以非常低的學(xué)習(xí)率開始訓(xùn)練模型,在每一次迭代過程中逐漸提高學(xué)習(xí)率(線性提高或是指數(shù)提高都可以),用戶可以用這種方法估計出最佳學(xué)習(xí)率。

640?wx_fmt=jpeg

在每一個 mini-batch 后提升學(xué)習(xí)率

如果我們對每次迭代的學(xué)習(xí)進(jìn)行記錄,并繪制學(xué)習(xí)率(對數(shù)尺度)與損失,我們會看到,隨著學(xué)習(xí)率的提高,從某個點(diǎn)開始損失會停止下降并開始提高。在實(shí)踐中,學(xué)習(xí)速率的理想情況應(yīng)該是從圖的左邊到最低點(diǎn)(如下圖所示)。在本例中,是從 0.001 到 0.01。

640?wx_fmt=jpeg

上述方法看似有用,但該如何應(yīng)用呢?

目前,上述方法在 fast.ai 包中作為一個函數(shù)進(jìn)行使用。fast.ai 包是由 Jeremy Howard 開發(fā)的一種高級 pytorch 包(就像 Keras 之于 Tensorflow)。

在訓(xùn)練神經(jīng)網(wǎng)絡(luò)之前,只需輸入以下命令即可開始找到最佳學(xué)習(xí)速率。

# learn is an instance of Learner class or one of derived classes like ConvLearner

learn.lr_find()

learn.sched.plot_lr()

使之更好

現(xiàn)在我們已經(jīng)知道了什么是學(xué)習(xí)速率,那么當(dāng)我們開始訓(xùn)練模型時,怎樣才能系統(tǒng)地得到最理想的值呢。接下來,我們將介紹如何利用學(xué)習(xí)率來改善模型的性能。

傳統(tǒng)的方法

一般而言,當(dāng)已經(jīng)設(shè)定好學(xué)習(xí)速率并訓(xùn)練模型時,只有等學(xué)習(xí)速率隨著時間的推移而下降,模型才能最終收斂。

然而,隨著梯度達(dá)到高原,訓(xùn)練損失會更難得到改善。在 [3] 中,Dauphin 等人認(rèn)為,減少損失的難度來自鞍點(diǎn),而不是局部最低點(diǎn)。

640?wx_fmt=jpeg

誤差曲面中的鞍點(diǎn)。鞍點(diǎn)是函數(shù)上的導(dǎo)數(shù)為零但不是軸上局部極值的點(diǎn)。(圖片來源:safaribooksonline)

所以我們該如何解決這個問題

我們可以采取幾種辦法。[1] 中是這么說的:

…無需使用固定的學(xué)習(xí)速率,并隨著時間的推移而令它下降。如果訓(xùn)練不會改善損失,我們可根據(jù)一些周期函數(shù) f 來改變每次迭代的學(xué)習(xí)速率。每個 Epoch 的迭代次數(shù)都是固定的。這種方法讓學(xué)習(xí)速率在合理的邊界值之間周期變化。這是有益的,因?yàn)槿绻覀兛ㄔ诎包c(diǎn)上,提高學(xué)習(xí)速率可以更快地穿越鞍點(diǎn)。

在 [2] 中,Leslie 提出了一種「三角」方法,這種方法可以在每次迭代之后重新開始調(diào)整學(xué)習(xí)速率。

640?wx_fmt=jpeg

Leslie N. Smith 提出的「Triangular」和「Triangular2」學(xué)習(xí)率周期變化的方法。左圖中,LR 的最小值和最大值保持不變。右圖中,每個周期之后 LR 最小值和最大值之間的差減半。

另一種常用的方法是由 Loshchilov&Hutter [6] 提出的預(yù)熱重啟(Warm Restarts)隨機(jī)梯度下降。這種方法使用余弦函數(shù)作為周期函數(shù),并在每個周期最大值時重新開始學(xué)習(xí)速率。「預(yù)熱」是因?yàn)閷W(xué)習(xí)率重新開始時并不是從頭開始的,而是由模型在最后一步收斂的參數(shù)決定的 [7]。

下圖展示了伴隨這種變化的過程,該過程將每個周期設(shè)置為相同的時間段。

640?wx_fmt=jpeg

SGDR 圖,學(xué)習(xí)率 vs 迭代次數(shù)。

因此,我們現(xiàn)在可以通過周期性跳過「山脈」的辦法縮短訓(xùn)練時間(下圖)。

640?wx_fmt=jpeg

比較固定 LR 和周期 LR(圖片來自 ruder.io)

研究表明,使用這些方法除了可以節(jié)省時間外,還可以在不調(diào)整的情況下提高分類準(zhǔn)確性,而且可以減少迭代次數(shù)。

遷移學(xué)習(xí)中的學(xué)習(xí)速率

在 fast.ai 課程中,非常重視利用預(yù)訓(xùn)練模型解決 AI 問題。例如,在解決圖像分類問題時,會教授學(xué)生如何使用 VGG 或 Resnet50 等預(yù)訓(xùn)練模型,并將其連接到想要預(yù)測的圖像數(shù)據(jù)集。

我們采取下面的幾個步驟,總結(jié)了 fast.ai 是如何完成模型構(gòu)建(該程序不要與 fast.ai 包混淆)的:

1. 啟用數(shù)據(jù)增強(qiáng),precompute = True2. 使用 lr_find() 找到損失仍在降低的最高學(xué)習(xí)速率3. 從預(yù)計算激活值到最后一層訓(xùn)練 1~2 個 Epoch4. 在 cycle_len = 1 的情況下使用數(shù)據(jù)增強(qiáng)(precompute=False)訓(xùn)練最后一層 2~3 次5. 修改所有層為可訓(xùn)練狀態(tài)6. 將前面層的學(xué)習(xí)率設(shè)置得比下一個較高層低 3~10 倍7. 再次使用 lr_find()8. 在 cycle_mult=2 的情況下訓(xùn)練整個網(wǎng)絡(luò),直到過度擬合

從上面的步驟中,我們注意到步驟 2、5 和 7 提到了學(xué)習(xí)速率。這篇文章的前半部分已經(jīng)基本涵蓋了上述步驟中的第 2 項(xiàng)——如何在訓(xùn)練模型之前得出最佳學(xué)習(xí)率。

在下文中,我們會通過 SGDR 來了解如何通過重啟學(xué)習(xí)速率來減少訓(xùn)練時間和提高準(zhǔn)確性,以避免梯度接近零。

在最后一節(jié)中,我們將重點(diǎn)介紹差異學(xué)習(xí)(differential learning),以及如何在訓(xùn)練帶有預(yù)訓(xùn)練模型中應(yīng)用差異學(xué)習(xí)確定學(xué)習(xí)速率。

什么是差異學(xué)習(xí)

差異學(xué)習(xí)(different learning)在訓(xùn)練期間為網(wǎng)絡(luò)中的不同層設(shè)置不同的學(xué)習(xí)速率。這種方法與人們常用的學(xué)習(xí)速率配置方法相反,常用的方法是訓(xùn)練時在整個網(wǎng)絡(luò)中使用相同的學(xué)習(xí)速率。

640?wx_fmt=jpeg

在寫這篇文章的時候,Jeremy 和 Sebastian Ruder 發(fā)表的一篇論文深入探討了這個問題。所以我估計差異學(xué)習(xí)速率現(xiàn)在有一個新的名字——差別性的精調(diào)。:)

為了更清楚地說明這個概念,我們可以參考下面的圖。在下圖中將一個預(yù)訓(xùn)練模型分成 3 組,每個組的學(xué)習(xí)速率都是逐漸增加的。

640?wx_fmt=jpeg

具有差異學(xué)習(xí)速率的簡單 CNN 模型。圖片來自 [3]

這種方法的意義在于,前幾個層通常會包含非常細(xì)微的數(shù)據(jù)細(xì)節(jié),比如線和邊,我們一般不希望改變這些細(xì)節(jié)并想保留它的信息。因此,無需大量改變權(quán)重。

相比之下,在后面的層,以綠色以上的層為例,我們可以從中獲得眼球、嘴巴或鼻子等數(shù)據(jù)的細(xì)節(jié)特征,但我們可能不需要保留它們。

這種方法與其他微調(diào)方法相比如何?

在 [9] 中提出,微調(diào)整個模型太過昂貴,因?yàn)橛行┠P涂赡艹^了 100 層。因此人們通常一次一層地對模型進(jìn)行微調(diào)。

然而,這樣的調(diào)整對順序有要求,不具并行性,且因?yàn)樾枰ㄟ^數(shù)據(jù)集進(jìn)行微調(diào),導(dǎo)致模型會在小數(shù)據(jù)集上過擬合。

下表證明 [9] 中引入的方法能夠在各種 NLP 分類任務(wù)中提高準(zhǔn)確度且降低錯誤率。

640?wx_fmt=jpeg


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多