bert模型代码运行文档

#1. 了解Bert是什么,找到原始文章和源码

  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


#2. 参考源码readme文件和相关技术博客运行demo

  相关博客地址: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="自定义路径"/

 

#3. 改换数据集,使用Bert进行情感分类预测

  (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

#4. Bert在中文数据集上的应用

  可参考博客:https://www.jianshu.com/p/aa2eff7ec5c1  https://blog.csdn.net/renxingkai/article/details/87605693
  实际上运行中文模型和英文是类似的,注意找好相对应的中文预训练模型,其余的依葫芦画瓢就可以了。
  个人也用Bert中文模型试了下对唐诗数据的情感二分类,在对实验数据做了预处理后最终在验证集上得到了0.9275的acc,挺不错的,可能是数据量不大的原因,只有4000条。后续可以做进一步的研究。

注:订正一点,之前我说中文数据分词影响很大,后来发现在bert中中文最后是按字处理的,分词其实并没什么影响,识别结果上的区别应该是数据量小导致的偶然性。

 

你可能感兴趣的:(python,NLP,深度学习,BERT,情感分类,fine-tune)