BERT模型的结构,特点和实践
BERT模型介绍,特点,资源
- 一、背景介绍
- 二、BERT与语言模型
- 1.feature-based
- 2.fine-tuning
- 3.BERT的语言模型
- 三、BERT整体概览
- 1. BERT框架
- 2. BERT模型结构
- 2.1输入部分
- 2.2 BERT的预训练任务
- 任务1:Masked Language Model(MLM)
- 任务2:Next Sentence Prediction(NSP)
- 3. 训练:fine-tune
- 四、总结
- 五、相关资料
一、背景介绍
BERT模型是在2018年被提出( Pre-training of Deep Bidirectional Transformers for Language Understanding),预训练领域的里程碑之作,在多项nlp任务上达到了state-of-art,也开启了预训练模型的新篇章。字面注解是关于语言理解的深度双向transformers的预训练模型。它可以学习文本的语义信息,通过向量形式的输出可以用于分类,语义相识度等任务。它是一种预训练语言模型,也就说,它自己已经在大规模预料上训练好的参数,我们在用的时候只需要在这个基础上训练更新参数。不像其他的语言模型,它是在无监督的预料上,在模型的每一层都会文本左右相关的信息进行训练,关于语言模型可参考第二部分。总的来说,你可以在加最后的额外一层,比如全连接进行分类或者更多的语言推理任务(问答等)
二、BERT与语言模型
语言模型被用来学习文本句子的语义信息具体通过一些文本转化成数学表达比如经典的词向量Wordvec等表示,由于其被认为可以获得部分语义信息,改进了很多的nlp处理任务的效果。 包括句子级的任务例如句子推断,句子间的关系,也可以字符级别的任务比如实体识别。现有的技术将语言表示模型用于下游任务的手段: feature-based和fine-tuning。这两种方法都共享了同样的目标函数在预训练阶段,都用单向的语言模型来学习常规语言表示。
1.feature-based
feature-based只变化了最后一层的参数。通常feature-based方法包括两步:(1)首先在大的语料A上无监督地训练语言模型,训练完毕得到语言模型然后构造task-specific model例如序列标注模型。(2)采用有标记的语料B来有监督地训练task-sepcific model,将语言模型的参数固定,语料B的训练数据经过语言模型得到LM embedding,作为task-specific model的额外特征ELMo是这方面的典型工作
2.fine-tuning
Fine-tuning方式是指在已经训练好的语言模型的基础上,加入少量的task-specific parameters, 例如对于分类问题在语言模型基础上加一层softmax网络,然后在新的语料上重新训练来进行fine-tune。除了最后一层,所有的参数都变化了。GPT的训练方式即采用这种(图1),
首先语言模型采用了Transformer Decoder的方法来训练,采用文本预测作为语言模型训练任务,完成训练后,加一层Linear Project来完成分类/相似度计算等NLP任务。因此总结来说,LM + Fine-Tuning的方法工作也包括两步:
构造语言模型,采用大的语料A来训练语言模型
(1)在语言模型基础上增加少量神经网络层来完成specific task例如序列标注、分类等,
(2)然后采用有标记的语料B来有监督地训练模型,这个过程中语言模型的参数并不固定,依然是trainable variables.
3.BERT的语言模型
现有的方法不足以表现出语言表示的全部威力,限制是因为标准语言模型都是没有方向的,例如在OpenAI GPT中,作者用了一个从左到右的结构,通过前k-1个词预测第k个词,从前往后,不断前进,属于单向的预测,这中做法在一些用到与文本双向有关信息理解的时候,不一定最优。BERT改进了这一点,预训练阶段用到:遮蔽语言模型MLM。这可以用到文本的左右的相关信息,训练出一个双向transformer模型。除了双向语言模型之外BERT用到了"预测下一句" 任务句子间联合训练文本对的表示。BERT论文采用了LM + fine-tuning的方法,同时也讨论了BERT + task-specific model的方法。
三、BERT整体概览
1. BERT框架
BERT整体框架包含pre-train和fine-tune两个阶段。pre-train阶段模型是在无标注的标签数据上进行训练,fine-tune阶段,BERT模型首先是被pre-train模型参数初始化,然后所有的参数会用下游的有标注的数据进行训练。
2. BERT模型结构
BERT的模型结构是一个多层的双向transformer结构的encoder部分。首先来看看BERT输入长什么样子,然后讨论这样的输入训练什么样的模型任务。
2.1输入部分
BERT的输入的编码向量(长度是512)是3个嵌入特征的单位和(图3)。
(1) WordPiece 嵌入 [6]:WordPiece是指将单词划分成一组有限的公共子词单元,能在单词的有效性和字符的灵活性之间取得一个折中的平衡。例如图4的示例中‘playing’被拆分成了‘play’和‘ing’;
(2)位置嵌入(Position Embedding):位置嵌入是指将单词的位置信息编码成特征向量,位置嵌入是向模型中引入单词位置关系的至关重要的一环。位置嵌入的具体内容参考我之前的分析;
(3)分割嵌入(Segment Embedding):用于区分两个句子,例如B是否是A的下文(对话场景,问答场景等)。对于句子对,第一个句子的特征值是0,第二个句子的特征值是1。
2.2 BERT的预训练任务
BERT预训练是采用多任务的方式,包括遮蔽语言模型(MLM)和下一个句子预测(NSP)。
任务1:Masked Language Model(MLM)
Masked Language Model(MLM),所谓MLM是指在训练的时候随即从输入预料上mask掉一些单词,然后通过的上下文预测该单词,该任务非常像我们在中学时期经常做的完形填空。正如传统的语言模型算法和RNN匹配那样,MLM的这个性质和Transformer的结构是非常匹配的。在BERT的实验中,15%的WordPiece Token会被随机Mask掉。在训练模型时,一个句子会被多次喂到模型中用于参数学习,但是Google并没有在每次都mask掉这些单词,而是在确定要Mask掉的单词之后,80%的时候会直接替换为[Mask],10%的时候将其替换为其它任意单词,10%的时候会保留原始Token。
80%:my dog is hairy -> my dog is [mask]
10%:my dog is hairy -> my dog is apple
10%:my dog is hairy -> my dog is hairy
这么做的原因是如果句子中的某个Token100%都会被mask掉,那么在fine-tuning的时候模型就会有一些没有见过的单词。加入随机Token的原因是因为Transformer要保持对每个输入token的分布式表征,否则模型就会记住这个[mask]是token ’hairy‘。至于单词带来的负面影响,因为一个单词被随机替换掉的概率只有15%*10% =1.5%,这个负面影响其实是可以忽略不计的。
另外文章指出每次只预测15%的单词,因此模型收敛的比较慢。
任务2:Next Sentence Prediction(NSP)
Next Sentence Prediction(NSP)的任务是判断句子B是否是句子A的下文。如果是的话输出’IsNext‘,否则输出’NotNext‘。训练数据的生成方式是从平行语料中随机抽取的连续两句话,其中50%保留抽取的两句话,它们符合IsNext关系,另外50%的第二句话是随机从预料中提取的,它们的关系是NotNext的。这个关系保存在图4中的[CLS]符号中。
3. 训练:fine-tune
在海量单预料上训练完BERT之后,便可以将其应用到NLP的各个任务中了。对于NSP任务来说,其条件概率表示为P=softmax(CWT)P=softmax(CW^T)P=softmax(CWT),其中 C 是BERT输出中的[CLS]符号, W是可学习的权值矩阵。
对于其它任务来说,我们也可以根据BERT的输出信息作出对应的预测。图5展示了BERT在11个不同任务中的模型,它们只需要在BERT的基础上再添加一个输出层便可以完成对特定任务的微调。这些任务类似于我们做过的文科试卷,其中有选择题,简答题等等。下图中4其中Tok表示不同的Token, E表示嵌入向量, 表示第 TiT_iTi个Token在经过BERT处理之后得到的特征向量。
微调的任务,这里以(a)和(d)举例说明:
(a)基于句子对的分类任务:
MNLI:给定一个前提 (Premise) ,根据这个前提去推断假设 (Hypothesis) 与前提的关系。该任务的关系分为三种,蕴含关系 (Entailment)、矛盾关系 (Contradiction) 以及中立关系 (Neutral)。所以这个问题本质上是一个分类问题,我们需要做的是去发掘前提和假设这两个句子对之间的交互信息。
QQP:基于Quora,判断 Quora 上的两个问题句是否表示的是一样的意思。
QNLI:用于判断文本是否包含问题的答案,类似于我们做阅读理解定位问题所在的段落。
STS-B:预测两个句子的相似性,包括5个级别。
MRPC:也是判断两个句子是否是等价的。
RTE:类似于MNLI,但是只是对蕴含关系的二分类判断,而且数据集更小。
SWAG:从四个句子中选择为可能为前句下文的那个。
(d)命名实体识别
CoNLL-2003 NER:判断一个句子中的单词是不是Person,Organization,Location,Miscellaneous或者other(无命名实体)。微调CoNLL-2003 NER时将整个句子作为输入,在每个时间片输出一个概率,并通过softmax得到这个Token的实体类别。
四、总结
BERT很受欢迎不是没有原因的,使用Transformer的结构将已经走向瓶颈期的Word2Vec带向了一个新的方向,11个NLP任务的精度大幅提升足以震惊整个深度学习领域;BERT算法还有很大的优化空间,包括依靠位置嵌入和预训练任务MLM这种方式都有其优化空间,以及其参数设置。BERT的训练在目前的计算资源下很难完成,论文中说训练需要在64块TPU芯片上训练4天完成,而一块TPU的速度约是目前主流GPU的7-8倍。预训练模型开源也发展原来越成熟,比如Hugging Face提供了各种预训练语言模型,在第五部分中给出链接,有的既有tensorflow也有pytorch版本,关于hugging face怎么用实际操作已经有很多资料了,官网例子也很详细,配置环境处理好输入输出,直接可以下载拿fine-tune用于咱们的下游任务。
五、相关资料
(1)BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
https://arxiv.org/pdf/1810.04805.pdf
(2)Transformer:Attention Is All You Need
https://arxiv.org/abs/1706.03762
(3)Hugging Face,https://huggingface.co/
https://github.com/huggingface/
BERT模型的结构,特点和实践相关推荐
- 【NLP】BERT 模型与中文文本分类实践
简介 2018年10月11日,Google发布的论文<Pre-training of Deep Bidirectional Transformers for Language Understan ...
- 干货 | 谷歌BERT模型fine-tune终极实践教程
作者 | 奇点机智 从11月初开始,Google Research就陆续开源了BERT的各个版本.Google此次开源的BERT是通过TensorFlow高级API-- tf.estimator进行封 ...
- 谷歌BERT模型fine-tune终极实践教程
从11月初开始,Google Research就陆续开源了BERT的各个版本.Google此次开源的BERT是通过TensorFlow高级API-- tf.estimator进行封装(wrapper) ...
- ICLR2020 | StructBERT : 融合语言结构的BERT模型
今天给大家介绍阿里巴巴达摩院在ICLR2020的一篇论文,该研究针对预训练语言模型BERT在预训练任务中忽略了语言结构的问题,作者对BERT进行扩展,通过加入语言结构到预训练任务中,其核心思想是在预训 ...
- 基于朴素贝叶斯和预训练Bert模型的中文句子情感分类实践
基于朴素贝叶斯和预训练Bert模型的中文句子情感分类实践 1.任务介绍 本次实践选题为AI研习社2019年9月份举办的中文对话情感分析任务,并在原任务基础上进行了拓展.任务首先给定一中文语句数据集 ...
- NLP突破性成果 BERT 模型详细解读 bert参数微调
https://zhuanlan.zhihu.com/p/46997268 NLP突破性成果 BERT 模型详细解读 章鱼小丸子 不懂算法的产品经理不是好的程序员 关注她 82 人赞了该文章 Goo ...
- 【NLP】一份相当全面的BERT模型精讲
本文概览: 1. Autoregressive语言模型与Autoencoder语言模型 1.1 语言模型概念介绍 Autoregressive语言模型:指的是依据前面(或后面)出现的单词来预测当前时刻 ...
- BERT模型系列大全解读
前言 本文讲解的BERT系列模型主要是自编码语言模型-AE LM(AutoEncoder Language Model):通过在输入X中随机掩码(mask)一部分单词,然后预训练的主要任务之一就是根据 ...
- 【NLP】(task4)编写BERT模型
学习总结 (1)回顾上次所学,GPT是采用传统的基于自回归的语言建模方法,而BERT是用了基于自编码(Auto-Encoding)的预训练任务进行训练.有些问题如transformer 为什么使用 l ...
最新文章
- 网络慢是带宽不足?优化网络带宽的5个小窍门
- ASP.NET MVC Display Mode 移动端视图 配置对微信内置浏览器的识别
- 【UWP】使用 Rx 改善 AutoSuggestBox
- livewriter写Blog 神秘失踪?
- 并不是所有的 Github 项目写在简历上都加分
- 7-1 作业调度算法--先来先服务
- 【AI初识境】被Hinton,DeepMind和斯坦福嫌弃的池化,到底是什么?
- 让互联网更快的协议,QUIC在腾讯的实践及性能优化
- Quartz调度源码分析
- Bootstrap Paginator 分页插件参数介绍及使用
- 哈哈哈,第一次做codeforce
- 提高Android应用辅助功能的方法Accessibility
- Java权限管理系统完整案例
- day 21 C# 窗体绘制一个正方体
- HTML写简历表格及内容
- 贝塔分布与狄利克雷分布
- C++数组初始化及定义
- 线性规划python
- windows异常处理
- 企业级数据仓库:数据仓库概述;核心技术框架,数仓理论,数据通道Hive技术框架,HBase设计,系统调度,关系模式范式,ER图,维度建模,星型/雪花/星座模式,数据采集同步,业务数据埋点,数据仓库规范
热门文章
- [FPGA入门笔记](十):按键消抖实验
- php开启sockets模块,wdlinux 增加php的sockets模块
- java如何设置控制台打印的字体颜色、背景、字体样式(idea设置打印字体样式)工具类 - 附插件方式
- 概率论 事件关系 古典概型与几何概型
- python能开发小程序吗_微信小程序用什么语言开发?Python能开发小程序么
- win10 软路由_上网装置升级:软路由开箱体验+爱快系统体验
- 交叉编译ortp、osip2、eXosip2、mediastreamer2及其附带的库实现SIP软电话
- 【缅怀妈妈系列诗歌】之二十四:一份永不忘却的思念
- python求和1到100_python求1到100的和的几种方法
- 华为交换机如何清除console口密码