掌握BERT:自然語言處理 (NLP) 從初級到高級的綜合指南
1. 什么是BERT?
在不斷發展的自然語言處理 (NLP) 領域,一項名為 BERT 的突破性創新已經出現,改變了游戲規則。BERT 代表 Bidirectional Encoder Representations from Transformers,不僅僅是機器學習術語海洋中的另一個首字母縮略詞。它代表了機器理解語言方式的轉變,使它們能夠理解使人類交流豐富而有意義的錯綜復雜的細微差別和上下文依賴關系。
2. 為什么BERT很重要?
想象一句話:“她拉小提琴的時候很漂亮。傳統的語言模型會從左到右處理這個句子,有可能忽略了小提琴(“violin”)本身會影響整個句子的解釋這一關鍵事實。然而BERT的機制能夠理解關鍵信息,單詞的上下文關系在派生意義方面起著關鍵作用。它抓住了雙向性的本質,使其能夠考慮圍繞每個單詞的完整上下文,從而徹底改變了語言理解的準確性和深度。
3. BERT是如何工作的?
BERT的核心是由一個強大的神經網絡架構(稱為 Transformers)提供支持的。這種架構采用了一種稱為自我注意的機制,允許 BERT 根據其上下文(包括前后)來權衡每個單詞的重要性。這種上下文感知使BERT能夠生成上下文的單詞嵌入,這些單詞嵌入是考慮單詞在句子中的含義的表示。這類似于BERT閱讀和重新閱讀句子以深入了解每個單詞的作用。
考慮這句話:“The 'lead' singer will 'lead' the band.”傳統模型可能會為“lead”這個詞的歧義而苦苦掙扎。然而,BERT 毫不費力地區分第一個 “lead” 是名詞,而第二個 “lead” 是動詞,展示了它在消除語言結構歧義方面的實力。
4. BERT預處理邏輯
Tokenization:將文本分成有意義的塊
想象一下,您正在教 BERT 閱讀一本書。你不會一次交出整本書;你會把它分成句子和段落。同樣,BERT 需要將文本分解為更小的單元,稱為標記。但這里有一個轉折點:BERT 使用 WordPiece Token。它將單詞拆分成更小的部分,例如將 “running” 轉換為 “run” 和 “ning”。這有助于處理棘手的單詞,并確保 BERT 不會在不熟悉的單詞中迷失方向。
原文:“ChatGPT is fascinating”。
WordPiece Token: [“chat”, “##G”, “##PT”, “is”, “fascinating”, “.”]
Input Formatting:為 BERT 提供上下文
BERT 能理解上下文。我們以 BERT 可以理解的方式處理tokens。我們在句子之間添加特殊標記,如 [CLS](代表分類),[SEP](代表分離)。我們還分配了segment embeddings來告訴 BERT 哪些token屬于哪個句子。
原文: “ChatGPT is fascinating.”
Formatted Tokens: [“[CLS]”, “Chat”, “##G”, “##PT”, “is”, “fascinating”, “.”, “[SEP]”]
Masked Language Model (MLM) 目標:BERT 上下文理解
BERT 的秘訣在于它能夠理解雙向上下文。在訓練過程中,一些單詞在句子中被掩蓋(替換為 [MASK]),BERT 學會從上下文中預測這些單詞。這有助于 BERT 掌握單詞在之前和之后如何相互關聯。
原文: “The cat is on the mat.”
Masked Sentence: “The [MASK] is on the mat.”
使用 Hugging Face Transformer 進行分詞
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
text = "BERT preprocessing is essential."
tokens = tokenizer.tokenize(text)
print(tokens)
5. 針對特定任務微調 BERT
BERT 有不同的風格,如 BERT-base、BERT-large 等。這些變體具有不同的模型大小和復雜性。選擇取決于任務要求和您擁有的資源。較大的模型可能性能更好,但它們也需要更多的計算能力。我們微調 BERT 的任務稱為 “下游任務”。包括情緒分析、命名實體識別等。微調涉及使用特定于任務的數據更新 BERT 的權重。有助于 BERT 專注于這些任務,且好處就是不需要從頭開始。
例如簡單使用 BERT 進行文本分類
from transformers import BertForSequenceClassification, BertTokenizer
import torch
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased')
text = "This movie was amazing!"
inputs = tokenizer(text, return_tensors='pt')
outputs = model(**inputs)
predictions = torch.argmax(outputs.logits, dim=1)
print(predictions)
6. BERT的注意力機制
Self-Attention: BERT對關鍵信息的把控
想象一下,怎么快速閱讀一本書并高亮最重要的那些單詞。對于 BERT,這種處理方式叫做自注意力機制,它會查看句子中的每個單詞,并根據它們的重要性決定應該對其他單詞給予多少關注。這樣,BERT 可以專注于相關單詞,即使它們在句子中相距很遠。
Multi-Head Attention: 多個注意力協同
BERT 不僅僅依賴于一個觀點,它使用多個“頭”的注意力。將這些 heads 想象成不同的專家,專注于句子的各個方面。這種多頭方法幫助 BERT 捕捉單詞之間的不同關系,使其理解更豐富、更準確。
可視化注意力權重
import torch
from transformers import BertModel, BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
text = "BERT's attention mechanism is fascinating."
inputs = tokenizer(text, return_tensors='pt', padding=True, truncatinotallow=True)
outputs = model(**inputs, output_attentinotallow=True)
attention_weights = outputs.attentions
print(attention_weights)
7. BERT的訓練過程
BERT從預訓練開始,從大量的文本數據中學習。想象一下,向 BERT 展示數百萬個句子,并讓它預測缺失的單詞。這個練習有助于 BERT 建立對語言模式和關系的堅實理解。在預訓練期間,BERT 會得到一些單詞被掩蓋(隱藏)的句子。然后,它嘗試根據周圍的上下文預測這些掩碼詞。這就像填空游戲,通過猜出缺失的單詞,BERT 了解單詞如何相互關聯,從而獲得其上下文的Embedding關系。BERT不僅能理解單詞;它抓住了句子的生成方向。在 NSP 目標中,BERT經過訓練來預測文本對中的一個句子是否緊跟下一個句子。這有助于BERT理解句子之間的邏輯聯系,使其成為理解段落和較長文本的大師。
8. BERT Embeddings
BERT 的強大之處在于它能夠以一種在特定上下文中捕獲其含義的方式表示單詞。
Word Embeddings vs. Contextual Word Embeddings
Word Embeddings比較常見,但BERT通過上下文理解更進一步生成Contextual Word Embeddings。BERT不是每個單詞只有一個含義,而是根據句子中的上下文為同一單詞創建不同的embedding。這樣,每個單詞的表示都更加微妙,并受到周圍內容的影響。
WordPiece Tokenization:更好處理復雜詞匯
BERT 的詞匯就像一個由稱為子詞的小塊組成的拼圖。它使用 WordPiece分詞將單詞分解為這些子詞。這對于處理長而復雜的單詞以及處理以前從未見過的單詞特別有用。
Positional Encodings: 引導句子結構
由于 BERT 以雙向方式讀取單詞,因此它需要知道每個單詞在句子中的位置。位置編碼被添加到Embedding中,以使 BERT 具有這種空間感知能力。這樣,BERT 不僅知道單詞的含義,還知道它們在句子中的位置。
使用 Hugging Face Transformer 提取單詞嵌入
from transformers import BertTokenizer, BertModel
import torch
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
text = "BERT embeddings are fascinating."
inputs = tokenizer(text, return_tensors='pt', padding=True, truncatinotallow=True, add_special_tokens=True)
outputs = model(**inputs)
word_embeddings = outputs.last_hidden_state
print(word_embeddings)
本文轉載自?? 沐白AI筆記??,作者: 楊沐白
