BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

前言

bert是google在NLP方面的一个重要的工作,可以说一定程度上改变了NLP领域的研究方式。bert获得了2019 NAACL的最佳长论文奖。

简介

预训练模型

bert,连同之前的ELMO和GPT,可以说开创了NLP的『预训练模型时代』。这3个模型,总体的思想都是采用通用模型架构在语料库(corpus)上预训练(pre-training);然后针对具体的NLP任务,在通用模型架构上增加几层,固定通用模型的参数,微调(fine-tuning)增加的若干层参数。区别在于,3个模型在通用模型选型和一些训练技术上有所不同。

ELMO GPT bert
bi-direction LSTM single-direction transformer bi-direction transformer

transformer模型与Attention机制

bert模型,凭借其出色的performance,成为上述3个基于预训练的模型的代表。
这里可能要稍微插一下,目前的趋势是transformer渐渐替代以LSTM为代表的RNN模型成为NLP领域的基础模型。transformer是一种基于Attention机制的网络,由于transformer可以通过Attention将一个sentence中任何两个word联系起来,因此其建模能力强于以LSTM为代表的RNN类模型。另外,由于没有RNN的时序依赖的特点,transformer便于并行计算。具体关于transformer和Attention机制,读者可以移步别的文章,这里就不在旁逸斜出了。

关于计算资源

最后想说的一点是,bert模型的pre-training需要消耗巨量的计算资源和计算时间,一般学校里的实验室都没有那么多计算资源可以进行bert这样的pre-training,但bert的fine-tuning和predicting相对来说消耗资源比较少,学校和个人都是可以跑的。类似CV领域中,研究者下载在ImageNet上预训练的模型参数,bert也开放了在不同语言上训练的模型供大家下载。

创新点

bert创新点主要在2个地方:

  1. 针对单向transformer难以捕捉句子中逆序词对的联系的问题,提出了Masked LM,也就是双向transformer,通过Mask词两边的词预测Mask词;
  2. 针对sentence-level的NLP问题,提出了NSP (Next Sentence Prediction),把上下文句子对关系进行训练

Masked LM

bert想要利用一个单词的前后文对单词进行预测,而不是仅仅利用单词的前文(这个motivation还是挺合理的),并在transformer模型中实现了这一点(RNN模型中,bi-direction LSTM就是干这个的)。实现方法是,随机遮住句子中的一个单词(用[Mask] token替代),用句子里前文的单词和后文的单词预测被遮住的单词。
但这样会引入新的问题,即训练集和测试集之间有偏差,因为测试集中是不会出现[Mask] token的。为此,作者的解决方案是,对于以15%随机概率被选中的成为[Mask]的单词进行如下的变换:

  • 80%的概率被替换为[Mask]
  • 10%的概率被被替换为词典里的一个random的token
  • 10%保持不变

(感觉就是集成了一下,算是一个训练技巧吧)
如果读者熟悉传统NLP的话,就会发现Masked LM的思想其实类似CBOW(就是与skip-gram相对应的那个),而论文中作者宣称Masked LM是受Cloze启发的。

NSP

NLP中有许多涉及sentence pair的关系的任务,例如Question-Answering和Natural Language Inference. 为此,bert在pre-training的过程中加入了对于sentence之间关系的训练。具体做法是训练集中每一个句子对(sa, sb),有50%的概率是前后文关系,50%是语料库里随机的两个句子的组合,然后用句子对进行0-1二分类(是否是前后文对)的训练。

实验

主实验

作者做了4个数据集(GLUE, SQuAD v1.1, SQuAD v2.0, SWAG)上11个任务(GLUE数据集有MNLI, QQP, QNLI, SST-2, CoLA, STS-B, MRPC, RTE共8项任务)的实验,均取得state-of-the-art的效果,实验方法都是采样pre-trained模型在特定任务上做fine-tuning,显示出bert模型的通用性。

消融实验(Ablation Studies)

此外,作者还设计了消融实验证明了双向transformer以及NSP两个创新点的有效性。

关于中文bert模型的fine-tuning

下面写一下博主在中文数据集上的fine-tuning经历。总的来说,bert的github项目的文档就已经很全了,这里就当是做一个翻译和一些补充了。

下载中文模型

由于是中文任务,因此采用bert的中文预训练模型:下载地址。虽然说是中文预训练模型,实际上是在一些中文语料库上训练的模型,不仅仅还有中文,还含有一些英文以及其他字符。具体可以解压打开中文模型,查看vocab.txt文件,里面存储了中文模型的所有token.

准备数据

run_classifier.py文件里的InputExample类抽象了一个样本,guid自动生成不用用户管,label是类标,单文本任务用text_a,文本对任务(例如QA)用text_atext_b.

class InputExample(object):"""A single training/test example for simple sequence classification."""def __init__(self, guid, text_a, text_b=None, label=None):"""Constructs a InputExample.Args:guid: Unique id for the example.text_a: string. The untokenized text of the first sequence. For singlesequence tasks, only this sequence must be specified.text_b: (Optional) string. The untokenized text of the second sequence.Only must be specified for sequence pair tasks.label: (Optional) string. The label of the example. This should bespecified for train and dev examples, but not for test examples."""self.guid = guidself.text_a = text_aself.text_b = text_bself.label = label

run_classifier.py文件里的DataProcessor类,是所有输入数据接口的基类。通过继承DataProcessor类,我们实现自己的输入数据接口类,重载get_train_examples, get_dev_examples, get_test_examples, get_labels这4个抽象方法,自定义训练集、验证集、测试集和类标的输入格式。run_classifier.py还提供了XnliProcessor等几个预置的输入数据接口类可以供我们实现的时候参考。自定义的数据接口格式需要与数据集文件中数据格式一致。

class DataProcessor(object):"""Base class for data converters for sequence classification data sets."""def get_train_examples(self, data_dir):"""Gets a collection of `InputExample`s for the train set."""raise NotImplementedError()def get_dev_examples(self, data_dir):"""Gets a collection of `InputExample`s for the dev set."""raise NotImplementedError()def get_test_examples(self, data_dir):"""Gets a collection of `InputExample`s for prediction."""raise NotImplementedError()def get_labels(self):"""Gets the list of labels for this data set."""raise NotImplementedError()@classmethoddef _read_tsv(cls, input_file, quotechar=None):"""Reads a tab separated value file."""with tf.gfile.Open(input_file, "r") as f:reader = csv.reader(f, delimiter="\t", quotechar=quotechar)lines = []for line in reader:lines.append(line)return lines

使用GPU

bert的github项目上给出了fine-tuning的样例脚本,在该脚本的头部添加环境变量CUDA_VISIBLE_DEVICES="x",可以指定在第x号GPU上运行。

bert论文解析——BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding相关推荐

  1. 预训练模型:BERT深度解析《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》

    目录 1. 背景 2. 什么是 Bert 及原理? 3. 论文内容<BERT: Pre-training of Deep Bidirectional Transformers for Langu ...

  2. BERT(一)--论文翻译:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    转载请注明出处:https://blog.csdn.net/nocml/article/details/124860490 传送门: BERT(一)–论文翻译:BERT: Pre-training o ...

  3. 【论文阅读笔记】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    BERT的出现使我们终于可以在一个大数据集上训练号一个深的神经网络,应用在很多NLP应用上面. BERT: Pre-training of Deep Bidirectional Transformer ...

  4. 论文阅读笔记:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    提示:阅读论文时进行相关思想.结构.优缺点,内容进行提炼和记录,论文和相关引用会标明出处. 文章目录 前言 介绍 背景知识 相关工作 具体实现结构 Pre-training BERT Fine-tun ...

  5. 论文阅读——BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding Abstract 作者引入了一种新的语 ...

  6. Paper:《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding用于语言理解的深度双向Tr

    Paper:<BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding用于语言理解的深度双 ...

  7. 【文本分类】BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

    ·阅读摘要:   Bert是继Transformer之后的又一杰出的模型.Bert是一种预训练语言模型,是在GPT.Elmo.Transformer的基础上提出的.基于Bert的多个NLP领域任务都取 ...

  8. 《BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding》

    目录 <BERT:Pre-training of Deep Bidirectional Transformers for Language Understanding> 1.Bert研究意 ...

  9. BERT论文阅读(一): Pre-training of Deep Bidirectional Transformers for Language Understanding

    BERT三大核心: pre-training bidirectional==>alleviates the unidirectionality constriant of fine-tuning ...

最新文章

  1. GitHub遭攻击滥用以代管网钓套件
  2. 规范化的递归转换成非递归
  3. iOS UITableView的使用大全-备用
  4. php的防csrf攻击,zblog php添加Token防止CSRF攻击
  5. oracle中角色和用户权限,Oracle用户、角色、权限管理
  6. 微信小程序api接口调用用封装
  7. 使用iScroll实现上、下滑动刷新和加载更多数据
  8. 十一这里最好玩啦!快来一起玩耍!
  9. 智慧机场室内导航系统-采用蓝牙定位方案-导乘整体解决方案
  10. 独立游戏开发(一)-- 安装Unity
  11. ps怎么对字体进行加粗?
  12. win10电脑进入睡眠时间过快,电源选项的设置无效
  13. 微信公众号 被关注回复和关键词回复
  14. 【Linux】一步一步学Linux系列教程汇总(更新中......)
  15. Java实现视频通话
  16. 点阵、基元和晶体结构之间的关系
  17. 过压保护电路(OVP)
  18. 掌握可视化设计流程这4步就够了
  19. /include/sys/types.h:151: error: duplicate 'unsigned' uint,ulong和ushort自定义和工具链报冲突的规避方法
  20. 云ESB服务总线培训规程

热门文章

  1. linux修改zip中文件,Linux下修改jar、zip等文件内的文件详解
  2. ReactNative(学习部署){样式使用、图片、文本、布局、按钮、活动提示器、状态栏和背景图、开关和文本输入框}
  3. 【数据库】数据库四大特性ACID
  4. Kubernete 安装
  5. jdbc连接mysql原理_JDBC 原理浅析
  6. mysql身份证号批判断正误_如何验证检查Excel表中身份证号码的正误
  7. 设置网页的html的font-size,CSS中的font-size属性使用教程
  8. css 加载图片,纯CSS图片预加载
  9. Fabric部署基础篇 - 单机网络
  10. 0XID定位多网卡主机 使用记录