一、BERT是什麼?
BERT是Bidirectional Encoder Representations from Transformers的縮寫,是Google於2018年發布的一種預訓練語言模型。BERT利用了當前最先進的模型架構和預訓練方法,從而取得了在多項自然語言處理任務上的最新成果。
BERT模型的核心思想是預先在大規模的文本數據上進行訓練,學習出輸入語言序列的表示,再結合下游任務的監督信號對預先訓練的模型進行微調。BERT在處理各種自然語言處理任務時,具備比較強的通用性和適應性,可以處理不同長度、不同形式的輸入文本,同時還能夠捕捉到上下文信息,克服了傳統模型的許多缺陷。
以文本分類為例,BERT預訓練模型輸出的表示形式可以在上游任務中進行微調,使得模型能夠直接從句子中提取語義特徵,對文本進行分類。
二、BERT在上下文理解中的應用
BERT通過在大量的文本數據上進行預訓練,學習出了語言序列之間的上下文關係,從而可以更好地理解輸入文本的上下文信息,提高了模型的泛化能力。具體來說:
1、BERT可以更好地理解語言中的多義性,以句子相似度為例,如果兩個完全不同的句子語義相似,則BERT預訓練模型可以很好地處理這種情況,而傳統的模型則會將其解讀為兩個完全不同的句子。
from transformers import BertTokenizer, BertModel
import torch
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertModel.from_pretrained('bert-base-uncased')
text1 = "The quick brown fox jumps over the lazy dog."
text2 = "A quick brown fox jumps over the lazy dog."
encoded_dict1 = tokenizer(text1, return_tensors='pt')
encoded_dict2 = tokenizer(text2, return_tensors='pt')
with torch.no_grad():
output1 = model(encoded_dict1['input_ids'], encoded_dict1['attention_mask'])
output2 = model(encoded_dict2['input_ids'], encoded_dict2['attention_mask'])
cosine_sim = torch.nn.CosineSimilarity(dim=1, eps=1e-6)
score = cosine_sim(output1[1], output2[1])
print(score)
通過BERT預訓練模型,可以得到兩個句子的表示向量,再通過餘弦相似度計算這兩個句子的相似度,輸出相似度得分為0.9429,說明這兩個句子很相似。
2、BERT可以很好地處理輸入文本的上下文信息,例如利用BERT模型進行命名實體識別時,可以更好地捕捉到命名實體的上下文信息,從而提高識別效果。
from transformers import BertTokenizer, BertForTokenClassification
import torch
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForTokenClassification.from_pretrained('bert-base-uncased', num_labels=7)
text = "Harry Potter and the Deathly Hallows is a fantasy novel written by British author J. K. Rowling."
labels = ["","","","","B-MISC","I-MISC","I-MISC","I-MISC","","","","","","O","B-MISC","I-MISC","I-MISC","I-MISC","O","O","O","O","O","O","O","O","O"]
encoded_dict = tokenizer(text, return_tensors='pt')
labels = torch.tensor([tokenizer.convert_tokens_to_ids(labels)], dtype=torch.long)
with torch.no_grad():
output = model(encoded_dict['input_ids'], encoded_dict['attention_mask'])
predictions = torch.argmax(output.logits, dim=2)
print(predictions)
通過BERT預訓練模型,再微調命名實體識別模型,可以對輸入文本進行具體的命名實體識別,輸出結果為[0, 0, 0, 0, 4, 5, 6, 5, 0, 0, 0, 0, 0, 3, 4, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0],其中4、5、6表示“MISC”類型的命名實體。
三、BERT在文本分類中的應用
BERT在文本分類等任務中的應用,通常是預先訓練BERT模型,然後針對具體的場景完成模型的微調。輸入文本首先被編碼成token,經過BERT模型處理之後,輸出文本的向量表示,再通過softmax函數將向量轉化為概率值,得出最終的分類。
以情感分析為例:
from transformers import BertTokenizer, BertForSequenceClassification
import torch
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = BertForSequenceClassification.from_pretrained('bert-base-uncased', num_labels=2)
text = "I really enjoyed the movie, the story line was great!"
label = 1
encoded_dict = tokenizer(text, return_tensors='pt')
labels = torch.tensor([label], dtype=torch.long)
with torch.no_grad():
output = model(encoded_dict['input_ids'], encoded_dict['attention_mask'], labels=labels)
loss, logits = output[:2]
logits = logits.detach().cpu().numpy()
print(logits)
通過以上代碼,可以對輸入的文本進行情感分析,輸出該文本為正面評價的概率為0.9954。
四、BERT實現機器翻譯的應用
BERT也可以應用於機器翻譯,通過對源語言和目標語言句子對進行訓練,達到了與最先進的機器翻譯模型效果相近的水平。
首先準備訓練數據,使用的是中英文平行語料庫。
import torch
from torchtext.legacy.data import Field, TabularDataset, BucketIterator
import pandas as pd
from googletrans import Translator
translator = Translator()
def translate_text(x):
return translator.translate(x, dest='en').text
df = pd.read_csv('./cn_en.csv')
df['source'] = df['source'].apply(translate_text)
df.to_csv('./tmp.csv', index=False)
SRC = Field(tokenize = 'spacy',
tokenizer_language='en',
init_token = '',
eos_token = '',
lower = True,
batch_first = True)
TRG = Field(tokenize = 'spacy',
tokenizer_language='cn',
init_token = '',
eos_token = '',
lower = True,
batch_first = True)
fields = [('source', SRC), ('target', TRG)]
train_data = TabularDataset(path='./tmp.csv', format='csv', fields=fields)
train_data, valid_data = train_data.split(split_ratio=0.8, random_state=random.seed(SEED))
通過以上代碼,完成了中英文平行語料庫的準備和翻譯。
接下來,使用BERT模型來訓練機器翻譯模型。
import torch.nn as nn
class Transformer(nn.Module):
def __init__(self, input_dim, output_dim, hid_dim, n_layers, n_heads, pf_dim, dropout):
super().__init__()
self.tok_embedding = nn.Embedding(input_dim, hid_dim)
self.pos_embedding = nn.Embedding(1000, hid_dim)
self.layers = nn.ModuleList([EncoderLayer(hid_dim, n_heads, pf_dim, dropout) for _ in range(n_layers)])
self.fc_out = nn.Linear(hid_dim, output_dim)
self.dropout = nn.Dropout(dropout)
self.scale = torch.sqrt(torch.FloatTensor([hid_dim])).to(device)
def forward(self, src):
batch_size = src.shape[0]
src_len = src.shape[1]
pos = torch.arange(0, src_len).unsqueeze(0).repeat(batch_size, 1).to(device)
src = self.dropout((self.tok_embedding(src) * self.scale) + self.pos_embedding(pos))
for layer in self.layers:
src = layer(src)
output = self.fc_out(src[:, -1, :])
return output
以上代碼中,使用的是Transformer模型,將源語言的文本輸入到BERT模型中,得到編碼輸出,之後再進行解碼,得到最終的目標語言文本。
建立完模型之後,使用預處理的中英文平行語料庫進行模型的訓練。
import torch.optim as optim
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
INPUT_DIM = len(SRC.vocab)
OUTPUT_DIM = len(TRG.vocab)
HID_DIM = 256
N_LAYERS = 3
N_HEADS = 8
PF_DIM = 512
DROPOUT = 0.1
model = Transformer(INPUT_DIM, OUTPUT_DIM, HID_DIM, N_LAYERS, N_HEADS, PF_DIM, DROPOUT)
optimizer = optim.Adam(model.parameters())
criterion = nn.CrossEntropyLoss(ignore_index=TRG.vocab.stoi[''])
model = model.to(device)
criterion = criterion.to(device)
for epoch in range(N_EPOCHS):
train_loss = train(model, train_data, optimizer, criterion)
valid_loss = evaluate(model, valid_data, criterion)
print(f'Epoch: {epoch+1:02} | Train Loss: {train_loss:.3f} | Val. Loss: {valid_loss:.3f}')
通過上述代碼進行訓練,可以得到轉化效果較好的機器翻譯模型。
五、BERT模型的優化策略
BERT模型在預訓練和微調過程中,存在許多的優化策略,這些優化方法能夠有效地提升模型的泛化能力。
1、Masked Language Model (MLM)預訓練方法:此方法在句子輸入時會將一些token替換為特殊的[MASK]標籤,模型最終要預測被替換掉的token。與其他預訓練方法相比,MLM不需要額外的標籤,可以處理許多不同種類的任務。
2、Next Sentence Prediction (NSP) 預訓練方法:該方法的目的是讓模型能夠理解兩個句子之間的關係,通過生成任務來對兩個句子之間的聯繫進行建模,從而促進模型語義的學習。
3、Fine-tuning 策略:對許多自然語言處理任務,特別是文本分類、情感分析等任務,BERT使用fine-tuning方法進行微調。這種方法可以通過最小化分類器的誤差來在下游任務中實現模型的優化。
六、總結
BERT作為一種先進的自然語言處理模型,獨樹一幟地使用了預訓練-微調的思路。其強大的上下文理解能力和通用性,使得BERT在各種自然語言處理任務中獲得了非常好的效果。未來,BERT的優化和改進仍需要結合更多實際應用場景,挖掘其更深層次的性能潛力。
原創文章,作者:GLYDX,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/351687.html
微信掃一掃
支付寶掃一掃