6.11 學(xué)習(xí)率調(diào)節(jié)器
本章的前面幾個小節(jié)我們詳細(xì)介紹了從基礎(chǔ)的梯度下降法,它的各種變體,到動量法及各種子子孫孫,再到Adam算法的發(fā)展演進(jìn)過程。在隨機(jī)梯度下降法中,我們提到過動態(tài)調(diào)整學(xué)習(xí)率是幫助模型快速收斂的有效辦法,因為它是各類優(yōu)化算法中的關(guān)鍵參數(shù)。本節(jié)咱們就專注于這個話題,介紹更多知識。
6.11.1 影響學(xué)習(xí)率主要因素
先來看看調(diào)整學(xué)習(xí)率時,需要考慮哪些因素:
模型的復(fù)雜度:較復(fù)雜的模型可能需要較小的學(xué)習(xí)率,因為復(fù)雜的模型更難擬合數(shù)據(jù)。
訓(xùn)練數(shù)據(jù)的規(guī)模:較大的訓(xùn)練數(shù)據(jù)集可以設(shè)置稍大的學(xué)習(xí)率,因為大的訓(xùn)練數(shù)據(jù)集可以提供更多的信息,模型也更容易擬合數(shù)據(jù)。
訓(xùn)練過程中損失函數(shù)的變化情況:如果損失函數(shù)的變化較小,可能需要調(diào)高學(xué)習(xí)率;如果損失函數(shù)的變化較大不穩(wěn)定,就需要適當(dāng)調(diào)低學(xué)習(xí)率。
目標(biāo)任務(wù)的復(fù)雜度:較復(fù)雜的目標(biāo)任務(wù)可能需要較小的學(xué)習(xí)率,因為復(fù)雜的任務(wù)更難擬合。
優(yōu)化器的類型:不同的優(yōu)化器可能對學(xué)習(xí)率的敏感度不同,需要根據(jù)實際情況進(jìn)行一定調(diào)整。
Batch size:較小的batch size可能會帶來較大的隨機(jī)噪聲,導(dǎo)致訓(xùn)練不穩(wěn)定,一般設(shè)置為較小的學(xué)習(xí)率。
所謂“牽一發(fā)而動全身”,這樣來形容學(xué)習(xí)率在深度學(xué)習(xí)優(yōu)化算法中的作用一點也不為過。事實上,除了上述因素之外,還有許多其他的因素可能會影響調(diào)整學(xué)習(xí)率的效果,在實戰(zhàn)中需要根據(jù)具體情況進(jìn)行調(diào)整。這么復(fù)雜而關(guān)鍵的問題,光靠人工手動調(diào)整太復(fù)雜,因此科學(xué)家們希望這件事能夠自動的進(jìn)行,因此就涌現(xiàn)出了“學(xué)習(xí)率調(diào)節(jié)器”(Learning Rate Scheduler)。
6.11.2 學(xué)習(xí)率調(diào)節(jié)器
學(xué)習(xí)率調(diào)節(jié)器是在訓(xùn)練神經(jīng)網(wǎng)絡(luò)時用來控制學(xué)習(xí)率的方法,更好的模型更新步驟大小的值。當(dāng)學(xué)習(xí)率過大時,模型會振蕩或者發(fā)散,而當(dāng)學(xué)習(xí)率過小時,模型的收斂速度會變慢。學(xué)習(xí)率調(diào)節(jié)器的作用就是幫助我們在訓(xùn)練過程中動態(tài)調(diào)整學(xué)習(xí)率,以便獲得更好的模型訓(xùn)練效果。
學(xué)習(xí)率調(diào)節(jié)器的發(fā)展可以追溯到 20 世紀(jì) 60 年代,當(dāng)時已經(jīng)有人提出了調(diào)節(jié)學(xué)習(xí)率的方法。但是,直到 2012 年,學(xué)習(xí)率調(diào)節(jié)器才真正開始流行。這是因為在 2012 年,Geoffrey Hinton 和他的團(tuán)隊發(fā)表了著名的論文 "ImageNet Classification with Deep Convolutional Neural Networks",提出了一種名為 "AdaGrad" 的學(xué)習(xí)率調(diào)節(jié)器。在此之后,學(xué)習(xí)率調(diào)節(jié)器發(fā)展迅速,出現(xiàn)了許多新的方法,包括 "RMSProp"、"Adam" 和 "SGD with Warm Restarts" 等。這些方法在實踐中表現(xiàn)出了良好的性能,因此被廣泛使用。現(xiàn)在,學(xué)習(xí)率調(diào)節(jié)器已經(jīng)成為訓(xùn)練神經(jīng)網(wǎng)絡(luò)的重要工具,并且在機(jī)器學(xué)習(xí)界廣受好評。
目前常用的深度學(xué)習(xí)框架,如 PyTorch、TensorFlow、 Keras 等,都提供了內(nèi)置的學(xué)習(xí)率調(diào)節(jié)器或者允許用戶自定義學(xué)習(xí)率調(diào)節(jié)器。因此,在使用這些框架訓(xùn)練深度學(xué)習(xí)模型時,你可以直接使用這些框架提供的學(xué)習(xí)率調(diào)節(jié)器,也可以自己實現(xiàn)一個學(xué)習(xí)率調(diào)節(jié)器并使用。
我們來看看一些常見的學(xué)習(xí)率調(diào)節(jié)器及其代碼實現(xiàn)。

注意,預(yù)熱通常是在訓(xùn)練過程中的前幾個 epoch 使用,并在達(dá)到一定的迭代次數(shù)后切換到其他的學(xué)習(xí)率調(diào)節(jié)方法。預(yù)熱和學(xué)習(xí)率調(diào)節(jié)器是兩個不同的概念,但是它們都可以用來調(diào)節(jié)學(xué)習(xí)率。
梗直哥提示:這部分的完整代碼實現(xiàn)涉及到比較多的對pytorch框架的講解,以及實戰(zhàn)經(jīng)驗。限于篇幅,歡迎選修進(jìn)階課程《梗直哥深度學(xué)習(xí)必修課:python實戰(zhàn)》
