初探自然語言預訓練技術演進之路
人工智慧的三個層次: - 運算職能:資料的儲存和計算能力,機器遠勝於人類。 - 感知職能:視覺、聽覺等能力,機器在語音識別、影象識別領域已經比肩人類。 - 認知智慧:自然語言處理、常識建模與推理等任務,機器還有很長的路要走。
自然語言處理屬於認知智慧範疇,由於自然語言具有抽象性、組合性、歧義性、知識性、演化性等特點,為機器處理帶來了極大的挑戰,有人將自然語言處理稱為人工智慧皇冠上的明珠。近些年來,出現了以BERT為代表的預訓練語言模型,將自然語言處理帶入了一個新紀元:預訓練語言模型 + 特定任務精調。本文試圖梳理自然語言預訓練技術的演進之路,以期和大家相互交流學習,不足、謬誤之處望批評指正。
1.古代——詞表示
1.1 One-hot Encoding
- 用一個詞表大小的向量表示一個詞,其中詞對應位置的值為1,其餘位置為0。缺點:
- 高維稀疏性
- 無法表示語義相似性:兩個同義詞的One-hot向量相似度為0
1.2 分散式表示
分散式語義假設:相似的詞具有相似的上下文,詞的語義可由上下文表示。基於該思想,可以利用每個詞的上下文分佈對詞進行表示。
1.2.1 詞頻表示
- 基於語料庫,利用詞的上下文構建共現頻次表,詞表的每一行代表了一個詞的向量表示。通過不同的上下文選擇可以捕獲到不同的語言資訊,如用句子中詞的周圍固定視窗的詞作為上下文,會更多的捕捉到詞的區域性資訊:詞法、句法資訊,若用所在文件作為上下文,更多的捕捉到詞所表示的主題資訊。缺點:
- 高頻詞問題
- 無法反應高階關係:(A, B) (B, C) (C, D) !=> (A, D)
- 依然存在稀疏性問題
1.2.2 TF-IDF表示
將詞頻表示中的值,替換為 TF-IDF,主要緩解詞頻表示的高頻詞問題。
1.2.3 點互資訊表示
同樣是緩解詞頻表示的高頻詞問題,將詞頻表示中的值替換為詞的點互資訊:
1.2.4 LSA
通過對詞頻矩陣進行奇異值分解(Singular Value Decomposition,SVD),可以得到每個詞的低維、連續、稠密的向量表示,可認為表示了詞的潛在語義,該方法也被稱為潛在語義分析(Latent Semantic Analysis, LSA)。
LSA 緩解了高頻詞、高階關係、稀疏性等問題,在傳統機器學習演算法中效果還是不錯的,但是也存在一些不足: - 詞表大時,SVD 速度比較慢。 - 無法追新,當語料變化或新增語料時,需要重新訓練。
2. 近代——靜態詞向量
文字的有序性及詞與詞之間的共現關係為自然語言處理提供了天然的自監督學習訊號,使得系統無需額外的人工標註也能夠從文字中學到知識。
2.1 Word2Vec
2.1.1 CBOW
CBOW(Continous Bag-of-Words)利用上下文(視窗)對目標詞進行預測,將上下文的詞的詞向量取算術平均,然後預測目標詞的概率。
2.1.2 Skip-gram
Skip-gram 通過詞預測上下文。
2.2 GloVe
GloVe(Global Vectors for Word Representation)利用詞向量對詞的共現矩陣進行預測,實現了隱式的矩陣分解。首先根據詞的上下文視窗構建距離加權的共現矩陣 X,再利用詞與上下文的向量對共現矩陣 X 進行擬合:
損失函式為:
2.3 小結
詞向量的學習利用了語料庫中詞與詞之間的共現資訊,底層思想還是分散式語義假設。無論是基於區域性上下文的Word2Vec,還是基於顯式全域性共現資訊的 GloVe,本質都是將一個詞在整個語料庫中的共現上下文資訊聚合到該詞的向量表示中,並都取得了不錯的效果,訓練速度也很快,但是缺點詞的向量是靜態的,即不具備隨上下文變化而變化的能力。
3. 現代——預訓練語言模型
自迴歸語言模型:根據序列歷史計算當前時刻詞的條件概率。
自編碼語言模型:通過上下文重構被掩碼的單詞。
$\hat{x} $表示被掩碼的序列。
3.1 基石——Transformer
3.1.1 注意力模型
注意力模型可以理解為對一個向量序列進行加權操作的機制,權重的計算。
$\begin{aligned} \hat{\alpha}_s=attn(q_s, k) \end{aligned} $
$\begin{aligned} \alpha_s=Softmax(\hat{\alpha})_s \end{aligned} $
$\begin{aligned} attn(q,k)=\begin{cases} w^Ttanh(W[q;k]) &\text{多層感知機}\ q^TWk &\text{雙線性}\ q^Tk &\text{點積} \ \cfrac{q^Tk}{\sqrt{d}} &\text{避免值過大} \end{cases} \end{aligned} $
3.1.2 多頭自注意力
Transformer 中使用的注意力模型可以表示為:
當 $Q、K 、V $ 來自同一向量序列時,成為自注意力模型。
多頭自注意力:設定多組自注意力模型,將其輸出向量拼接,並通過一個線性對映對映到 Transformer 隱層的維度大小。多頭自注意力模型,可以理解為多個自注意力模型的 ensemble。
3.1.3 位置編碼
由於自注意力模型沒有考慮輸入向量的位置資訊,但位置資訊對序列建模至關重要。可以通過位置嵌入或位置編碼的方式引入位置資訊,Transformer 裡使用了位置編碼的方式。
3.1.4 其他
此外 Transformer block 裡還使用了殘差連線、Layer Normalization 等技術。
3.1.5優缺點
優點: - 相比 RNN 能建模更遠距離的依賴關係,attention 機制將詞與詞之間的距離縮小為了1,從而對長序列資料建模能力更強。 - 相比 RNN 能更好的利用 GPU 平行計算能力。 - 表達能力強。
缺點: - 相比 RNN 引數大,增加了訓練難度,需要更多的訓練資料。
3.2 自迴歸語言模型
3.2.1 ELMo
ELMo: Embeddings from Language Models
輸入層
對詞可以直接用詞的 embedding,也可以對詞中的字元序列通過 CNN,或其他模型。
模型結構
ELMo 通過 LSTM 獨立的建模前向、後向語言模型,前向語言模型:
後向語言模型:
優化目標
最大化:
下游應用
ELMo 訓練好後,可以得到如下向量供下游任務使用。
$X_k^{LM} $ 是輸入層得到的 word embedding,$h_{k,j}^{LM} $ 是前、後向 LSTM 輸出拼接的結果。
下游任務使用時,可以加各層向量加權得到 ELMo 的一個向量表示,同時用一個權重對 ELMo 向量進行縮放。
不同層次的隱含層向量蘊含了不同層次或粒度的文字資訊: - 頂層編碼了更多的語義資訊 - 底層編碼了更多的詞法、句法資訊
3.2.2 GPT 系列
GPT-1
模型結構
在 GPT-1(Generative Pre-Training),是一個單向的語言模型,使用了12個 transformer block 結構作為解碼器,每個 transformer 塊是一個多頭的自注意力機制,然後通過全連線得到輸出的概率分佈。
$U $: 詞的獨熱向量
$W_e $:詞向量矩陣
$W_p $:位置向量矩陣
優化目標
最大化:
下游應用
下游任務中,對於一個有標籤的資料集 $C $,每個例項有 $m $ 個輸入 token:${x^1,...,x^m} $,它對於的標籤 $y $ 組成。首先將這些 token 輸入到訓練好的預訓練模型中,得到最終的特徵向量 $h_l^m $。然後再通過一個全連線層得到預測結果 $y $:
下游有監督任務的目標則是最大化:
為了防止災難性遺忘問題,可以在精調損失中加入一定權重的預訓練損失,通常預訓練損失。
GPT-2
GPT-2 的核心思想概括為:任何有監督任務都是語言模型的一個子集,當模型的容量非常大且資料量足夠豐富時,僅僅靠訓練語言模型的學習便可以完成其他有監督學習的任務。所以 GPT-2 並沒有對 GPT-1 的網路進行過多的結構的創新與設計,只是使用了更多的網路引數和更大的資料集,目標旨在訓練一個泛化能力更強的詞向量模型。
在8個語言模型任務中,僅僅通過 zero-shot 學習,GPT-2 就有7個超過了當時 state-of-the-art 的方法(當然好些任務上還是不如監督模型效果好)。GPT-2 的最大貢獻是驗證了通過海量資料和大量引數訓練出來的詞向量模型有遷移到其它類別任務中而不需要額外的訓練。
同時 GPT-2 表明隨著模型容量和訓練資料量(質量)的增大,其潛能還有進一步開發的空間,基於這個思想,誕生了GPT-3。
GPT-3
依舊模型結構沒啥變化,增加模型容量、訓練資料量及質量,號稱巨無霸,效果也很好。
小結
從 GPT-1 到 GPT-3,隨著模型容量和訓練資料量的增加,模型學到的語言知識也越豐富,自然語言處理的正規化也從「預訓練模型+精調」逐步向「預訓練模型+zero-shot/few-shot learning」轉變。GPT 的缺點是用的單向語言模型,BERT 已經證明了雙向語言模型能提升模型效果。
3.2.3 XLNet
XLNet 通過排列語言模型(Permutation Language Model)引入了雙向的上下文資訊,不引入特殊的 tag,避免了預訓練和精調階段 token 分佈不一致的問題。同時使用Transformer-XL作為模型主體結構,對長文字有更好的效果。
排列語言模型
排列語言模型的目標是:
$Z_T $ 是文字序列所有可能的排列集合。
雙流自注意力機制
雙流自注意力機制 (Two-stream Self-attention)要達到的目的:通過改造 Transformer,在輸入正常文字序列的情況下,實現排列語言模型: - 內容表示 $h_t^{(n)} $:包含$x_{1:t} $ 的資訊 - 查詢表示 $g_t^n $:只包含$x_{1:t-1} $ 的資訊
該方法使用了預測詞的位置資訊。
下游應用
下游任務應用時,不需要查詢表示,也不 mask。
3.3 自編碼語言模型
3.3.1 BERT
掩碼語言模型
- 掩碼語言模型(masked language model, MLM),隨機地遮蔽部分詞,然後利用上下文資訊進行預測。MLM 存在個問題,預訓練和 fine-tuning 之間不匹配,因為在 fine-tuning 期間從未看到[MASK] token。為了解決這個問題,BERT 並不總是用實際的[MASK] token 替換被「masked」的word piece token。訓練資料生成器隨機選擇15%的 token,然後:
- 80%的概率:用[MASK]標記替換。
- 10%的概率:從詞表隨機一個 token 替換。
- 10%的概率:token 保持不變。
原生 BERT 裡對 token 進行 mask,可以對整詞或短語(N-Gram)進行 mask。
下一句預測
下一句預測(NSP):當選擇句子 A 和 B 作為預訓練樣本時,B 有50%的可能是 A 的下一個句子,也有50%的可能是來自語料庫的隨機句子。
輸入層
模型結構
經典的「預訓練模型+精調」的正規化,主題結構是堆疊的多層 Transformer。
3.3.2 RoBERTa
RoBERTa(Robustly Optimized BERT Pretraining Approach)並沒有大刀闊斧的改進 BERT,而只是針對 BERT 的每一個設計細節進行了詳盡的實驗找到了 BERT 的改進空間。 - 動態掩碼:原始方式是構建資料集的時候設定好掩碼並固定,改進方式是每輪訓練將資料輸入模型的時候才進行隨機掩碼,增加了資料的多樣性。 - 捨棄NSP任務:通過實驗證明不使用 NSP 任務對大多數任務都能提升效能。 - 更多訓練資料,更大批次,更長的預訓練步數。 - 更大的詞表:使用 SentencePiece 這種位元組級別的 BPE 詞表而不是 WordPiece 字元級別的 BPE 詞表,幾乎不會出現未登入詞的情況。
3.3.3 ALBERT
-
BERT 引數量相對較大,ALBERT(A Lite BERT) 主要目標是減少引數:
-
詞向量引數分解(Factorized embedding parameterization)。
- BERT 的詞向量維度 $E $ 和隱含層維度 $H $ 相同,詞向量上下文無關,而 BERT 的 Transformer 層需要並且可以學習充分的上下文資訊,因此隱含層向量維度 $H $ 應遠大於詞向量維度 $E $。當增大 $H $ 提高效能時,$E $ 沒有必要跟著變大,因為詞向量空間對需要嵌入的資訊量可能已經足夠。
- 方案:$E\ne{H} $,詞向量通過全連線層變換為 H 維。
-
跨層引數共享(Cross-layer parameter sharing):不同層的 Transformer block 共享引數。
-
句子順序預測(sentence-order prediction, SOP),學習細微的語義差別及語篇連貫性。
-
3.4 生成式對抗——ELECTRA
ELECTRA(Efficiently Learning an Encoder that Classifies Token Replacements Accurately)引入了生成器和判別器的模式,把生成式的 Masked language model(MLM) 預訓練任務改成了判別式的 Replaced token detection(RTD) 任務,判斷當前 token 是否被語言模型替換過,比較類似 GAN 的思想。
生成器預測輸入文字中 mask 位置的 token:
判別器的輸入是生成器的輸出,判別器預測各個位置的詞是否是被替換過的。
此外,還做了些優化:
- 生成器和判別器分別是一個 BERT,縮放了生成器 BERT 引數。
- 詞向量引數分解。
- 生成器和判別器引數共享:輸入層引數共享,包括詞向量矩陣和位置向量矩陣。
在下游任務只使用判別器,不使用生成器。
3.5 長文字處理——Transformer-XL
Transformer 處理長文字的常見策略是將文字切分為固定長度的塊,並獨立編碼各個塊,塊與塊之間沒有資訊互動。
為了優化對長文字的建模,Transformer-XL 使用了兩個技術:狀態複用的塊級別迴圈(Segment-Level Recurrence with State Reuse)和相對位置編碼(Relative Positional Encodings)。
3.5.1 狀態複用的塊級別迴圈
Transformer-XL 在訓練的時候也是以固定長度的片段的形式進行輸入的,不同的是 Transformer-XL 的上一個片段的狀態會被快取下來然後在計算當前段的時候再重複使用上個時間片的隱層狀態,賦予了 Transformer-XL 建模更長期的依賴的能力。
長度為 L 的連續兩個片段 $s_{\tau}=[x_{\tau,1},...,x_{\tau,L}] $ 和 $s_{\tau+1}=[x_{\tau+1,1},...,x_{\tau+1,L}] $。$s_{\tau} $ 的隱層節點的狀態表示為 $h^n_{\tau}\in\Reals^{L\times d} $,其中 d 是隱層節點的維度。$s_{\tau+1} $ 的隱層節點的狀態$h^n_{\tau} $ 的計算過程為:
片段遞迴的另一個好處是帶來的推理速度的提升,對比Transformer的自迴歸架構每次只能前進一個時間片,Transfomer-XL的推理過程通過直接複用上一個片段的表示而不是從頭計算,將推理過程提升到以片段為單位進行推理。
3.5.2 相對位置編碼
在 Transformer 中,自注意力模型可以表示為:
$Q^TK $ 的完整表示式為:
Transformer 的問題是無論對於第幾個片段,它們的位置編碼 $U_{1:L} $都是一樣的,也就是說 Transformer 的位置編碼是相對於片段的絕對位置編碼(absulate position encoding),與當前內容在原始句子中的相對位置是沒有關係的。
Transfomer-XL 在上式的基礎上做了若干變化,得到了下面的計算方法:
- 變化1:$a ,b ,c , d $ 中,$W_k $ 被拆分成立 $W_{k,E} $和$W_{k,R} $,也就是說輸入序列和位置編碼不再共享權值。
- 變化2:$b ,d $ 中,絕對位置編碼 $U_j $ 替換為了相對位置編碼 $R_{i-j} $。
- 變化3:$d ,d $ 中引入了兩個新的可學習的引數 $u\in\R^d $ 和 $v\in\R^d $ 來替換 Transformer 中的 query 向量 $U_i^TW_q^T $。表明對於所有的 query 位置對應的 query 位置向量是相同的。 即無論 query 位置如何,對不同詞的注意偏差都保持一致。
改進之後,各個部分的含義: - 基於內容的相關度($a $): 計算 query $x_i $ 和 key $x_j $ 的內容之間的關聯資訊。 - 內容相關的位置偏置($b $):計算 query $x_i $ 的內容和 key $x_j $的位置編碼之間的關聯資訊。 - 全域性內容偏置($c $):計算 query $x_i $ 的位置編碼和 key $x_j $ 的內容之間的關聯資訊。 - 全域性位置偏置($d $):計算 query $x_i $ 和 key $x_j $ 的位置編碼之間的關聯資訊。
3.6 蒸餾與壓縮——DistillBert
知識蒸餾技術 (Knowledge Distillation, KD):通常由教師模型和學生模型組成,將知識從教師模型傳到學生模型,使得學生模型儘量與教師模型相近,在實際應用中,往往要求學生模型比教師模型小並基本保持原模型的效果。
DistillBert 的學生模型: - 六層的 BERT, 同時去掉了標記型別向量 (Token-type Embedding, 即Segment Embedding) - 使用教師模型的前六層進行初始化。 - 只使用掩碼語言模型進行訓練,沒有使用 NSP 任務。
教師模型: BERT-base
- 損失函式:
- 有監督 MLM 損失:利用掩碼語言模型訓練得到的交叉熵損失 $\begin{aligned} L_{mlm}=-\Sigma {y_i log(s_i)} \end{aligned} $
-
$y_i $ 表示第 $i $ 個類別的標籤,$s_i $ 表示學生模型第 $i $ 個類別輸出的概率。
- 蒸餾 MLM 損失:利用教師模型的概率作為指導訊號,與學生模型的概率計算交叉熵損失 $\begin{aligned} L_{ce}=-\Sigma {t_i log(s_i)} \end{aligned} $
-
$t_i $ 表示教師模型第 $i $ 個類別的標籤。
- 詞向量餘弦損失:對齊教師模型和學生模型的隱含層向量的方向,從隱含層維度拉近教師模型和學生模型的距離 $L_{cos}=cos(h^t,h^s) $
-
$h^t $ 和 $h^s $ 分別表示教師模型和學生模型最後一層的隱含層輸出。
- 最終的損失 $L=L_{mlm}+L_{ce}+L_{cos} $
4. 參考資料
http://luweikxy.gitbook.io/machine-learning-notes/self-attention-and-transformer
http://arxiv.org/pdf/1706.03762.pdf
http://zhuanlan.zhihu.com/p/38130339
http://zhuanlan.zhihu.com/p/184970999
http://zhuanlan.zhihu.com/p/466841781
http://blog.csdn.net/Dream_Poem/article/details/122768058
http://aclanthology.org/N18-1202.pdf
http://zhuanlan.zhihu.com/p/350017443
http://arxiv.org/pdf/2005.14165.pdf
http://www.4k8k.xyz/article/abc50319/108544357
http://arxiv.org/pdf/1906.08237.pdf
http://zhuanlan.zhihu.com/p/103201307
http://arxiv.org/pdf/1810.04805.pdf
http://zhuanlan.zhihu.com/p/51413773
http://arxiv.org/pdf/1907.11692.pdf
http://zhuanlan.zhihu.com/p/103205929
http://arxiv.org/pdf/1909.11942.pdf
http://arxiv.org/pdf/2003.10555.pdf
http://segmentfault.com/a/1190000041107202
http://arxiv.org/pdf/1910.01108.pdf
http://zhuanlan.zhihu.com/p/271984518
- 解鎖抖音世界盃的畫質優化實踐
- Kafka 架構、核心機制和場景解讀
- 頭條穩定性治理:ARC 環境中對 Objective-C 物件賦值的 Crash 隱患
- 位元組跳動模型大規模部署實戰
- 「飛書績效」寬表SQL自動生成邏輯淺析
- Mybatis原始碼主流程分析
- 推薦系統的Bias
- 抖音 Android 基礎技術大揭祕!| 位元組跳動技術沙龍第十期
- 基於序列標註模型的主動學習實踐
- 加密技術科普
- 二維碼掃描優化
- 前端監控系列4 | SDK 體積與效能優化實踐
- 特效側使用者體驗優化實戰 —— 包體積篇
- 深入理解 Android Studio Sync 流程
- 選擇 Go 還是 Rust?CloudWeGo-Volo 基於 Rust 語言的探索實踐
- 初探自然語言預訓練技術演進之路
- 高效能 RPC 框架 CloudWeGo-Kitex 內外統一的開源實踐
- 開源 1 週年突破 1w Star - CloudWeGo 開源社群實踐分享
- Go 語言官方依賴注入工具 Wire 使用指北
- prompt 綜述