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

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

0

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

簡單噪聲標(biāo)度方程

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

如果我們使用比簡單噪聲尺度小的 batch,可以通過增加 batch 來加快訓(xùn)練速度,反之,如果我們使用比簡單噪聲尺度大的 batch,我們只會(huì)浪費(fèi)算力。

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

  • 分子是梯度中每個(gè)變量的方差之和,它是對(duì)梯度中噪聲的一種測(cè)量。

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

因此,我們的梯度越嘈雜,我們想要的 batch 越大,這是自然的,因?yàn)槲覀兿胍谡_的方向上采取梯度步驟。相反,如果梯度沒有噪聲,我們將從較少的步驟中獲益更多,因?yàn)槲覀儾恍枰骄龃罅康挠^測(cè)值并分別使用它們。

另一方面,我們離最小值越近,batch 處理尺寸就越大,因?yàn)槲覀兿M扇「?jǐn)慎的步驟,離局部最小值越近,因?yàn)槲覀儾幌氤^它,錯(cuò)過正確的方向。

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

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

2.論文實(shí)踐

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

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

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

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




簡單噪聲標(biāo)度方程

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

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

尺度估計(jì)量

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

噪聲估計(jì)

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

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

給定批大小的近似梯度

一旦我們有了這兩個(gè)近似值,我們就可以用公式計(jì)算簡單的噪聲標(biāo)度:

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

簡單噪聲尺度的近似

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

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

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

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

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

我不會(huì)太詳細(xì)地解釋這些代碼,因?yàn)槲倚枰徽恼聛斫忉?Fastai 是如何將所有東西與其 API 結(jié)合在一起的,但是這些代碼應(yīng)該是一個(gè)好的開始。如果您想進(jìn)一步幫助理解代碼,請(qǐng)?jiān)谧⑨屩懈嬖V我,我可以解釋它,甚至可以寫一篇關(guān)于編碼部分的文章。

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

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

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

首先,我用給定的 batch 估計(jì)梯度近似實(shí)際梯度。

然后,當(dāng)協(xié)方差矩陣的計(jì)算可以看作兩個(gè)平均值時(shí),我試圖用指數(shù)移動(dòng)平均來近似它,因?yàn)槲也幌朐谟?xùn)練中儲(chǔ)存許多梯度。

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




計(jì)算出的批次上噪聲和簡單噪聲刻度的運(yùn)行平均值

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

B. 存儲(chǔ)梯度

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

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

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

它開始顯示結(jié)果,但是它的計(jì)算非常棘手:X 軸是以這種方式存儲(chǔ)的簡單的噪聲等級(jí)計(jì)算的 batch 數(shù)。雖然它似乎提供了某種結(jié)果,但在實(shí)踐中是不可用的,因?yàn)槲乙呀?jīng)存儲(chǔ)了數(shù)百個(gè)梯度!

C. 進(jìn)行兩次訓(xùn)練

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

然后我想,為什么要做一個(gè)單一的訓(xùn)練,我實(shí)際上可以運(yùn)行兩個(gè)不同 batch 大小的訓(xùn)練,然后計(jì)算它?

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

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

和第一種方法一樣,它產(chǎn)生了奇怪的結(jié)果!此外,當(dāng)我思考這個(gè)問題時(shí),我得到的 batch 可能在兩次運(yùn)行之間不一樣,因?yàn)闆]有任何東西強(qiáng)迫小 batch 包含在大 batch 批中。另外,我需要運(yùn)行兩個(gè)訓(xùn)練階段來計(jì)算這個(gè),所以這個(gè)方法不是很好。

D. 連續(xù)批處理

最后,我意識(shí)到最好的方法似乎是第二種方法,但有些東西必須修改,因?yàn)槲也幌氡A舸罅康奶荻葋碛?jì)算統(tǒng)計(jì)數(shù)據(jù)。

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

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

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

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

結(jié)果很不錯(cuò)!在這篇論文中,他們認(rèn)為增長趨勢(shì)是可以預(yù)期的,因?yàn)樵肼暱赡鼙3植蛔?,而梯度的尺度將隨著我們接近最小值而減小,這將導(dǎo)致一個(gè)越來越簡單的噪聲尺度。

因?yàn)槲覀兒芸赡茉O(shè)置不同,我也無法訪問他們的代碼,所以我們的結(jié)果略有不同,但是在論文中,作者提到了一個(gè)簡單的噪聲等級(jí),從 50 開始,達(dá)到 900,這才是重要的??紤]到在理論上和實(shí)踐中起作用的許多近似值,結(jié)果可以變化,但是如文中所解釋的,不應(yīng)該有超過一個(gè)數(shù)量級(jí)的變化。

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

這里的參數(shù)對(duì)應(yīng)關(guān)系是:

  • learn:一個(gè) Fastai 學(xué)習(xí)器

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

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

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

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

3.在不同任務(wù)上測(cè)試 batch 大小查找器

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

是時(shí)候邁出大步了!

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

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

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

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

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

在對(duì) 512 和 64 的 batch 進(jìn)行相同的訓(xùn)練之后,我們可以觀察到一些情況:

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

batch 512的第一個(gè)單周期訓(xùn)練

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

批處理大小為 64 的第一個(gè)單周期訓(xùn)練

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

然后,如果我們看看每個(gè) batch 的第二個(gè)訓(xùn)練周期損失:

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

batch 大小為 512 的第二個(gè)單周期訓(xùn)練損失

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

批量為 64 的第二個(gè)單周期訓(xùn)練損失

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

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

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

大小為 512 的 batch 最后一個(gè)單周期訓(xùn)練損失

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

batch 大小為 64 的最后一個(gè)單周期訓(xùn)練損失

最后,如果我們把 Rossmann 的結(jié)果加起來,使用 512 而不是 64 的 batch 大小:

  • 訓(xùn)練時(shí)間減 4

  • 提供更好的訓(xùn)練和驗(yàn)證損失,以及感興趣的指標(biāo)

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

結(jié)論

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

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

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

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

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)載須知

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

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