雖然說是QA機器人,但其實就是用BERT做一個分類器而已 😆
使用環境與套件
Python 3.6
PyTorch 1.3
huggingface/transformers
BERT Input
先複習一下BERT輸入

也就是說BERT的輸入是由三個Embeddings組成
Token Embeddings
Token Embeddings有兩種丟法
第一種是如上方圖片所示,是一個具有上下文關係的輸入:
my dog is cute,he likes playing
之後經過WordPiece方法處理,並且插入一些特殊標記符號
[CLS]與[SEP],前者表示輸入的開始,後者表示前後語句分割的標記
所以我們得到了
[CLS] my dog is cute[SEP]he likes play ##ing [SEP]
第二種是僅有單句輸入(依你的下游任務而定)
[CLS] SENTENCE [SEP]
到這裡就完成了Token Embeddings的部分
Segment Embeddings
Segment Embeddings 是為了讓BERT理解上下文之間的關係,在 huggingface/Transformers 中 A 句使用0,B 句使用 1
以 [CLS] my dog is cute[SEP]he likes play ##ing [SEP] 舉例我們的 Segment Embeddings應該長這樣:
0 0 0 0 0 0 1 1 1 1 1
Postition Embeddings
這邊是讓BERT去學習位置關係,會在學習的時候產生,基本上全給 1 做初始化即可:
1 1 1 1 1 1 1 1 1 1 1
若是需要補足訓練批次長度補剩餘0即可
使用資料集
https://raw.githubusercontent.com/p208p2002/taipei-QA-BERT/master/Taipei_QA_new.txt

資料筆數:7986
總類別數:149
BertTokenizer
了解了輸入與資料格集,準備把資料集轉換成BERT輸入
我們可以使用 Transformers 提供的 BertTokenizer 幫助我們完成 Token Embeddings
# 實例 BertTokenizer # 這邊的詞表使用英文的 bert-base-uncased-vocab # 若目標是中文,則需使用 bert-base-chinese-vocab from transformers import BertTokenizer tokenizer = BertTokenizer(vocab_file='bert-base-uncased-vocab.txt')
# 轉換成 WordPiece STR_INPUT = "what’re you doing" tokenizer.tokenize(STR_INPUT) # ['what', '’', 're', 'you', 'doing']
# 轉換成 WordPiece 對應的 id WORD_PIECE_STRING = ['what', '’', 're', 'you', 'doing'] tokenizer.convert_tokens_to_ids(WORD_PIECE_STRING) # [2054, 1521, 2128, 2017, 2725]
# 插入[CLS]與[SEP] # 有AB句 tokenizer.build_inputs_with_special_tokens(SENTENCE_A, SENTENCE_ B) # 只有A句 tokenizer.build_inputs_with_special_tokens(SENTENCE_A)