transformer bert GPT(未完)
原文標題:?規模?監督預訓練語?模型與應?(中)
文章目錄
- 1 transformer
- 1.1 encoder部分
- 1.1.1 Attention定義
- 1.1.2 Multi-head Attention
- 1.1.3 position-wise feed-forward networks
- 1.1.4 positional encoding
- 1.1.5 殘差鏈接
- 1.1.6 layer norm
- 1.2 decoder部分
- 1.3 transformer block
- 2 bert
- 2.1 Masked Language Model
- 2.2 框架
- 2.2 Bert升級版本
- 2.2.1 RoBERTa:更強?的BERT
- 2.2.2 ALBERT:參數更少的BERT
- 2.2.3 DistilBERT:輕量版BERT
- 2.2.4 Patient Distillation
- 2.2.5 ELECTRA
- 3 OpenAI GPT
1 transformer
論文Attention Is All You Need,這是一篇刷爆朋友圈的論文。因為它的效果基于現有效果有了較大幅度的提升。
transformer與之前一些結構的不同在于:
- 雙向LSTM:一個模型想要包含當前位置的信息,前一個位置的信息,后一個位置的信息
- CNN:一個位置包含的信息取決于kernel size大小
- transformer:可以得到全局信息
這個結構是由encoder和decoder組成。
1.1 encoder部分
encoder部分是有6個重復的結構組成。每一個重復結構一樣,但是參數不同,每一層結果是512維的。后面有人改進:每一層結構一樣,參數相同。
每一個重復 = 層正則化(殘差(multi head attention)) + 層正則化(殘差(前向神經網絡))
1.1.1 Attention定義
Attention是利用一組(q,k)對,計算得到加權值,對一組value進行加權平均。稱為scaled dot-product attention。
Attention(Q,K,V)=softmax(QKTdk)VAttention(Q, K, V ) = softmax(\dfrac{QK^T}{\sqrt[]d_k})VAttention(Q,K,V)=softmax(d?k?QKT?)V
dkd_kdk?是key向量的維度。
為什么除以dk\sqrt[]{d_k}dk???是為了保證計算的值方差不會很大。
為什么不除以dk,而是除以dk\sqrt[]{d_k}dk??,dk\sqrt[]{d_k}dk??消耗資源還多?dot(a,b)的標準差 = dk\sqrt[]{d_k}dk??
1.1.2 Multi-head Attention
不是對輸入做一個Attention,而是需要做多個Attention。
假如每個單詞512維度,這里有h個scaled dot-product attention。每一套可以并行計算。 Q K V 做了不同的affine變換,投射到不同的空間,得到不同的維度,也就是WX+b變換。(這里的描述與之前的文章不同,應該這里的描述是正確的,因為論文里面是這樣寫的)
之后過一個scaled dot-product attention。
h個結果concat
然后再做Linear
論文中h=8,dk=dv=dmodel/h=64d_k=d_v=d_{model/h}=64dk?=dv?=dmodel/h?=64
做Attention,Q K V 形狀是不會發生變化的,每個的形狀還是 seq_length,x,hidden_size
1.1.3 position-wise feed-forward networks
FFN(x) = max(0, xW1 + b1 )W2 + b2
之所以成為position-wise,是因為每個位置都做了一個這樣的變換
1.1.4 positional encoding
每個位置都定義了一個encoding。 在transformer中一直在做加權平均,沒有前后順序,這就會成為bag of words。
在這里有些位置用sin,有些位置用cos,表示位置信息。每個位置的encoding是什么樣子并不重要。重要的是每個位置的encoding不一樣
位置信息encoding之后 與 詞向量相加,也就是 embed(word) + embed(position),整體作為輸入送入到encoder。
按照偶數位sin,奇數位cos的方式,得到的結果確實是i,j越接近,pm.pnp_m.p_npm?.pn?越大。相對位置越遠,點乘的結果越?。
1.1.5 殘差鏈接
殘差鏈接是這樣的。
將輸入x加到multi-head或者feed network的輸出h上。這樣可以加快訓練。
這一步得到的結果記為h1′,h2′,h3′,h4′h_1',h_2',h_3',h_4'h1′?,h2′?,h3′?,h4′?。
1.1.6 layer norm
層正則化,是對殘差鏈接的結果做正則化。
對h1′,h2′,h3′,h4′h_1',h_2',h_3',h_4'h1′?,h2′?,h3′?,h4′?這4個向量分別計算每個向量的均值μ\muμ和方差σ\sigmaσ。
γ\gammaγ和β\betaβ是共享的參數,在模型中需要訓練。
γ\gammaγ和β\betaβ可以在一定程度上抵消掉正則的操作。為什么正則了又要抵消呢?
這樣做可以讓每一個時間步的值更平均一些,差異不會特別大。
這一步的輸出是h1′′,h2′′,h3′′,h4′′h_1'',h_2'',h_3'',h_4''h1′′?,h2′′?,h3′′?,h4′′?。
1.2 decoder部分
解碼器和編碼器差不多。
解碼器有一個master multi head attention。就是說在解碼的時候,每一個時間步只能看到它前面的狀態。例如在計算x2x_2x2?的參數時候,x2x_2x2?作為query,能作為key和value的只有x1x_1x1?。
還有一點不同是
這里是以解碼器的輸出作為key和value,這一時間步的輸出作為query計算attention。
1.3 transformer block
在bert與GPT模型中,有些時候會把layer norm放在self attention前面,稱為pre-norm,這樣效果更好。
2 bert
BERT:Masked Language Modeling預訓練模型
論?地址:https://arxiv.org/pdf/1810.04805.pdf
中?翻譯:https://zhuanlan.zhihu.com/p/59775981
參考地址
2.1 Masked Language Model
Masked Language Model實際在做一個完形填空。將一句話中的部分單詞隨機mask。然后預測這些位置的單詞應該是什么。
人們總想預訓練出一些模型,用來提升自然語言處理的其他任務的性能。這些模型一般有2種策略。一種是feature based,例如ELMo。一種是fine-tuning,例如transformer。bert使用的是fine-tuning。
bert分為pre-training和fine-tuning兩部分。
預訓練是在未標注的數據集上訓練的。
在fine-tuning階段,bert會使用預訓練階段的數據初始化參數,在下游nlp任務的標注數據集上訓練參數。
2.2 框架
bert 是一個multi-layer bidirectional Transformer encoder。
bert 的base框架 中L=12,H=768,A=12:有L=12層,hidden_size=768,自注意力機制的頭有12個。
bert使用的架構和transformer是一樣的。上圖中每一個Trm是就是一個Transformer的encoder。
bert使用wordpiece embedding,詞庫量是3萬。
每個句子的第一個token是CLS。我們可以使用CLS的向量表示一句話。
對于輸入是句子對形式的打包成一個句子,句子之間好用SEP隔開。:[CLS] I study at [MASK] . [SEP] I love [MASK] language processing . [SEP]
E表示input embedding
C表示CLS的hidden state
TiT_iTi?表示第i個token的hidden state
輸入表示:
BERT的輸入的編碼向量(長度是512)是3個嵌入特征的單位和,這三個詞嵌入特征是:
WordPiece 嵌入:WordPiece是指將單詞劃分成一組有限的公共子詞單元,能在單詞的有效性和字符的靈活性之間取得一個折中的平衡。例如圖4的示例中‘playing’被拆分成了‘play’和‘ing’;
位置嵌入(Position Embedding):位置嵌入是指將單詞的位置信息編碼成特征向量,位置嵌入是向模型中引入單詞位置關系的至關重要的一環。位置嵌入的具體內容參考我之前的分析;
分割嵌入(Segment Embedding):用于區分兩個句子,例如B是否是A的下文(對話場景,問答場景等)。對于句子對,第一個句子的特征值是0,第二個句子的特征值是1。
Bert的預訓練任務是由2個任務組成的:Masked LM 和Next Sentence Prediction。
任務Masked LM:隨機的mask掉一些單詞,然后預測這些單詞。在實驗中,每個句子隱藏了15%的詞(詞庫總量是3萬。這里的詞并不是一個單詞,而可能是單詞的一部分,因為bert使用的是wordpiece)。在預測的時候預測被隱藏的這部分內容。
因為下游任務中并不會有[MASK]標簽。所以在被隱藏的位置中,有80%是[MASK],有10%是一個隨機的token,有10%是token原來自己,不會變。
I study at July.如果July是被選擇要隱藏的部分。那么有80%的情況,句子會被變成: I study at [MASK]。有10%的機會,會變成: I study at pear. 有10%的機會保持原樣: I study at July.
然后TiT_iTi?使用交叉熵損失來預測原始的token。
任務下一句話預測:許多重要的下游任務如問答自然語言推斷都基于對兩句話關系的理解,但這并不能直接由語言模型學到。為了能訓練一個可以理解句子關系的模型,我們訓練了一個二分類的下一句話預測任務,數據很容易獲取。值得注意的是,當選擇句子A和B作為預訓練樣本時,50%的時候B時真的A的下一句,50%的時候是一個隨機的句子(即負樣本)。
代碼實現 google-research/bert
老師講的代碼 huggingface/transformers modeling_bert
bert wordpiece
elmo:字符
transformer:單詞
bert:wordpiece
兩篇論文 兩篇代碼看一下,代碼重點是 bertselfAttention部分
如何同時做兩個任務: total_loss = masked_ml_loss + next_sentecne_loss
為什么bert的特征提取器比bi-lstm好?
bert:訓練一般1天,一般12層-24層
bi-lstm:訓練量大,耗時時一般一個月
只能說因為訓練量大小不同,在相同數據集,訓練相同之間內bert效果要好。如果給予bi-lstm足夠的時間,應該能拿到一樣,或者更好的效果。
2.2 Bert升級版本
中文bert https://github.com/ymcui/Chinese-BERT-wwm
2.2.1 RoBERTa:更強?的BERT
論?地址:https://arxiv.org/pdf/1907.11692.pdf
特點是:
- 加?訓練數據 16GB -> 160GB,更?的batch size,訓練時間加?
- 不需要NSP Loss: natural inference
- 使?更?的訓練 Sequence
- 模型訓練成本在6萬美?以上(估算)
2.2.2 ALBERT:參數更少的BERT
論?地址:https://arxiv.org/pdf/1909.11942.pdf
?個輕量級的BERT模型
核?思想:
- 共享層與層之間的參數 (減少模型參數)
- 增加單層向量維度
- 實際訓練時間更長
2.2.3 DistilBERT:輕量版BERT
一個tearcher框架,一個student框架。訓練student框架的時候從teacher框架學東西。
2.2.4 Patient Distillation
論文
bert是12層的,訓練一個6層的模型。
引入Patinet loss。在訓練中還需要考慮每一層的輸出盡量接近。因為新模型的層數少,比較的時候可以是隔一層比較一次,也可以是比較最后6層。
2.2.5 ELECTRA
3 OpenAI GPT
GPT
Radford et. al., Improving Language Understanding by Generative Pre-Training
這篇?章推出了generative pre-training + discriminative fine-tuning的?法,后來也被BERT沿?。task-aware input transformation也是BERT借?的?個點。
代碼解讀
https://github.com/ZeweiChu/gpt-2/blob/master/src/model.py
huggingface代碼
https://github.com/huggingface/transformers/blob/master/src/transformers/modeling_gpt2.py
總結
以上是生活随笔為你收集整理的transformer bert GPT(未完)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql数据库置疑_SQL数据库置疑
- 下一篇: spring-boot 定时任务