預(yù)訓(xùn)練語言模型(PLM)- 基礎(chǔ)匯總篇(一)
時間:2023-03-13 15:10:01 | 來源:電子商務(wù)
時間:2023-03-13 15:10:01 來源:電子商務(wù)
預(yù)訓(xùn)練語言模型(PLM)- 基礎(chǔ)匯總篇(一)
Reference:
https://zhuanlan.zhihu.com/p/93781241 https://www.jiqizhixin.com/articles/2018-12-17-17paper&code:
https://huggingface.co/transformers/Chapter:Word Embedding
實現(xiàn)將one-hot representation的高維稀疏特征表示,映射到distributed representation的低維稠密特征表示,并保留原來高維空間中的structure features。常用的word embedding方法有word2vector和glove兩種。
Word2Vec
Word2vector方法主要有兩類,分別是CBOW和Skip-gram。
CBOW: 給定一個詞語的上下文,預(yù)測這個中心詞本身。
Skip-gram: 給定一個中心詞,預(yù)測它的上下文詞語。
由于計算過程中涉及到softmax函數(shù),在整個詞典大小規(guī)模下進(jìn)行這個計算,時間復(fù)雜度大,因此,提出了兩種訓(xùn)練優(yōu)化思路,分別是
hierarchical softmax和
negative sampling 。
- 映射層將上下文詞向量直接相加而不是拼接,去掉了隱藏層。
- Word2vec方法針對某個句子固定窗口大小的文本,并不是全局最優(yōu)解。
- hierarchical softmax在每個分裂節(jié)點上將問題轉(zhuǎn)化為二分類問題,復(fù)雜度下降到O(log N)。
- Skip-gram negative sample算法本質(zhì)上是一種PPMI矩陣分解方式。
- 經(jīng)驗上,Skip-gram negative sample優(yōu)于CBOW,一般使用輸入向量。
- 經(jīng)驗上,訓(xùn)練時將低頻詞映射為統(tǒng)一符號<unk>,并加入到詞表中。<unk>也表示OOV單詞。
原論文1:
http://proceedings.mlr.press/v32/le14.pdf原論文2:
https://arxiv.org/pdf/1301.3781.pdf經(jīng)典講解:
https://arxiv.org/pdf/1411.2738.pdf公式推導(dǎo):
https://arxiv.org/pdf/1402.3722.pdf數(shù)學(xué)原理:
https://www.cnblogs.com/peghoty/p/3857839.html源碼解析:
https://blog.csdn.net/mytestmy/article/details/26969149gensim使用Word2vec:
https://rare-technologies.com/word2vec-tutorial/代碼實現(xiàn):
https://github.com/xixiaoyao/CS224n-winter-together/tree/master/Assignments/assignment2Golve相比于局部上下文信息的word2vec方法,Glove在局部特征的基礎(chǔ)上,還利用了語料庫的全局統(tǒng)計信息。為了實現(xiàn)這一功能,Glove提出了
共現(xiàn)概率矩陣。
共現(xiàn)矩陣:矩陣的每一行表示中心詞;每一列表示上下文詞;矩陣中的每一個值
X_{i,j} ?,表示在整個語料庫中,所在行中心詞
word i 的上下文中,出現(xiàn)所在列的上下文詞
word j 的總次數(shù)(上下文用固定窗口統(tǒng)計)。那么
{X_{i}} = /sum_k X_{i,k} ,?表示出現(xiàn)在以
word i為中心詞的上下文中所有單詞的總次數(shù)。
共現(xiàn)概率矩陣:
令共現(xiàn)概率矩陣中的每一個元素?
P_{i,j} = P(j|i) = /frac{X_{i,j}}{X_{i}} 表示
word j 出現(xiàn)在中心詞
word i的上下文中的概率。
以原論文中Table 1的場景為例,對于矩陣中以ice為中心詞
P(k|ice) ?和以steam為中心詞
P(k|steam) ?這兩行,我們可以將對應(yīng)元素相除,得到 ?
Ratio= P(k|ice) / P(k|steam) 。當(dāng)?
Ratio 值趨近于1時,表示單詞
K 同時與單詞ice和單詞steam相關(guān)(或不相關(guān))。當(dāng)?
Ratio 值很大時,表示單詞
K 與單詞ice相關(guān),但是和單詞steam不相關(guān)。
通過?
Ratio = F(w_i, w_i, w_k) = /frac{P(k|i)} {P(k|j)} ,可以推導(dǎo)出損失函數(shù)
?
J = /sum_{i,k}f(X_{i,k}) (w_i^T /cdot w_k + b_i + b_k - log X_{i,k})^2 /label{eq:Glove}/tag{1} 其中,加入?
f(X_{i,k}) 一項,是由于在真實場景中,
X_{i,j} 的數(shù)值不同,代表不同組詞共現(xiàn)的次數(shù)不同,我們可以對共現(xiàn)次數(shù)較多的代價函數(shù),乘上一個更大的權(quán)重。(詳見參考文獻(xiàn)及資料)
- Glove算法結(jié)合了基于全局統(tǒng)計信息的LSA算法的特點,但是LSA的SVD無法在線更新,且容易維度災(zāi)難,時間復(fù)雜度高。
- Glove算法也結(jié)合了基于局部上下文特征的word2vec算法的特點,同時也通過迭代訓(xùn)練收斂優(yōu)化,但是word2vec沒有充分利用統(tǒng)計信息。
- Glove算法的物理解釋是同一個上下文中,不同中心詞的語義空間相近,它們的共現(xiàn)概率相近。
- Glove算法使用加權(quán)平方誤差作為損失函數(shù)。
- 雖然Glove算法通過無監(jiān)督的方式進(jìn)行迭代訓(xùn)練,但是在統(tǒng)計共現(xiàn)矩陣信息的時候,需要對語料進(jìn)行標(biāo)注。
- 經(jīng)驗上,Glove詞向量使用中心詞向量和上下文詞向量之和來表示,提高魯棒性。
原始論文:
https://www.aclweb.org/anthology/D14-1162.pdf 本站專欄:
https://zhuanlan.zhihu.com/p/42073620官方Glove下載:
https://nlp.stanford.edu/projects/glove/Glove實現(xiàn)與訓(xùn)練:
http://www.fanyeong.com/2018/02/19/glove-in-detail/#comment-1462Chapter:Context Word Embedding
The representations differ from traditional word type embeddings in that each token is assigned a representation that is a function of the entire input sentence.
從本章開始,token的向量表示不再簡單有一個固定向量表示,而是基于所在的上下文來決定。此時的第二階段fine-tune,大多是feature-based approach,僅僅把預(yù)訓(xùn)練向量作為input特征拼接,下游任務(wù)依舊保留Task-specific的復(fù)雜網(wǎng)絡(luò)結(jié)構(gòu)。
Cove
The ability to share a common representation of words in the context of sentences that include them could further improve transfer learning in NLP.
論文主體分為兩大部分:
- 首先使用Attention Encoder-Decoder 框架,在機(jī)器翻譯任務(wù)進(jìn)行預(yù)訓(xùn)練。
- 然后將Encoder的輸出作為詞向量,用于多個下游Task-specific任務(wù)進(jìn)行訓(xùn)練。
- CoVe是一種通過監(jiān)督學(xué)習(xí)的方式進(jìn)行預(yù)訓(xùn)練的方法,得到contextualized word representations。
- 將Glove embedding層+Encoder層作為CoVe向量,與Glove向量拼接,用于下游任務(wù)。
- 相比word2vec、Glove這種為詞典中每個單詞生成一個單獨(dú)的向量表示,CoVe在遷移學(xué)習(xí)上更進(jìn)一步,相同上下文的不同單詞,可以共享部分表示。
- 下游任務(wù):情感分類、問題分類、文本蘊(yùn)含分類、問答QA,均達(dá)到SOTA值。
- 實驗表明,預(yù)訓(xùn)練語料的規(guī)模,會影響下游任務(wù)的質(zhì)量和效果,規(guī)模越大效果更好。
- 下游任務(wù)的Task-specific模型還是比較復(fù)雜。
原始論文:
https://papers.nips.cc/paper/2017/file/20c86a628232a67e7bd46f76fba7ce12-Paper.pdf源碼實現(xiàn):
https://github.com/salesforce/coveTransformer
Transformer 是一個Encoder-Decoder框架 ,Encoder是雙向Multi-Head Attention (本質(zhì)是Self-Attention) + Feed Forward MLP。Decorder是單向Masked Multi-Head Attention (本質(zhì)是Masked Self-Attention) + Multi-Head Attention (本質(zhì)是context-aware Attention) + Feed Forward MLP。
Encoder有6層,每層包括一個Multi-Head Attention模塊和一個position-wise的全連接層模塊。每個模塊都有殘差連接和Layer Normalization。所有層的輸入和輸出維度都是 ?
d_{model} = 512 維。
Decoder有6層,每層包括一個Masked Multi-Head Attention模塊(只關(guān)注一個方向)、基于Encoder的Multi-Head Attention模塊和一個position-wise的全連接層模塊。每個模塊都有殘差鏈接和Layer Normalization。所有層的輸入和輸出維度都是 ?
d_{model} = 512 維。
An attention function can be described as mapping a query and a set of key-value pairs to an output, where the query, keys, values, and output are all vectors. The output is computed as a weighted sum of the values, where the weight assigned to each value is computed by a compatibility function of the query with the corresponding key.
While for small values of ? the two mechanisms (Additive Attention & Dot-Product Attention) perform similarly, additive attention outperforms dot product attention without scaling for larger values of ?. We suspect that for large values of ?, the dot products grow large in magnitude, pushing the softmax function into regions where it has extremely small gradients . To counteract this effect, we scale the dot products by ? .
縮放點積注意力機(jī)制模型 (Scaled Dot-Product Attention):?
Attention(Q,K,V) = softmax(/frac{QK^T}{/sqrt d_k})V /label{eq:Scaled Dot-Product Attention}/tag{2} 多頭注意力機(jī)制模型 (Multi-Head Attention):?
MultiHead(Q,K,V) = Concat(head_1, head_2,...,head_h)W^o // where /, head_i = Attention(QW^Q_i, KW^K_i, VW^V_i) /tag{3} /label{eq:MultiHeadAttention} 其中,Q,K,V分別經(jīng)過參數(shù)
W^Q_i, W^K_i, W^V_i 映射為維度
d_k,d_k,d_v ?,經(jīng)過Scaled Dot-Product Attention之后,得到 ?
d_v 維度的output vector。?
h 個output拼接之后,經(jīng)過單層全連接網(wǎng)絡(luò)映射回
d_{model} ?的維度。論文中,
h = 8,
d_k = d_k = d_v = 512/h = 64 。
Position-wise的全連接層模塊:對于每一個position,使用同一個兩層網(wǎng)絡(luò)。兩層網(wǎng)絡(luò)之間,用ReLU激活函數(shù)。?
FFN(x) = max(0,xW_1+b_1)W_2+b_2 。輸入和輸出維度是?
d_{model} = 512 ,網(wǎng)絡(luò)內(nèi)部維度是
d_{ffn} = 2048 ?。
Add&Norm模塊:包括殘差連接和Layer Normalization。LN把數(shù)據(jù)重新歸一化為均值0方差1,防止落入激活函數(shù)的飽和區(qū),加速收斂。LN是在一個樣本的向量維度上計算均值與方差。 ?
LN(x_i) = /alpha /times /frac{x_i - /mu_L}{/sqrt{/sigma^2_L + /epsilon}} + /beta 位置編碼 (Position Encoding):為了補(bǔ)充并行計算的Attention的位置信息,在Encoder和Docoder的輸入層,都加上了Positional Encoding。
?
PE_{(pos,2i)} = sin(pos/10000^{2i/d_{model}}) // PE_{(pos,2i+1)} = cos(pos/10000^{2i/d_{model}}) /tag{4}/label{eq:Position Encoding} 其中,pos是單詞位置,?
i 是單詞維度(從0到
d_{model}?)。位置編碼可以對絕對位置進(jìn)行編碼,同時也可以根據(jù)三角函數(shù)關(guān)系推導(dǎo)出相對位置之間的關(guān)系。
- Transformer首先在機(jī)器翻譯任務(wù)取得突破,是一個典型的Encoder-Decoder框架。
- Transformer對于不同位置的計算的并行的,通過Attention的方式進(jìn)行聚合,而不是RNN這種串行的單向計算方式。
- Transformer基于矩陣的并行計算,符合GPU的硬件環(huán)境,有較好的并行性。
- Transformer通過mask的方式來實現(xiàn)單向decode,即在softmax操作之前,對當(dāng)前時刻右側(cè)的值設(shè)置成負(fù)無窮大
-inf
。 - Position-wise的全連接層模塊的效果,類似于兩層的kernel為1的卷積層。
- dropout:Add-Norm之前對上一個模塊的輸出進(jìn)行dropout;對經(jīng)過PE編碼之后的input使用dropout。
- BPE:有利于處理未知或罕見的詞匯(OOV問題);利于模型學(xué)習(xí)詞綴之間的關(guān)系;subword粒度可以trade-off單詞和字符特征。BPE編碼的計算量較大,訓(xùn)練前數(shù)據(jù)預(yù)處理階段建立subword詞表以及word詞表,并建立映射關(guān)系,預(yù)先將語料單詞tokenize,對于OOV,使用<unk>。
- Label Smoothing:損失函數(shù)中加入LS,正確label的目標(biāo)概率? y_k 不再是0和1的二值選擇,而是? y_k^{ls} = y_k(1-/epsilon) + /epsilon / labelNum ,這樣損失函數(shù)中,每個label都有一項。LS的這種不確定性,會損壞ppl值,但是有助于準(zhǔn)確率和BLEU值,論文中,? /epsilon 取值為0.1。
- 如果沒有位置編碼,那么句子之間的單詞丟失順序關(guān)系,打亂單詞順序得到相同結(jié)果,成為一個詞袋模型。
- input embedding、output embedding、以及Decoder最終softmax操作之前的pre-softmax linear transformation,三者共享參數(shù)。
- Transformer相對于RNN和CNN而言,句子中任意位置之間的計算距離為1,有效解決長期依賴的問題。
- 一般而言,句子長度
n
小于向量維度dimen
,Transformer的計算復(fù)雜度O(n*n*dimen)
,低于RNN的O(n*dimen*dimen)
和CNN的O(k*n*dimen*dimen)
。 - 后續(xù)廣泛使用的BERT模型,是從Transformer的Encoder結(jié)構(gòu)演化而來。
原始論文:
https://papers.nips.cc/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf經(jīng)典講解:
https://jalammar.github.io/illustrated-transformer/經(jīng)典講解中文版:
https://zhuanlan.zhihu.com/p/48508221源碼淺析(PyTorch):
https://zhuanlan.zhihu.com/p/47812375源碼實現(xiàn)(TF):
https://github.com/tensorflow/tensor2tensor (available as a part of the Tensor2Tensor package)
源碼實現(xiàn)(pyTorch):
http://nlp.seas.harvard.edu/2018/04/03/attention.html簡單使用教程(pyTorch):
https://zhuanlan.zhihu.com/p/107586681ELMo
ELMo 全稱 Embeddings from Language Models,語言模型主體為雙向LSTM:
前向LSTM: ?
P(t_1,t_2,...t_N) = /Pi_{j=1}^{N} P(t_j|t_{j-1},...,t_2,t_1) 后向LSTM: ?
P(t_1,t_2,...t_N) = /Pi_{j=1}^{N} P(t_j|t_{j+1},t_{j+2},...,t_N) Jointly maximize the log likelihood: ?
Loss = /sum_{j=1}^{N}(/log P(t_j|t_{j-1},...,t_2,t_1;/theta) + /log P(t_j|t_{j+1},t_{j+2},...,t_N; /theta)) 基本結(jié)構(gòu)是一個兩層的biLSTM, 每一層包含4096個unit, 每個詞會被softmax layer映射為512維的向量。第一層和第二層之間增加了殘差連接。
biLM預(yù)訓(xùn)練之后,對于fine-tune階段:
每個時刻
k 的所有內(nèi)部層(
j = 0, 1, ..., L ?)的表示都參與下游任務(wù),即通過加權(quán)求和的方式得到單個token的representation,?
s^{task}_j 是經(jīng)過softmax-normalized
?
ELMo_k^{task} = /gamma^{task}/sum_{j=0}^{L} s_j^{task} h_{k,j}^{LM} /label{eq:ELMo}/tag{5} j=0 時表示token的詞向量表示??梢允菃卧~級別的word embedding,也可以是字符級別的n-gram CNN結(jié)構(gòu)。本文在輸入層(?
j=0 時)和輸出層(softmax之前)都使用char-based CNN,相比于word embedding,能更好解決OOV問題,且CNN softmax參數(shù)量遠(yuǎn)小于?
|V|h 。
- ELMo是一種通過無監(jiān)督學(xué)習(xí)的方式進(jìn)行大規(guī)模預(yù)訓(xùn)練的方法,得到contextualized word representations。
- Lower level LSTM能夠?qū)φZ法和語義(syntax; semantics)進(jìn)行建模,Higher level LSTM能對不同上下文的一詞多義性(polysemy)進(jìn)行建模。
- ELMo的損失函數(shù),由前向LSTM與后向LSTM兩個語言模型直接相加組成,同時考慮上下文。
- ELMo的輸入層與輸出層的CNN結(jié)構(gòu)相同,參數(shù)不同。相比于word embedding的look-up操作,CNN耗時更多。可以在inference階段先將詞表的word embedding計算出來,tokenize轉(zhuǎn)為word id,減輕計算壓力。
- ELMo與CoVe的最大區(qū)別在于,ELMo層數(shù)更深,且每個input token的representation是所有內(nèi)部層的線性組合,而不僅僅是最后一層。
- 在下游任務(wù)中,Eq.5 得到的向量,可以直接與詞向量拼接使用(即固定ELmo模型的參數(shù),計算出每個時刻的representation后與詞向量拼接);也可以與下游RNN模型的更高層的hidden states拼接使用,在SNLI,SQUAD任務(wù)上有提升效果。
- 使用Dropout及L2正則化項,有利于? Eq.5 中的?參數(shù)的調(diào)權(quán)優(yōu)化。
原始論文:
https://www.aclweb.org/anthology/N18-1202.pdf源碼實現(xiàn)(pyTorch):
https://github.com/allenai/allennlp/tree/main/allennlp源碼實現(xiàn)(TF):
https://github.com/allenai/bilm-tfELMo主頁及官方ELMo模型下載:
https://allennlp.org/elmoChapter:Pretraining Language Model
本章開始,框架整體分為Pretrain+fine-tune兩大階段。模型主要基于Transformer結(jié)構(gòu),在無監(jiān)督的LM任務(wù)上進(jìn)行大規(guī)模預(yù)訓(xùn)練,并基于結(jié)構(gòu)上的微調(diào),可以實現(xiàn)在多種下游任務(wù)中進(jìn)行有監(jiān)督的fine-tune。
GPT
GPT 全稱Generative Pre-Training,本質(zhì)上是用Transformer的Decoder來做單向語言模型的預(yù)訓(xùn)練。?
Loss_{lm} = /sum_{j=1}^{N}/log P(t_j|t_{j-1},...,t_2,t_1;/theta) 在fine-tune階段,同時考慮語言模型的目標(biāo)函數(shù)以及下游任務(wù)的目標(biāo)函數(shù)。?
Loss = /lambda Loss_{lm} + Loss_{task-specific} 在fine-tune階段,利用task-specific input adaptations方法,非常巧妙地將整個遷移學(xué)習(xí)的框架(fine-tune)做到非常精簡和通用。
Our goal is to learn a universal representation that transfers with little adaptation to a wide range of tasks
在fine-tune階段,輸入序列經(jīng)過12層Transformer-Decoder-Block之后,用最后一層的最后一個時刻的輸出,feed into一個task-specific的Linear Layer,然后softmax操作來得到輸出的預(yù)測概率。
Unsupervised pre-training:
- Datasets: BooksCorpus dataset主要包括document level的長文本,Word Benchmark dataset主要包括sentence level的短文本。
- Model specifications: 12-layer decoder-only transformer, ? d_{model} = 768 維, head = 12 ?, d_k = d_k = d_v = 768/h = 64 。網(wǎng)絡(luò)內(nèi)部維度是? d_{ffn} = 3072 .
- Optimization: Adam, lr先增后減,前2000 step從0線性遞增到2.5e-4,然后cosine曲線遞減到0.
- Hyperparameter:epoch=100,batch=64,padding=512 tokens,BPE-vocab =40000,dropout=0.1。
Supervised fine-tuning details:大部分場景下,復(fù)用預(yù)訓(xùn)練階段的參數(shù),一般epoch=3即可得到不錯的結(jié)果。
- task-specific input adaptations方法源自traversal-style approaches遍歷式方法,將結(jié)構(gòu)化輸入處理成單個連續(xù)的token序列,從而將不同下游任務(wù)的多種格式的輸入,轉(zhuǎn)化為統(tǒng)一的連續(xù)token序列格式,使得在很小改動的情況下框架可以在不同任務(wù)上進(jìn)行有效fine-tune。
- Text classification:對于這類任務(wù),不需要額外的改動,可以直接將預(yù)訓(xùn)練的框架應(yīng)用于fine-tune階段。
- Textual entailment:輸入包括premise-hypothesis文本對,在文本對直接拼接起來,中間增加一個分隔符delimiter token。
- Sentence similarity:輸入包括兩個句子對,由于兩個句子內(nèi)部沒有先后順序,為了保留原始結(jié)構(gòu),文本對(with delimiter)拼接的時候,同時考慮了兩種先后順序關(guān)系,并分別通過Transformer,并將兩個網(wǎng)絡(luò)的最后一層的最后一個時刻的輸出,相加得到最后的序列表達(dá),輸入到Linear Layer中。
- QA and Commonsense Reasoning:輸入包括document,query和一組answers,首位直接將document和query拼接作為context,然后分別與每一個answer拼接(with delimiter),分別通過Transformer和Linear Layer之后,用softmax歸一化來produce an output distribution over possible answers.
- 四類任務(wù)的輸入文本前后,都有起始符號Start和終止符號Extract,訓(xùn)練階段隨機(jī)初始化之后,可以固定下來,不隨網(wǎng)絡(luò)參數(shù)迭代。
2. 與預(yù)訓(xùn)練階段相比,fine-tune的訓(xùn)練階段新增了兩部分參數(shù):Decoder之后的LinearLayer網(wǎng)絡(luò),以及delimiter token的embedding表示。
3. 去掉fine-tune的訓(xùn)練階段,直接在task上進(jìn)行Zero-shot預(yù)測,隨著預(yù)訓(xùn)練的epoch越多,Task預(yù)測效果更好,說明預(yù)訓(xùn)練階段能夠pretrain通用基礎(chǔ)知識。
4. 對于natural language inference (NLI)任務(wù)或者大數(shù)據(jù)集任務(wù),fine-tune訓(xùn)練階段,加上?
Loss_{lm} 之后效果更好。
5. input embedding包括bpe token embedding和position embedding相加。
原始論文:
https://www.cs.ubc.ca/~amuham01/LING530/papers/radford2018improving.pdf中文翻譯:
https://zhuanlan.zhihu.com/p/54754171源碼實現(xiàn)及模型(TF):
https://github.com/openai/finetune-transformer-lm官方博客:
https://openai.com/blog/language-unsupervised/GPT-2 與GPT/BERT的區(qū)別:
- 模型&參數(shù):
更高質(zhì)量、多領(lǐng)域、多數(shù)據(jù)量的訓(xùn)練數(shù)據(jù),更深的網(wǎng)絡(luò)層數(shù),更多的網(wǎng)絡(luò)參數(shù)。 - 預(yù)訓(xùn)練階段:
Layer Normalization: 將layer normalization放到每個sub-block之前,并在最后一個Self-attention后再增加一個layer normalization。
BPE: 直接在byte序列上進(jìn)行bpe,減小base vocab。為了避免陷入局部最優(yōu)解,除空格之外,禁止將不同類別的字節(jié)進(jìn)行合并。 - fine-tune訓(xùn)練階段:
GPT和BERT都是supervised fint-tune,而GPT-2是unsupervised fine-tune tasks,即zero-shot的實驗設(shè)置。比如摘要生成任務(wù),在原文后面加上<TL;DR:>分隔符,然后一個字一個字生成摘要內(nèi)容。
GPT-2原始論文:
https://d4mucfpksywv.cloudfront.net/better-language-models/language-models.pdfGPT-2源碼實現(xiàn)及模型(TF):
https://github.com/openai/gpt-2GPT-2官方博客:
https://openai.com/blog/better-language-models/GPT-2論文解讀:
http://jalammar.github.io/illustrated-gpt2/ https://zhuanlan.zhihu.com/p/139840113GPT-2源碼解讀:
https://medium.com/analytics-vidhya/understanding-the-gpt-2-source-code-part-1-4481328ee10bGPT-2中BPE源碼解讀:
https://www.pythonf.cn/read/106117BERT
BERT 全稱Bidirectional Encoder Representations from Transformers。本質(zhì)上是用Transformer的Encoder來做雙向語言模型的預(yù)訓(xùn)練。同時,為了利用雙向信息,改進(jìn)了普通語言模型成為完形填空式的 Mask-LM (Mask-Language Model)。
預(yù)訓(xùn)練階段主要包括了兩個任務(wù):Mask-LM (Mask-Language Model) 和 NSP (Next Sentence Prediction)。?
Loss=Loss_{MLM} + Loss_{NSP} Mask-LM:單次級別多分類任務(wù)。input sequence中的每個token有15% 的概率masked,并且用最后一層hidden states映射到詞表上進(jìn)行預(yù)測。由于fine-tune階段并沒有mask符號,在預(yù)訓(xùn)練階段,被masked的token只有80%的情況被替換為[mask]符號,10%的情況下唄替換為詞表中其他任意符號,10%的情況下不做替換。
NSP:句子級別二分類任務(wù),補(bǔ)充建模句子之間的關(guān)系。input sequence包括兩個句子,50%的概率兩個句子有前后順序關(guān)系,50%的概率是隨機(jī)挑選的兩個句子。用句首對應(yīng)的hidden states映射到而分類任務(wù)上進(jìn)行預(yù)測。
預(yù)訓(xùn)練階段,首先構(gòu)造 [CLS] Sentence_A [SEP] Sentence_B [SEP] 的形式,然后截斷到512token長度,使用BPE分詞,每個token有15% 的概率進(jìn)行mask操作。
Fine-tune階段,幾乎所有框架和超參都與預(yù)訓(xùn)練階段一致。在不同的下游任務(wù)上,各自訓(xùn)練一套參數(shù),輸入輸出層的改造也略有不同。
- 與GPT相比,BERT通過MLM實現(xiàn)上下文雙向信息的利用。與ELMo相比,BERT的雙向信息融合更深。
- fine-tune訓(xùn)練階段,除了分類任務(wù)輸出層的FFN,其他結(jié)構(gòu)與預(yù)訓(xùn)練一致。不同的下游任務(wù)都用預(yù)訓(xùn)練好的參數(shù)進(jìn)行初始化,然后在各自的任務(wù)上fine-tune。
- 輸入embedding包括了bpe token embedding、position embedding以及segment embedding。
- 與GPT在fine-tune階段引入分隔符不同,BERT在預(yù)訓(xùn)練和fine-tune訓(xùn)練階段,都使用[CLS]和[SEP]分隔符。[CLS]用于句首,[SEP]用于每個句子的末尾。同時還新增了表示句子A和句子B的segment embedding vector。
- 與GPT的語言模型相比,BERT僅對15%的token進(jìn)行語言模型學(xué)習(xí),因此需要更多的訓(xùn)練epoch,收斂更慢,大約40epoch,共1M steps。
- 為了加速預(yù)訓(xùn)練,同時減少開銷,首先90%的steps將input sequence截斷到128位,剩下的10%放寬到512位,用于學(xué)習(xí)position embedding。
- fine-tune階段,小數(shù)據(jù)集的超參數(shù)選擇比大數(shù)據(jù)集更加敏感,可以進(jìn)行一定范圍的網(wǎng)格搜索。一般batch是16或32,epoch是2到4。
原始論文:
https://www.aclweb.org/anthology/N19-1423.pdf源碼實現(xiàn)及模型(TF 1.11):
https://github.com/google-research/bert源碼實現(xiàn)(pyTorch 1.3 / TF 2.0):
https://github.com/huggingface/transformers簡單使用教程(pyTorch):
https://zhuanlan.zhihu.com/p/113639892BERT實踐博客:
https://zhuanlan.zhihu.com/p/337212893Transformer-XL
Transformer將輸入序列進(jìn)行一定長度的截斷,比如512 tokens,不同segment之間沒有信息交互,截斷的時候也沒有考慮語義是否完整。
Transformer-XL為了解決長距離文本建模的問題:
- 提出片段級遞歸機(jī)制(segment-level recurrence mechanism),引入一個記憶(memory)模塊(類似于cache或cell),循環(huán)用來建模片段之間的聯(lián)系。
- 使得長距離依賴的建模成為可能;
- 使得片段之間產(chǎn)生交互,解決上下文碎片化問題。
2. 提出
相對位置編碼機(jī)制(relative position embedding scheme),代替絕對位置編碼。
- 為了在memory的循環(huán)計算的實現(xiàn)過程中,避免時序混淆,位置編碼可重用。
- 在實驗中,Transformer-XL在字符級 (bpc)和詞級別 (ppl)的任務(wù)上比Transformer效果更好。
- 對于長文本,Transformer-XL比Transformer在inference階段速度更快。
- XLNet基于Transformer-XL框架對預(yù)訓(xùn)練任務(wù)進(jìn)行了設(shè)計。
原論文:
https://www.aclweb.org/anthology/P19-1285.pdf源碼實現(xiàn):
https://github.com/kimiyoung/transformer-xl
關(guān)鍵詞:匯總,基礎(chǔ),訓(xùn)練,語言,模型