层次分解位置编码,让BERT可以处理超长文本
?PaperWeekly 原創 ·?作者|蘇劍林
單位|追一科技
研究方向|NLP、神經網絡
大家都知道,目前的主流的 BERT 模型最多能處理 512 個 token 的文本。導致這一瓶頸的根本原因是 BERT 使用了從隨機初始化訓練出來的絕對位置編碼,一般的最大位置設為了 512,因此頂多只能處理 512 個 token,多出來的部分就沒有位置編碼可用了。當然,還有一個重要的原因是 Attention的 復雜度,導致長序列時顯存用量大大增加,一般顯卡也 finetune 不了。
本文主要面向前一個原因,即假設有足夠多的顯存前提下,如何簡單修改當前最大長度為 512 的 BERT 模型,使得它可以直接處理更長的文本,主要思路是層次分解已經訓練好的絕對位置編碼,使得它可以延拓到更長的位置。
位置編碼
BERT 使用的是訓練出來的絕對位置編碼,這種編碼方式簡單直接,效果也很不錯,但是由于每個位置向量都是模型自己訓練出來的,我們無法推斷其余位置的編碼向量,因此有了長度限制。
解決這個問題的一個主流思路是換成相對位置編碼,這是個可行的辦法,華為的 NEZHA [1] 模型便是一個換成了相對位置編碼的 BERT 模型。相對位置編碼一般會對位置差做個截斷,使得要處理的相對位置都在一個有限的范圍內,因此相對位置編碼可以不受限于序列長度。
但相對位置編碼也不是完美的解決方案,首先像 NEZHA 那樣的相對位置編碼會增加計算量(如果是 T5 那種倒是不會),其次是線性 Attention 則沒法用相對位置編碼,也就是不夠通用。
讀者可能會想起 Attention is All You Need 不是提出了一種用 表示的 Sinusoidal 絕對位置編碼嗎?直接用那種不就不限制長度了?理論上是這樣,但問題是目前沒有用 Sinusoidal 位置編碼的模型開放呀,難道我們還要自己從零訓練一個?這顯然不大現實呀。
層次分解
所以,在有限資源的情況下,最理想的方案還是想辦法延拓訓練好的 BERT 的位置編碼,而不用重新訓練模型。下面給出筆者構思的一種層次分解方案。
▲ 位置編碼的層次分解示意圖
具體來說,假設已經訓練好的絕對位置編碼向量為 ,我們希望能在此基礎上構造一套新的編碼向量 ,其中 。為此,我們設:
其中 且 是一個超參數, 是該套位置編碼的“基底”。這樣的表示意義很清晰,就是將位置 層次地表示為 ,然后 i, j 對應的位置編碼分別為 和,而最終 的編碼向量則是兩者的疊加。不難理解,要求 是為了區分 (i, j) 和 (j, i) 兩種不同的情況。
我們希望在不超過 n 時,位置向量保持跟原來的一樣,這樣就能與已經訓練好的模型兼容。換句話說,我們希望 ,這樣就能幫助我們把各個 給確定下來了:
這樣一來,我們的參數還是 ,但我們可以表示出 個位置的編碼,并且前 n 個位置編碼跟原來模型是相容的。
自我分析
事實上,讀懂了之后,讀者就會發現其實這個分解幾乎沒什么技術含量,就是一個純粹的拍腦袋的結果而已。
至于為什么會覺得這樣做有效?一是由于層次分解的可解釋性很強,因此可以預估我們的結果具有一定外推能力,至少對于大于 n 的位置是一個不錯的初始化;二則是下一節的實驗驗證了,畢竟實驗是證明 trick 有效的唯一標準。
本質上來說,我們做的事情很簡單,就是構建一種位置編碼的延拓方案,它跟原來的前 n 個編碼相容,然后還能外推到更多的位置,剩下的就交給模型來適應了。這類做法肯定有無窮無盡的,筆者只是選擇了其中自認為解釋性比較強的一種,提供一種可能性,并不是最優的方案,也不是保證有效的方案。
此外,討論一下 的選取問題,筆者默認的選擇是 。理論上來說, 且 都成立,但是從實際情況出發,還是建議選擇 的數值。
因為我們很少機會碰到上萬長度的序列,對于個人顯卡來說,能處理到 2048 已經很壕了,如果 n=512,那么這就意味著 i = 1, 2, 3, 4 而 ,如果 的話,那么從分解式(1)看 就會占主導,因為位置編碼之間差異變小,模型不容易把各個位置區分開來,會導致收斂變慢;如果 ,那么占主導的是 ,位置編碼的區分度更好,模型收斂更快一些。
實踐測試
綜上所述,我們可以幾乎無成本地延拓 BERT 的絕對位置編碼,使得它最大長度可以達到 萬!這絕對能滿足我們的需求了吧?該改動已經內置在 bert4kera>=0.9.5 中,用戶只需要在 build_transformer_model 中傳入參數 hierarchical_position=True 即可啟用,True 也可以換為 0~1 之間的浮點數,代表上述 的值,為 True 時則默認 。
至于效果,筆者首先測了 MLM 任務,直接將最大長度設為 1536,然后加載訓練好的 RoBERTa 權重,發現 MLM 的準確率大概是 38% 左右(如果截斷到 512,那么大概是 55% 左右),經過 finetune 其準確率可以很快(2000 步左右)恢復到 55% 以上。
這個結果表明這樣延拓出來的位置編碼在 MLM 任務上是行之有效的。如果有空余算力的話,在做其他任務之前先在 MLM 下繼續預訓練一會應該是比較好的。
然后測了兩個長文本分類問題,分別將長度設為 512 和 1024,其他參數不變進行 finetune(直接 finetune,沒有 MLM 繼續預訓練),其中一個數據集的結果沒有什么明顯變化;另一個數據集在驗證集上 1024 的比 512 的要高 0.5% 左右。
這再次表明本文所提的層次分解位置編碼是能起作用的。所以,大家如果有足夠顯存的顯卡,那就盡管一試吧,反正在 bert4keras 下就是多一行代碼的事情,有提升就是賺到了,沒提升也沒浪費多少精力。
最后提供一個 finetune 階段最大長度與最大 batch_size 的參照表(RoBERTa Base 版,24G 的 TITAN RTX):
文章小結
本文分享了筆者構思的一種基于層次分解的位置編碼延拓方案,通過這個延拓,BERT理論上最多可以處理多達 26 萬長度的文本,只要顯存管夠,就沒有 BERT 處理不了的長文本。
所以,你準備好顯存了嗎?
參考文獻
[1] https://github.com/huawei-noah/Pretrained-Language-Model/tree/master/NEZHA-TensorFlow
[2] https://github.com/bojone/bert4keras
更多閱讀
#投 稿?通 道#
?讓你的論文被更多人看到?
如何才能讓更多的優質內容以更短路徑到達讀者群體,縮短讀者尋找優質內容的成本呢?答案就是:你不認識的人。
總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發出更多的可能性。?
PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優質內容,可以是最新論文解讀,也可以是學習心得或技術干貨。我們的目的只有一個,讓知識真正流動起來。
?????來稿標準:
? 稿件確系個人原創作品,來稿需注明作者個人信息(姓名+學校/工作單位+學歷/職位+研究方向)?
? 如果文章并非首發,請在投稿時提醒并附上所有已發布鏈接?
? PaperWeekly 默認每篇文章都是首發,均會添加“原創”標志
?????投稿郵箱:
? 投稿郵箱:hr@paperweekly.site?
? 所有文章配圖,請單獨在附件中發送?
? 請留下即時聯系方式(微信或手機),以便我們在編輯發布時和作者溝通
????
現在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關注」訂閱我們的專欄吧
關于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
總結
以上是生活随笔為你收集整理的层次分解位置编码,让BERT可以处理超长文本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 申请专利的条件和流程图(申请专利的条件)
- 下一篇: 如何应用AutoML加速图机器学习任务的