Poly-encoders(2020 ICLR)
1.摘要
Cross - encoder 對句子對進行完全self-attention ,Bi - encoder分別對句子對進行編碼。前者往往性能更好,但實際使用起來太慢。在這項工作中,作者開發了一種新的Transformer 架構:Poly - encoder,它學習全局而不是token級的self-attention功能。
2.介紹
本文對BERT模型進行改進,將其用于多句子評分:給定一個輸入上下文,給一組候選標簽的評分。這是檢索和對話任務的常見形式,它們必須考慮兩個方面:
因此提出Poly - encoder,相比于Cross - encoder 速度更快,預測質量比 Bi - encoder更高。并且發現,使用與下游任務更相似的數據對Poly - encoder進行預訓練相比于BERT帶來了顯著的受益。
3. task
考慮兩個任務:
3. 對話任務(句子選擇):ConvAI2 , DSTC7,Ubuntu V2
4. IR任務(文章檢索):Wikipedia Article Search
4.方法
4.1 Transformer 和pre-train策略
Transformers:本文的transformer(Bi , Cross,Ploy)在后面描述,它們與BERT有相同大小和尺寸,12層,12個attention heads,hidden size 768。除了考慮預訓練的BERT權重外,作者還重新訓練了兩個Transformer:
前者是為了驗證再現類似BERT的設置給我們提供了與之前報告相同的結果,而后者測試對更類似于感興趣的下游任務的數據的預訓練是否有所幫助。
Input Representation:本文的預訓練輸入[INPUT,LABEL]的連接,其中兩者都被特殊的標記[SSS]包圍。
在Reddit上進行預訓練時,輸入的是上下文,label的是下一句話。當在維基百科和多倫多圖書上進行預訓練時,輸入是一句話,標簽是文本中的下一句話。每個輸入令牌都表示為三個嵌入的總和:token嵌入、position嵌入和segment嵌入,輸入標記的段為0,標簽標記的段為1。Pre-training Procedure:對于維基百科數據,與BERT相同,采用MLM訓練。在Reddit上的預訓練中添加了一個下一個話語預測任務,它與BERT略有不同,因為一個話語可以由幾個句子組成。在訓練過程中,一半時間是真實的下一句話,另一半時間是從數據集中隨機抽取的一句話。
使用Adam優化器,其學習率為2e-4,β1= 0.9,β2= 0.98,沒有L2權重衰減,線性學習率預熱,以及學習率的平方根倒數衰減。在所有層上使用0.1的dropout。
batch size :32000個由相似長度的連接[INPUT,LABEL]組成的token。在32個GPU上訓練模型14天。
Fine-tuning:經過預訓練后,考慮三種架構來微調Transformer :Bi - encoder,Cross - encoder Poly - encoder。
預先定義顏色標志
4.2 Bi - encoder
在Bi - encoder中,輸入上下文和候選標簽都被編碼成向量:
其中T1T_1T1?和T2T_2T2?是兩個預訓練好的Transformer ,它們最初以相同的權重開始,但在微調期間可以單獨更新。TTT(xxx) = h1h_1h1?,…,hNh_NhN?是Transformer TTT的輸出,rrreeeddd((()))是一個函數,它將向量序列簡化為一個向量。由于輸入和標簽是分開編碼的,因此兩者的段標記都是000。
h1h_1h1?對應于token : [S]。本文考慮了通過rrreeeddd((()))將輸出減少為一個表示的三種方法:
結果在實驗中展示。
Scoring : 由點積sss(ccctttxxxttt,cccaaannndddi_ii?) = yyyc_cc?t_tt?x_xx?t_tt??·?yyyc_cc?a_aa?n_nn?d_dd?i_ii?給出的候選cccaaannndddi_ii?的分數。網絡被訓練成最小化交叉熵損失,其中logits是yyyc_cc?t_tt?x_xx?t_tt??·?yyyc_cc?a_aa?n_nn?d_dd?1_11?,…,yyyc_cc?t_tt?x_xx?t_tt??·?yyyc_cc?a_aa?n_nn?d_dd?n_nn?,其中c_cc?a_aa?n_nn?d_dd?1_11?是正確的標簽,其他標簽是從訓練集中選擇的(每個batch 中其他標簽為負例)。
Inference speed :使用FAISS庫構建索引,存儲embedding向量,在推理時,只需要點積操作這一步驟。
4.3 Cross-encoder
上下文和標簽的connection:
fffiiirrrsssttt是一個函數,取最后一層輸出的第一個向量([S] token )。Cross-encoder能夠在上下文和候選之間執行self-attention,從而產生比Bi - encoder更豐富的提取機制。
Scoring : 用一個線性層WWW映射Transformer的輸出為一個標量作為評分:
LLLooossssss與Bi - encoder同為交叉熵函數。與Bi - encoder不同,Cross-encoder不能將同batch內的其他標簽作為負例回收,因此在訓練集中采樣負例。Cross-encoder使用的內存比Bi - encoder多得多,導致batch小得多。
Inference speed:在推理時,每個候選對象都必須與輸入上下文相連接,并且必須通過整個模型的正向傳播。所以并不適用大規模對象。
4.4 Poly-encoder
Poly-encoder目標是從上述兩個類型encoder中獲得最佳結果。
像Bi - encoder一樣,Poly-encoder對上下文和標簽使用兩個獨立的Transformer,候選對象被編碼成單個向量yyyc_cc?a_aa?n_nn?d_dd?i_ii?。因此,可以使用預計算緩存來實現Poly-encoder方法。
但是,輸入的上下文通常比候選長得多,Poly-encoder用mmm個向量聚合Transformer輸出表示為:(yyy1^11c_cc?t_tt?x_xx?t_tt?,…,yyym^mmc_cc?t_tt?x_xx?t_tt?),其中mmm將影響推理速度。為了獲得代表輸入的這mmm個全局特征,學習mmm個上下文codes (c1c_1c1?,…,cmc_mcm?),其中,cic_ici?通過關注前一層的所有輸出來表示yyyi^iic_cc?t_tt?x_xx?t_tt?。也就是說,獲得yyyi^iic_cc?t_tt?x_xx?t_tt?:(這里其實就是Inner - attention的想法)
mmm個上下文代碼是隨機初始化的,并在微調期間學習。最后,給定mmm個全局上下文特征,使用yyyc_cc?a_aa?n_nn?d_dd?i_ii?作為查詢來處理它們:(這里就是attention思路)
5 Experiments
data
評價指標
Recall@C , MRR
5.1 Bi-encoder and Cross-encoder
首先實驗原始BERT的權重 微調。Bi-encoder的情況下,可以通過將其他batch視為負訓練樣本來使用大量的負樣本,從而避免重新計算它們的嵌入。在8個Nvidia Volta v100 GPUs上,使用浮點運算,在ConvAI2上達到512個元素的batch。表2顯示,在這種設置下,使用更大的batch獲得更高的性能,其中511個負例產生最佳結果。
對于其他任務,將batch大小保持在256,因為這些數據集中較長的序列會占用更多內存。Cross-encoder計算量更大,因為每次都必須重新計算(上下文,候選)對的嵌入。因此,將其批量限制為16,并從訓練集中提供負隨機樣本。對于DSTC7和Ubuntu V2,選15個負例;對于ConvAI2,數據集提供19個負例。
本文嘗試了兩個優化器:權重衰減為0.01的Adam和沒有權重衰減的Adamax ;
基于驗證集的性能,選擇在使用BERT權重時與Adam一起微調。學習速率初始化為5e-5,Bi-encoder和poly-encoder預熱100次,Cross-encoder預熱1000次。在每半個epoch,在有效集合上評估的損失平穩區間,學習率下降0.4倍。 表3顯示了使用帶有衰減優化器的Adam對BERT提供的權重的各個層進行微調時的驗證性能。 除詞嵌入外,對整個網絡進行微調非常重要。
5.2 Poly-encoder
poly - encoder 后面的數字表示為集合codes mmm的大小,得到的結論是,在計算成本允許的情況下,mmm越大,模型性能越好。有些甚至優于Cross-encoder,但是Cross-encoder的計算成本是巨大的。見下圖推理時間比較表。
CPU:80 core Intel Xeon processor CPU E5-2698
GPU:單個Nvidia Quadro GP100 using cuda 10.0 and cudnn 7.4
另外,在與下游任務相似的數據上訓練時,性能相比于BERT有相當大的提升。
附錄
A . 在四個數據集上的訓練時間(小時):
B. : Bi-encoder的輸出采樣策略比較:(first表示取[SSS]位置的token輸出,Avg first 16 outputs表示取前16個輸出(h1h_1h1?,h2h_2h2?,…,h1h_1h1?6_66?)…),可以看到直接取[SSS]效果最好。
C. 上下文向量的替代選擇
本文考慮了其他幾種從輸出(hhh1^11c_cc?t_tt?x_xx?t_tt?,…,hhhN^NNc_cc?t_tt?x_xx?t_tt? )導出上下文向量(yyy1^11c_cc?t_tt?x_xx?t_tt?,…,yyym^mmc_cc?t_tt?x_xx?t_tt?)的方法(mmm《《《《《《NNN):
下表報告了m為{1,4,16,64,360}時各個策略的評價指標:
三個數據集上的整體評價:
可以看到,在不同數據集上Learnt-m和First-m各有千秋。
總結
以上是生活随笔為你收集整理的Poly-encoders(2020 ICLR)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 智慧医疗、互联网医疗相关术语
- 下一篇: 项目中使用completablefutu