丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗,強烈建議使用更快更安全的瀏覽器
此為臨時鏈接,僅用于文章預覽,將在時失效
人工智能開發(fā)者 正文
發(fā)私信給skura
發(fā)送

0

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

本文作者: skura 2019-11-28 18:00
導語:一個關(guān)于batch大小的故事

有一次,我在 twitter 上看到 Jeremy Howard 引用 Yann LeCun 關(guān)于 batch 大小的話:

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

Twitter 上關(guān)于 batch 的討論

自從我在 Fastai 找到了一個非常好的學習率查找工具后,我就一直在想這個問題,我一直在想是否有一個有用的 batch 大小查找工具,人們可以用來快速地得到一個合適的 batch 大小來訓練他們的模型。

提醒一下,F(xiàn)astai 中使用的學習速率查找器通過測試不同的學習速率來確定能最大程度地減少損失的數(shù)值,從而幫助找到正確的學習速率。更詳細的解釋可以在這里找到:https://sgugger.github.io/how-do-you-find-A-good-learning-rate.html

在我的腦海中,做一個 bacth 大小查找器的想法已經(jīng)有很長一段時間了,在得到 Jeremy 里米的激勵后,我決定開始這一旅程,實現(xiàn)一個 batch 大小查找器來訓練神經(jīng)網(wǎng)絡。

今天我想和大家分享完成一篇論文的歷程,在我看來,這些文章都很有趣,也許也會激勵你去嘗試更多的東西!

1.一個關(guān)于大小的故事

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

有關(guān) batch 大小的 OC meme

一個常見的看法是不應該使用大 batch,因為這只會導致模型過大,并且可能會耗盡內(nèi)存。顯然這個觀點是正確的,但前者比后者更復雜,為了回答這個問題,我們將深入研究 OpenAI 論文「An Empirical Model of Large-Batch Training」。

我非常推薦這篇文章,它解釋了許多易于理解、記憶的想法。

首先,我們的目標是通過隨機梯度下降法將損失最小化,并且有一個真正的潛在環(huán)境,我們將在這個環(huán)境下最小化損失。然而,我們不能訪問整個數(shù)據(jù)集上的真實梯度,因此我們必須用有限的 batch 大小來近似梯度。

因為我們在一個 batch 上取平均值,如果我們的 batch 很小,就會有很多噪音存在,我們可能只在噪音上訓練我們的模型。盡管如此,應用幾個連續(xù)的更新是正確的策略,但我們也可以直接使用更大的批處理大小,它在計算效率上更高,并直接將噪聲平均化。然而,在一個特定的大小之后,如果梯度已經(jīng)是精確的,就沒有必要使批處理更大,因為這只是在計算上的浪費,精度幾乎沒有提高。

此外,通過使用更大的 batch 尺寸(達到 GPU 允許的合理數(shù)量),我們加快了訓練速度,這相當于采用了幾個大步驟,而不是許多小步驟。因此,對于更大的 batch 尺寸,在相同的時間段,我們有時可以在計算時間上獲得 2 倍的增益!

其次,有一個稱為「簡單噪音等級」的統(tǒng)計數(shù)據(jù),它幫助我們確定什么是好的 batch 大小,定義為:

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

簡單噪聲標度方程

G 是損失 L 在 n 個參數(shù)上的實際梯度。

如果我們使用比簡單噪聲尺度小的 batch,可以通過增加 batch 來加快訓練速度,反之,如果我們使用比簡單噪聲尺度大的 batch,我們只會浪費算力。

為了進一步了解這一統(tǒng)計數(shù)字的含義,讓我們研究每一個術(shù)語:

  • 分子是梯度中每個變量的方差之和,它是對梯度中噪聲的一種測量。

  • 分母是梯度的平方范數(shù),我們稱之為標度,給出了梯度接近于零的局部極小值的度量。

因此,我們的梯度越嘈雜,我們想要的 batch 越大,這是自然的,因為我們想要在正確的方向上采取梯度步驟。相反,如果梯度沒有噪聲,我們將從較少的步驟中獲益更多,因為我們不需要平均出大量的觀測值并分別使用它們。

另一方面,我們離最小值越近,batch 處理尺寸就越大,因為我們希望采取更謹慎的步驟,離局部最小值越近,因為我們不想超過它,錯過正確的方向。

最后,簡單的噪音量表為我們提供了一個工具來回答「較大的 batch 將使我們過度擬合,而較小的 batch 有助于規(guī)范化」的問題:

不一定!如果你的任務已經(jīng)很復雜,并且近似的梯度很吵,你可能會感興趣的是有一個更大的 batch 大小來確保你的模型沒有訓練太多的噪音。這并不是說一個較大的 batch 會使你過擬合,而是一個較小的 batch 會通過噪聲注入增加更多的正則化。但是如果你不能正確擬合,你會添加正則化嗎?

2.論文實踐

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

現(xiàn)在我們已經(jīng)了解了為什么選擇正確的 batch 大小很重要,以及如何通過簡單的噪聲規(guī)模統(tǒng)計找到一個好的 batch 大小,現(xiàn)在是時候?qū)崿F(xiàn)它了!

記住,簡單的噪聲比例方程是:

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果




簡單噪聲標度方程

問題是,我們不僅需要知道實際的梯度,而且還需要知道這個梯度的方差,這就增加了難度。為了解決這個問題,作者提出了兩種不同的統(tǒng)計方法來近似簡單噪聲尺度的分子和分母。

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

尺度估計量

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

噪聲估計

在這里,我們使用兩種不同的 batch 大小——B big 和 B small,使用以下公式計算實際梯度的兩種不同估計:

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

給定批大小的近似梯度

一旦我們有了這兩個近似值,我們就可以用公式計算簡單的噪聲標度:

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

簡單噪聲尺度的近似

為了確保該估計量具有很小的方差,作者在整個訓練過程中計算了幾個簡單的噪聲尺度估計量,并對其進行了平均。

如文中所述,一種自然的方法是利用多個 GPU 計算每個 GPU 的局部梯度,即小梯度,然后將其與不同 GPU 的平均梯度(即大梯度)進行比較。盡管如此,這個方法假設我們有多個 GPU,這不是我們大多數(shù)人所面臨的情況。

因此,必須找到一種有效的方法來實現(xiàn)這種單一的 GPU?,F(xiàn)在,我將和你們分享我如何解決這個問題的具體推理過程!

本文其余部分使用的代碼可以在這里找到:https://colab.research.google.com/drive/15lTG_r03yqSwShZ0JO4XaoWix LMXMEmv        

在第一行代碼中,我建立了一個 Fastai 環(huán)境,在 MNIST 上運行一個模型,因為這個數(shù)據(jù)集已經(jīng)在論文中進行了測試,他們得到了平均 900 的簡單噪聲等級。

我不會太詳細地解釋這些代碼,因為我需要一整篇文章來解釋 Fastai 是如何將所有東西與其 API 結(jié)合在一起的,但是這些代碼應該是一個好的開始。如果您想進一步幫助理解代碼,請在注釋中告訴我,我可以解釋它,甚至可以寫一篇關(guān)于編碼部分的文章。

A. 使用指數(shù)移動平均的第一種方法

考慮到我在論文中提出的統(tǒng)計數(shù)字并不是很有用,我沒有多 GPU ,所以我想我可以跳過它,直接計算方差,通過做近似計算:

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

首先,我用給定的 batch 估計梯度近似實際梯度。

然后,當協(xié)方差矩陣的計算可以看作兩個平均值時,我試圖用指數(shù)移動平均來近似它,因為我不想在訓練中儲存許多梯度。

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果




計算出的批次上噪聲和簡單噪聲刻度的運行平均值

正如你在這里看到的,結(jié)果很奇怪,簡單的噪音等級太顛簸了,噪音比噪音大得多,這給了一個非常糟糕的簡單噪音等級,沒有意義。

B. 存儲梯度

我們看到使用指數(shù)移動平均不是一個好的近似協(xié)方差矩陣的方法。

解決這個問題的另一種方法是簡單地預先設置 n 個梯度保持,然后我們將簡單地計算 n 個不同的梯度,并使用那些 n 個梯度來近似協(xié)方差矩陣。

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

它開始顯示結(jié)果,但是它的計算非常棘手:X 軸是以這種方式存儲的簡單的噪聲等級計算的 batch 數(shù)。雖然它似乎提供了某種結(jié)果,但在實踐中是不可用的,因為我已經(jīng)存儲了數(shù)百個梯度!

C. 進行兩次訓練

在又一次失敗后,我決定按照論文的思路,計算他們的兩個統(tǒng)計數(shù)字。盡管如此,當我只有一個 GPU 的時候,我需要有一個方法在訓練中得到兩批不同尺寸的產(chǎn)品。

然后我想,為什么要做一個單一的訓練,我實際上可以運行兩個不同 batch 大小的訓練,然后計算它?

所以我采用了這個想法,使用 B big=2 * B small,這將允許我計算它們各自的梯度,并使用它們以指數(shù)移動平均的方式計算 G 和 S,如本文所述。

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

和第一種方法一樣,它產(chǎn)生了奇怪的結(jié)果!此外,當我思考這個問題時,我得到的 batch 可能在兩次運行之間不一樣,因為沒有任何東西強迫小 batch 包含在大 batch 批中。另外,我需要運行兩個訓練階段來計算這個,所以這個方法不是很好。

D. 連續(xù)批處理

最后,我意識到最好的方法似乎是第二種方法,但有些東西必須修改,因為我不想保留大量的梯度來計算統(tǒng)計數(shù)據(jù)。

然后,一個非常簡單但有效的想法浮現(xiàn)在腦海中:如果我不是像論文中那樣以并行方式平均幾個 batch,而是以順序方式平均連續(xù)的 batch 呢?

這就意味著我只需要設置一個參數(shù),我調(diào)用 n_batch,這是在計算大小梯度之前我必須存儲的 batch 數(shù),然后我就可以按順序計算論文的統(tǒng)計數(shù)據(jù)了!

這樣實施之后,我得到了以下結(jié)果:

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

結(jié)果很不錯!在這篇論文中,他們認為增長趨勢是可以預期的,因為噪聲可能保持不變,而梯度的尺度將隨著我們接近最小值而減小,這將導致一個越來越簡單的噪聲尺度。

因為我們很可能設置不同,我也無法訪問他們的代碼,所以我們的結(jié)果略有不同,但是在論文中,作者提到了一個簡單的噪聲等級,從 50 開始,達到 900,這才是重要的??紤]到在理論上和實踐中起作用的許多近似值,結(jié)果可以變化,但是如文中所解釋的,不應該有超過一個數(shù)量級的變化。

因此,經(jīng)過這段漫長的旅程,似乎有一個正在起作用的實現(xiàn)。盡管論文對此幾乎沒有幫助,但最好的部分是,要在實踐中使用它,你只需要一行代碼!

這里的參數(shù)對應關(guān)系是:

  • learn:一個 Fastai 學習器

  • lr:可以使用 lr_find()找到執(zhí)行訓練循環(huán)的學習速率

  • num_it:你要處理的批數(shù),可以設置為 None,它將在一個時間段內(nèi)自動訓練

  • n_batch:在計算簡單噪聲標度之前要存儲的批數(shù)。20 似乎在不同的任務中都能很好地工作。

  • beta:指數(shù)移動平均值的 beta 參數(shù),用來計算方差和梯度的比例。如果繪圖不太規(guī)則,請嘗試增加到 0.999 或更多(如果需要),或增加 n_batch 參數(shù)

3.在不同任務上測試 batch 大小查找器

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

是時候邁出大步了!

現(xiàn)在我們已經(jīng)有了一個有用的實現(xiàn),看看它在實踐中如何輔助找到一個好的 batch 大小可能會很有趣。

首先,我們將研究 Rossmann 數(shù)據(jù)集。這個數(shù)據(jù)集已經(jīng)在 Fastai courses v3 中進行了探索,你可以在這里找到它:https://github.com/Fastai/course-v3/blob/master/nbs/dl1/lesson6-rossmann.ipynb 

在這里,我將簡單地運行我的 batch 大小查找器,并做與原來完全相同的訓練,但 batch 大小要考慮到簡單噪聲比例。

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

現(xiàn)在如何解釋?這意味著,對于給定的學習速率,訓練似乎收斂到一個大約 500 的簡單噪聲標度,即噪聲和標度在訓練后期趨于穩(wěn)定。因此,計算時間和效率之間的最佳折衷似乎是擁有 512 的 batch 大小。

在對 512 和 64 的 batch 進行相同的訓練之后,我們可以觀察到一些情況:

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

batch 512的第一個單周期訓練

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

批處理大小為 64 的第一個單周期訓練

batch 大小為 512,訓練速度比 batch 大小為 64 的快了近 4 倍!此外,盡管 batch 大小 512 采取的步驟較少,但最終它具有更好的訓練損失和稍差的驗證損失。

然后,如果我們看看每個 batch 的第二個訓練周期損失:

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

batch 大小為 512 的第二個單周期訓練損失

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

批量為 64 的第二個單周期訓練損失

在這里我們可以看到,與 batch 大小 512 相比,64 的訓練要坎坷得多,后者的結(jié)果并不過分,因為驗證損失繼續(xù)減少。

最后,我們可以觀察到最后一個訓練周期的以下結(jié)果:

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

大小為 512 的 batch 最后一個單周期訓練損失

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

batch 大小為 64 的最后一個單周期訓練損失

最后,如果我們把 Rossmann 的結(jié)果加起來,使用 512 而不是 64 的 batch 大?。?br/>

  • 訓練時間減 4

  • 提供更好的訓練和驗證損失,以及感興趣的指標

我研究過文本和圖像數(shù)據(jù),但是考慮到它們要大得多,特別是預訓練模型非常大,當我嘗試用 batch 訓練時,我使用了 CUDA,由于內(nèi)存不足,所以我不會在這里顯示結(jié)果,但你可以在 Colab Notebook 上查看。

結(jié)論

我們在這篇文章中看到了很多東西!我希望你喜歡這趟旅程,如果你有什么需要記住的話,那就是下面這些:

  • 沒有神奇的 batch 大小數(shù)字,比如 32,這取決于數(shù)據(jù)的復雜性和 GPU 約束。我們看到,小 batch 可以通過噪聲注入幫助調(diào)整,但如果你想學習的任務很難完成,這可能是不行的。此外,運行許多小步驟還需要更多的時間。相反,大 batch 可以真正加快你的訓練速度,甚至有更好的泛化性能。

  • 使用「An Empirical Model of Large- Batch Training」中引入的簡單噪聲尺度度量,可以很好地知道哪個 batch 尺寸是好的。我在這里提供了第一個快速實現(xiàn):https://github.com/DanyWind/fastai_bs_finder 。你可以在自己的數(shù)據(jù)集上進行嘗試,特別是在推薦系統(tǒng)或表格模型上,這樣你就不太可能遇到 CUDA 內(nèi)存不足的情況。

  • 不要害怕嘗試,一點小小的推動有時會促使你去做出很好的結(jié)果!我大概在 6 個月前看到了這篇論文,直到我真正嘗試(并且多次失?。┤崿F(xiàn)它,我才真正關(guān)注它。但現(xiàn)在,我不僅可以與一個大型社區(qū)分享這些結(jié)果,它還幫助我更好地了解 batch 大小是如何工作的,以及它的常見概念和可能的錯誤。所以現(xiàn)在就不要猶豫,去實現(xiàn)酷的東西,即使它不能直接工作也無所謂,旅程比目的地更有價值!

via:https://medium.com/@danielhuynh_48554/implementing-a-batch-size-finder-in-fastai-how-to-get-a-4x-speedup-with-better-generalization-813d686f6bdf 

雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng)

雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

如何設置合適的 batch 大小收獲 4 倍加速 & 更好的泛化效果

分享:
相關(guān)文章
當月熱門文章
最新文章
請?zhí)顚懮暾埲速Y料
姓名
電話
郵箱
微信號
作品鏈接
個人簡介
為了您的賬戶安全,請驗證郵箱
您的郵箱還未驗證,完成可獲20積分喲!
請驗證您的郵箱
立即驗證
完善賬號信息
您的賬號已經(jīng)綁定,現(xiàn)在您可以設置密碼以方便用郵箱登錄
立即設置 以后再說