BERT模型在自然語言處理中的應用

一、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
GLYDX的頭像GLYDX
上一篇 2025-02-17 17:02
下一篇 2025-02-17 17:04

相關推薦

  • TensorFlow Serving Java:實現開發全功能的模型服務

    TensorFlow Serving Java是作為TensorFlow Serving的Java API,可以輕鬆地將基於TensorFlow模型的服務集成到Java應用程序中。…

    編程 2025-04-29
  • Python訓練模型後如何投入應用

    Python已成為機器學習和深度學習領域中熱門的編程語言之一,在訓練完模型後如何將其投入應用中,是一個重要問題。本文將從多個方面為大家詳細闡述。 一、模型持久化 在應用中使用訓練好…

    編程 2025-04-29
  • ARIMA模型Python應用用法介紹

    ARIMA(自回歸移動平均模型)是一種時序分析常用的模型,廣泛應用於股票、經濟等領域。本文將從多個方面詳細闡述ARIMA模型的Python實現方式。 一、ARIMA模型是什麼? A…

    編程 2025-04-29
  • Python實現一元線性回歸模型

    本文將從多個方面詳細闡述Python實現一元線性回歸模型的代碼。如果你對線性回歸模型有一些了解,對Python語言也有所掌握,那麼本文將對你有所幫助。在開始介紹具體代碼前,讓我們先…

    編程 2025-04-29
  • VAR模型是用來幹嘛

    VAR(向量自回歸)模型是一種經濟學中的統計模型,用於分析並預測多個變量之間的關係。 一、多變量時間序列分析 VAR模型可以對多個變量的時間序列數據進行分析和建模,通過對變量之間的…

    編程 2025-04-28
  • 如何使用Weka下載模型?

    本文主要介紹如何使用Weka工具下載保存本地機器學習模型。 一、在Weka Explorer中下載模型 在Weka Explorer中選擇需要的分類器(Classifier),使用…

    編程 2025-04-28
  • Python實現BP神經網絡預測模型

    BP神經網絡在許多領域都有着廣泛的應用,如數據挖掘、預測分析等等。而Python的科學計算庫和機器學習庫也提供了很多的方法來實現BP神經網絡的構建和使用,本篇文章將詳細介紹在Pyt…

    編程 2025-04-28
  • Python AUC:模型性能評估的重要指標

    Python AUC是一種用於評估建立機器學習模型性能的重要指標。通過計算ROC曲線下的面積,AUC可以很好地衡量模型對正負樣本的區分能力,從而指導模型的調參和選擇。 一、AUC的…

    編程 2025-04-28
  • 量化交易模型的設計與實現

    本文將從多個方面對量化交易模型進行詳細闡述,並給出對應的代碼示例。 一、量化交易模型的概念 量化交易模型是一種通過數學和統計學方法對市場進行分析和預測的手段,可以幫助交易者進行決策…

    編程 2025-04-27
  • Morphis: 更加簡便、靈活的自然語言處理工具

    本文將會從以下幾個方面對Morphis進行詳細的闡述: 一、Morphis是什麼 Morphis是一個開源的Python自然語言處理庫,用於處理中心語言(目前僅支持英文)中的詞性標…

    編程 2025-04-27

發表回復

登錄後才能評論