Bert笔记

本文会尽可能详细的介绍BERT的结构,预训练方法细节
一 BERT的结构 BERT的具体结构如下图所示,其只用到了transformer的encoder部分,由多层tranformer的encoder堆叠而成,因此我们可以看到BERT并未在结构上进行了创新,其主要创新点在于预训练的部分

Bert笔记
文章图片
图1 来自于参考资料5的博客
Bert笔记
文章图片
图2 BERT input representation
BERT将输入文本转化为为向量表示其实是由三部分相加构成(图2),token embeddings,segment embeddings,和 posistion embeddings 。由于需要相加操作,这三个embedding的大小都是一致的,embedding size 通常和BERT的隐层大小保持一致。这三部分参数都是通过训练得到的,segment emdeddings 是一个 2 X embedding size的矩阵,第一行对应句子A的embedding,第二行对应句子B的embedding,需要注意的是这里得到position emedding参数的方式和transformer不一样,在transormer里,postition embedding是由sin/con函数直接得到,不需要训练。图2出现的和将会在下文中进行解释。
二 BERT的框架 框架分为两步,一是预训练,二是fine-tuning

Bert笔记
文章图片
图3 BERT框架图 2.1 预训练BERT 预训练的语料是用大量的无标签数据构成的,具体地预训练任务有两个,masked LM 和预测是否为下个句子,每个输入序列可以由一个或两个有上下文联系的句子构成,句子之前用分隔,在每个输入序列的最前面加 token
2.1.1 masked LM(MLM) —— BERT论文中的一个重要创新点 随机mask句子中的一部分词(15%),然后预测这些mask词的实际值,注意此时输出序列任何输入序列一样长,只不过计算loss的时候只计算mask位置的,如原始句子: I eat [mask] apple,输出 I eat an apple.
论文中还提到对句子中选择的15%mask的词,其中80%会被mask,10%会保留原来的词,10%会被随机替换成另一个词(random token)
tensorflow实现bert的代码中将原始数据复制了10份,再将句子中选择15%的mask(10份复制的 8份mask, 1份保留,1份随机替换)
:为什么要将10%被选择mask的词保留原来的词
如果将选择的mask的词100%都mask,由于在finetune的阶段,所有词都已知,没有,如果模型只在带的句子上训练过,那么模型就只知道根据其他词的信息来预测当前词,而不会利用这个词本身的信息(被mask的词),导致损失一部分信息
:为什么10%会被随机替换成另一个词
因为如果都用原来的词,预训练时,模型会学到如果当前词是mask,就根据其他词的信息推断这个词,如果是正常的,那么可能会直接照抄原来的单词,不利于模型学习单词间的依赖关系。使用了random token有助于模型在任何位置的token上都把当前token信息和上下文信息相结合。
2.1.2 预测是否为下个句子(Next Sentence Prediction, NSP) 构建语料:每个训练例子有句子A,B,B有50%的几率是A的下一句,标记上是下一句标签,50%的几率是随机选的,标记上非下一句标签,构建输入序列的时候是形如 AB 这样的格式,见图2
2.2 fine-tune 用第一步预训练得到的参数初始化BERT,再将BERT接入到适合下游任务的结构中。
举个最简单的例子,对于分类任务来说,将softmax层接在 token输入对应最后一个隐层输出(这个一般视为概括了整个句子的信息)或者在softmax层之前再接单层全连接网络
从图二中看到BERT在预训练的时候一个输入序列是由两个句子组成,那么如果需要finetune的下游任务为单句的话输入格式要怎么处理?
A:BERT预训练的输入序列用了两个句子的拼接是为了NSP任务,当要finetune的任务是单句的时候,输入格式直接为 My dog is cute
使用BERT-base进行fine-tune需要12G以上的GPU,预训练BERT需要28G以上GPU
三 BERT实际应用 3.1 如何用于长文本,如在阅读理解任务中 答案是用sliding windows,即把文档分成有重叠的若干段,每一段都当成独立的文档送入BERT,最后再对这些独立文档得到的结果进行整合
sliding windows只能用于训练,测试阶段可通过设置batchsize为将长文本读取
3.2 如何用于多文档 现有的主要思路是先用retrieval选一些相关的doc,再当做阅读理解的问题做
参考资料

  1. 原论文 https://arxiv.org/pdf/1810.04805.pdf
  2. 知乎上的一一篇文章 https://zhuanlan.zhihu.com/p/46652512
  3. 习翔宇知乎 https://zhuanlan.zhihu.com/p/46833276?utm_source=wechat_session&utm_medium=social&utm_oi=580863656032473088
  4. kaggle上的一篇高分教程 https://www.kaggle.com/abhinand05/bert-for-humans-tutorial-baseline
  5. google提供的BERT预训练模型(有英文也有中文的)https://github.com/google-research/bert#pre-trained-models
  6. bert版本的pytorch https://github.com/huggingface/transformers
  7. pytorch版bert使用教程https://zhuanlan.zhihu.com/p/66057193
  8. pytorch版bert中文使用博客https://blog.csdn.net/ccbrid/article/details/88732857
  9. 包括了BERT结构的解析https://cloud.tencent.com/developer/article/1389555
  10. 【Bert笔记】BERT源码解读https://www.jianshu.com/p/d7ce41b58801

    推荐阅读