BERT简介
项目地址:google-research/bert,基于Tensorflow。
BERT is a method of pre-training language representations, meaning that we train a general-purpose "language understanding" model on a large text corpus (like Wikipedia), and then use that model for downstream NLP tasks that we care about (like question answering). BERT outperforms previous methods because it is the first unsupervised, deeply bidirectional system for pre-training NLP.
google在2018年10月底公布了BERT在11项nlp任务中的卓越表现,自此BERT成为NLP领域的大热模型。
全称:Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder。模型的主要创新点在pre-train方法上,即用了Masked Language Model(MLM)和Next Sentence Prediction(NSP)两种方法分别捕捉词语和句子级别的representations。
作为一个Word2Vec的替代者,BERT的出现,彻底改变了预训练产生词向量和下游具体NLP任务的关系,提出训练词向量概念。
而近一两年提出的ULMFiT,GPT,BERT等都属于模型迁移。
BERT的网络架构使用的是《Attention is all you need》中提出的多层Transformer结构(Transformer是一个encoder-decoder的结构,由若干个编码器和解码器堆叠形成),其最大的特点是抛弃了传统的RNN和CNN,通过Attention机制将任意位置的两个单词的距离转换成1,有效的解决了NLP中棘手的长期依赖问题。(BERT是基于Transformer的深度双向语言表征模型,本质上是利用Transformer结构构造了一个多层双向的Encoder网络。Transformer是Google在2017年提出的基于自注意力机制(Self-attention)的深层模型,在包括机器翻译在内的多项NLP任务上效果显著,超过RNN且训练速度更快。不到一年时间内,Transformer已经取代RNN成为神经网络机器翻译的State-Of-The-Art(SOTA)模型,包括谷歌、微软、百度、阿里、腾讯等公司的线上机器翻译模型都已替换为Transformer模型。关于Transformer的详细介绍可以参考Google论文《Attention is all you need》)
BERT的本质上是通过在海量的语料的基础上运行自监督学习方法为单词学习一个好的特征表示,所谓自监督学习是指在没有人工标注的数据上运行的监督学习。在以后特定的NLP任务中,我们可以直接使用BERT的特征表示作为该任务的词嵌入特征。所以BERT提供的是一个供其它任务迁移学习的模型,该模型可以根据任务微调或者固定之后作为特征提取器。
BERT将传统大量在下游具体NLP任务中做的操作转移到预训练词向量中,在获得使用BERT词向量后,最终只需在词向量上加简单的MLP或线性分类器即可。
BERT模型的标准版本有1亿的参数量,与GPT持平;BERT的大号版本有3亿多参数量,这应该是目前自然语言处理中最大的预训练模型了。
google用了16个TPU集群(一共64块TPU)来训练大号版本的BERT,花了4天时间。对于是否可以复现预训练,作者在 [Reddit]上有一个大致的回复,指出OpenAI当时训练GPT用了将近1个月的时间,而如果用同等的硬件条件来训练BERT估计需要1年的时间。不过他们会将已经训练好的模型和代码开源,方便大家训练好的模型上进行后续任务。
词向量模型
词向量(word embedding),可以很好地度量词与词之间的相似性。
传统意义上,词向量模型是一个工具,可以把真实世界抽象存在的文字转换成可以进行数学公式操作的向量,而对这些向量的操作,才是NLP真正要做的任务。因而NLP任务分成两部分,预训练产生词向量,对词向量操作(下游具体NLP任务)。
从word2vec(2013年Google开源,用于词向量计算的工具)到ELMo(AllenNLP在2018年8月发布的一个上下文无关模型)到BERT,做的其实主要是把下游具体NLP任务的工作量逐渐移到预训练产生词向量上。
word2vec ——> ELMo:
结果:上下文无关的static向量变成上下文相关的dynamic向量,比如苹果在不同语境vector不同。
操作:encoder操作转移到预训练产生词向量过程实现。
ELMo ——> BERT:
结果:训练出的word-level向量变成sentence-level的向量,下游具体NLP任务调用更方便,修正了ELMo模型的潜在问题,。
操作:使用句子级负采样获得句子表示/句对关系,Transformer模型代替LSTM提升表达和时间上的效率,masked LM解决“自己看到自己”的问题。
BERT使用
google此次开源的BERT是通过tensorflow高级API[tf.estimator]进行封装(wrapper)的。因此对于不同数据集的适配,只需要修改代码中的processor部分,就能进行代码的训练、交叉验证和测试。
Google发布的中文BERT模型是基于中文维基百科数据训练得到,属于通用领域预训练语言模型。
BERT模型的输入可以是单句或者句对。对于每一个输入的Token,它的表征由其对应的词表征(Token Embedding)、段表征(Segment Embedding)和位置表征(Position Embedding)相加产生。(实际的输入值是segment embedding与position embedding相加?)
分词
参考:
可参考资料
【NLP】彻底搞懂BERT
一文读懂BERT(从原理到实践)
知乎文章|BERT详解
干货|BERT fine-tune 终极实践教程
美团BERT的探索和实践