我是如何從頭寫一篇頂級論文的

語言: CN / TW / HK

Datawhale乾貨 

作者: 重劍無鋒@知乎,劍橋大學,編輯:極市平臺

原文丨https://zhuanlan.zhihu.com/p/538681254

極市導讀

關於一篇頂會論文是如何產生的這件事—且看作者為你娓娓道來,如何從一形成routine的日常科研生活中挖掘到巧妙的產出。

最近完成了一篇很滿意的論文,不僅整個過程愉快,回味無窮,而且真正做到了“學術有影響 工業有產出”,可以肯定這篇文章會改變差分隱私(differential privacy;DP)深度學習的正規化。

因為這次經歷實在太過“巧”了 (過程充滿巧合 結論極其巧妙)在此和同學們分享一下自己從觀察-->構思-->實證-->理論-->大規模實驗的完整流程,儘量保持lightweight不涉及過多技術細節,程式碼放在底部。

Automatic Clipping: Differentially Private Deep Learning Made Easier and Strongerarxiv.org/abs/2206.07136

https://arxiv.org/abs/2206.07136

尤其與paper展現的順序不同,paper有時會刻意將結論放在開頭吸引讀者,或者先介紹簡化後的定理而將完整的定理放附錄,而我想將我的經歷按時間順序寫下(也就是流水賬) 比如把走過的彎路和研究中突發的狀況寫出來,以供剛踏上科研之路的同學參考。

一、 文獻閱讀

我每天都會讀arXivDaily學術速遞裡所有機器學習和統計的文章標題及簡介,大概每天150篇 所以DP的文章基本第一時間就能知道。

事情的起源是斯坦福的一篇論文,現在已經錄了ICLR:

文章寫的非常好,總結起來三個主要貢獻:

  1. 在NLP任務中,DP模型的accuracy非常高,鼓勵了privacy在語言模型的應用 (與之相對的是CV中DP會產生非常大的accuracy惡化 比如cifar10目前DP限制下只有80%accuracy,而不考慮DP可以輕鬆95%;ImageNet當時最好的DP accuracy不到50%)

  2. 在語言模型上,模型越大效能會越好。比如GPT2中,從4億引數到8億引數效能提升很明顯,也取得了很多SOTA(但是在CV和推薦系統中,很多時候更大的模型效能會很差,甚至接近random guess。比如CIFAR10的DP best accuracy此前是由四層CNN得到的,而非ResNet)

NLP任務中DP模型越大效能越好 [Xuechen et al. 2021]

3. 在多個任務上取得SOTA的超引數是一致的,都是clipping threshold要設定的足夠小,並且learning rate需要大一些(此前所有文章都是一個任務調一個clipping threshold 費時費力,並沒有出現過像這篇這樣一個clipping threshold=0.1 貫穿所有任務表現還這麼好)

以上總結是我讀完paper瞬間理解的,其中括號內的內容並非來此這篇paper而是以往諸多閱讀產生的印象,這有賴於長期的閱讀積累和高度的概括能力,才能快速聯想和對比出來。

事實上很多同學做文章起步難恰恰就在於看一篇文章只能看到一篇文章的內容,無法和整個領域的知識點形成網路產生聯想。這一方面由於剛入門的同學閱讀量不夠,尚未掌握足夠的知識點,尤其是長期從老師手中拿課題不自己獨立propose的同學容易有這個問題。另一方面則是閱讀量隨夠但沒有時時歸納總結,導致資訊沒有凝聚成知識或者知識沒有串聯。

這裡補充下DP deep learning的背景知識,暫且略過DP的定義,不影響閱讀:

所謂DP deep learning 從演算法的角度來說其實就是多做兩個額外的步驟:per-sample gradiet clipping和Gaussian noise addition;換句話來說,只要你把gradient按照這兩步處理完了(處理後的gradient叫做private gradient)之後該怎麼用優化器怎麼用,SGD/Adam都可以。

至於最後演算法到底多private就是另一個子領域的問題了,稱為privacy accounting theory 此領域相對成熟而且需要極強的理論功底,由於本文專注於optimization 按下不表。

g_i 是 一個數據點的梯度(per-sample gradient),R是clipping threshold, sigma是noise multiplier。

其中Clip叫做clipping function 就跟常規的gradient clipping一樣,梯度長於R就剪到R,小於R就不動。

比如DP版本的SGD就是:

目前所有paper全都用的是隱私深度學習開山之作(Abadi, Martin, et al. "Deep learning with differential privacy.")中的clipping function,也稱為Abadi's clipping

但這是完全不必要的,遵循第一性原理 從privacy accounting theory出發。其實clipping function只需要滿足Clip(g_i)*g_i的模小於等於R就可以了,也就是說Abadi's clipping只是一種滿足這個條件函式,絕非唯一。

二、切入點

一篇文章的閃光點很多,但是並非都能為我所用,要結合自身的需求和擅長去判斷最大的貢獻是什麼。

這篇文章前兩個貢獻其實非常empirical,也很難深挖,而最後一個貢獻很有意思。我仔細看了看超引數的ablation study 發現一個原作者沒有發現的點:在clipping threshold足夠小的時候,其實clipping threshold(也就是clipping norm C,在上面的公式中和R是一個變數)沒有作用。

縱向來看 C=0.1,0.4,1.6對DP-Adam沒什麼區別 [Xuechen et al. 2021]

這引起了我的興趣,感覺背後一定有什麼原理,於是我手寫了他們所用的DP-Adam來看看為什麼,其實這很簡單:

如果R足夠小,clipping其實等價於normalization!簡單代入private gradient(1.1)可以將R從clipping的部分和noising的部分分別提出來。

而Adam的形式使得R會同時出現在梯度和自適應的步長中,分子分母一抵消,R就沒有了,頂會idea就有了!

m和v都依賴於梯度,同時用private梯度替換即得到DP-AdamW。

就這麼簡單的代換,就證明了我的第一個定理:在DP-AdamW中,足夠小的clipping thresholds是互相等價的,無需調參的。

毫無疑問,這是一個很簡明而且很有趣的觀察,但這並沒有足夠的意義,所以我需要思考這個觀察在實際中有什麼用途。

其實,這意味著DP訓練減少了一個數量級的調參工作:假設學習率和R各調5個值(如上圖) 那就要測25種組合才能找到最優超引數,現在只需要調學習率5種可能就好,調參效率提高了數倍,這是對業界來說極有價值的痛點問題。

立意足夠高,數學足夠簡明,一個好的想法已經初具雛形。

三、簡單擴充套件

只對Adam/AdamW成立的話,這個工作的侷限性還是太大了。所以我很快擴充套件到了AdamW和其他adaptive optimizers,比如AdaGrad。事實上,對於所有的adaptive optimizers 都可以證明clipping threshold會被抵消從而不用調參,大大增加了定理的豐富程度。

這裡面還有一個有趣的小細節,眾所周知 Adam with weight decay和AdamW不一樣,後者使用的是decoupled weight decay 就這個區別還發了篇ICLR。

Adam有兩種加weight decay的方式

這個區別在DP優化器中也存在,同樣是Adam 用decoupled weight decay的話,縮放R不影響weight decay的大小,但是用普通的weight decay的話,放大R兩倍等價於縮小兩倍的weight decay。

四、另有乾坤

聰明的同學可能已經發現了,我一直再強調自適應優化器,為啥不講講SGD呢? 答案是在我寫完DP自適應優化器的理論後,Google緊接著就放了一篇DP-SGD用在CV的文章,也做了ablation study,但是規律和在Adam上發現的完全不同,給我留下了一個對角的印象。

對DP-SGD且R足夠小的時候,增大10倍lr等於增大10倍R [https://arxiv.org/abs/2201.12328]

當時我看到這篇文章的時候很興奮,因為又是一個證明small clipping threshold效果好的論文。

在科學界,連續的巧合背後往往有著隱藏的規律。

簡單的代換一下,發現SGD比Adam還好分析 (1.3)可以近似為:

顯然,R又可以提出來和學習率 \eta\eta 組合在一起,從理論上證明了Google的觀察

“Specifically, when the clipping norm is decreased k times, the learning rate should be increased k times to maintain similar accuracy.”

很可惜 Google只看到現象,沒有上升到理論的高度,這裡也有一個巧合,那就是上圖他們同時畫了兩種尺度的ablation study 只有左邊的尺度能看出對角線,光看右邊是沒有結論的...

由於沒有自適應步長,SGD不像Adam一樣無視R而是把R看作學習率的一部分,所以不需要調節 反正學習率要調參。

再將SGD的理論擴充到momentum,所有Pytorch支援的優化器全都分析完畢。

五、從直覺到嚴謹

一個創新點是有了,但是Abadi's clipping嚴格來說只是近似normalization,不能劃等號,也就沒法確鑿的分析收斂性。

根據多啦A夢鐵人兵團原理,我直接命名normalization為新的clipping function 替代了整個領域用了6年的Abadi clipping,這是我的第二個創新點。

經過剛才的證明,新的clipping嚴格不需要R,所以稱之為automatic clipping (AUTO-V; V for vanilla)

既然形式上與Abadi's clipping有不同,那麼accuracy就會有差異,而我的clipping可能有劣勢。

所以我需要寫程式碼測試我的新方法,而這 只需要改動一行程式碼 (畢竟只是把 )

事實上,DP per-sample gradient clipping這個方向,總共只有三種clipping functions。除了Abadi's clipping以外的兩種都是我提出的:一個是global clipping;還有一個就是這篇automatic clipping,而在先前的工作中,我就已經知道怎麼在各個流行的庫中改clipping了。我將修改方法放在文章最後一個appendix。

經過我的測試,我發現斯坦福的文章中GPT2在整個訓練過程中,所有itertation所有per-sample gradient都是clip過的。也就是說,至少在這一個實驗上Abadi's clipping完全等價於automatic clipping。雖然後來的實驗的確有輸於SOTA的情況,但這已經說明了我的新方法有足夠的價值:一個不需要調整clipping threshold的clipping function 而且有時accuracy也不會犧牲。

六、 迴歸抽象思考

斯坦福的文章有兩大類語言模型的實驗:一類是GPT2為模型的生成型任務;另一類是RoBERTa為模型的分型別任務。雖然在生成任務上automatic clipping和Abadi's clipping等價 但是分型別任務卻總是差幾個點的準確率。

出於我自己的學術習慣,這個時候我不會去換資料集然後專門挑我們佔優的實驗發表,更不會增加trick比如做資料增強和魔改模型之類的。我希望在完全公平的比較中,只比較per-sample gradient clipping的前提下,儘可能做出最好的不含水分的效果。

事實上,在和合作者討論中我們發現,純粹的normalization和Abadi's clipping比,梯度大小的資訊是完全拋棄的。也即是說對於automatic clipping,無論原始的梯度多大 clip後都是R這麼大,而Abadi對於比R小的梯度是保留了大小的資訊的。

基於這個想法,我們做了一個微小但極其巧妙的改動,稱之為AUTO-S clipping (S代表stable)。

將R和學習率融合後變成

簡單一畫可以發現,這個小小的 \gamma\gamma (一般設為0.01 其實設成別的正數都行 很穩健)就能保留梯度大小的資訊。

基於這個演算法,還是隻改動一行,把斯坦福的程式碼重跑一遍,六個NLP資料集的SOTA就到手了。

在E2E生成任務上,AUTO-S超越了所有其他clipping function,在SST2/MNLI/QNLI/QQP分類任務也是。

七、要做通用演算法

斯坦福文章的一個侷限性是隻專注於NLP,又很巧合的是,緊接著Google刷了ImageNet的DP SOTA兩個月後,Google子公司DeepMind放出了一篇DP在CV中大放異彩的文章,直接將ImageNet從48%提升到84%!

https://arxiv.org/abs/2204.13650

在這篇文章中,我第一時間去看優化器和clipping threshold的選擇,直到我在附錄翻到這張圖:

DP-SGD在ImageNet上的SOTA也是需要clipping threshold足夠小

依然是small clipping threshold效果最好!有了三篇高質量的文章支撐 automatic clipping已經有了很強的動機了,我越發肯定自己的工作會是非常傑出的。

巧合的是,DeepMind這篇文章也是純實驗沒有理論,這也導致他們差點就領悟出了他們可以從理論上不需要R。事實上他們真的非常接近我的想法了,他們甚至已經發現了R是可以提取出來和學習率融合的 (感興趣的同學可以看看他們的公式(2)和(3)) 但是Abadi's clipping的慣性太大了... 即使他們總結出了規律卻沒有更進一步。

DeepMind也發現了small clipping threshold效果最好,但是沒有理解為什麼。

受這篇新的工作啟發,我開始著手做CV的實驗,讓我的演算法能被所有DP研究者使用,而不是NLP搞一套方法CV搞另一套。

好的演算法,就是應該通用好用,事實也證明 automatic clipping在CV資料集上同樣能取得SOTA。

八、理論為骨 實驗為翼

縱觀以上所有的論文,都是SOTA提升顯著,工程效果拔滿,但是理論完全空白。

當我做完所有實驗的時候,這份工作的貢獻已經超過了一篇頂會的要求:我將經驗上small clipping threshold所產生的DP-SGD和DP-Adam的引數影響大大簡化;提出了新的clipping function而不犧牲運算效率、隱私性,還不用調參;小小的 \gamma\gamma 修復了Abadi's clipping和normalization對梯度大小資訊的破壞;充足的NLP和CV實驗都取得了SOTA的準確率。

我還沒有滿意,一個沒有理論支撐的優化器,還是無法為深度學習做出實質貢獻。每年頂會提出的新優化器幾十個,第二年全都掃進故紙堆,Pytorch官方支援的、業界真正在用的還是那麼幾個。

為此我和合作者們額外花了兩個月做了automatic DP-SGD收斂性分析,過程艱難但最後的證明簡化到極致。結論也很簡單,將batch size、learning rate、model size、sample size等變數對收斂的影響都定量的表達出來,並且符合所有已知的DP訓練行為。

特別的,我們證明了DP-SGD雖然收斂的比標準的SGD慢,但是iteration趨於無窮的話,收斂的速度都是一個數量級的,這為隱私計算提供了信心:DP模型收斂,雖遲但到。

九、撞車了...

終於,寫了7個月的文章完稿了,沒想到巧合還沒停,5月份NeurIPS投稿 6/14內部修改完放arXiv,結果6/27看到微軟亞州研究院(MSRA)發表了一篇和我們撞車的文章,提出的clipping和我們的automatic clipping一摸一樣:

和我們的AUTO-S分毫不差

仔細看了看,連收斂性的證明都差不多,而我們兩組人又沒有交集,可以說隔著太平洋的巧合誕生了。

這裡稍微講一下兩篇文章的不同:對方文章稍偏理論,比如額外分析了Abadi DP-SGD的收(我只證了automatic clipping 也就是他們文中的DP-NSGD,可能我也不知道咋整DP-SGD),用的假設也有一些不同;而我們實驗做的多一些大一些(十幾個資料集)更顯式地建立了Abadi's clipping和normalization的等價關係,比如Theorem 1和2解釋為什麼R可以不用調參。

既然是同時期的工作,我很開心能有人literally不謀而合,互相能補充共同推動這個演算法,讓整個社群儘快相信這個結果並從中受益,當然私心來說,也提醒自己下一篇要加速了!

十、總結

回顧這篇文章的創作歷程,從起點來看,基本功一定是前提。而另一個重要的前提是自己心中一直念念不忘調參這個痛點問題,正是久旱,所以讀到合適的文章才能逢甘露;至於過程,核心在於將觀察數學化理論化的習慣,反倒在這個工作中程式碼實現能力不是最重要的,我會再寫一篇專欄著重講講另一個硬核程式碼工作;最後的收斂性分析,也是靠合作者和自己的不將就,所幸好飯不怕晚,繼續前進!

P.S. 我的paper沒有公佈程式碼 因為別人的codebase寫了幾萬行 我就改一行實在沒有釋出的必要 比如Facebook的DP程式碼庫Opacus(https://github.com/pytorch/opacus) (version 1.1.3)只需要把https://github.com/pytorch/opacus/blob/main/opacus/optimizers/optimizer.py(https://github.com/pytorch/opacus/blob/main/opacus/optimizers/optimizer.py) 第400行的

per\_sample\_clip\_factor = \(self.max\_grad\_norm / \(per\_sample\_norms + 1e-6\)\).clamp\(max=1.0\)

改成下面這行就好了

per\_sample\_clip\_factor = 1 / \(per\_sample\_norms + 1e-2\)

這等價於斯坦門茨的故事:畫一條線價值一萬美元 :)

“整理不易, 三連