乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      通俗講解從Transformer到BERT模型!

       520jefferson 2020-08-25
      作者:陳鍇,中山大學(xué)  張澤,華東師范大學(xué)  

      近兩年來(lái),Bert模型非常受歡迎,大部分人都知道Bert,但卻不明白具體是什么。一句話概括來(lái)講:BERT的出現(xiàn),徹底改變了預(yù)訓(xùn)練產(chǎn)生詞向量和下游具體NLP任務(wù)的關(guān)系,提出龍骨級(jí)的訓(xùn)練詞向量概念。

      想要了解Bert,那么可能你需要先從tranformer框架了解清楚。今天我們就從Transformer到Bert進(jìn)行詳細(xì)地講解。

      1. Attention

      在學(xué)會(huì) Transformer 和 Bert 之前,我們需要理解Attention和Self-Attention機(jī)制。Attention的本質(zhì)是要找到輸入的feature的權(quán)重分布,這個(gè)feature在某一個(gè)維度有一個(gè)長(zhǎng)度的概念,如果我們輸入一個(gè)長(zhǎng)為 n 的 feature,那么 Attention 就要學(xué)習(xí)一個(gè)長(zhǎng)為 n 的分布權(quán)重,這個(gè)權(quán)重是由相似度計(jì)算出來(lái)的,最后返回的得分就將會(huì)是權(quán)重與feature的加權(quán)和。

      1.1 Attention的計(jì)算過(guò)程

      Attention的輸入是Q,K,V,返回的是一個(gè)socre,計(jì)算公式如下:

      需要注意的是上述公式的下標(biāo)位置,顯然我們需要學(xué)習(xí)的權(quán)重分布是 ,而和相關(guān),就是我們希望去被找到權(quán)重的feature。

      1.1.1 QKV 英文名字的含義

      • Q 即為英文中 Query 是指:被查詢的序列,可以看到在每次計(jì)算相似度的過(guò)程中,Q在計(jì)算中是一直保持著整體的狀態(tài)。
      • K 即為英文中 Key 是指:被查詢的索引,我們學(xué)習(xí)到的權(quán)重分布A 長(zhǎng)度為n,那么A中每一個(gè)下標(biāo)的大小,就代表了對(duì)應(yīng)索引被分配到的權(quán)重。所以這個(gè)K,控制的是索引。
      • V 即為英文中的 Value 是指:值,也就是我們feature 本身的值,他要去和權(quán)重分布做加權(quán)和來(lái)得到最終的分布。

      1.1.2 相似度的計(jì)算方式

      這里相似度的計(jì)算方式有很多種:

      相似度名計(jì)算方式
      點(diǎn)乘
      矩陣乘積,為參數(shù)
      余弦相似度$s(q,k)=\frac{q^Tk}{
      concat,為參數(shù)
      mlp,為參數(shù)

      1.2 HAN中的Attention

      我們首先看一下 HAN 的 Attention 中的QKV分別是如何體現(xiàn)的。

      在 HAN 中,我們只有一個(gè)輸入 ,輸出為 和 的加權(quán)平均,所以即為 Attention 機(jī)制中的 Value。我們把 做了一個(gè)線性變換變成了 ,然后又隨機(jī)生成了一個(gè) 向量 , 一起計(jì)算 。公式為:

      可以看到在公式中一直處于被查詢的狀態(tài),即一直保持著一個(gè)整體的狀態(tài),所以我們生成的隨機(jī)向量即為 Attention 機(jī)制中的Query 。而我們做完線性變換生成的U 給 A 生成不同索引的權(quán)重值,他即代表我們 Attention 機(jī)制中的 Key。這里用的相似度公式顯然是點(diǎn)積,而在我自己實(shí)現(xiàn)的時(shí)候遇到了點(diǎn)困難,改成了MLP實(shí)現(xiàn)法。

      1.3 seq2seq中的Attention

      我們來(lái)看 seq2seq 中的 Attention 機(jī)制,在這個(gè)任務(wù)中我們需要一步一步的生成,我們會(huì)根據(jù)每一步生成的(實(shí)際是一個(gè)分布),找到對(duì)應(yīng)的單詞。

      我們的生成公式為:

      可以看出,每一次生成的時(shí)候都要被更新,而在這個(gè)模型中就是 Attention 模型最終被返回的得分。

      在 seq2seq模型中,我們把輸入Encoder 生成的值記為 ,我們需要學(xué)習(xí)關(guān)于 的權(quán)重分布,所以 即為這里 Value,而這里的 Key 也是 他自己,他沒(méi)有像 HAN 中一樣做變換,我們每一次要查詢的 Query 是已經(jīng)生成的序列 也即為 Decoder 中生成的值 ,顯然隨著每次生成的變化這個(gè)被查詢的 會(huì)變長(zhǎng)。這樣,由我們的 就能生成出最后的。

      2. Transformer

      Transformer改進(jìn)了RNN最被人詬病的訓(xùn)練慢的缺點(diǎn),利用self-attention機(jī)制實(shí)現(xiàn)快速并行

      2.1 Self-Attention

      在 Transformer 中我們要用到的 Attention 方式是 Self-Attention,它與之前的 Attention 有些許的不同。簡(jiǎn)單的來(lái)說(shuō),它通過(guò)學(xué)習(xí)三個(gè)參數(shù),來(lái)對(duì)同一個(gè)embedding之后的feature 進(jìn)行轉(zhuǎn)換,將他線性轉(zhuǎn)換成Q、K、V 之后計(jì)算出這句話的 Attention 得分。名字中的Self 體現(xiàn)的是所有的Q、K、V 都是由輸入自己生成出來(lái)的。

      歸一化:權(quán)重分布在歸一化前,要除以輸入矩陣的第一維開(kāi)根號(hào),這會(huì)讓梯度更穩(wěn)定。這里也可以使用其它值,8只是默認(rèn)值,再進(jìn)行softmax。

      返回:這里返回的值和輸入的長(zhǎng)度維度是一樣的,每一個(gè)單詞對(duì)應(yīng)的輸出是所有單詞對(duì)于當(dāng)前單詞的權(quán)重分布與Value得分的加權(quán)和。所以他有多少個(gè)單詞,就做了多少次Attention 得分,這就是self-Attention 。

      2.2 模型結(jié)構(gòu)

      • Transformer:Input(Embedding)→Encoder ×6 → Decoder×6 → output
      • Encoder:Multi-headed attention → Add&Norm → Feed Forward → Add&Norm
      • Decoder:Multi-headed attention → Add&Norm → Encoder-Decoder-Attention → Add&Norm → Feed Forward → Add&Norm

      • Multi-headed attention:Self-Attention×8

      其中Encoder-Decoder-Attention即為seq2seq 中的Attention 結(jié)構(gòu),K和V 為Encoder頂層的output。

      2.3 Multi-headed attention(多頭怪)

      Self-Attention 生成了一組,而多頭怪生成了 8組 ,在實(shí)際的過(guò)程中,最后需要把這8組進(jìn)行concat(拼接)。

      需要注意的是 Decoder 端的多頭 self-attention 需要做mask,因?yàn)樗陬A(yù)測(cè)時(shí),是“看不到未來(lái)的序列的”,所以要將當(dāng)前預(yù)測(cè)的單詞(token)及其之后的單詞(token)全部mask掉。使用多頭機(jī)制可以理解為CNN中同時(shí)使用多個(gè)卷積核。

      代碼實(shí)現(xiàn)在pytorch中很簡(jiǎn)單,直接調(diào)包即可:第0維是長(zhǎng)度,第一維是batchsize。

      ## nn.MultiheadAttention 輸入第0維為lengthquery = torch.rand(12,64,300)key = torch.rand(10,64,300)value= torch.rand(10,64,300)multihead_attn = nn.MultiheadAttention(embed_dim, num_heads)multihead_attn(query, key, value)[0].shape# output: torch.Size([12, 64, 300])

      可以考慮實(shí)現(xiàn)一個(gè)第0維是 batchsize 的 MultiheadAttention:

      class MultiheadAttention(nn.Module):    def __init__(self, hid_dim, n_heads, dropout):        super(MultiheadAttention,self).__init__()        self.hid_dim = hid_dim        self.n_heads = n_heads
      assert hid_dim % n_heads == 0 # d_model // h 是要能整除 self.w_q = nn.Linear(hid_dim, hid_dim) self.w_k = nn.Linear(hid_dim, hid_dim) self.w_v = nn.Linear(hid_dim, hid_dim) self.fc = nn.Linear(hid_dim, hid_dim) self.do = nn.Dropout(dropout) self.scale = torch.sqrt(torch.FloatTensor([hid_dim // n_heads]))
      def forward(self, query, key, value, mask=None): bsz = query.shape[0] Q = self.w_q(query) K = self.w_k(key) V = self.w_v(value) Q = Q.view(bsz, -1, self.n_heads, self.hid_dim // self.n_heads).permute(0, 2, 1, 3) K = K.view(bsz, -1, self.n_heads, self.hid_dim // self.n_heads).permute(0, 2, 1, 3) V = V.view(bsz, -1, self.n_heads, self.hid_dim // self.n_heads).permute(0, 2, 1, 3)
      # Q, K相乘除以scale,這是計(jì)算scaled dot product attention的第一步 energy = torch.matmul(Q, K.permute(0, 1, 3, 2)) / self.scale
      # 如果沒(méi)有mask,就生成一個(gè) if mask is not None: energy = energy.masked_fill(mask == 0, -1e10)
      # 然后對(duì)Q,K相乘的結(jié)果計(jì)算softmax加上dropout,這是計(jì)算scaled dot product attention的第二步: attention = self.do(torch.softmax(energy, dim=-1))
      # 第三步,attention結(jié)果與V相乘 x = torch.matmul(attention, V)
      # 最后將多頭排列好,就是multi-head attention的結(jié)果了 x = x.permute(0, 2, 1, 3).contiguous() x = x.view(bsz, -1, self.n_heads * (self.hid_dim // self.n_heads)) x = self.fc(x) return x

      測(cè)試結(jié)果符合預(yù)期:

      ## 構(gòu)造的 輸入第0維為batchquery = torch.rand(64,12,300)key = torch.rand(64,10,300)value= torch.rand(64,10,300)tran=MultiheadAttention(hid_dim=300, n_heads=6, dropout=0.1)tran(query, key, value).shape## output: torch.Size([64, 12, 300])

      2.4 使用位置編碼表示序列的順序

      將位置向量添加到詞嵌入中使得它們?cè)诮酉聛?lái)的運(yùn)算中,能夠更好地表達(dá)的詞與詞之間的距離(因?yàn)?Self-Attention 本身是并行的,沒(méi)有學(xué)習(xí)位置信息)。原始論文里描述了位置編碼的公式,使用了使用不同頻率的正弦和余弦,因?yàn)槿枪讲皇苄蛄虚L(zhǎng)度的限制,也就是可以對(duì)比之前遇到序列的更長(zhǎng)的序列進(jìn)行表示。

      2.5 Add&Norm(殘差模型)

      殘差模塊就是一個(gè)殘差連接,并且都跟隨著一個(gè)“層歸一化”步驟。其中Norm 指的是 Layer Normalization,在 torch 中也很方便調(diào)用。

      3. Bert

      Bert模型的定位是一個(gè)預(yù)訓(xùn)練模型,同等級(jí)的應(yīng)該是NNLM,Word2vec,Glove,GPT,還有ELMO。模型具體的解釋不是本文關(guān)注重點(diǎn),這里同樣采用簡(jiǎn)單概述。

      3.1 預(yù)訓(xùn)練模型分類

      • 非語(yǔ)言模型:Word2vec,Glove

      • 語(yǔ)言模型:GPT,NNLM,ELMO,Bert。

        其中NNLM是不考慮上下文(單向)的,而ELMO和Bert是考慮上下文(雙向)的模型。

      3.2 不同模型的建模

      3.2.1 NNLM

      其全稱為Nerual Network Language Model

      目標(biāo)函數(shù)為用前t-1個(gè)單詞,預(yù)測(cè)第t個(gè)單詞,即最大化:

      3.2.2 ELMO

      Elmo的全稱為Embedding from Language Models,ELMO是根據(jù)上下文單詞的語(yǔ)義去動(dòng)態(tài)調(diào)整單詞的Word Embedding表示,解決了多義詞的問(wèn)題,采用的機(jī)制為雙層雙向LSTM。

      目標(biāo)函數(shù)

      ELMo是分別以

      作為目標(biāo)函數(shù),獨(dú)立訓(xùn)練處兩個(gè)representation然后進(jìn)行拼接。

      詞的表示

      由于采用了雙層雙向LSTM,所以網(wǎng)絡(luò)中有三層Word Embedding,給予這三個(gè)Embedding中的每一個(gè)Embedding一個(gè)權(quán)重,這個(gè)權(quán)重可以學(xué)習(xí)得來(lái),根據(jù)各自權(quán)重累加求和,將三個(gè)Embedding整合成一個(gè)Embedding。

      理解:第一層LSTM學(xué)習(xí)到了句法信息,所以可以用這種方式解決一詞多義。

      ELMO兩階段過(guò)程

      • 第一個(gè)階段是語(yǔ)言模型進(jìn)行預(yù)訓(xùn)練;
      • 第二個(gè)階段是在做下游任務(wù)時(shí),從預(yù)訓(xùn)練網(wǎng)絡(luò)中提取對(duì)應(yīng)單詞的網(wǎng)絡(luò)各層的Word Embedding作為新特征補(bǔ)充到下游任務(wù)中。

      3.2.3 GPT

      GPT全稱為Generative Pre-Training,它和ELMO類似都使用了Transformer,但與ELMO不同的是采用了單向的語(yǔ)言模型,也即只采用單詞的上文來(lái)進(jìn)行預(yù)測(cè)。其余與ELMO幾乎一樣這里就不展開(kāi)介紹了。

      3.2.4 BERT

      BERT 在 GPT 的基礎(chǔ)上使用了雙向的Transformer block連接,為了適配多任務(wù)下的遷移學(xué)習(xí),BERT設(shè)計(jì)了更通用的輸入層和輸出層。

      BERT兩階段過(guò)程

      第一階段雙向語(yǔ)言模型預(yù)訓(xùn)練,第二階段采用具體任務(wù)Fine-tuning。

      目標(biāo)函數(shù)

      BERT預(yù)訓(xùn)練模型分為以下三個(gè)步驟:Embedding、Masked LM、Next Sentence Prediction

      Embedding

      這里的Embedding由三種Embedding求和而成:

      • Token Embeddings:是詞向量,第一個(gè)單詞是CLS標(biāo)志,可以用于之后的分類任務(wù)

      • Segment Embeddings:將句子分為兩段,用來(lái)區(qū)別兩種句子,因?yàn)轭A(yù)訓(xùn)練不光做LM還要做以兩個(gè)句子為輸入的分類任務(wù)

      • Position Embeddings:和之前文章中的Transformer不一樣,不是三角函數(shù)而是學(xué)習(xí)出來(lái)的

      Masked LM

      隨機(jī)mask每一個(gè)句子中15%的詞,用其上下文來(lái)做預(yù)測(cè)。采用非監(jiān)督學(xué)習(xí)的方法預(yù)測(cè)mask位置的詞。在這15%中,80%是采用[mask],10%是隨機(jī)取一個(gè)詞來(lái)代替mask的詞,10%保持不變。

      Next Sentence Prediction

      用A+B/C來(lái)作為樣本:選擇一些句子對(duì)A與B,其中50%的數(shù)據(jù)B是A的下一條句子,剩余50%的數(shù)據(jù)B是語(yǔ)料庫(kù)中隨機(jī)選擇的,學(xué)習(xí)其中的相關(guān)性,添加這樣的預(yù)訓(xùn)練的目的是目前很多NLP的任務(wù)比如QA和NLI都需要理解兩個(gè)句子之間的關(guān)系,從而能讓預(yù)訓(xùn)練的模型更好的適應(yīng)這樣的任務(wù)。

      Bert的優(yōu)缺點(diǎn)

      • Bert 對(duì)硬件資源的消耗巨大,大模型需要16個(gè)tpu,歷時(shí)四天;更大的模型需要64個(gè)tpu,歷時(shí)四天。
      • Bert 最大的亮點(diǎn)在于效果好及普適性強(qiáng),幾乎所有NLP任務(wù)都可以套用Bert這種兩階段解決思路,而且效果應(yīng)該會(huì)有明顯提升。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多