BERT,全称是Bidirectional Encoder Representations from Transformers,是一种预训练语言表示的新方法。
Bert是2018年由Google AI团队开源的NLP模型,引起业内巨大反响,因为其在多项NLP任务上均超过当前的state-of-the-art。
Bert的原始论文为《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》,其主要讲述了Bert 的基本原理和两个主要任务:Masked LM 和 Next Sentence Prediction。
Bert源码地址为:https://github.com/google-research/bert
相关博客地址:https://www.jianshu.com/p/3d0bb34c488a
https://baijiahao.baidu.com/s?id=1616001262563114372&wfr=spider&for=pc
https://www.jiqizhixin.com/articles/2018-11-01-9
(1)下载Bert源码
git clone https://github.com/google-research/bert.git
(2)下载预训练模型
Bert提供的预训练模型有很多,如:"BERT-Base,Uncased", "BERT-Large,Uncased", "BERT-Base,Cased", "BERT-Large,Cased", "BERT-Base,Chinese"等共计9个。
因为运行demo我用的是英文语料,且显卡内存不大,对英文大小写也不敏感,故选用"BERT-Base,Uncased: 12-layer, 768-hidden, 12-heads, 110M parameters"这个模型。
(3)下载训练数据:MRPC语料
数据下载地址为:https://gluebenchmark.com/tasks
也可通过运行代码 download_glue_data.py来下载,代码地址为:
https://gist.github.com/W4ngatang/60c2bdb54d156a41194446737ce03e2e
运行指令为:
python3 download_glue_data.py --data_dir glue_data --tasks MRPC
(4)run demo
我下载的MRPC语料所执行的是基于MRPC语料的句子对分类任务,执行任务之前记得检查是否满足训练条件:tensorflow >= 1.11.0 # CPU Version of TensorFlow. / tensorflow-gpu >= 1.11.0 # GPU version of TensorFlow.
在Bert源码文件里运行run_classifier.py, 基于预训练模型进行fine-tune,具体运行指令为:
python run_classifier.py \
--task_name=MRPC \
--do_train=true \
--do_eval=true \
--data_dir="MRPC所在路径"/MRPC \
--vocab_file="预训练模型所在路径"/uncased_L-12_H-768_A-12/vocab.txt \
--bert_config_file="预训练模型所在路径"/uncased_L-12_H-768_A-12/bert_config.json \
--init_checkpoint="预训练模型所在路径"/uncased_L-12_H-768_A-12/bert_model.ckpt \
--max_seq_length=128 \
--train_batch_size=32 \
--learning_rate=2e-5 \
--num_train_epochs=3.0 \
--output_dir="自定义路径"/
模型保存在output_dir,验证结果为:
***** Eval results *****
eval_accuracy = 0.85294116
eval_loss = 0.38407618
global_step = 343
loss = 0.38407618
预测时的运行指令为:
python run_classifier.py \
--task_name=MRPC \
--do_predict=true \
--data_dir="MRPC所在路径"/MRPC \
--vocab_file="预训练模型所在路径"/uncased_L-12_H-768_A-12/vocab.txt \
--bert_config_file="预训练模型所在路径"/uncased_L-12_H-768_A-12/bert_config.json \
--init_checkpoint="训练后模型文件所在路径" \
--max_seq_length=128 \
--output_dir="自定义路径"/
(1)可参考博客:https://blog.csdn.net/qq874455953/article/details/90276116,该博主讲的很详细,其采用的数据集为三分类的英文情感数据,训练集为10026行数据,验证集为1002行数据,测试集包含4850行数据。
(2)自己采用在网上找到的160万条Twitter数据(二分类),用Bert进行情感分类预测。
数据下载地址为:http://help.sentiment140.com/for-students/,如无法下载可留言区留下邮箱我发给各位。
论文可参考:Go A, Bhayani R, Lei H. Twitter sentiment classification using distant supervision[J]. Cs224n Project Report, 2009.
环境准备(tensorflow, python等)、源码克隆、预训练模型获取等步骤就不再赘述,下边讲几个重点。
1)数据集的预处理
所用Twitter数据集为csv文件,即逗号分隔符文件,采用pandas命令读取它,读取时声明编码为"ISO-8859-1"。
原数据集中有6个字段,分别为:情感极性、ID、日期、是否查询、用户、文本内容,我们只选取情感极性和文本内容,另外加了个索引号(在原数据集中的序号,也可以不加,用不到)。
对文本内容进行清洗,去除掉其中的HTML编码、@提及、URL链接、#等非字母字符等等。
2)修改run_classifier.py
主要是添加类"class TwitterProcessor",自定义processor代码部分见下边run_classifier.py地址:
3)运行run_classifier.py
运行指令对照前边demo的将目录、文件的路径写对,task_name为twitter(自定义),其余参数不变即可。先执行训练和验证,运行成功后可得到eval_acc=0.860375;再执行预测,可得到预测后输出结果文件test_results.tsv。
Twitter数据集预处理代码twitter_preprocess.py和自己修改后的run_classifier.py代码可通过以下地址下载:
https://download.csdn.net/download/qq_42278138/11620181
可参考博客:https://www.jianshu.com/p/aa2eff7ec5c1 https://blog.csdn.net/renxingkai/article/details/87605693
实际上运行中文模型和英文是类似的,注意找好相对应的中文预训练模型,其余的依葫芦画瓢就可以了。
个人也用Bert中文模型试了下对唐诗数据的情感二分类,在对实验数据做了预处理后最终在验证集上得到了0.9275的acc,挺不错的,可能是数据量不大的原因,只有4000条。后续可以做进一步的研究。
注:订正一点,之前我说中文数据分词影响很大,后来发现在bert中中文最后是按字处理的,分词其实并没什么影响,识别结果上的区别应该是数据量小导致的偶然性。