[详解] 一文读懂 BERT 模型

作者: Microstrong

本文概览:

1. Autoregressive 语言模型与 Autoencoder 语言模型

1.1 语言模型概念介绍

Autoregressive 语言模型:指的是依据前面(或后面)出现的单词来预测当前时刻的单词,代表有 ELMo, GPT 等。

Autoencoder 语言模型:通过上下文信息来预测被 mask 的单词,代表有 BERT , Word2Vec(CBOW) 。

1.2 二者各自的优缺点

Autoregressive 语言模型:

  • 缺点:**** 它只能利用单向语义而不能同时利用上下文信息。ELMo 通过双向都做 Autoregressive 模型,然后进行拼接,但从结果来看,效果并不是太好。
  • 优点:对生成模型友好,天然符合生成式任务的生成过程。这也是为什么 GPT 能够编故事的原因。

Autoencoder 语言模型:

  • 缺点:由于训练中采用了 [MASK] 标记,导致预训练数据与微调阶段数据不一致的问题。BERT 独立性假设问题,即没有对被遮掩(Mask)的 token 之间的关系进行学习。此外对于生成式问题,Autoencoder 模型也显得捉襟见肘。
  • 优点:能够很好的编码上下文语义信息(即考虑句子的双向信息), 在自然语言理解相关的下游任务上表现突出。

2. DAE 与 Masked Language Model

2.1 AutoEncoder

如下图所示,AutoEncoder 框架包含两大模块:编码过程和解码过程。通过 将输入样本 映射到特征空间 ,即编码过程;然后再通过 将抽象特征 映射回原始空间得到重构样本 ,即解码过程。优化目标则是通过最小化重构误差来同时优化 encoder 和 decoder,从而学习得到针对输入样本 的抽象特征表示 。

这里我们可以看到,AutoEncoder 在优化过程中无需使用样本的 label,本质上是把样本的输入同时作为神经网络的输入和输出,通过最小化重构误差希望学习到样本的抽象特征表示 。这种无监督的优化方式大大提升了模型的通用性。

对于基于神经网络的 AutoEncoder 模型来说,则是 encoder 部分通过逐层降低神经元个数来对数据进行压缩;decoder 部分基于数据的抽象表示逐层提升神经元数量,最终实现对输入样本的重构。

这里值得注意的是,由于 AutoEncoder 通过神经网络来学习每个样本的唯一抽象表示,这会带来一个问题:当神经网络的参数复杂到一定程度时 AutoEncoder 很容易存在过拟合的风险。

2.2 Denoising AutoEncoder(DAE)

为了缓解经典 AutoEncoder 容易过拟合的问题,一个办法是在输入中加入随机噪声,Vincent 等人提出了 Denoising AutoEncoder,即在传统 AutoEncoder 输入层加入随机噪声来增强模型的鲁棒性;另一个办法就是结合正则化思想,Rifai 等人提出了 Contractive AutoEncoder,通过在 AutoEncoder 目标函数中加上 encoder 的 Jacobian 矩阵范式来约束使得 encoder 能够学到具有抗干扰的抽象特征。

下图是 Denoising AutoEncoder 的模型框架。目前添加噪声的方式大多分为两种:

  • 添加服从特定分布的随机噪声;
  • 随机将输入 x 中特定比例的数值置为 0;

DAE 模型的优势:

  • 通过与非破损数据训练的对比,破损数据训练出来的 Weight 噪声较小。因为擦除数据的时候不小心把输入噪声给擦掉了。
  • 破损数据一定程度上减轻了训练数据与测试数据的代沟。由于数据的部分被擦掉了,因而这破损数据一定程度上比较接近测试数据。

推荐阅读论文:
【1】Extracting and composing robust features with denoising autoencoders, Pascal Vincent etc, 2008.
【2】Contractive auto-encoders: Explicit invariance during feature extraction, Rifai S etc, 2011.

2.3 DAE 与 Masked Language Model 联系

  • BERT 模型是基于 Transformer Encoder 来构建的一种模型。
  • BERT 模型基于 DAE(Denoising AutoEncoder,去燥自编码器)的,这部分在 BERT 中被称为 Masked Language Model (MLM)
  • MLM 并不是严格意义上的语言模型,它仅仅是训练语言模型的一种方式。BERT 随机把一些单词通过 MASk 标签来代替,并接着去预测被 MASk 的这个单词,过程其实就是 DAE 的过程。

3. Transformer 模型回顾

Transformer 模型使用经典的 encoder-decoder 架构,由 encoder 和 decoder 两部分组成。

  • 下图左侧用框出来的,就是我们 encoder 的一层。encoder 一共有层这样的结构。
  • 下图右侧用框出来的,就是我们 decoder 的一层。decoder 一共有层这样的结构。
  • 输入序列经过 Input Embedding 和 Positional Encoding 相加后,输入到 encoder 中。
  • 输出序列经过 Output Embedding 和 Positional Encoding 相加后,输入到 decoder 中。
  • 最后,decoder 输出的结果,经过一个线性层,然后计算。

3.1 Encdoer 部分

输入是原始词表中词的。接着进行 Input Embedding,把词转换成分布式的表示。在语言模型中词的顺序还是很重要的,因此 Transformer 加入了 Positional Encoding,也就是加入了词的位置信息。encoder 的输入是 Input Embedding 加上对应位置的 Positional Encoding。

Input Embedding 加上对应位置的 Positional Encoding 作为 encoder 的输入,首先会经过 Multi-Head Attention,学习输入中词与词之间的相关性。接着是 Add & Norm 层,Add 残差的方式对不同的输出相加,是借鉴 CV 中的残差网络思想解决梯度消失问题;Norm 用的是 Layer Norm。然后进行 Feed Forward 的前向计算,这一层就是全连接的神经网络。最后再接一层 Add & Norm,防止梯度消失。

3.2 Decoder 部分

通过 encoder 部分已经获得了所有输入的信息,把这些信息当作 decoder 后面 Multi-Head Attention 的输入,也就是 self-attention 中的、来自 encoder 部分输出的特征,来自 decoder 部分的输入。


  • 本文地址:[详解] 一文读懂 BERT 模型
  • 本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出

decoder 之前解码出的单词当作本次 decoder 的输入,也是通过 Output Embedding 加上对应位置的 Positional Encoding 输入到 Masked Multi-Head Attention,再经过 Add & Norm 层,这里还把 decoder 输入和 Masked Multi-Head Attention 输出做了残差连接,最后得到的输出就是我们上面提到的了。

把 encoder 部分获得的所有输入的信息和 decoder 前半部分得到的输入信息,一同送到后面这个 Multi-Head Attention 中,它学习哪些输入信息和之前输出信息的特征更有利于解码,最后还经过了 Add & Norm 层、Feed Forward 层和 Add & Norm 层,得到了 decoder 的最终输出。

解码这里要特别注意一下,编码可以并行计算,一次性全部 encoding 出来,但是解码不是一次把所有序列解出来的,而是像 RNN 一样一个一个解出来的,因为要用前几个位置单词的结果当作 self-attention 的 query。

3.3 Linear 和 Softmax

拿到 decoder 的输出做一个线性变换,最后通过一个计算对应位置的输出词的概率。Transformer 本次的输出当作下一步 decoder 的输入。

关于 Transformer 更详细的内容,可以参考我之前写的一篇文章:《Self-Attention 与 Transformer》

面试题:为什么 NLP 中的模型一般使用 Layer Norm,而不是 Batch Norm?

回答:

  • 在 CV 中,深度网络中一般会嵌入批归一化(BatchNorm,BN)单元,比如 ResNet;而 NLP 中,则往往向深度网络中插入层归一化(LayerNorm,LN)单元,比如 Transformer。为什么在归一化问题上会有分歧呢?一个最直接的理由就是,BN 用在 NLP 任务里实在太差了(相比 LN),此外,BN 还难以直接用在 RNN 中,而 RNN 是前一个 NLP 时代的最流行模型。虽然有大量的实验观测,表明 NLP 任务里普遍 BN 比 LN 差太多,但是迄今为止,依然没有一个非常严谨的理论来证明 LN 相比 BN 在 NLP 任务里的优越性。
  • 基于我阅读过的文献,我个人认为:BatchNorm 就是通过对 batch size 这个维度归一化来让分布稳定下来,有助于训练深度神经网络,是因为它可以让 loss 曲面变得更加平滑。LayerNorm 则是通过对 Hidden size 这个维度归一化来让某层的分布稳定,主要作用是在训练初期缓解梯度消失和爆炸的问题,提升稳定性。
  • 关于 BatchNorm 为什么在 NLP 问题上不 work 和 LayerNorm 在 NLP 问题上 work 的讨论,我强烈推荐大家阅读这篇文章《LayerNorm 是 Transformer 的最优解吗?》

4. BERT 模型

BERT 的全称是 Bidirectional Encoder Representation from Transformers,模型是基于 Transformer 中的 Encoder 并加上双向的结构,因此一定要熟练掌握 Transformer 的 Encoder。BERT 模型的主要创新点都在 pre-train 方法上,即用了 Masked Language Model 和 Next Sentence Prediction 两种方法分别捕捉词语和句子级别的 representation。

在用 Masked Language Model 方法训练 BERT 的时候,随机把语料库中 15% 的单词做 Mask 操作。对于这 15% 的单词做 Mask 操作分为三种情况:80% 的单词直接用[Mask]替换、10% 的单词直接替换成另一个新的单词、10% 的单词保持不变。

因为涉及到 Question Answering (QA) 和 Natural Language Inference (NLI)之类的任务,增加了 Next Sentence Prediction 预训练任务,目的是让模型理解两个句子之间的联系。与 Masked Language Model 任务相比,Next Sentence Prediction 更简单些,训练的输入是句子 A 和 B,B 有一半的几率是 A 的下一句,输入这两个句子,BERT 模型预测 B 是不是 A 的下一句。

由于注意力计算开销是输入序列长度的平方,较长的序列会影响训练速度,为了加快实验中的预训练速度,所以 90% 的 steps 都用序列长度为 128 进行预训练,余下 10% 的 steps 预训练为 512 长度的输入。

BERT 预训练之后,会保存它的 Embedding table 和层 Transformer 权重(BERT-BASE)或层 Transformer 权重(BERT-LARGE)。使用预训练好的 BERT 模型可以对下游任务进行 Fine-tuning,比如:文本分类、相似度判断、阅读理解等。

5. BERT 模型在实际场景的应用

BERT 模型在现实中的应用:

  • 情感分类:通过用户对商品评价来对商品质量问题进行分析,比如是否新鲜、服务问题等;
  • 意图识别;
  • 问答匹配;
  • 槽位提取:BERT 后接 CRF 来做命名实体识别;

6. BERT 模型的预训练及其改进

7. BERT 的 Fine-tuning 不同训练方式及常见的改进策略

7.1 Fine-tuning 的不同训练方式

7.2 BERT 的 Fine-tuning 中常见的改进策略

如果机器不足、预料不足,一般都会直接考虑用原始的 BERT、Roberta、XLnet 等在下游任务中微调,这样我们就不能在预训练阶段进行改进,只能在 Fine-tuning 阶段进行改进。改进方案如下图所示:

7.3 BERT 在实践中的 trick

  • 筛选训练数据,剔除过短或者过长的数据;
  • 尝试 bert+conv, bert+conv+avg_max_pooling, bert_last_layer_concat 等方式;
  • 针对本场景数据,进行少步数的进一步预训练;

8. 总结

BERT 模型作为当今 NLP 应用的大杀器,具有易于使用、稳定性强等诸多优点。本文深入了解 BERT 的原理,如何做到 BERT 的预训练改进以及 Fine-tuning 中所涉及到的常见改进策略。另外,本文也讲述了 BERT 模型在实际场景中的应用及在实践中的一些 tricks。

9. Reference

本文部分内容是 Microstrong 在观看徐路在 B 站上讲解的视频《BERT 模型精讲》的笔记,地址:https://www.bilibili.com/video/BV1M5411x7FZ?from=search&seid=7509511278753452725 ,剩余部分是 Microstrong 从 BERT 论文及下列参考文章中整理而来。

【1】Devlin J, Chang M W, Lee K, et al. Bert: Pre-training of deep bidirectional transformers for language understanding[J]. arXiv preprint arXiv:1810.04805, 2018.
【2】BERT 模型精讲,地址:https://www.bilibili.com/video/BV1M5411x7FZ?from=search&seid=7509511278753452725
【3】LayerNorm 是 Transformer 的最优解吗?,地址:https://mp.weixin.qq.com/s/W4gI9SWJm3MjbQHYgvFKbg
【4】The Illustrated Transformer,地址:https://jalammar.github.io/illustrated-transformer/
【5】一文看懂 AutoEncoder 模型演进图谱 - 深度的文章 - 知乎 https://zhuanlan.zhihu.com/p/68903857
【6】【NLP】Google BERT 详解 - 李如的文章 - 知乎 https://zhuanlan.zhihu.com/p/46652512


本文地址:https://www.6aiq.com/article/1594176245885
本文版权归作者和AIQ共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出