【精读Paper】BERT:NLP 新范式

二月出了 ELMo,六月出了 OpenAI Transformer,十月又出了BERT,下半年开始的这场预训练语言模型的火,越燃越大啊,希望能烧出 CV 那样的 baseline。
不得不说,Jacob 的这篇 BERT 真是大手笔,massive data + massive model + massive computation,踏平了 N 多 task,称得上 NLP 新范式了。当然,常人基本不可能复现的现实也很尴尬。。。

优缺点都很明显,但 paper 仍值得精读,思路明晰,细节充足,还是有很多启发的,这里讨论下吧。


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

1. Motivations

基于语言模型的预训练网络,最近在很多 NLP task 上取得了 SOTA 成绩。将预训练好的语言表征应用到下游 task, Jacob 大手笔的将其分成了两类:

feature-based approaches

早期的 Word2Vec、Glove 将 token 表示为上下文无关的表征,进一步推广到了 doc2vec;后期 Context2Vec、ELMo 尝试将 token 小时为上下文相关的表征,ELMo 利用了 biLM 的语义语法提取能力。
这类方法的思路就是:预训练语言表征,对于特定的监督学习任务,将语言表征作为 task-specific 网络的输入特征使用。task-specific 网络因监督学习任务而不同。

fine-tuning approaches

pre-train LM、MT、MRC 迁移到下游任务,一直都有研究,可以极大缩减监督学习任务上的参数学习规模,比如 ULMFiT、OpenAI Transformer(后称 GPT)。GPT 基于 LM 训练了 Transformer decoder 用于后续任务的 fine-tuning。
这类方法的思路就是:预训练语言表征的网络,作为所有监督学习任务的核心骨干网络,对于特定监督学习任务,进行 fine-tuning 即可。

Jacob 野心很大,要实现 NLP 的 ResNet。作者出发点:

  • fine-tuning approaches 是未来趋势
  • 基于 LM 训练语言表征
  • biLM 对于捕捉上下文信息非常必要,尤其对于 token-level task
  • ELMo 虽然用了 biLM,但方式浅陋:前向 LM 和后向 LM 是两个网络,基本不共享参数;在 loss 时才结合;前向后向简单拼接
  • GPT 由于训练的 Transformer decoder 网络,只能获取前向信息
  • Transformer 的特征提取能力,以及长距离依赖能力出众,可继续采用

因此,作者对 fine-tuning approaches 做了改进,基于 biLM 训练了Transformer encoder,核心贡献在于设计了新的预训练目标。下面介绍 BERT 模型的内容。

2. Framework

2.1 model

作者给出了 BERT 和 GPT、ELMo 的网络结构差异对比,见下图:

在这里插入图片描述

(EMLo 的图不是很准确,最后表征 T_n 应该是利用前向 LSTM 和后向 LSTM 的 stacked LSTM 的各层信息,而非仅最后一层)

可见,BERT 的网络结构就是标准的 Transformer 的 encoder 单元,multi-head attention + LN + MLP + Res + LN,不像 GPT 用的 musked multi-head attention,从而可以 attention 上下文信息。

2.2 input

为了能用一个 token 序列支持单文本和文本对,同 GPT,BERT 设计了网络的 input representation 形式。形如下:

在这里插入图片描述

  • 每个 token 输入表征为 sum representation = token embedding + segment embedding + position embedding。这三个 embedding 都是预训练好的,这里 token embedding 用了谷歌 NMT 中的 WordPiece,类似于先做 word hash 吧,实际,跟 ELMo 一样可以用 word2vec 也可以基于字符的 CNN。
  • token 序列的第一个 token 通常是有效的分类表征,故在序列前增加了 CLS token。对于下游分类任务,则把网络中 CLS token 对应的最终隐状态,作为整个序列的整体表征,用于分类;当然,下游非分类任务,则忽略这个 token 即可。
  • 对于文本对输入,为了区分文本,加入了分割 token SEP,以及每个文本的 token 都要加上该文本的 embedding;单文本当然也可以没有 segment embedding。

2.3 pre-train

要在 Transformer encoder 这个网络结果上,基于 biLM 预训练网络参数,作者提出了新的 object,由两个 task 构成。

Masked LM(MLM)

标准的 LM 是单向的,即 token t_k 在网络中最终状态作为输出,接 softmax 预测 token t_{k+1},构造 loss。
为实现 biLM, ELMo 做法是分别训练正向的标准 LM 和反向的标准 LM,然后将两个表征进行拼接。但这并不是真正合乎直觉的深度双向网络。
实际上,基本不可能根据标准 LM 实现深度双向网络,这必然会产生回路,造成 tokens 间接接触到他们自己,从而使得预测无意义。

作者另辟蹊径,提出了 MLM task,即在预训练过程中,随机选择 p% 的 tokens 进行 mask,然后利用 LM 仅预测这些被 masked 的 tokens。这实际上相当于,随机划窗构造有序 CBOW,预测 masked token 利用了窗口的信息,实现了双向的信息获取。

上面还有个小问题未解决,将 masked token 表示为 [MASK] token,虽然可以预训练 [MASK] token,但其并不会出现在后续任务的 fine-tuning 中,从而造成mismatch,而且过多的 [MASK] token 会影响上下文相关的语言表征的学习。因此,MLM 的具体数据产生方式为:

  • 随机选取 15% tokens 来 mask
  • 其中,80% masked token 替换为 [MASK] token,为了形成 biLM
  • 其中,10% masked token 替换为任意其他 token,结合上一条,为了强制学到 distributional contextual token representation
  • 其中,10% masked token 保持不变,为了平衡真实 token 的学习
Next Sentence Prediction(NSP)

很多下游任务需要捕捉文本对间的关系,但 MLM 建模的 biLM 并不能直接捕捉到。
这就需要用到这里的 NSP task,在训练过程中,对于 sentenceA 和 sentenceB,随机选择 50% 对,将其中 sentenceB 置换成其他任意文本,然后标签为 0/1,从而构造成了二值分类任务。这有点像 Skip-throughts 的思路。

最终,pre-training 过程中,training loss 为平均 MLM 似然和平均 NSP 似然之和。

2.4 fine-tune

预训练好模型后,应用于下游任务时,

  • 对于 sequence-level 分类任务,无论单文本还是文本对,像前面说的,直接使用 [CLS] token 对应的最后隐状态即可,后面只需接一层分类层即可。
  • 对于 span-level 或者 token-level 预测任务来说,则需要针对任务进行相应调整:对QA使用输入 para 对应 token 的最后隐状态序列,对于标注任务使用单文本所有 token 的最后隐状态构成的序列。
  • fine-tuning 过程中,模型的大部分超参数不变,通常调整 batch size、learning rate、epoches 即可;作者发现,这些超参对于大规模标注训练数据相对小规模标注训练数据而言,影响更小。

2.5 参数信息

  • 语料用的 BooksCorpus 和 enWiki,文档级语料很重要
  • BERT_BASE:Transformer blocks L=12,hidden size H=768,MLP size 4H,multi-head A=12,共 110M 参数,其他训练参数就不介绍了
  • 16块 TPU,跑了四天!!!

2.6 ablation studies

  • NSP 对于上下文相关 task 有作用,如 NLI task
  • MLM 对于语义理解很重要,如 MRPC 和 SQuAD
  • 众所周知的是,对于大规模的任务如 MT 和 LM,增大模型规模将持续提升性能,本工作第一次发现,对于非常小规模的任务如 MRPC,增大模型规模也能持续提升性能,作者认为这说明预训练充分了(待分析)

3. Comments

3.1 缺点

  • MLM 使得每个 batch 仅 15% tokens 参与预测,需要更多 training steps,收敛很慢
  • 模型巨大,算力要求巨大,reddit 上网友预估训练一次需要 5W 人民币

3.2 启发

  • 预训练时用了 MLM 和 NSP 两个 task,也可以像 decaNLP 那样进一步引入更多 task,搞个 multi-task learning?
  • 不简单使用 final hidden state,像 ELMo 那样,学习各层表征的线性组合,也能捕捉到 syntax 的信息
  • MLM 通过挖坑实现 biLM,可以借鉴,比 ELMo 的简单拼接更符合直觉
  • Transformer 确实有优越之处,可以多使用
  • 基于语言模型预训练网络,是大趋势,用不起 BERT,可以试试 ELMo
  • 数据+模型+算力,普通团队越来越不好玩这游戏了。。。
  • 考虑众筹买训练好的模型。。。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值