一、BERT原理
BERT取名來自 Bidirectional Encoder Representations from Transformers,架構為:預訓練 + fine-tuning(對于特定的任務只需要添加一個輸出層), 1、引言 通過預訓練語言模型可顯著提高NLP下游任務,限制模型潛力的主要原因在于現有模型使用的都是單向的語言模型,無法充分了解到單詞所在的背景關系結構, 受完形填空的啟發,BERT通過使用 “Masked Language Model” 的預訓練目標來緩解單向語言模型的約束, 首先 “Masked Language Model” 會隨機屏蔽(masked)15%的token,然后讓模型根據背景關系來預測被Mask的token(被Mask的變成了標簽),具體,將masked token 位置輸出的最終隱層向量送入softmax,來預測masked token, 此外, “Next sentence prediction” 的任務預訓練文本對,將 token-level 提升到 sentence-level,以應用不同種類的下游任務, 2、BERT模型 BERT:pre-training 和 fine-tuning,兩階段的步驟,- pre-training 階段,BERT 在無標記的資料上進行無監督學習;
- fine-tuning 階段,BERT利用預訓練的引數初始化模型,并利用下游任務標記好的資料進行有監督學習,并對所有引數進行微調,
2.1、模型架構
BERT 是由多層雙向的 Transformer Encoder 結構組成,區別于 GPT 的單向的 Transformer Decoder 架構,
BERT_BASE (L=12, H=768, A=12, Total Parameters=110M) and BERTLARGE (L=24, H=1024, A=16, Total Parameters=340M),
2.2、輸入
為了能應對下游任務,BERT 給出了 sentence-level 級別的 Representation,包括句子和句子對,在 BERT 中 sequence 并不一定是一個句子,也有可能是任意的一段連續的文本;而句子對主要是因為類似 QA 問題,
BERT 的輸入:
分為三塊:Token Embeddings、Segment Embeddings 和 Position Embeddings
- Token Embeddings 采用的 WordPiece Embedding,共有 30000 個 token,每個 sequence 會以一個特殊的 classi?cation token [CLS] 開始,同時這也會作為分類任務的輸出;句子間會以 special seperator token [SEP] 進行分割,
- WordPiece Embedding:n-gram 字符級 Embedding,采用 BPE 雙位元組編碼,可以將單詞拆分,比如 “loved” “loving” ”loves“ 會拆分成 “lov”,“ed”,“ing”,“es”,
- Segment Embedding也可以用來分割句子,但主要用來區分句子對,Embedding A 和 Embedding B 分別代表左右句子,如果是普通的句子就直接用 Embedding A,
- Position Embedding 是用來給單詞定位的,學習出來的embedding向量,這與Transformer不同,Transformer中是預先設定好的值,
- 80% 的 [MASK] token 會繼續保持 [MASK];—my dog is [MASK]
- 10% 的 [MASK] token 會被隨機的一個單詞取代;my dog is apple
- 10% 的 [MASK] token 會保持原單詞不變(但是還是要預測)my dog is hairy
- 在 encoder 的輸出上添加一個前饋神經網路,將其轉換為詞匯的維度
- softmax 計算詞匯表中每個單詞的概率
- B有一半的幾率是A的下一句,即正例;
- B有一半的幾率是隨機取一個句子作為負例,
- 1. 在分類任務中,例如情感分析等,只需要在 Transformer 的輸出之上加一個分類層
- 2. 在QA任務中,問答系統需要接收有關文本序列的 question,并且需要在序列中標記 answer, 可以使用 BERT 學習兩個標記 answer 開始和結尾的向量來訓練Q&A模型,
- 3. 在命名物體識別(NER)中,系統需要接收文本序列,標記文本中的各種型別的物體(人員,組織,日期等), 可以用 BERT 將每個 token 的輸出向量送到預測 NER 標簽的分類層,

- a、b 是 sentence-level 級別的任務,類似句子分類,情感分析等等,輸入句子或句子對,在 [CLS] 位置接入 Softmax 輸出 Label;
- c是token-level級別的任務,比如 QA 問題,輸入問題和段落,在 Paragraph 對應輸出的 hidden vector 后接上兩個 Softmax 層,分別訓練出 Span 的 Start index 和 End index(連續的 Span)作為 Question 的答案;
- d也是token-level級別的任務,比如命名物體識別問題,接上 Softmax 層即可輸出具體的分類,
生成
3. 結論
BERT采用Pre-training和Fine-tuning兩階段訓練任務(源于GPT),在Pre-training階段使用多層雙向Transformer Encoder進行訓練,并采用Masked LM 和 Next Sentence Prediction兩種訓練任務解決 token-level 和 sentence-level 的問題,為下游任務提供了一個通用的模型框架;在 Fine-tuning 階段會針對具體 NLP 任務進行微調以適應不同種類的任務需求,并通過端到端的訓練更新引數從而得到最終的模型,
BERT優點:
Transformer Encoder因為有Self-attention機制,因此BERT自帶雙向功能因為雙向功能以及多層Self-attention機制的影響,使得BERT必須使用Cloze版的語言模型Masked-LM來完成token級別的預訓練為了獲取比詞更高級別的句子級別的語意表征,
BERT加入了Next Sentence Prediction來和Masked-LM一起做聯合訓練為了適配多任務下的遷移學習,BERT設計了更通用的輸入層和輸出層微調成本小
BERT缺點:
- [MASK]標記在實際預測中不會出現,訓練時用過多[MASK]影響模型表現;
- 每個batch只有15%的token被預測,所以BERT收斂得比left-to-right模型要慢(它們會預測每個token);
- BERT對硬體資源的消耗巨大,
二、BERT答疑
1、三個Embedding怎么來的 在BERT中,Token,Position,Segment Embeddings 都是通過學習來得到的,pytorch代碼中它們是這樣的: self.word_embeddings = Embedding(config.vocab_size, config.hidden_size) self.position_embeddings = Embedding(config.max_position_embeddings, config.hidden_size) self.token_type_embeddings = Embedding(config.type_vocab_size, config.hidden_size) BERT 能夠處理對輸入句子對的分類任務,這類任務就像判斷兩個文本是否是語意相似的,句子對中的兩個句子被簡單的拼接在一起后送入到模型中, 那BERT如何去區分一個句子對中的兩個句子呢?答案就是segment embeddings.
https://www.cnblogs.com/d0main/p/10447853.html#token-embeddings
2、不考慮多頭的原因,self-attention中詞向量不乘QKV引數矩陣,會有什么問題?
Self-Attention的核心是用文本中的其它詞來增強目標詞的語意表示,從而更好的利用背景關系的資訊,
self-attention中,sequence中的每個詞都會和sequence中的每個詞做點積去計算相似度,也包括這個詞本身,
3、為什么BERT選擇mask掉15%這個比例的詞,可以是其他的比例嗎?
BERT采用的Masked LM,會選取語料中所有詞的15%進行隨機mask,
論文表示受到完形填空任務的啟發,但其實與CBOW也有異曲同工之妙, 從CBOW的角度,有一個比較好的解釋是:在一個大小為 的視窗中隨機選一個詞,類似CBOW中滑動視窗的中心詞,區別是這里的滑動視窗是非重疊的, 那從CBOW的滑動視窗角度,10%~20%都是還ok的比例,
4、為什么BERT在第一句前會加一個[CLS]標志?

BERT在第一句前會加一個CLS]標志,最后一層該位對應向量可以作為整句話的語意表示,從而用于下游的分類任務等,與文本中已有的其它詞相比,這個無明顯語意資訊的符號會更“公平”地融合文本中各個詞的語意資訊,從而更好的表示整句話的語意
5、Self-Attention 的時間復雜度是怎么計算的? O(n^2 d) 相加的 6、Transformer在哪里做了權重共享,為什么可以做權重共享? Transformer在兩個地方進行了權重共享: (1)Encoder和Decoder間的Embedding層權重共享; (2)Decoder中Embedding層和FC層權重共享, 解碼的詞,要有embedding,同時也可作為分類器權重,,Embedding層可以說是通過onehot去取到對應的embedding向量,FC層可以說是相反的,通過向量(定義為 x)去得到它可能是某個詞的softmax概率,取概率最大, FC層的每一行量級相同的前提下,理論上和 x 相同的那一行對應的點積和softmax概率會是最大的(內積), 通過這樣的權重共享可以減少引數的數量,加快收斂, 7、BERT非線性的來源在哪里? 前饋層的gelu激活函式和self-attention,self-attention是非線性的,感謝評論區指出, 8. BERT引數 https://blog.csdn.net/weixin_43922901/article/details/102602557 Bert采用的vocab_size=30522,hidden_size=768,max_position_embeddings=512 LN引數,gamma和beta的維度均為768,因此總引數為768 * 2 + 768 * 2 * 2 * 12(層數) 模型引數Bert模型的版本如下: BERT-Base, Uncased: 12-layer, 768-hidden, 12-heads, 110M parameters BERT-Large, Uncased: 24-layer, 1024-hidden, 16-heads, 340M parameters三、BERT調包和微調
BERT有兩個約束條件,- 1. 所有的句子必須被填充或截斷成一個固定的長度,
- 2. 最大的句子長度是512個tokens,
"注意力遮蓋"只是一個1和0的陣列,表示哪些標記是padding,哪些不是,
這個掩碼告訴BERT中的"自我關注"機制,不要將這些pad標記納入它對句子的解釋中,
(還有點類似Decoder,不過這是為了對其句子用,而不是為了自回歸)
不過,最大長度確實會影響訓練和評估速度,例如,用特斯拉K80,
MAX_LEN = 128 --> 訓練一個 epoch 需要 5:28
MAX_LEN = 64 --> 訓練一個 epoch 需要 2:57,
現在我們準備好執行真正的 tokenization 了,tokenizer.encode_plus函式為我們結合了多個步驟,
- 將句子分割成token,
- 添加特殊的[CLS]和[SEP]標記,
- 將這些標記映射到它們的ID上,
- 把所有的句子都墊上或截斷成相同的長度,
- 創建注意力Masl,明確區分真實 token 和[PAD]token,
- BertModel
- BertForPreTraining
- BertForMaskedLM
- BertForNextSentencePrediction(下句預測)
- BertForSequenceClassification - 我們將使用的那個,
- BertForTokenClassification
- BertForQuestionAnswering
from transformers import BertForSequenceClassification, AdamW, BertConfig
# Load BertForSequenceClassification, the pretrained BERT model with a single
# linear classification layer on top.
model = BertForSequenceClassification.from_pretrained(
"bert-base-uncased", # Use the 12-layer BERT model, with an uncased vocab.
num_labels = 2, # The number of output labels--2 for binary classification.
# You can increase this for multi-class tasks.
output_attentions = False, # Whether the model returns attentions weights.
output_hidden_states = False, # Whether the model returns all hidden-states.
)
# Tell pytorch to run this model on the GPU.
model.cuda()
參考
- 用huggingface.transformers在文本分類任務(單任務和多任務場景下)上微調預訓練模型https://blog.csdn.net/PolarisRisingWar/article/details/127365675
- 比賽:Datawhale零基礎入門NLP賽事 - Task5 基于深度學習的文本分類https://tianchi.aliyun.com/notebook/118258
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/550214.html
標籤:其他
