本文分享自華為雲社群《使用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):給定句子對,預測第二個句子是否是第一個句子的下文。
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模型的理解加深,你可以嘗試實現更復雜的任務,如問答系統、命名實體識別等。
點選關注,第一時間瞭解華為雲新鮮技術~