抛开约束,增强模型:一行代码提升 ALBERT 表现
?PaperWeekly 原創 ·?作者|蘇劍林
單位|追一科技
研究方向|NLP、神經網絡
本文標題看起來有點“標題黨”了,不過所作改動放到 bert4keras 框架 [1] 下,確實是一行代碼的變動,至于是否有提升,這個筆者不敢打包票,不過測了幾個算是比較有代表性的任務,均顯示持平甚至有提升,所以標題說的也基本是事實。
那究竟是什么改動呢?其實一句話也能講清楚:
在下游任務中,放棄 ALBERT 的權重共享的約束,也就是把 ALBERT 當 BERT 用。
ALBERT是什么
這個改動是專門給 ALBERT 設計的,所以要理解這個改動,需要先知道 ALBERT?是什么。在此還是花點篇幅對 ALBERT 進行個簡單的科普。這里假設讀者已經對 BERT 有了一定的了解,所以主要是比較 ALBERT 跟 BERT 的異同。?
低秩分解
首先是 Embedding 層,以中文版 bert base 為例,token 總數大約是 20000,而 Embedding 層維度是 768,所以 Embedding 層的總參數量大約是 1500 萬,大概占了總參數量的 1/6。
ALBERT 第一個開刀的部分就是 Embedding 層,它把 Embedding 層弄成 128 維了,然后再通過 128 × 768 的矩陣變換矩陣變回 768 維,這樣 Embedding 層參數量就只有原來的 1/6 了,這就是所謂的低秩分解。?
參數共享
其次是 transformer 部分。在以 BERT 為代表的 transformer 架構模型中,其核心是由 self attention、layer norm、全連接(核大小為 1 的一維卷積)等組成的模塊,這里稱之為“transformer block”,而 BERT 模型就是多個 transformer block 的堆疊。
如下面左圖實際上是 bert base 的示意圖,它堆疊了 12 個 transformer block:
▲ 圖1. BERT base & ALBERT?base極簡示意圖
注意到,在 BERT 的設計里邊,每個 transformer block 的輸入和輸出形狀是一樣的,這意味著當前 block 的輸出作為當前 block 的輸入也是合理的。這也告訴我們,同一個 block 其實是可以重復使用來迭代的,而不至于每一層都使用一個新的 block。
ALBERT 里邊使用了一種最簡單直接的方案:所有層都公用同一個 transformer block(如上面右圖所示)!這樣一來,在 ALBERT base 中,transformer block 這部分參數量直接降低為原來 BERT base 的 1/12 了。
簡單評述
除了以上兩點之外,ALBERT 與 BERT 的一個顯著不同之處是在預訓練階段將 NSP (Next Sentence Prediction) 任務改為了 SOP (Sentence-Order Prediction) 任務,但是這并不屬于模型架構上的,所以并不是本文要關心的,讀者自行找相關資料了解即可。?
總的來說,ALBERT 是一個為了降低參數量而設計的模型,并且希望這個參數量的降低能帶來一定的正則化作用,從而降低過擬合風險,提升最終表現。但最后的結果是否如作者所愿呢?從“戰績”來看,ALBERT 問世之時用它最大版本的模型刷新了 GLUE 榜單,所以應該算是達到了作者的期望。但是,ALBERT 并非總是那么理想,ALBERT 也不是我們想象中的小模型。?
對于一個模型來說,我們比較關心的是速度和效果兩個指標。從上面兩個 BERT 和 ALBERT 的圖其實就可以看到,在預測階段(前向傳播),其實 ALBERT 跟 BERT 沒啥差別,所以同一規格(比如大家都是 base 版本)下的 ALBERT 和 BERT?的預測速度是一樣的,甚至更嚴格地說,ALBERT 還更慢些,因為 ALBERT 的 Embedding 部分還多了一個矩陣運算。換句話說,ALBERT 不能帶來預測速度的提升!?
那同一規格的 ALBERT 和 BERT,哪個效果好呢?其實 ALBERT?論文已經給出了答案:在 large 以內的版本,ALBERT 效果比 BERT 更差,只有在 xlarge、xxlarge 的版本時 ALBERT 效果才開始優于?BERT。
但是 roberta 方式的預訓練部分彌補了 BERT 的缺點,所以真正可以說穩定優于 bert/roberta 的 ALBERT 版本就只有 xxlarge。然而?ALBERT?xxlarge 是一個很龐大的模型,以至于我們很難把它跑起來。?
所以,基本上可以說:(在大多數人能搞起的前提下)在同樣的預測速度下, ALBERT 效果更差;在同樣的效果下,ALBERT 更慢。?
那訓練階段呢?前面還沒有提到的一點是,ALBERT 的參數共享設計其實有很強的正則化作用,所以 ALBERT 去掉的 dropout。參數共享和去掉 dropout 這兩點確實可以省一些顯存,并且提高訓練速度,但是筆者的評測是幅度只有 10%~20% 左右。也就是說,就算 ALBERT 參數降低到 BERT 的 1/10 甚至更多,并不意味著它的顯存占用量能降低到 1/10,也不意味著訓練速度能提高 10 倍,相反,它只有小幅度的提升。
拋開共享約束
從前面的討論中,我們能理解到幾個事實:?
1. 只看預測的話,ALBERT 跟 BERT 基本一致;?
2.?ALBERT 的參數共享對效果的作用基本是負面的。?
既然這樣,那么我們可以嘗試一個新鮮的玩法:在針對下游任務進行 finetune 時,我們把參數共享這個約束去掉如何?也就是說,finetune 的時候把 ALBERT 當 BERT 用,相當于每一個 transformer block 的初始化權重都一樣的 BERT。?
效果評測
事不宜遲,測了效果再說話。這里挑了四個任務來測。為了保證可復現性,下面同一個實驗都跑了三次,表格里顯示的是三次結果的平均值。其中 unshared 版本就是指去掉參數共享后的模型。而訓練速度那一列,指的是每個 epoch 所用的訓練時間,這是在單卡 TITAN RTX 上跑的時間,僅供相對比較參考。?
實驗用 bert4keras [1] 進行,對 unshared 版本,只需要在 build_bert_model 時加載 ALBERT 權重,并且設置 model='albert_unshared' ,這就是標題所說的“一行代碼”。?
首先是比較簡單的文本情感分類?[2]?任務。
去掉參數共享后,訓練時間略有增加,這是預料之中的,至于模型表現各有優劣。考慮到這個任務準確率本身比較高了,可能顯示不出模型間的差距,所以下面繼續測試復雜一點的模型。
這次我們試試 CLUE 的 IFLYTEK'長文本分類 [3],結果如下:
這時候 unshared 版本的優勢開始顯示出來了,主要體現在整體上收斂更快(看第一個 epoch 的指標值),small 版本最優效果明顯更優,tiny 版本最優效果略差,但通過精細調整學習率后,tiny_unshared 版本的最優效果其實是可以優于 tiny 版的(但這樣一來變量太多了,表格顯示的是嚴格的控制變量的結果)。
然后試試比較綜合的任務:信息抽取 [4]。結果如下:
可以看到,在比較綜合性的復雜任務,unshared 版本的模型已經穩定超過同規模的原模型。
最后一個是用 seq2seq 做閱讀理解式問答?[5],結果如下:
這個任務主要目的是測試模型的文本生成能力。可以看到在此任務上,unshared 版本的模型已經明顯超過原版模型,甚至 tiny 版的 unshared 模型已經逼近原版 small 模型。
分析思考
上面的模型都是?ALBERT?tiny/small 的實驗,其實 base 版也實驗過,結論跟 tiny 和 small 版的基本一致,但是 base 版本(自然也包括 large 以及 xlarge 版本)實驗時間過長,所以沒有做完完整的實驗(也沒有重復三次),因此就不貼上了。但總的來說,可以感覺到 tiny/small 版本的結果基本上有代表性了。?
上述實驗標明,去掉參數共享后的 ALBERT,在下游任務中的表現基本能持平甚至超過原版 ALBERT,這顯示了對于很多 NLP 任務來說,參數共享可能并不是一個很好的約束。讀者可能糾結于“為什么到了 xlarge 甚至 xxlarge 規模的模型時,參數共享的 ALBERT 又開始超過了不參數共享的 BERT 了呢?”。這里筆者嘗試給出一個解釋。?
從理論上來說,BERT 防止過擬合的手段有 dropout 和權重衰減,其中權重衰減在 ALBERT 也用了,但 dropout 沒有出現在 ALBERT 中,所以可以往 dropout 角度思考。很多實驗都表明,dropout 確實是一種降低過擬合風險的有效策略,但已有的實驗模型基本都遠遠比不上 BERT xlarge、BERT xxlarge那么大,所以 dropout 在超大模型下的有效性依然值得商榷。
事實上,dropout 存在訓練和推斷的不一致問題,也就是“嚴格來講訓練模型和預測模型并不是同一個模型”,個人感覺模型變大變深時,這種不一致性會進一步放大,所以個人認為 dropout 對于超大模型并不是一種有效的防止過擬合的方法。而 ALBERT 去掉了 dropout,通過參數共享來引入隱式的正則,使得模型變大變深不至于退化,甚至會表現更好。?
反過來說,ALBERT 的參數共享性能要好,條件是要足夠大、足夠深,所以如果我們用的是 base 版本、small 版本甚至是 tiny 版本時,反而不應該用參數共享,因為對于小模型來說參數共享反而是對模型表達能力的不必要的限制,所以這時候去掉參數共享表現反而更好些。
文章小結
本文實驗了一個新鮮的玩法:finetune 階段把 ALBERT 的參數共享去掉,把 ALBERT 當 BERT 用,在幾個任務上發現這樣做有著持平甚至超過原始?ALBERT 的表現,最后給出了對 ALBERT 以及此現象的個人理解。
相關鏈接
[1] https://github.com/bojone/bert4keras?
[2]?https://github.com/bojone/bert4keras/blob/master/examples/task_sentiment_albert.py
[3] https://github.com/CLUEbenchmark/CLUE?
[4]?https://github.com/bojone/bert4keras/blob/master/examples/task_relation_extraction.py?
[5]?https://github.com/bojone/bert4keras/blob/master/examples/task_reading_comprehension_by_seq2seq.py
點擊以下標題查看更多往期內容:?
AAAI 2020?| 語義感知BERT(SemBERT)
淺談 Knowledge-Injected BERTs
從 Word2Vec 到 BERT
后 BERT 時代的那些 NLP 預訓練模型
BERT+知識圖譜:知識賦能的K-BERT模型
從三大頂會論文看百變Self-Attention
#投 稿 通 道#
?讓你的論文被更多人看到?
如何才能讓更多的優質內容以更短路徑到達讀者群體,縮短讀者尋找優質內容的成本呢?答案就是:你不認識的人。
總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發出更多的可能性。?
PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學習心得或技術干貨。我們的目的只有一個,讓知識真正流動起來。
?????來稿標準:
? 稿件確系個人原創作品,來稿需注明作者個人信息(姓名+學校/工作單位+學歷/職位+研究方向)?
? 如果文章并非首發,請在投稿時提醒并附上所有已發布鏈接?
? PaperWeekly 默認每篇文章都是首發,均會添加“原創”標志
???? 投稿郵箱:
? 投稿郵箱:hr@paperweekly.site?
? 所有文章配圖,請單獨在附件中發送?
? 請留下即時聯系方式(微信或手機),以便我們在編輯發布時和作者溝通
????
現在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關注」訂閱我們的專欄吧
關于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
▽ 點擊 |?閱讀原文?| 查看作者博客
總結
以上是生活随笔為你收集整理的抛开约束,增强模型:一行代码提升 ALBERT 表现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件不兼容win7怎么办 win7软件兼
- 下一篇: 拯救颓废假期!快来和我们一起刷论文写笔记