Google 自然語言處理(NLP)最新預(yù)訓(xùn)練模型 ALBERT

??模型來自論文 Google 最近公布的論文 《ALBERT: A LITE BERT FOR SELF-SUPERVISED LEARNING OF LANGUAGE REPRESENTATIONS》[1],該論文現(xiàn)在已送審 ICIR 2020。
從名字就可以看出 ALBERT 是 BERT 的“改進(jìn)版”,其進(jìn)步的地方,一言以蔽之,就是 用更少的參數(shù),取得了更好的效果

1. 模型大小與模型性能之間的關(guān)系

??這是作者開篇討論的問題。近一兩年,預(yù)訓(xùn)練語言模型給自然語言處理領(lǐng)域帶來了巨大的突破。從 ELMO,GPT,到 Bert,XLNet 和 RoBerta,我們不難看出,性能越強(qiáng)的模型,參數(shù)量也越大。既然模型的參數(shù)量如此重要,我們就會(huì)有一個(gè)很直接的假設(shè):參數(shù)量越大,模型的性能就會(huì)越高。

??先不考慮硬件資源和訓(xùn)練時(shí)間(還是要考慮,如此大的開銷已經(jīng)將很多參與者擠出門外了),如果上述假設(shè)成立,那么我們只需要想方設(shè)法地?cái)U(kuò)展模型規(guī)模就可以了。作者為驗(yàn)證假設(shè),將 Bert-large 模型的隱藏層 size 擴(kuò)展了一倍,構(gòu)建了 Bert-xlarge模型。該模型的參數(shù)量較 Bert-large 提升了一倍,然而遺憾的是,如圖1所示,Bert-xlarge 出現(xiàn)了模型退化(model degradation)現(xiàn)象,性能不升反降。因此,簡單地推高參數(shù)量,不僅會(huì)面臨更加嚴(yán)峻的硬件資源不足以及訓(xùn)練時(shí)間過長問題,且無法獲得更好的效果的。


圖1 Bert-large 與 Bert-xlarge 對(duì)比圖

??其實(shí)這也比較好理解,參數(shù)量越大性能越好,我認(rèn)為這本身是沒有正確的,但前提是對(duì)模型中參數(shù)的運(yùn)用沒有退化,或者說模型內(nèi)單位參數(shù)所發(fā)揮的作用沒有退化。舉個(gè)例子,鯨魚大腦的絕對(duì)體積和重量都要超過人類,但其大腦很大一部分精力用在控制其“臃腫”的體積上,而不是用來思考和記憶,因此遠(yuǎn)不如人類聰明。
??因此為了提升模型性能,我們既可以“做加法”,在模型結(jié)構(gòu)合理有效的前提下,增大模型的規(guī)模(e.g. Bert --> Bert-large, Bert --> XLNet);也可以“做減法”,降低參數(shù)量,但提升參數(shù)的利用效率、更大地發(fā)揮參數(shù)的效果。本篇論文中所設(shè)計(jì)的 ALBERT,就是在“做減法”的基礎(chǔ)上,在性能上全面超越 Bert。

2. 為模型“做減法”

??ALBERT 在模型上“做減法”,最大的體現(xiàn)就是減少了參數(shù)量,同時(shí)帶來了以下提升:

  • 提升了訓(xùn)練速度,注意是訓(xùn)練速度,測(cè)試速度還是很慢
  • 減少了硬件資源的要求??
  • 最后但是最重要的,提升了性能
    ??鋪墊了這么久,讓我們看看 ALBERT 是如何在降低參數(shù)量的同時(shí),提升訓(xùn)練速度和性能的吧(在結(jié)果上,近乎完美的提升啊)。在整體上,ALBERT 繼承了 Bert 的骨干架構(gòu),也就是使用 transformer encoder 和 GELU 非線性激活函數(shù)。不同的是,作者引入了兩個(gè)參數(shù)削減機(jī)制和一個(gè)全新的loss函數(shù)設(shè)計(jì),讓 BERT 煥然一新。
I. 嵌入層參數(shù)因式分解(Factorized embedding parameterization)

width
??不論是 Bert,還是隨后的 XLNet 和 RoBERTa,模型中的詞嵌入(WordPiece Embedding)大小都是與隱藏層輸出大?。℉idden-layer Embedding)相捆綁的,譬如 E\equiv H,然而這種捆綁策略不論是從建模層面還是實(shí)際層面來看,都是欠佳的。
從建模層面講,詞嵌入的目標(biāo)是學(xué)習(xí)上下文無關(guān)的表示(context-independent representations),而隱藏層的目標(biāo)是學(xué)習(xí)上下文相關(guān)表示(context-dependent),而 Bert 表示的強(qiáng)大之處正是在于學(xué)習(xí)這種上下文相關(guān)的表示。解開 詞嵌入 與 隱藏層表示 的直接捆綁關(guān)系,譬如使得 H 遠(yuǎn)大于 E,能夠更加高效地利用模型的整體參數(shù)。
從實(shí)際層面講,自然語言詞表(V, vocabulary)長度達(dá)到 2w~3w。如果 E 恒等于 H,那么想要增加隱藏層大小 H,意味著需要同時(shí)增加嵌入矩陣 V\times E的大小,由于V非常大,少量地增加 E,都會(huì)使得模型的參數(shù)達(dá)到數(shù)十億的量級(jí),顯得十分臃腫;同時(shí),直觀上我們知道 上下文無關(guān)表示(單詞級(jí)別) 所蘊(yùn)含的信息要遠(yuǎn)遠(yuǎn)少于 上下文相關(guān)表示(句子級(jí)別) 所蘊(yùn)含的信息,然而他們卻被賦予了相同的 size,可以想見詞嵌入 E 的多數(shù)維度在訓(xùn)練過程中都只是稀疏更新,顯得十分低效。
因此,作者在 ALBERT 中嘗試打破這種 詞嵌入 與 隱藏層 維度的捆綁關(guān)系。模型中,不再直接將獨(dú)熱碼向量映射到隱藏空間(hidden space)中(這樣會(huì)帶來 V\times H的參數(shù)矩陣),而是先將 獨(dú)熱碼向量 映射到一個(gè)低維嵌入空間中,再將它們映射到 隱藏空間中,也就是將原本的大矩陣 V\times H 分解成兩個(gè)小矩陣 V\times E, E\times H,當(dāng) H 遠(yuǎn)大于 E 的時(shí)候,這種分解能大大減少參數(shù)量。
疑問:Bert中的隱藏層參數(shù)E多少? 隱藏層向量又是多少?得到詞向量的過程究竟是怎么樣的

II. 跨層參數(shù)共享機(jī)制(Cross-layer parameter sharing)- depth

??為了進(jìn)一步提升參數(shù)的效率,作者嘗試了不同的參數(shù)共享方式,包括全參數(shù)共享、注意力參數(shù)共享和前饋神經(jīng)網(wǎng)絡(luò)參數(shù)共享。雖然這些參數(shù)共享方式在不同程度上造成了性能的一些下降,但是它顯著地降低了參數(shù)量。從下表的試驗(yàn)結(jié)果可以看出,當(dāng)設(shè)置 E = 128 的時(shí)候,性能下降的程度是比較小的;同時(shí)通過對(duì)比試驗(yàn),性能下降主要是 前饋神經(jīng)網(wǎng)絡(luò)參數(shù)共享所帶來的,當(dāng)只共享 attention 參數(shù)且 E 設(shè)置為 128 的時(shí)候,性能不降反升。不過最終作者選擇的策略是所有層共享所有參數(shù)。

圖2 參數(shù)共享對(duì)比實(shí)驗(yàn)

疑問:這個(gè)跨層共享參數(shù)的*跨層*究竟是怎么跨的

III. 句間連續(xù)性損失函數(shù)(Inter-sentence coherence loss)

??我們知道 Bert 設(shè)計(jì)了兩個(gè)任務(wù)在無監(jiān)督數(shù)據(jù)上實(shí)現(xiàn)預(yù)訓(xùn)練,分別是 掩碼雙向語言模型(MLM, masked language modeling)和 下句預(yù)測(cè)任務(wù)(NSP, next-sentence prediction)。MLM 類似于我們熟悉的完形填空任務(wù),在 ALBERT 中被保留了下來,這里不再贅述。NSP 是一個(gè)簡單的二分類任務(wù),即判斷兩個(gè)句子是否是一篇文章中的兩個(gè)連續(xù)的句子,正例的構(gòu)造就是從一個(gè) text 中摘取位置上連續(xù)的兩個(gè)句子,而負(fù)例的構(gòu)造卻是從兩篇不同的文章中選取兩個(gè)句子(我原本以為是從一篇文章中不連續(xù)地抽取兩個(gè)句子呢)。我們知道設(shè)計(jì) MLM 任務(wù)是為了捕捉句內(nèi)不同單詞之間的關(guān)系的,適用于序列標(biāo)記等任務(wù);而 NSP 是用于獲取句子間關(guān)系的,以此提升類似于語言推理這樣的下游任務(wù)性能,然而該任務(wù)存在明顯的缺陷:它太簡單了,以至于模型從這個(gè)任務(wù)中學(xué)不到充分的句子間關(guān)系。NSP 任務(wù)試圖將 主題預(yù)測(cè)(topic prediction)和 句子連貫性預(yù)測(cè)(coherence prediction)糅合成一個(gè)任務(wù);然而比起句子連貫性,主題預(yù)測(cè)是個(gè)簡單得多的任務(wù)(只要預(yù)測(cè)出來兩句話的主題不一致,就判負(fù)例,否則為正例),因此在 NSP 任務(wù)中,模型更傾向于預(yù)測(cè)主題,造成的后果就是:不僅忽略了句間連貫性預(yù)測(cè),把握不到句間關(guān)系,也使得 NSP 任務(wù)與 MLM 任務(wù)產(chǎn)生了重合(主題預(yù)測(cè)本質(zhì)上也是探索一個(gè)句子中的內(nèi)在聯(lián)系)。
??這不禁讓我想到了之前做的一個(gè)實(shí)體抽取任務(wù),由于賽方不僅提供了目標(biāo)text文本,還提供了目標(biāo)實(shí)體所參與的事件類型type(e.g. text: 小明做了S1類型的事件,小麗做了S2類型的事件 type: S1 則目標(biāo)實(shí)體是小明,而不是小麗),我們既可以把 type 和 text 拼接起來當(dāng)成一個(gè)句子,也可以把 type 和 text 看成一個(gè)句子對(duì),然而后者做法的效果明顯比前者要查,也能就是 MLM 的設(shè)計(jì)要優(yōu)于 NSP ,使得 BERT 在處理單個(gè)句子的時(shí)候更有優(yōu)勢(shì)。
??針對(duì) NSP 任務(wù)的兩大缺點(diǎn):1)過于簡單,與 MLM 任務(wù)有重合 2)無法很好地捕捉句間關(guān)系,作者對(duì) NSP 任務(wù)進(jìn)行了改進(jìn)。還是針對(duì)一個(gè)句子對(duì)做二分類,正例的構(gòu)造也和 NSP一致,即從一篇文章中選取連續(xù)的兩個(gè)句子,用 \left[ S_i, S_{i+1} \right ]來表示(其中下標(biāo) i 表示文章中的第i個(gè)句子);而負(fù)例的構(gòu)造就有很大的不同了,不再是從不同文章中選取句子,而是調(diào)換同一篇文章中兩個(gè)連續(xù)句子的順序,即\left[ S_{i+1}, S_i \right]。為何這么設(shè)計(jì)?首先我們可以看到,兩個(gè)句子由于來自同一篇文章,因此其主題是一致的,模型無法通過主題預(yù)測(cè)判斷是正例還是負(fù)例,因此增加了任務(wù)的難度。其次,由于正負(fù)例之間最大的區(qū)別就是順序的調(diào)換,因此該任務(wù)能夠強(qiáng)制模型去關(guān)注話語級(jí)別的句子連貫性屬性,從而更好地把握句子間關(guān)系。所以一開始提到的 NSP 任務(wù)缺陷在這里都解決了,作者把這個(gè)任務(wù)稱作 句子順序預(yù)測(cè)任務(wù)(SOP, sentence-order prediction),對(duì)應(yīng)的 loss 稱為 句間連貫性損失。同時(shí)作者把任務(wù)中的句子(sentence)換成了句段,一個(gè)句段通常由多個(gè)句子組成,經(jīng)驗(yàn)證,在模型訓(xùn)練中,以句段為單位較句子更加有效。[2]
# --------------------------------------------------------- 我也可以設(shè)計(jì)實(shí)驗(yàn)去搞一搞啊
# --------------------------------------------------------- 設(shè)計(jì)一個(gè)更好的預(yù)訓(xùn)練任務(wù)啊
??作者通過對(duì)比實(shí)驗(yàn)發(fā)現(xiàn),用 NSP 任務(wù)預(yù)訓(xùn)練過的模型,在 SOP 任務(wù)上測(cè)試,性能只比拋硬幣好一點(diǎn);而在 SOP 任務(wù)上預(yù)訓(xùn)練過的模型,在 NSP 任務(wù)上卻達(dá)到了非常不錯(cuò)的性能。這也印證了 SOP 任務(wù)比 NSP 任務(wù)更難,能夠讓模型學(xué)到更佳的句子間信息。

圖3 預(yù)訓(xùn)練效果圖

3. 預(yù)訓(xùn)練實(shí)驗(yàn)設(shè)置 & 代碼分析

??為了控制變量、方便實(shí)驗(yàn)對(duì)比,ALBERT 的實(shí)驗(yàn)設(shè)置與 BERT 基本保持一致,包括:

  • 預(yù)訓(xùn)練數(shù)據(jù)采用 BOOKCORPUS 和 English Wikipedia,包含約 16G 未壓縮的文字;
  • 構(gòu)造 input 的方式: “[CLS] x1 [SEP] x2 [SEP]”,其中 x1 和 x2 都是句段,包含一個(gè)或多個(gè)句子
  • n-gram masking 任務(wù)(n = 1, 2, 3)
    一大不同是不再使用 權(quán)重衰減的Adam 優(yōu)化器,而是使用 2019 年新提出的一種 LAMB 優(yōu)化器,學(xué)習(xí)率設(shè)置為 0.00176,batch size 設(shè)置為 4096。用到的 TPU 數(shù)量根據(jù)模型大小,從 64 到 1024 塊不等。

4. 模型性能

??通過圖4的表格我們可以看到,由于采取了上述的策略,ALBERT 在參數(shù)量上要遠(yuǎn)遠(yuǎn)小于 Bert。譬如,ALBERT-large 的參數(shù)量僅有 18M,僅為 Bert-large 的 1/18;將 Bert 的隱藏層擴(kuò)展到 2048 維,參數(shù)量會(huì)飆升到 1.27G 且性能下降,而 H = 2048 的 ALBERT-xlarge 模型只有 59M 的參數(shù),更大的模型 ALBERT-xxlarge(H=4096)參數(shù)量也僅有 233M。另外作者在 ALBERT-xxlarge 中設(shè)定了 12 層的網(wǎng)絡(luò),之所以不設(shè)置為 24 層,是因?yàn)橥ㄟ^實(shí)驗(yàn)作者驗(yàn)證了二者在性能上相近,而后者的計(jì)算成本更高。


圖4 模型配置

??整體性能上可以看到,ALBERT 在幾乎所有任務(wù)上都超越了 Bert-large 模型,同時(shí)兼具 參數(shù)量小 和 訓(xùn)練速度快 的優(yōu)勢(shì)。然而我測(cè)試了 github 上公開的一個(gè)實(shí)現(xiàn)版本,發(fā)現(xiàn)測(cè)試的速度并沒有提升。


圖片.png

5. 其他思考

??可以看到,本篇論文并沒有對(duì)預(yù)訓(xùn)練模型的結(jié)構(gòu)進(jìn)行大刀闊斧的創(chuàng)新,但這仍不妨礙它為預(yù)訓(xùn)練模型發(fā)展方向所做出的巨大指導(dǎo):雖然參數(shù)量是提升模型性能的重要因素,但為了提升參數(shù)量而提升參數(shù)量只會(huì)導(dǎo)致模型退化等負(fù)面情況,還要考慮模型對(duì)參數(shù)的運(yùn)用效率。如果把小模型比作“人”,那么在規(guī)模上變大了的模型仍然應(yīng)當(dāng)是個(gè)“巨人”,而不應(yīng)該是一個(gè)“大象”。
??同時(shí),論文中個(gè)通過豐富的 ALBERT 對(duì)比實(shí)驗(yàn)(啊,硬件資源不要錢?。┨接懥艘恍┪覀兘?jīng)常會(huì)遇到的疑惑:
?? a. 模型深度和寬度之于模型性能有何影響
??模型深度指的是 層數(shù)(number of layer),模型寬度指的是 隱藏層大?。╤idden size)。作者首先進(jìn)行了深度的探索,由于所有層共享所有參數(shù),所以參數(shù)量并不會(huì)因?yàn)樯疃鹊脑黾佣淖儯ㄒ恢倍际?18M)??梢詮膱D 5 看到,雖然參數(shù)量沒變,但隨著深度的增加,模型在下游任務(wù)上的性能逐步提升;在 12 層的之后,性能變化很小,并且在48層的時(shí)候出現(xiàn)了性能下降。注意作者在這個(gè)實(shí)驗(yàn)中使用了 熱啟動(dòng)(warm-start)技術(shù),也即深層模型是由淺層模型 finetune 而得到的,這能幫助深層模型達(dá)到收斂。

圖5 深度實(shí)驗(yàn)

??性能先增后降的現(xiàn)象同樣出現(xiàn)在 寬度實(shí)驗(yàn) 中,如圖 6 所示。不論是在訓(xùn)練還是在驗(yàn)證的過程中,沒有模型出現(xiàn)了過擬合現(xiàn)象,但比起 ALBERT 的最佳參數(shù)配置,它們都有更高的 loss。
圖6 寬度實(shí)驗(yàn)

?? b. 訓(xùn)練時(shí)間對(duì)模型性能的影響
??如下圖,訓(xùn)練幾乎相同的時(shí)間,ALBERT-xxlarge 的性能是高于 Bert-large 的,不過前者的數(shù)據(jù)吞吐量(data-throughput)確實(shí)是比后者慢三倍有余。

圖7 控制訓(xùn)練時(shí)間相同

?? c. 更寬的 ALBERT 模型也需要變得更深嗎?
??在圖 5 中我們看到,12 層模型和 24 層模型的結(jié)果差距很小,那么造成這個(gè)現(xiàn)象的原因,是模型寬度沒有跟著深度的增加而增加嗎,作者通過圖 8 的實(shí)驗(yàn)給出了否定的回答:第一行模型的參數(shù)是 12-layer 和 1024-H,第二行模型的參數(shù)是 24-layer 和 4096-H,然而性能幾乎沒有改變。這就說明簡單地加深模型、加寬模型抑或是同時(shí)加寬加深模型,都無法帶來性能的提升,參數(shù)量的增加還是需要基于模型基礎(chǔ)結(jié)構(gòu)復(fù)雜度、合理性的提升。

圖8 寬度與深度

?? d. 增加額外的訓(xùn)練數(shù)據(jù)以及引入 Dropout 機(jī)制
??前面說到作者為了方便與 Bert 對(duì)比,只是用了 English Wikipedia 和 BOOKCORPUS 數(shù)據(jù)集,在本部分的實(shí)驗(yàn)中,作者擴(kuò)充了訓(xùn)練集,加入了 XLNet 和 RoBERTa 訓(xùn)練過程中所使用的數(shù)據(jù)。從圖 9(a) 中可以看出,增加訓(xùn)練數(shù)據(jù)后,不論是在預(yù)訓(xùn)練還是下游任務(wù)上,模型都有了進(jìn)一步的提升。

圖9 訓(xùn)練走勢(shì)圖

圖10 額外數(shù)據(jù)

??而由于 ALBERT-xxlarge 即使在訓(xùn)練了 1M steps 后,仍然沒有在訓(xùn)練集上過擬合,因此如圖 12 所示,作者在移除 dropout 機(jī)制后,發(fā)現(xiàn)性能提升了。這第一次印證了 dropout 可能對(duì)基于 transformer 的大型模型產(chǎn)生負(fù)面效果,其原因很有可能是當(dāng) batch normalization 和 dropout 同時(shí)應(yīng)用與模型上時(shí),會(huì)損害模型性能。
圖11 Dropout

?? e. 當(dāng)前 NLU 任務(wù)上最好的模型
最后作者又總結(jié)了一遍論文中提出的模型——ALBERT-xxlarge 的強(qiáng)大性能(使用了 Bert、XLNet 和 RoBERTa 的訓(xùn)練數(shù)據(jù)):在 13 項(xiàng) NLP 任務(wù)上都取得了最佳,包括 GLUE 上的 9 個(gè)任務(wù) 和 SQuAD、RACE等 4 個(gè)數(shù)據(jù)集。


圖12 NLU最佳模型

6. 我的思考

1) 更好的預(yù)訓(xùn)練任務(wù)設(shè)計(jì)

[1] Lan Z, Chen M, Goodman S, et al. ALBERT: A Lite BERT for Self-supervised Learning of Language Representations[J]. arXiv preprint arXiv:1909.11942, 2019.
[2] Yinhan Liu, Myle Ott, Naman Goyal, Jingfei Du, Mandar Joshi, Danqi Chen, Omer Levy, Mike Lewis, Luke Zettlemoyer, and Veselin Stoyanov. RoBERTa: A robustly optimized BERT pretraining approach. arXiv preprint arXiv:1907.11692, 2019.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容