文章目录

  • 1. Bert 的网络结构
  • 2. Bert 模型的输入
  • 3. Bert 模型预训练任务
    • 3.1 Masked LM(MLM)
    • 3.2 Next Sentence Prediction(NSP)
  • 4. Bert 中的特殊符号
  • 5. Fine-Tune
  • 6. Bert 和 ELMo 模型的对比
    • 6.1 Bert 比 ELMo 效果好的原因
    • 6.2 ELMo和 Bert 的区别
  • 7. BERT的局限性
  • 8. 从源码层面,理解Bert原理
  • 9. 用 Bert 解决实际NLP任务

Bert 全称 Bidirectional Encoder Representations from Transformers ,从全称可知,Bert内部使用的是一个双向的transformer的encoder结构。

此前将预训练的语言模型应用到NLP任务主要有两种策略,一种是基于特征的语言模型,如ELMo模型;另一种是基于微调的语言模型,如OpenAI GPT。这两类语言模型各有其优缺点,而BERT的出现,似乎融合了它们所有的优点,因此才可以在诸多后续特定任务上取得最优的效果。

1. Bert 的网络结构

Bert 是一种 基于微调的多层双向 Transformer 编码器,(关于Transformer框架的深度解读请参考此文章->#由浅入深# 从 Seq2seq 到 Transformer)Bert中的Transformer 编码器 和 Transformer 本身的编码器结构相似,但有以下两点的不同:

  1. 与Transformer本身的Encoder端相比,BERT的Transformer Encoder端输入的向量表示,多了Segment Embeddings。
  2. 模型输入中的 Position Embeddings(位置编码)在bert中学习出来的,在Transformer中是预先设定好的值。

Bert 实现了两个版本的模型,在两个版本中前馈型神经网络(全连接层)大小都设置为4层,两个版本的其他参数对比请参考下表:

版本名称 层数 隐藏层维度 self-attention头数 总参数量 前馈型神经网络层数
BERTBASE 12 768 12 110M 4层
BERTLARGE 24 1024 16 340M 4层

2. Bert 模型的输入


与Transformer本身的Encoder端相比,Bert 的Transformer Encoder端输入的向量表示,多了Segment Embeddings;Bert的输入由以下三个嵌入向量相加而成:

  1. token Embeddings(词嵌入) 表示的是词向量,既可以是原始词向量(one-hot编码),也可以是经过word2vec或glove等模型处理后的静态词向量;其中第一个单词是CLS标志,可以用于之后的分类任务,对于非分类任务,可以忽略CLS标志;

  2. Segment Embeddings (段嵌入)用来区别两种句子,因为预训练不只做语言模型还要做以两个句子为输入的分类任务;例如输入数据由两个句子拼接而成,如果词语属于第一个句子,则Segment Embeddings的对应位置为0,属于第二个句子,则Segment Embeddings的对应位置为1

  3. Position Embeddings(位置编码) 学习出来的embedding向量。这与Transformer不同,Transformer中是预先设定好的值。

3. Bert 模型预训练任务

BERT模型使用两个新的无监督预测任务进行训练,分别是 Masked LMNext Sentence Prediction

3.1 Masked LM(MLM)

为了训练深度双向Transformer表示,采用了一种简单的方法:随机掩盖部分输入词,然后对那些被掩盖的词进行预测,此方法被称为 Masked LM

在训练的过程中,文章作者在一句话中随机选择 15% 的词汇用于预测。对于在原句中被抹去的词汇, 80% 情况下采用一个特殊符号 [MASK] 替换, 10% 情况下采用一个任意词替换,剩余 10% 情况下保持原词汇不变。这么做的主要原因是:

  1. 在后续微调任务中语句中并不会出现 [MASK] 标记,防止被预测的单词泄露给网络,迫使模型更多地依赖于上下文信息去预测词汇
  2. 并且赋予了模型一定的纠错能力,适应更多样的下游任务,因为有些NLP任务需要用到所有的输入数据,例如词性标注等

当然这种方法也有其缺点,就是每批次数据中只有 15% 的标记被预测(只计算15%的损失),这意味着模型可能需要更多的预训练步骤来收敛。

3.2 Next Sentence Prediction(NSP)

很多句子级别的任务如自动问答(QA)和自然语言推理(NLI)都需要理解两个句子之间的关系。在这一任务中我们需要随机将数据划分为等大小的两部分(依靠 segment embedding 标记两个句子),一部分数据中的两个语句对是上下文连续的,另一部分数据中的两个语句对是上下文不连续的。然后让Transformer模型来识别这些语句对中,哪些语句对是连续的,哪些对子不连续。

但是最新的 XLNet 中没有用到 NSP,因为实验表明 NSP 和 PLM 不兼容。 最新的 XLM 也没有用NSP。
用作者的话说,XLM 成功的秘诀是 larger dimension and no NSP(层数为12,和 BERT-Base 相同,但隐层更大,总参数比 BERT-Large 还多,GLUE benchmark 上的效果也超越了 BERT-Large)

个人认为,MLM,NSP分别学习词与词之间和句与句之间的关系。

4. Bert 中的特殊符号

[CLS]:用于标识序列的开始,在语义分析、语句层级的分类等需要使用到[CLS]位置的输出
[SEP]:用于分隔两个句子,在两个句子之间使用 [SEP] 进行分隔

5. Fine-Tune

这里 Fine-Tune 之前对模型的修改非常简单,例如针对sequence-level classification problem(例如情感分析),取第一个token的输出表示,喂给一个softmax层得到分类结果输出;对于token-level classification(例如NER),取所有token的最后层transformer输出,喂给softmax层做分类。
Fine-Tune 分为全局 Fine-Tune 和 局部 Fine-Tune,Bert是全局 Fine-Tune,微调是会更新所有参数;但是GPT 的 Fine-Tune 是固定语言模型参数进行 Fine-Tune 的

6. Bert 和 ELMo 模型的对比

6.1 Bert 比 ELMo 效果好的原因

从网络结构以及最后的实验效果来看,Bert 比 ELMo 效果好主要集中在以下几点原因:

  1. LSTM 抽取特征的能力远弱于 Transformer

  2. 拼接方式双向融合的特征融合能力偏弱(没有具体实验验证,只是推测)

  3. Bert 的训练数据以及模型参数均多余ELMo,这也是比较重要的一点

6.2 ELMo和 Bert 的区别

ELMo模型是通过语言模型任务得到句子中单词的embedding表示,以此作为补充的新特征给下游任务使用。因为ELMo给下游提供的是每个单词的特征形式,所以这一类预训练的方法被称为“Feature-based Pre-Training”。

而BERT模型是“基于Fine-tuning的模式”,这种做法和图像领域基于Fine-tuning的方式基本一致,下游任务需要将模型改造成BERT模型,才可利用BERT模型预训练好的参数。

7. BERT的局限性

从XLNet论文中,提到了BERT的两个缺点,分别如下:

  • BERT在第一个预训练阶段,假设句子中多个单词被Mask掉,这些被Mask掉的单词之间没有任何关系,是条件独立的,然而有时候这些单词之间是有关系的,比如”New York is a city”,假设我们Mask住”New”和”York”两个词,那么给定”is a city”的条件下”New”和”York”并不独立,因为”New York”是一个实体,看到”New”则后面出现”York”的概率要比看到”Old”后面出现”York”概率要大得多。
    但是需要注意的是,这个问题并不是什么大问题,甚至可以说对最后的结果并没有多大的影响,因为本身BERT预训练的语料就是海量的(动辄几十个G),所以如果训练数据足够大,其实不靠当前这个例子,靠其它例子,也能弥补被Mask单词直接的相互关系问题,因为总有其它例子能够学会这些单词的相互依赖关系。

  • BERT的在预训练时会出现特殊的[MASK],但是它在下游的fine-tune中不会出现,这就出现了预训练阶段和fine-tune阶段不一致的问题。其实这个问题对最后结果产生多大的影响也是不够明确的,因为后续有许多BERT相关的预训练模型仍然保持了[MASK]标记,也取得了很大的结果,而且很多数据集上的结果也比BERT要好。但是确确实实引入[MASK]标记,也是为了构造自编码语言模型而采用的一种折中方式。

  • 为了解决OOV的问题,我们通常会把一个词切分成更细粒度的WordPiece。BERT在Pretraining的时候是随机Mask这些WordPiece的,这就可能出现只Mask一个词的一部分的情况,例如:

probability这个词被切分成”pro”、”#babi”和”#lity”3个 WordPiece。有可能出现的一种随机Mask是把”#babi” Mask住,但是”pro”和”#lity”没有被Mask。这样的预测任务就变得容易了,因为在”pro”和”#lity”之间基本上只能是”#babi”了。这样它只需要记住一些词(WordPiece的序列)就可以完成这个任务,而不是根据上下文的语义关系来预测出来的。类似的中文的词”模型”也可能被Mask部分(其实用”琵琶”的例子可能更好,因为这两个字只能一起出现而不能单独出现),这也会让预测变得容易。

为了解决这个问题,很自然的想法就是词作为一个整体要么都Mask要么都不Mask,这就是所谓的Whole Word Masking。这是一个很简单的想法,对于BERT的代码修改也非常少,只是修改一些Mask的那段代码。

8. 从源码层面,理解Bert原理

  1. 从源码层面,深入理解 Bert 框架
  2. 从源码解析 Bert 的 Embedding 模块​
  3. 从源码解析 Bert 的 BertEncoder 模块
  4. 从源码解析 Bert 的 BertPooler 模块

文章从源码层理,对Bert模型进行了深入的解析

9. 用 Bert 解决实际NLP任务

使用 Bert 框架去解决NLP中的实际任务,请参考我的这篇 文章,里边对常见的NLP任务进行了分类,并详细讲解了针对每一类问题,如何对Bert框架进行微调。
参考文章:
4. 关于BERT的若干问题整理记录
5. 图解BERT模型:从零开始构建BERT
6. BERT四大下游任务
7. 超细节的BERT/Transformer知识点

#深入理解# Bert框架原理相关推荐

  1. 理解BERT:一个突破性NLP框架的综合指南

    概述 Google的BERT改变了自然语言处理(NLP)的格局 了解BERT是什么,它如何工作以及产生的影响等 我们还将在Python中实现BERT,为你提供动手学习的经验 BERT简介 想象一下-- ...

  2. (连载)词向量的理解——BERT模型的句子向量表示

    文章均从个人微信公众号" AI牛逼顿"转载,文末扫码,欢迎关注! word embedding的出现提升了自然语言处理的效果.典型的使用场景就是把高质量的词向量输入到的模型中,通过 ...

  3. bert中的sep_一步步理解BERT

    作者:张贵发 研究方向:自然语言处理 NLP NLP:自然语言处理(NLP)是信息时代最重要的技术之一.理解复杂的语言也是人工智能的重要组成部分.而自google在2018年10月底公布BERT在11 ...

  4. 从One-hot, Word embedding到Transformer,一步步教你理解Bert

    zenRRan前言: 没进交流群的小伙伴注意啦!扫描下面群二维码和我的个人二维码即可! 群二维码 我的二维码 作者 | 张贵发 转载自AINLP 文章目录 NLP Word Embedding RNN ...

  5. 理解BERT Transformer:Attention is not all you need!

    BERT是谷歌近期发布的一种自然语言处理模型,它在问答系统.自然语言推理和释义检测(paraphrase detection)等许多任务中都取得了突破性的进展.在这篇文章中,作者提出了一些新的见解和假 ...

  6. NLP系列(9)_深入理解BERT Transformer ,不仅仅是注意力机制

    大数据文摘与百度NLP联合出品 作者:Damien Sileo 审校:百度NLP.龙心尘 编译:张驰.毅航 https://blog.csdn.net/longxinchen_ml/article/d ...

  7. 深入理解BERT Transformer ,不仅仅是注意力机制

    作者: 龙心尘 时间:2019年3月 出处:https://blog.csdn.net/longxinchen_ml/article/details/89058309 大数据文摘与百度NLP联合出品 ...

  8. 关于Transformer你需要知道的都在这里------从论文到代码深入理解BERT类模型基石(包含极致详尽的代码解析!)

    UPDATE 2.26.2020 为代码解析部分配上了Jay Ammar The Illustrated GPT-2 的图示,为想阅读源码的朋友缓解疼痛! 深入理解Transformer------从 ...

  9. 理解BERT模型理论

    BERT 模型是 Google 在 2018 年提出的一种 NLP 模型,成为最近几年 NLP 领域最具有突破性的一项技术.在 11 个 NLP 领域的任务上都刷新了以往的记录,例如GLUE,SquA ...

最新文章

  1. JSON Web Token - 在Web应用间安全地传递信息
  2. 详解正则表达式匹配方法 match()
  3. jq鼠标移入移除事件
  4. 使dreamweaver支持ftl扩展名
  5. 【最详细】数据结构(C语言版 第2版)第七章课后习题答案 严蔚敏 等 编著
  6. SQL Server中drop、truncate和delete语句的用法
  7. SAP CDS view里的association会被编译成LEFT OUTER MANY TO ONE JOIN
  8. oracle存储过程隐式函数,Oracle存储过程,函数。
  9. LeetCode 189. Rotate Array
  10. vs mfc数据与控件绑定错了_ASP.NET Core Blazor Webassembly 之 数据绑定
  11. (三)设置Jenkins为MLOps构建CI/CD管道
  12. hibernate - Transaction not successfully started
  13. pythonclass的使用详情_python 类class基础简明笔记
  14. 方向导数与梯度——学习笔记
  15. jQuery事件自动触发
  16. 苹果Mac新手必备技巧|了解使用 Mac 桌面
  17. 三菱q plc modbus通讯协议详解_三菱Q系列PLC与昆仑通态触摸屏以太网通讯
  18. 4ARM-PEG-DA 4Arm-PEG-ACRL 四臂PEG丙烯酸酯
  19. VB→C++→C#→VB.NET,语言的共性和个性
  20. 通过hover显示子元素

热门文章

  1. 更相减损术程序设计c语言,更相减损术
  2. 《计算机网络》局域网
  3. MSP430F5xx / F6xx系列 DCO频率范围选择方法
  4. 华为hn–wx9x笔记本电脑_HUAWEI 华为 MateBook X Pro 2019款 13.9英寸笔记本电脑(i5-8265U、8GB、512GB)...
  5. Java学习之多线程3
  6. 【数据存储】【Redis】第三章: Redis五大数据类型实现原理
  7. 看过的觉得好的TED演讲(Update@21/04/18)
  8. sham-link和路由选路
  9. Leetcode-跳跃游戏I和II(动态规划)
  10. 基于OneFlow实现Unfold、Fold算子