如何使用bert

1.什么是bert

  1. bert原文中文翻译版,论文地址。
  2. 腾讯一篇对bert解读的文章,从零构建BERT,文章地址。
2.bert的使用 uer-py
  1. UER-py全称是Universal Encoder Representations,UER-py是一个在通用语料预训练以及对下游任务进行微调的工具包。github项目地址。
  2. uer的一些教程,知乎教程(bert做情感分类、序列标注)。
  3. uer分类代码的介绍,参考uer-py/run_classifier.py。
    • args参数介绍。
      pretrained_model_path--------原始的bert模型地址。
      output_model_path-------------分类模型的保存地址。
      vocab_path-----------------------词表文档的地址。注意每一个预训练bert模型都要有相对应的vocab_path,config文件。vocab的作用用于把输入的一句话转化为一个tokens。
      config_path----------------------关于bert一些超参数的设置。
      seq_length-----------------------设置输入的句长,这里注意一点bert的句长并无限制,模型里也没有句长的超参数,这里设置句长是设置输入时token的最大长度,超过长度的会自动截断。
      embedding、encoder--------这里是由于uer是一个通用的工具,选择不同的embedding、encoder和target即可构成不同的模型,在这里我们使用bert即可。
      subword option----------------这里是指要不要使用更细粒度的表示,由于一般的bert是基于字的,所以后面的一系列参数是没用的。
      tokenizer------------------------是指转换sequence到token的方法,这里选用bert。
      后面是一些优化器的参数,warm up是指在学习的前k%的轮数采用较低的学习率进行学习。
#bert加载的关键代码 model = build_model(args) # Load or initialize parameters. if args.pretrained_model_path is not None: # Initialize with pretrained model. model.load_state_dict(torch.load(args.pretrained_model_path), strict=False) else: # Initialize with normal distribution. for n, p in list(model.named_parameters()): if 'gamma' not in n and 'beta' not in n: p.data.normal_(0, 0.02) #这是model就是一个已经把预训练权重全部加载好了的模型了。 #我们先使用model.embedding 把token转化为embedding,然后调用model.encoder #进行bert编码。 #在这个模型中,把加载好的bert model作为参数传入了自己建立的分类模型。

pytroch_pretrained_bert
  1. 为什么可以加载bert模型呢?
    实际上就是和我们平时保存加载模型一样,网上发布的模型通常是他们在大规模语料上训练的模型的权重,只要我们实现了和网上权重对应的bert模型,就可以把相应的参数load进去,下面我们介绍下一个pytorch上的bert模型。
  2. 项目名称 pytorch-pretrained-bert.
    这个项目时fork一个项目transformer的一个实现,里面的实现也是基本差不多,不过transformer封装的更好,类间的关系的复杂,代码的冗余比较低,但我还没有怎么看tranformer的用法。这个项目有个好处,每一个类的实现比较完整,比较方便自己去改动。
  3. 如何安装,建议使用源码安装,pip直接安装会报错。
#进入到下载的github项目根目录下,运行 pip install --editable . # 注意最后面的 . 不能省略。

  1. 官网的使用教程(由于官网下载的网络比较差,我就把模型换成了,上述uer的预训练模型)
    项目目录如下
    如何使用bert
    文章图片

    上述的pytorch_model.bin就是模型的权重(一定要命名成pytorch_model.bin,否则会报错,vocab和config也是一样必须要安装这样来命名,还有一点,如果是使用uer上下载的bert模型,必须要在里面加上一个参数vocab_size)然后在同级目录下建立一个bert_test的demo。
import torch from pytorch_pretrained_bert import BertTokenizer, BertModel, BertForMaskedLM#Load pre-trained model tokenizer (vocabulary) tokenizer = BertTokenizer.from_pretrained('bert/bert-base-chinese-vocab.txt') model = BertModel.from_pretrained('bert') #这样就可以加载模型权重了。详细的使用教程可以参考github上的示例。

uer-py预训练bert 【如何使用bert】在自己的数据集上进行bert任务的学习,可以进一步把权重学的更好,使用方法,数据要处理成这种格式
如何使用bert
文章图片

然后依次运行preprocess.py 和 pretrain.py即可,这里遇到一个问题,在使用gpu时实验室的服务器会报错,我在自己的电脑是可以正常运行的,猜测是由于pytorch的版本造成的问题。
pytorch_pretrained_bert如何进行预训练,在examples文件中有一个run_lm_finetuning.py文件。

    推荐阅读