对比学习可以使用梯度累积吗?
?PaperWeekly 原創 ·?作者?|?蘇劍林
單位?|?追一科技
研究方向?|?NLP、神經網絡
在之前的文章用時間換取效果:Keras 梯度累積優化器中,我們介紹過“梯度累積”,它是在有限顯存下實現大 batch_size 效果的一種技巧。一般來說,梯度累積適用的是 loss 是獨立同分布的場景,換言之每個樣本單獨計算 loss,然后總 loss 是所有單個 loss 的平均或求和。然而,并不是所有任務都滿足這個條件的,比如最近比較熱門的對比學習,每個樣本的 loss 還跟其他樣本有關。
那么,在對比學習場景,我們還可以使用梯度累積來達到大 batch_size 的效果嗎?本文就來分析這個問題。
簡介
一般情況下,對比學習的 loss 可以寫為:
這里的 b 是 batch_size; 是事先給定的標簽,滿足 ,它是一個 one ?hot 矩陣,每一列只有一個 1,其余都為0;而 是樣本 i 和樣本 j 的相似度,滿足 ,一般情況下還有個溫度參數,這里假設溫度參數已經整合到 中,從而簡化記號。模型參數存在于 中,假設為 。
可以驗證,一般情況下:
所以直接將小 batch_size 的對比學習的梯度累積起來,是不等價于大 batch_size 的對比學習的。類似的問題還存在于帶 BN(Batch Normalization)的模型中。
梯度
注意,剛才我們說的是常規的簡單梯度累積不能等效,但有可能存在稍微復雜一些的累積方案的。為此,我們分析式(1)的梯度:
其中 表示不需要對 求 的梯度,也就是深度學習框架的?stop_gradient 算子。上式表明,如果我們使用基于梯度的優化器,那么使用式(1)作為 loss,跟使用 作為 loss,是完全等價的(因為算出來的梯度一模一樣)。
內積
接下來考慮 的計算,一般來說它是向量的內積形式,即 ,參數 在 里邊,這時候:
所以 loss 中的 可以替換為 而效果不變:
第二個等號源于將 那一項的求和下標 i,j 互換而不改變求和結果。
流程
式(5)事實上就已經給出了最終的方案,它可以分為兩個步驟。第一步就是向量:
的計算,這一步不需要求梯度,純粹是預測過程,所以 batch_size 可以比較大;第二步就是把 當作“標簽”傳入到模型中,以 為單個樣本的 loss 進行優化模型,這一步需要求梯度,但它已經轉化為每個樣本的梯度和的形式了,所以這時候就可以用常規的梯度累積了。
假設反向傳播的最大 batch_size 是 b,前向傳播的最大 batch_size 是 nb,那么通過梯度累積讓對比學習達到 batch_size 為 nb 的效果,其格式化的流程如下:
1. 采樣一個 batch 的數據 ,對應的標簽矩陣為 ,初始累積梯度為 g=0;
2. 模型前向計算,得到編碼向量 以及對應的概率矩陣 ;
3. 根據式(6)計算標簽向量 ;
4. 對于 ,執行:
5. 用 g 作為最終梯度更新模型,然后重新執行第 1 步。
總的來說,在計算量上比常規的梯度累積多了一次前向計算。當然,如果前向計算的最大 batch_size 都不能滿足我們的需求,那么也可以分批前向計算,因為我們只需要把各個 算出來存好,而 可以基于 算出來。
最后還要提醒的是,上述流程只是在優化時等效于大 batch_size 模型,也就是說 的梯度等效于原 loss 的梯度,但是它的值并不等于原 loss 的值,因此不能用 作為 loss 來評價模型,它未必是單調的,也未必是非負的,跟原來的 loss 也不具有嚴格的相關性。
問題
上述流程有著跟《節省顯存的重計算技巧也有了 Keras 版了》[1] 介紹的“重計算”一樣的問題,那就是跟 Dropout 并不兼容,這是因為每次更新都涉及到了多次前向計算,每次前向計算都有不一樣的 Dropout,這意味著我們計算標簽向量 時所用的 跟計算梯度時所用的 并不是同一個,導致計算出來的梯度并非最合理的梯度。
這沒有什么好的解決方案,最簡單有效的方法就是在模型中去掉 Dropout。這對于 CV 來說沒啥大問題,因為 CV 的模型基本也不見 Dropout 了;對于 NLP 來說,第一反應能想到的結果就是 SimCSE 沒法用梯度累積,因為 Dropout 是 SimCSE 的基礎。
小結
本文分析了對比學習的梯度累積方法,結果顯示對比學習也可以用梯度累積的,只不過多了一次前向計算,并且需要在模型中去掉 Dropout。本文同樣的思路還可以分析 BN 如何使用梯度累積,有興趣的讀者不妨試試。
參考文獻
[1] https://kexue.fm/archives/7367
更多閱讀
#投 稿?通 道#
?讓你的文字被更多人看到?
如何才能讓更多的優質內容以更短路徑到達讀者群體,縮短讀者尋找優質內容的成本呢?答案就是:你不認識的人。
總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發出更多的可能性。?
PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學術熱點剖析、科研心得或競賽經驗講解等。我們的目的只有一個,讓知識真正流動起來。
?????稿件基本要求:
? 文章確系個人原創作品,未曾在公開渠道發表,如為其他平臺已發表或待發表的文章,請明確標注?
? 稿件建議以?markdown?格式撰寫,文中配圖以附件形式發送,要求圖片清晰,無版權問題
? PaperWeekly 尊重原作者署名權,并將為每篇被采納的原創首發稿件,提供業內具有競爭力稿酬,具體依據文章閱讀量和文章質量階梯制結算
?????投稿通道:
? 投稿郵箱:hr@paperweekly.site?
? 來稿請備注即時聯系方式(微信),以便我們在稿件選用的第一時間聯系作者
? 您也可以直接添加小編微信(pwbot02)快速投稿,備注:姓名-投稿
△長按添加PaperWeekly小編
????
現在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關注」訂閱我們的專欄吧
關于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
總結
以上是生活随笔為你收集整理的对比学习可以使用梯度累积吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机密级国家秘密是重要的国家秘密泄露会使国
- 下一篇: 东航 C919 于 5 月 28 日成功