Pytorch | BERT模型實現,提供轉換指令碼【橫掃NLP】
源 | GitHub 編譯 | 肖琴 首發 | 新智元
《》,上週推送的這篇文章,全面解讀基於TensorFlow實現的BERT程式碼。現在,PyTorch使用者的福利來了:一個名為Hugging Face的團隊近日公開了BERT模型的谷歌官方TensorFlow庫的op-for-op PyTorch重新實現【點選閱讀原文直接訪問】:
https://github.com/huggingface/pytorch-pretrained-BERT
這個實現可以為BERT載入任何預訓練的TensorFlow checkpoint(特別是谷歌的官方預訓練模型),並提供一個轉換指令碼。
BERT-base和BERT-large
其結果如下:
在序列級MRPC分類任務上,該實現使用小型BERT-base模型再現了原始實現的84%-88%的準確率。
在token級的SQuAD 任務上,該個實現使用小型BERT-base模型再現了原始實現的88.52 F1的結果。
作者表示,正致力於在其他任務以及更大的BERT模型上重現結果。
BERT模型的PyTorch實現
這個儲存庫包含了谷歌BERT模型的官方TensorFlow儲存庫的op-for-op PyTorch重新實現。谷歌的官方儲存庫是與BERT論文一起釋出的:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding,作者是Jacob Devlin、Ming-Wei Chang、Kenton Lee和Kristina Toutanova。
這個實現可以為BERT載入任何預訓練的TensorFlow checkpoint(特別是谷歌的預訓練模型),並提供了一個轉換指令碼(見下文)。
此外,我們將在本週晚些時候新增多語言版本和中文版本的模型程式碼。
指令碼:載入任何TensorFlow檢查點
使用convert_tf_checkpoint_to_pytorch.py指令碼,你可以在PyTorch儲存檔案中轉換BERT的任何TensorFlow檢查點(尤其是谷歌釋出的官方預訓練模型)。
這個指令碼將TensorFlow checkpoint(以bert_model.ckpt開頭的三個檔案)和相關的配置檔案(bert_config.json)作為輸入,併為此配置建立PyTorch模型,從PyTorch模型的TensorFlow checkpoint載入權重並儲存生成的模型在一個標準PyTorch儲存檔案中,可以使用 torch.load() 匯入(請參閱extract_features.py,run_classifier.py和run_squad.py中的示例)。
只需要執行一次這個轉換指令碼,就可以得到一個PyTorch模型。然後,你可以忽略TensorFlow checkpoint(以bert_model.ckpt開頭的三個檔案),但是一定要保留配置檔案(bert_config.json)和詞彙表文件(vocab.txt),因為PyTorch模型也需要這些檔案。
要執行這個特定的轉換指令碼,你需要安裝TensorFlow和PyTorch。該庫的其餘部分只需要PyTorch。
下面是一個預訓練的BERT-Base Uncased 模型的轉換過程示例:
export BERT_BASE_DIR=/path/to/bert/uncased_L-12_H-768_A-12python convert_tf_checkpoint_to_pytorch.py --tf_checkpoint_path $BERT_BASE_DIR/bert_model.ckpt --bert_config_file $BERT_BASE_DIR/bert_config.json --pytorch_dump_path $BERT_BASE_DIR/pytorch_model.bin
你可以在這裡下載Google的預訓練轉換模型:
https://github.com/google-research/bert#pre-trained-models
BERT的PyTorch模型
在這個庫裡,我們提供了三個PyTorch模型,你可以在modeling.py中找到:
BertModel - 基本的BERT Transformer 模型
BertForSequenceClassification - 頂部帶有sequence classification head的BERT模型
BertForQuestionAnswering - 頂部帶有token classification head 的BERT模型,
以下是每類模型的一些細節。
1 . BertModel
BertModel是一個基本的BERT Transformer模型,包含一個summed token、位置和序列嵌入層,然後是一系列相同的self-attention blocks(BERT-base是12個blocks, BERT-large是24個blocks)。
輸入和輸出與TensorFlow 模型的輸入和輸出相同。
具體來說,該模型的輸入是:
input_ids:一個形狀為[batch_size, sequence_length]的torch.LongTensor,在詞彙表中包含單詞的token索引
token_type_ids:形狀[batch_size, sequence_length]的可選torch.LongTensor,在[0,1]中選擇token型別索引。型別0對應於句子A,型別1對應於句子B。
attention_mask:一個可選的torch.LongTensor,形狀為[batch_size, sequence_length],索引在[0,1]中選擇。
模型的輸出是由以下內容組成的一個元組:
all_encoder_layers:一個大小為[batch_size, sequence_length,hidden_size]的torch.FloatTensor列表,它是每個注意塊末端隱藏狀態的完整序列列表(即BERT-base的12個完整序列,BERT-large的24個完整序列)
pooled_output:一個大小為[batch_size, hidden_size]的torch.FloatTensor,它是在與輸入(CLF)的第一個字元相關聯的隱藏狀態之上預訓練的分類器的輸出,用於訓練Next-Sentence任務(參見BERT的論文)。
extract_features.py指令碼提供了有關如何使用這類模型的示例,該指令碼可用於為給定輸入提取模型的隱藏狀態。
2 . BertForSequenceClassification
BertForSequenceClassification是一個fine-tuning 模型,包括BertModel,以及BertModel頂部的一個序列級分類器(sequence-level classifier)。
序列級分類器是一個線性層,它將輸入序列中第一個字元的最後隱藏狀態作為輸入(參見BERT論文中的圖3a和3b)。
run_classifier.py指令碼提供了關於如何使用此類模型的示例,該指令碼可用於使用BERT微調單個序列(或序列對)分類器,例如用於MRPC任務。
3. BertForQuestionAnswering
BertForQuestionAnswering是一個fine-tuning 模型,包括BertModel,它在最後隱藏狀態的完整序列之上具有token級分類器(token-level classifiers)。
token-level 分類器將最後隱藏狀態的完整序列作為輸入,併為每個token計算得分,(參見BERT論文的圖3c和3d)。
run_squad.py指令碼提供了有關如何使用此類模型的示例,該指令碼可用於使用BERT微調token分類器,例如用於SQuAD任務。
詳情請點選閱讀原文
推薦閱讀