四兩撥千斤,如何做到自然語言預訓練加速十倍
近年來,自然語言處理中的預訓練成為了研究領域的熱點,著名的 GPT-3 也掀起了一波新的浪潮。但是眾所周知,訓練這樣大規(guī)模的模型非常消耗資源:即使在維基百科數(shù)據(jù)上訓練一個簡單的 BERT-Base 模型,都需要用許多 GPU 訓練1-2周,且不說購買 GPU 的開銷,光是電費就需要數(shù)萬美金。這樣的消耗只有工業(yè)界的幾個大公司才可以實現(xiàn),極高的門檻限制了相關方向的探索以及整體發(fā)展。
為了降低預訓練的準入門檻,微軟亞洲研究院機器學習組的研究員們從機器學習中的不同角度出發(fā),針對預訓練的不同側(cè)面分別提出了加速方法。具體而言,研究員們提出了基于 Transformer 的新結(jié)構 TUPE,針對 BERT 設計了數(shù)據(jù)高效利用的策略,以及擴展了類似人類學習的預訓練任務。
其中前兩項工作已被新鮮出爐的 ICLR 2021 接收。這些方法既可以獨立使用,也可以結(jié)合起來使用,從而可以達到更大的加速比。原來需要10天的訓練,現(xiàn)在只要一天就可以完成!
基于 Transformer 的新結(jié)構 TUPE(ICLR 2021)
位置表征(Positional Embedding)大家都知道,但這個設計真的高效、合理嗎?
由于 Transformer 在結(jié)構上不能識別來自不同位置的詞語,所以模型一般需要用位置表征來輔助。其中最簡單的做法就是在輸入詞向量上直接加位置表征,但詞向量和位置向量相加是不是一個正確的選擇呢?
詞向量的加減操作可以保持語義,但位置向量本身是不具備語義的,兩者相加會不會讓模型更難學呢?在第一層對 Transformer 的注意力分布(attention weight)進行展開可以得到:
從上面展開的公式里,可以發(fā)現(xiàn)兩個問題:
第一,中間兩項引入了詞語和位置信息的交叉,但沒有理由說某個位置和某個詞一定有很強的關聯(lián)(論文中有詳細的實驗分析也表明了中間兩項有一定的冗余) 。
第二,第一項和第四項分別計算詞與詞、位置與位置的關聯(lián),但他們采用了相同的參數(shù)化函數(shù) (W^Q 和 W^K),從而限制了注意力表達能力。
為了解決上述兩個問題,微軟亞洲研究院的研究員們做了一些簡單的改動:
簡單來說,就是去掉了位置 (position) 和文本( token) 之間的交叉,同時用了不同的變換矩陣。
需要注意的是,在多層的 Transformer 模型里,比如 BERT,上面公式的第二項在不同層之間是共享的。因此,這里僅需要計算一次,幾乎沒有引入額外的計算代價。
圖1:整體 TUPE (Transformer with Untied Positional Encoding) 結(jié)構
圖2:實驗結(jié)果
另外,研究員們還特殊處理了 [CLS] token 的位置,使其不會因太過關注局部而忽略了整個句子的信息,整體 TUPE (Transformer with Untied Positional Encoding)結(jié)構如圖1所示。
實驗結(jié)果如圖2,可以看到,該方法不僅最后比基線要好很多,并且可以在 30% (300k-step) 的時候,就達到基線在 1000k-step 時的效果。
TUPE 的完整工作請見:https://openreview.net/forum?id=09-528y2Fgf
高效數(shù)據(jù)利用:讓 BERT 像人類一樣記筆記(ICLR 2021)
眾所周知,在語言數(shù)據(jù)集中,單詞通常具有非常長尾的分布,即大量的單詞在整個數(shù)據(jù)集中都具有很低的出現(xiàn)頻率。而這些低頻詞的詞向量,往往訓練質(zhì)量都不佳。
這些低質(zhì)量的詞向量,給模型理解整句訓練語句造成了困難,進而拖慢了整個模型預訓練的速度。
舉例來說,如圖3所示,如果「COVID-19」是一個低頻詞,做完形填空的人如果對其含義一無所知的話,那么想要填對合適的詞是十分困難的,類似的問題也會發(fā)生在自然語言預訓練的過程中。
圖3:低頻詞例
由此,微軟亞洲研究院的研究員們提出了為低頻詞詞動態(tài)記筆記的方法 Taking Notes on the Fly(TNF),記錄歷史上出現(xiàn)過稀有詞的句子信息,從而使得當模型再見到該低頻詞的時候,對其的理解能夠更加充分。
如圖3所示,研究員們希望模型能夠從筆記「The COVID-19 pandemic is an ongoing global crisis」(COVID-19 是一場持續(xù)發(fā)生的全球危機)推測出「COVID-19」與生命有關,從而更容易理解任務得出上述完形填空問題的答案「lives」(生命)。
具體說來,TNF 維護了一個筆記詞典。在這個筆記詞典中,每一個低頻詞都存有一個上下文表征向量(Contextual representation)來作為筆記。
當該詞出現(xiàn)時,TNF 從筆記詞典中取出其的上下文表征向量,與其詞向量一起構成模型在該位置的輸入,同時也更新筆記上針對這個詞的內(nèi)容。如圖4所示:
圖4:TNF 的訓練過程
研究員們將 TNF 應用到了兩個著名且有效的語言預訓練方法 BERT 和 ELECTRA 上進行實驗,同時也在 GLUE 上對預訓練的模型進行了精調(diào),然后對比。
實驗結(jié)果表明,在兩個預訓練方法上,當 TNF 與基線達到相同的實驗結(jié)果時,TNF 的訓練時間僅僅為基線的40%(見圖5)。
圖5:TNF 的訓練曲線
當 TNF 與基線訓練相同的迭代更新次數(shù)時,TNF 在 GLUE 上的平均 GLUE Score 和大多數(shù)子任務上的表現(xiàn)均超過了基線。
TNF 的完整工作請見:https://openreview.net/forum?id=lU5Rs_wCweN
合理的預訓練目標:BERT 更喜歡做 ABCD 單選題
目前許多預訓練模型都會使用掩碼語言模型任務,即遮擋住輸入句子的一部分,讓模型還原被遮擋的部分。該任務實際上相當于一個「完形填空」問題,但與考試中常見的完形填空不同,自然語言預訓練中的完形填空備選項是整個詞典。
顯然,即使對于人類來說,在沒有備選答案的開放環(huán)境下,想要準確完成這個「完形填空」任務也是十分困難的。
圖6:單選題任務
實際上,人類更容易完成選擇題或判斷題。在給定有限選項的條件下,任務的難度會極大降低。著名的「ELECTRA」模型使用的就是判斷題任務,在前期設計的判斷題容易,于是訓練效率很高。
隨著模型的訓練,判斷題設計越來越難,模型可以一直得到有效的反饋。與 ELECTRA 稍有區(qū)別,微軟亞洲研究院的研究員們給模型設計的預訓練任務是 ABCD 單選題,并希望能夠動態(tài)地調(diào)整單選題的難度。
在早期學習中,設計簡單的單選題,令模型完成相對簡單的任務,從而加快學習進程,在后期則逐漸加大任務難度,從而獲得更精細的結(jié)果。
在這里可以通過設計不同難度的任務以及選項的個數(shù)調(diào)節(jié)任務的難度(選項越多任務越困難)。
圖7:使用元控制器進行預訓練
為了達到訓練任務從易到難的效果,一個能夠出題的「元控制器」被提出,它能夠自適應地改變多選題的難度。
特別的是,這個元控制器是一個較小的 BERT,基于掩碼語言模型進行預訓練,并隨著主模型一起訓練迭代。
對于每句話先對這句話進行遮擋,然后元控制器以遮擋后的語句作為輸入,并輸出被遮擋目標詞相關的詞例,這些詞例將被用于構造備選答案。
圖 8:基于自適應多選題任務的預訓練實驗結(jié)果
可以看到,在訓練初期,元控制器的訓練并不充分,于是生成備選答案的質(zhì)量不高,主模型可以在這些容易的任務上很快學習到正確的知識。
在訓練后期,元控制器的訓練接近完成,可以生成高質(zhì)量的備選答案,從而主模型可以在這些困難的任務上得到進一步的進化。
將這個元控制器應用到 BERT上,可以發(fā)現(xiàn)與原始 BERT 相比,訓練速度提升了80%,即在下游任務 GLUE 上,用20%的計算開銷訓練得到的模型,可以與訓練時間長5倍的 BERT 模型相匹配。
完整工作請見:https://arxiv.org/abs/2006.05744