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