日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【NLP】通俗讲解从Transformer到BERT模型!

發布時間:2025/3/8 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【NLP】通俗讲解从Transformer到BERT模型! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作者:陳鍇,中山大學??張澤,華東師范大學??

近兩年來,Bert模型非常受歡迎,大部分人都知道Bert,但卻不明白具體是什么。一句話概括來講:BERT的出現,徹底改變了預訓練產生詞向量和下游具體NLP任務的關系,提出龍骨級的訓練詞向量概念。

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

1. Attention

在學會 Transformer 和 Bert 之前,我們需要理解Attention和Self-Attention機制。Attention的本質是要找到輸入的feature的權重分布,這個feature在某一個維度有一個長度的概念,如果我們輸入一個長為 n 的 feature,那么 Attention 就要學習一個長為 n 的分布權重,這個權重是由相似度計算出來的,最后返回的得分就將會是權重與feature的加權和。

1.1 Attention的計算過程

Attention的輸入是Q,K,V,返回的是一個socre,計算公式如下:

需要注意的是上述公式的下標位置,顯然我們需要學習的權重分布是?,而和相關,就是我們希望去被找到權重的feature。

1.1.1 QKV 英文名字的含義

  • Q 即為英文中 Query 是指:被查詢的序列,可以看到在每次計算相似度的過程中,Q在計算中是一直保持著整體的狀態。

  • K 即為英文中 Key 是指:被查詢的索引,我們學習到的權重分布A 長度為n,那么A中每一個下標的大小,就代表了對應索引被分配到的權重。所以這個K,控制的是索引。

  • V 即為英文中的 Value 是指:值,也就是我們feature 本身的值,他要去和權重分布做加權和來得到最終的分布。

1.1.2 相似度的計算方式

這里相似度的計算方式有很多種:

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

1.2 HAN中的Attention

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

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

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

1.3 seq2seq中的Attention

我們來看 seq2seq 中的 Attention 機制,在這個任務中我們需要一步一步的生成,,我們會根據每一步生成的(實際是一個分布),找到對應的單詞。

我們的生成公式為:

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

在 seq2seq模型中,我們把輸入Encoder 生成的值記為?,我們需要學習關于?的權重分布,所以?即為這里 Value,而這里的 Key 也是?他自己,他沒有像 HAN 中一樣做變換,我們每一次要查詢的 Query 是已經生成的序列?,也即為 Decoder 中生成的值 ,顯然隨著每次生成的變化這個被查詢的?會變長。這樣,由我們的?就能生成出最后的。

2. Transformer

Transformer改進了RNN最被人詬病的訓練慢的缺點,利用self-attention機制實現快速并行

2.1 Self-Attention

在 Transformer 中我們要用到的 Attention 方式是 Self-Attention,它與之前的 Attention 有些許的不同。簡單的來說,它通過學習三個參數,來對同一個embedding之后的feature 進行轉換,將他線性轉換成Q、K、V?之后計算出這句話的 Attention 得分。名字中的Self 體現的是所有的Q、K、V?都是由輸入自己生成出來的。

歸一化:權重分布在歸一化前,要除以輸入矩陣的第一維開根號,這會讓梯度更穩定。這里也可以使用其它值,8只是默認值,再進行softmax。

返回:這里返回的值和輸入的長度維度是一樣的,每一個單詞對應的輸出是所有單詞對于當前單詞的權重分布與Value得分的加權和。所以他有多少個單詞,就做了多少次Attention 得分,這就是self-Attention 。

2.2 模型結構

  • 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 結構,K和V 為Encoder頂層的output。

2.3 Multi-headed attention(多頭怪)

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

需要注意的是 Decoder 端的多頭 self-attention 需要做mask,因為它在預測時,是“看不到未來的序列的”,所以要將當前預測的單詞(token)及其之后的單詞(token)全部mask掉。使用多頭機制可以理解為CNN中同時使用多個卷積核。

代碼實現在pytorch中很簡單,直接調包即可:第0維是長度,第一維是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])

可以考慮實現一個第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_headsassert 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,這是計算scaled dot product attention的第一步 energy = torch.matmul(Q, K.permute(0, 1, 3, 2)) / self.scale# 如果沒有mask,就生成一個 if mask is not None: energy = energy.masked_fill(mask == 0, -1e10)# 然后對Q,K相乘的結果計算softmax加上dropout,這是計算scaled dot product attention的第二步: attention = self.do(torch.softmax(energy, dim=-1))# 第三步,attention結果與V相乘 x = torch.matmul(attention, V)# 最后將多頭排列好,就是multi-head attention的結果了 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

測試結果符合預期:

## 構造的 輸入第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 使用位置編碼表示序列的順序

將位置向量添加到詞嵌入中使得它們在接下來的運算中,能夠更好地表達的詞與詞之間的距離(因為 Self-Attention 本身是并行的,沒有學習位置信息)。原始論文里描述了位置編碼的公式,使用了使用不同頻率的正弦和余弦,因為三角公式不受序列長度的限制,也就是可以對比之前遇到序列的更長的序列進行表示。

2.5 Add&Norm(殘差模型)

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

3. Bert

Bert模型的定位是一個預訓練模型,同等級的應該是NNLM,Word2vec,Glove,GPT,還有ELMO。模型具體的解釋不是本文關注重點,這里同樣采用簡單概述。

3.1 預訓練模型分類

  • 非語言模型:Word2vec,Glove

  • 語言模型:GPT,NNLM,ELMO,Bert。

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

3.2 不同模型的建模

3.2.1 NNLM

其全稱為Nerual Network Language Model

目標函數為用前t-1個單詞,預測第t個單詞,即最大化:

3.2.2 ELMO

Elmo的全稱為Embedding from Language Models,ELMO是根據上下文單詞的語義去動態調整單詞的Word Embedding表示,解決了多義詞的問題,采用的機制為雙層雙向LSTM。

目標函數

ELMo是分別以

作為目標函數,獨立訓練處兩個representation然后進行拼接。

詞的表示

由于采用了雙層雙向LSTM,所以網絡中有三層Word Embedding,給予這三個Embedding中的每一個Embedding一個權重,這個權重可以學習得來,根據各自權重累加求和,將三個Embedding整合成一個Embedding。

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

ELMO兩階段過程

  • 第一個階段是語言模型進行預訓練;

  • 第二個階段是在做下游任務時,從預訓練網絡中提取對應單詞的網絡各層的Word Embedding作為新特征補充到下游任務中。

3.2.3 GPT

GPT全稱為Generative Pre-Training,它和ELMO類似都使用了Transformer,但與ELMO不同的是采用了單向的語言模型,也即只采用單詞的上文來進行預測。其余與ELMO幾乎一樣這里就不展開介紹了。

3.2.4 BERT

BERT 在 GPT 的基礎上使用了雙向的Transformer block連接,為了適配多任務下的遷移學習,BERT設計了更通用的輸入層和輸出層。

BERT兩階段過程

第一階段雙向語言模型預訓練,第二階段采用具體任務Fine-tuning。

目標函數

BERT預訓練模型分為以下三個步驟:Embedding、Masked LM、Next Sentence Prediction

Embedding

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

  • Token Embeddings:是詞向量,第一個單詞是CLS標志,可以用于之后的分類任務

  • Segment Embeddings:將句子分為兩段,用來區別兩種句子,因為預訓練不光做LM還要做以兩個句子為輸入的分類任務

  • Position Embeddings:和之前文章中的Transformer不一樣,不是三角函數而是學習出來的

Masked LM

隨機mask每一個句子中15%的詞,用其上下文來做預測。采用非監督學習的方法預測mask位置的詞。在這15%中,80%是采用[mask],10%是隨機取一個詞來代替mask的詞,10%保持不變。

Next Sentence Prediction

用A+B/C來作為樣本:選擇一些句子對A與B,其中50%的數據B是A的下一條句子,剩余50%的數據B是語料庫中隨機選擇的,學習其中的相關性,添加這樣的預訓練的目的是目前很多NLP的任務比如QA和NLI都需要理解兩個句子之間的關系,從而能讓預訓練的模型更好的適應這樣的任務。

Bert的優缺點

  • Bert 對硬件資源的消耗巨大,大模型需要16個tpu,歷時四天;更大的模型需要64個tpu,歷時四天。

  • Bert 最大的亮點在于效果好及普適性強,幾乎所有NLP任務都可以套用Bert這種兩階段解決思路,而且效果應該會有明顯提升。

往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯獲取一折本站知識星球優惠券,復制鏈接直接打開:https://t.zsxq.com/662nyZF本站qq群1003271085。加入微信群請掃碼進群(如果是博士或者準備讀博士請說明):

總結

以上是生活随笔為你收集整理的【NLP】通俗讲解从Transformer到BERT模型!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。