文章目录
- 一、背景
- 二、方法
论文:BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
出处:Google
一、背景
在 BERT 之前的语言模型如 GPT 都是单向的模型,但 BERT 认为虽然单向(从左到右预测)预测任务符合语言模型的建模过程,但对一些语言理解任务不太友好,因为要理解一句话说的是什么意思的话(如 VQA), 同时看到一整句话也是可以的,是符合逻辑的,而不是只能一个单词一个单词的来逐个看。
所以 BERT 打破了语言模型单向的限制,做了一个双向的模型,就是做完形填空的时候运行看左边也运行看右边,而且是受 Cloze (1953年的论文)这个方法的启发
具体的做法就是每次随机选一些 token 然后 mask 掉这些信息,目标是预测这些 token,这样就允许训了一个双向且深的 transformer 模型结构
此外,BERT 还做了一个任务——下一个句子的预测(next sentence prediction),就是给模型两个句子,让模型判断这两个句子在原文中是不是相邻的,能让模型学习句子层面的信息
二、方法
BERT 的两个步骤:
- 预训练:使用无标注的数据训练的预训练模型(左边)
- mask model:输入的是句子对儿,会把句子先进行拆词,并在序列首位放置 [CLS] 在句子中间放置 [SPE] 这两个特殊的 token,然后对普通的 token(除过特殊 token 之外的从句子中拆出来的 token)进行 15% 概率的擦除,然后在这 15% 的 token 中选择 80% 的直接用 [MASK] 替换掉这个 token,10%的随机放置 token,10% 不改变 token。
- next sentence prediction:预测下一个句子,在 VQA 和 语言推理中都是句子对,所以使用这种方法对这两个任务类似的理解的任务有提升。输入的数据中有 50% 真的是下一个句子,50% 是随机拿来的句子。
- 微调:针对不同的下游任务,还会使用有标签的数据来微调,使用预训练模型参数初始化,所有权重都会参与训练(右边)
模型超参数:base 共 110M 参数(也就是 1.1亿)对标的是 GPT 模型大小,large 共 340M 参数(也就是 3.4亿)
- transformer block 个数:base 12 层,large 24 层
- hidden 层大小:base 768,large 1024
- 多头注意力机制 head 的个数:base 12 头,large 16 头
输入和输出:
- 输入是一个序列,可以是一个句子,也可以是两个句子,两个句子也会并成一个序列
- 序列的构成方式:使用的切词方法是 WordPiece,因为如果按照空格切词的话会导致词典很大,WordPiece 是说如果一个词出现频率不高的话,那么就切开看它的子序列,子序列出现多的话保留子序列就可,可以使用 30000 token vocabulary 就能表示一个大的文本了。切好词之后就要把两个句子整合成一个序列,序列的第一个词用于都是 [CLS],bert 希望这个 token 表示整个序列的特征。还有一个 [SEP] token 表示将两个句子在这里切开,因为毕竟每个句子还是独立的个体,所以要有标志将其切开。在图 1 左侧就展示了,将句子切成 token,然后将求每个 token 的 embedding,
- 每个 token 还要加 位置的 embedding 和 segment embedding,如图 2 所示
- BERT 的每个 token 的输入是由三个部分相加得到的
- token embedding:就是输入 transformer 之前的一次简单 embedding
- segment embedding:表示第一句话还是第二句话
- position embedding:token 在序列中的位置