基於Python和TensorFlow實現BERT模型應用

华为云开发者联盟發表於2024-06-26

本文分享自華為雲社群《使用Python實現深度學習模型:BERT模型教程》,作者: Echo_Wish。

BERT(Bidirectional Encoder Representations from Transformers)是Google提出的一種用於自然語言處理(NLP)的預訓練模型。BERT透過雙向訓練Transformer,能夠捕捉到文字中詞語的上下文資訊,是NLP領域的一個里程碑。

在本文中,我們將詳細介紹BERT模型的基本原理,並使用Python和TensorFlow實現一個簡單的BERT模型應用。

1. BERT模型簡介

1.1 Transformer模型複習

BERT基於Transformer架構。Transformer由編碼器(Encoder)和解碼器(Decoder)組成,但BERT只使用編碼器部分。編碼器的主要元件包括:

多頭自注意力機制(Multi-Head Self-Attention):計算序列中每個位置對其他位置的注意力分數。
前饋神經網路(Feed-Forward Neural Network):對每個位置的表示進行獨立的非線性變換。

1.2 BERT的預訓練與微調

BERT的訓練分為兩步:

預訓練(Pre-training):在大規模語料庫上進行無監督訓練,使用兩個任務:
  • 遮蔽語言模型(Masked Language Model, MLM):隨機遮蔽輸入文字中的一些詞,並要求模型預測這些被遮蔽的詞。
  • 下一句預測(Next Sentence Prediction, NSP):給定句子對,預測第二個句子是否是第一個句子的下文。
微調(Fine-tuning):在特定任務上進行有監督訓練,如分類、問答等。

2. 使用Python和TensorFlow實現BERT模型

2.1 安裝依賴

首先,安裝必要的Python包,包括TensorFlow和Transformers(Hugging Face的庫)。

pip install tensorflow transformers

2.2 載入預訓練BERT模型

我們使用Hugging Face的Transformers庫載入預訓練的BERT模型和對應的分詞器(Tokenizer)。

import tensorflow as tf
from transformers import BertTokenizer, TFBertModel

# 載入預訓練的BERT分詞器和模型
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
model = TFBertModel.from_pretrained('bert-base-uncased')

2.3 資料預處理

我們將使用一個簡單的句子分類任務作為示例。假設我們有以下資料:

sentences = ["I love machine learning.", "BERT is a powerful model.", "I enjoy studying AI."]
labels = [1, 1, 1]  # 假設1表示積極,0表示消極

我們需要將句子轉換為BERT輸入格式,包括輸入ID、注意力掩碼等。

# 將句子轉換為BERT輸入格式
input_ids = []
attention_masks = []

for sentence in sentences:
    encoded_dict = tokenizer.encode_plus(
                        sentence,                      # 輸入文字
                        add_special_tokens = True,     # 新增特殊[CLS]和[SEP]標記
                        max_length = 64,               # 填充和截斷長度
                        pad_to_max_length = True,
                        return_attention_mask = True,  # 返回注意力掩碼
                        return_tensors = 'tf'          # 返回TensorFlow張量
                   )
    
    input_ids.append(encoded_dict['input_ids'])
    attention_masks.append(encoded_dict['attention_mask'])

input_ids = tf.concat(input_ids, axis=0)
attention_masks = tf.concat(attention_masks, axis=0)
labels = tf.convert_to_tensor(labels)

2.4 構建BERT分類模型

我們在預訓練的BERT模型基礎上新增一個分類層。

from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Model

class BertClassifier(Model):
    def __init__(self, bert):
        super(BertClassifier, self).__init__()
        self.bert = bert
        self.dropout = tf.keras.layers.Dropout(0.3)
        self.classifier = Dense(1, activation='sigmoid')

    def call(self, input_ids, attention_mask):
        outputs = self.bert(input_ids, attention_mask=attention_mask)
        pooled_output = outputs[1]
        pooled_output = self.dropout(pooled_output)
        return self.classifier(pooled_output)

# 例項化BERT分類模型
bert_classifier = BertClassifier(model)

2.5 編譯和訓練模型

編譯模型並進行訓練。

# 編譯模型
optimizer = tf.keras.optimizers.Adam(learning_rate=2e-5)
loss = tf.keras.losses.BinaryCrossentropy()
metric = tf.keras.metrics.BinaryAccuracy()

bert_classifier.compile(optimizer=optimizer, loss=loss, metrics=[metric])

# 訓練模型
bert_classifier.fit([input_ids, attention_masks], labels, epochs=3, batch_size=2)

2.6 評估模型

訓練完成後,我們可以對新資料進行預測。

# 預測新句子
new_sentences = ["AI is fascinating.", "I dislike machine learning."]
new_input_ids = []
new_attention_masks = []

for sentence in new_sentences:
    encoded_dict = tokenizer.encode_plus(
                        sentence,
                        add_special_tokens = True,
                        max_length = 64,
                        pad_to_max_length = True,
                        return_attention_mask = True,
                        return_tensors = 'tf'
                   )
    
    new_input_ids.append(encoded_dict['input_ids'])
    new_attention_masks.append(encoded_dict['attention_mask'])

new_input_ids = tf.concat(new_input_ids, axis=0)
new_attention_masks = tf.concat(new_attention_masks, axis=0)

# 進行預測
predictions = bert_classifier.predict([new_input_ids, new_attention_masks])
print(predictions)

3. 總結

在本文中,我們詳細介紹了BERT模型的基本原理,並使用Python和TensorFlow實現了一個簡單的BERT分類模型。透過本文的教程,希望你能夠理解BERT模型的工作原理和實現方法,並能夠應用於自己的任務中。隨著對BERT模型的理解加深,你可以嘗試實現更復雜的任務,如問答系統、命名實體識別等。

點選關注,第一時間瞭解華為雲新鮮技術~

相關文章