BERT官方Github地址:https://github.com/google-research/bert ,其中对BERT模型进行了详细的介绍,更详细的可以查阅原文献:https://arxiv.org/abs/1810.04805 。
BERT本质上是一个两段式的NLP模型。第一个阶段叫做:Pre-training,跟WordEmbedding类似,利用现有无标记的语料训练一个语言模型。第二个阶段叫做:Fine-tuning,利用预训练好的语言模型,完成具体的NLP下游任务。
Google已经投入了大规模的语料和昂贵的机器帮我们完成了Pre-training过程,这里介绍一下不那么expensive的fine-tuning过程。
回到Github中的代码,只有run_classifier.py和run_squad.py是用来做fine-tuning 的,其他的可以暂时先不管。这里使用run_classifier.py进行句子分类任务。
代码解析:
从主函数开始,可以发现它指定了必须的参数:
if __name__ == "__main__":
flags.mark_flag_as_required("data_dir")
flags.mark_flag_as_required("task_name")
flags.mark_flag_as_required("vocab_file")
flags.mark_flag_as_required("bert_config_file")
flags.mark_flag_as_required("output_dir")
tf.app.run()
从这些参数出发,可以对run_classifier.py进行探索:
data_dir:指的是我们输入数据的文件夹目录。
task_name:是用来选择processor的。
processors = {
"cola": ColaProcessor,
"mnli": MnliProcessor,
"mrpc": MrpcProcessor,
"xnli": XnliProcessor,
}
processors = {
"ner": NerProcessor
}
继续查看,以ner为例,可以发现这个processor就是用来对data_dir中输入的数据进行预处理的。
class NerProcessor(DataProcessor):
def get_train_examples(self, data_dir):
return self._create_example(
self._read_data(os.path.join(data_dir, "train.txt")), "train"
)
def get_dev_examples(self, data_dir):
return self._create_example(
self._read_data(os.path.join(data_dir, "dev.txt")), "dev"
)
def get_test_examples(self, data_dir):
return self._create_example(
self._read_data(os.path.join(data_dir, "test.txt")), "test")
def get_labels(self):
return ["O", "B-PER", "I-PER", "B-ORG", "I-ORG", "B-LOC", "I-LOC", "X", "[CLS]", "[SEP]"]
另外,label在get_labels()设定,如果是二分类,则将label设定为[“0”,”1”],同时_create_examples()中,给定了如何获取guid以及如何给text_a, text_b和label赋值。
主要修改的是:
对于这个fine-tuning过程,我们要做的只是:
准备好一个8G显存左右的GPU,没有也不用担心,可以使用谷歌免费的GPU
准备好train.txt, dev.txt以及test.txt
新建一个跟自己task_name对应的processor,用于将train.txt, dev.txt以及test.txt中的数据提取出来赋给text_a, text_b, label
下载好Pre-training模型,将do_train设置为true,先训练好自己的模型。完成之后,将do_predict设置为truej进行预测。
这里主要讲使用,原理细节还需仔细探索。。。