基於隨機token MASK是Bert能實現雙向上下文信息編碼的核心。但是MASK策略本身存在一些問題
- MASK的不一致性:MASK只在預訓練任務中存在,在微調中不存在,Bert只是通過替換部分的隨機MASK來降低不一致性的影響
- 獨立性假設:對MASK的預測是基於獨立概率而不是聯合概率,模型並不會考慮MASK之間的條件關聯
- MASK訓練低效:每次只遮蓋15%的token,每個batch的模型更新只基於這15%的input,導致模型訓練效率較低
MASK有這么多的問題,那能否繞過MASK策略來捕捉雙向上下文信息呢?下面介紹兩種方案XLNET,Electra,它們使用兩種截然不同的方案實現了在下游遷移的Encoder中完全拋棄MASK來學習雙向上下文信息。正在施工中的代碼庫也接入了這兩種預訓練模型,同時支持半監督,領域遷移,降噪loss等模型優化項,感興趣的戳這里>>SimpleClassification
XLNET
XLNET主要的創新在於通過排列組合的亂序語言模型,在不依賴MASK的情況下捕捉雙向上下文信息,從而避免了MASK存在帶來的不一致性。
亂序語言模型
常規語言模型的目標是按輸入順序進行因式分解,把文本聯合概率拆分成條件概率的乘積
而其實對於長度為T的序列,總共有T!種不同的排列組合方式,語言模型只是使用了輸入順序對應的一種分解順序。而XLNET為了捕捉雙向的上下文信息,把目標調整為最大化所有排列組合的以上概率。
以下\(Z_T\)來指代不同的排列組合,\(z \lt t\)是指在z的排列組合中t之前的元素
為了控制計算量,XLNET並不會計算所有排列組合而是只采樣一部分進行計算。因為不同的排列組合共用一套參數,也就隱形實現了雙向上下文信息的獲取。
這里需要注意的是所謂的亂序,並不是對輸入樣本進行打亂,輸入樣本會保持原始順序,而亂序的計算是通過Attention MASK來實現。例如用‘1->3->2’的順序,生成第3個token會先mask第2個token只使用1個token的信息。這個實現是非常必要,一方面對輸入保序,保證了預訓練和下游遷移時文本輸入是一致的都是正常順序。另一方面,如果對輸入進行直接打亂,會丟失文本的正常順序,導致模型不知道正常的文本是什么樣子的。
從信息傳遞的角度來看,BERT在還原每個MASK token時都使用了全部的上下文信息,而XLNET的每一種排列組合在預測當前token時只采樣了當前排列組合下的部分信息,從這個角度來講亂序語言模型應該要比MLM更加穩健以及更容易學到更豐富的文本語義
雙流機制
但以上的亂序AR存在一個問題,也就是當順序是‘3->2->4’時預測4用到的信息,和‘3->2->1’預測1時的信息是一樣的。也就是模型無法區分4和1不同位置帶來信息差異。為什么只有XLNET會存在這個問題,GPT和BERT就不存在這個問題呢?
在BERT之中是通過MASK來標注哪些位置是需要AE預測的位置,而MASK只修改了對應位置的token embedding,而position embedding是保留了原始位置的信息的,這樣在進行self-attention計算時,模型只是不能有效獲取MAS
K位置的token信息但是可以獲取位置信息。不過其實我對BERT的底層位置信息在經過多層transfromer block之后MASK部分的位置信息是否還能都得到有效的保留,個人感覺是存疑的
而在GPT中因為默認了向前遞歸,對於所有文本在預訓練任務和下游遷移中這個順序都沒有發生改變,所以模型對位置信息的依賴只在x<t的部分,因為向前遞歸預測的永遠是下一個位置,所以位置信息被隱含在了向前遞歸中。
但是在XLNET中,它既沒有按照固定的向前傳遞順序,也同時沒有像Bert一樣保留預測位置的的position embedding,這就導致模型無法知道下一個要預測的位置和已有信息間的關系。
為了解決這個問題XLNET引入了雙流機制,其實就是在原始的transformer中加入一個額外的流,這個流不包含當前token的內容信息但是包含當前token的位置信息。
- \(h_{z_t}\)是content流,這部分和原始的transformer更新方式相同。只不過是在self-attention的基礎上按當前的分解順序,只使用包含當前<=t的所有信息
- \(g_{z_t}\)是query流,這部分包含<=t的位置信息,以及<t的內容信息。實現方式就是在attention計算時用\(h_{z \lt t}\)做K&V,保證內容信息不包含當前位置,而用\(g_{z_t}\)做Q來引入當前位置信息,最終模型的預測依賴query流的輸出結果。所以XLNET其實是引入了在下游遷移中可以拋棄的\(g_{z_t}\),來代替MASK,在保留位置信息的同時避免token本身的文本信息泄露。
以上初始化\(h_{z_t}\)是用word embedding進行初始化,而\(g_{z_t}\)是隨機初始化的。
XLNET的位置編碼沿用了Transformer-XL提出的相對位置編碼,不熟悉的同學戳這里中文NER的那些事兒5. Transformer相對位置編碼&TENER代碼實現,不過這部分提升主要針對長文本,和亂序語言模型沒有必然的綁定關系,所以后面一起放到長文本建模中再說吧~
由於以上的亂序語言模型的擬合難度較高,如果對全文本都進行擬合,會導致模型難以收斂。所以XLNET引入了hyperparams K,每次只對當前排列組合下最后的\(1/K\)個token進行擬合。所以這里k越小訓練難度越高。最終作者選擇的K在6~7附近,所以和BERT 15%MASK的訓練效率相似,每次只能對15%左右的token進行訓練。
下游遷移
XLNET在下游任務遷移中的使用方式和Bert基本是完全一樣的,以上的雙流機制和亂序語言模型只使用在預訓練階段,來幫助模型參數學習到上下文信息。而在遷移到下游時,只有content流被使用,遷移方式也和Bert一致。XLNET在GLUE評估中基本全面超越BERT
和RoBERTa。
當然以上效果增益部分來自XLNET的亂序語言模型,部分來自Transformer-XL相對位置編碼對長文本的效果,部分來自XLNET借鑒了Roberta用了比Roberta略小但遠大於BERT的訓練數據。不過文中作者做很嚴謹的對比實驗,在相同數據量下XLNET依舊超越BERT和DAE+Transformer-XL。順便也跟着Roberta驗證了NSP對於XLNET任務也是沒有效果的...不過我繼續持保留意見嘿嘿~
ELECTRA
Electra主要針對MLM只對15%MASK的token進行訓練導致訓練低效的問題,通過兩段式的訓練,也實現了在下游任務中和MASK解耦,按論文的效果是只用1/4的時間就可以媲美Bert。
預訓練
Eletra的預訓練模塊由以下兩部分構成,分別是生成replace token的Generator,以及判別每個token是否是原始token的Descriminator,我們分別看下各自的實現
Generator的部分和Bert是基本一致,每次隨機MASK15%的token,然后Generator去預測可能的原始token,所以Generator部分就是Bert的MLM任務。
Descriminator的輸入是Generator的預測結果,判別器負責判斷每個token是否是原始的token,注意如果generator預測正確,則該token也是原始token,所以是一個二分類的判別任務
最終的Loss是Generator和Descriminator Loss的結合
看上模型實現很簡單,但細節里全是魔鬼。。。我們來細數下Electra實現過程的細節,以及可能的問題
模型大小
作者對比了生成器和判別器之間模型大小對效果的影響,整體上生成器大小在判別器的[1/4,1/2]之間最優,雖然size選擇有點玄學,不過部分邏輯是講的通的,節省空間的目的咱就不提了,無論如何預訓練內存都是Bert的一倍多,除此之外
- 生成器的大小決定了判別器的任務難度,感覺一部分Electra能快速擬合的收益,來自生成器生成了更加hard的樣本來訓練判別器,但是生成器太強就會導致判別器難以擬合
- 生成器決定了判別器輸入部分的正負樣本比,生成器太強會導致負樣本太少
參數共享
生成器和判別器因為以上Size差異的原因,沒有共享全部參數,而是共享了Embedding部分,包括token和position embedding的權重。這里共享權重是必要的,因為只有生成器的部分因為要預測token所以會對全Vocab embedding進行更新,而判別器只會對輸入部分的token進行更新,考慮下游使用只使用判別器,如果不共享權重,部分低頻token可能會存在訓練不足的問題。
訓練方式
作者對比了幾種生成器和判別器的訓練方式
- Electra:兩個模型一同訓練,但是梯度隔離,既判別器的梯度不會回傳到生成器
- GAN:用GAN的方式進行訓練
- 兩階段:先訓練生成器再Freeze生成器訓練判別器
效果如下圖是Electra>GAN>兩階段。不過后兩種訓練方式都還有進一步探索的空間,例如兩階段訓練的核心是讓生成器先訓練一段時間來生成更加Hard的樣本,但是會和以上模型size選擇存在相同的問題就是生成器太強會導致判別器難以擬合,所以什么時候交換到判別任務的時間點可能很關鍵。而GAN的部分如果只是讓生成器最大化判別器的Loss則難以保證生成器生成的樣本多樣性,不過我對GAN並不太了解這塊就先不展開了。
消融實驗
作者通過對比不同的訓練策略,對Electra的效果進行了歸因,大頭的效果提升來自於在判別器階段對所有token進行訓練
- Electra 15%:在判別器部分只針對生成器MASK的15%的token進行訓練,確實效果大幅下降,這個對比很solid的指出Electra效果的提升大部分來自判別器對all token的訓練
- Replace MLM:在Electra15%的基礎上把判別器換成MLM,其實也就是把Bert MASK的策略換成了生成器。作者是想通過Replace MLM>Bert來說明MASK的不一致性對Bert存在一定影響,但感覺這到訓練后期隨着生成器的效果越來越好,MLM似乎還是會存在直接copy輸入的feature leakage?
- All-Tokens MLM:在以上Replace MLM的基礎上對所有token進行預測,也就是把Electra的二分類變回Vocab的多分類。為了避免在擬合未被替換的token時模型學到直接copy輸入這種feature leakage,輸出有p的概率是輸入的拷貝,有1-p的概率是預測概率。作者想通過這個說明二分類判別器的效果更好,但感覺隨機copy避免信息泄漏的方案並不像MASK這樣solid?
下游遷移
Electra在下游遷移的時候只使用判別器的部分,因此和MASK實現了解耦。但Electra的判別器也是質疑聲音最大的地方,Bert的Embedding Output有豐富的上下文語義的一個前提是每個token的預測都是在全Vocab上做softmax,所以Embedding需要包含相對復雜&多樣的信息才能完成這個任務,而Electra只是簡單的二分類任務,對Embedding表征信息的要求要低的多。所以實踐中被吐槽在NER這類對輸入Embedding信息量有高要求的任務,以及更加復雜的文本理解任務上Electra表現並不好。
整體上Electra兩段式的訓練方式去和MASK解耦,對全token進行訓練提高訓練效率,以及用生成器做進行類似數據增強的操作是相對有亮點的地方,不過把MLM替換成二分類的判別器的選擇,以及Electra的訓練方式還是值得再進一步深入研究的~
BERT手冊相關論文和博客詳見BertManual
Reference
- XLNet: Generalized Autoregressive Pretraining for Language Understanding
- ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators
- 李Rumor,談談我對ELECTRA源碼放出的看法,https://zhuanlan.zhihu.com/p/112813856
- 蘇劍林. (Oct. 29, 2020). 《用ALBERT和ELECTRA之前,請確認你真的了解它們 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/7846