BERT Training By Example

BERT 模型的训练主要分为三个阶段:
1. Masked Language Model,基于对自然语言的语料打标签生成训练样本,将无监督学习转换为监督学习
2. Pretraining,模型训练的核心过程,生成能理解语言的模型
3. Fine-tuning,基于对模型的理解,完成特定的任务。

Masked Language Model

Masked Language Model 的任务是将无标签的语料转换为有标签的语料,进而将无监督学习转化为监督学习。这个过程需要准备两份材料:原始语料词汇表
原始语料就是一系列符合语法的句子或段落。
词汇表维持token-id的映射,除了一门语言自身的词汇,BERT还要求词汇表包含[PAD], [UNK], [CLS], [SEP]和[MASK]。

Pretraining

Pretraining是整个BERT训练的核心,其目的是获取Language Model(语言模型),一个含有每个词的Embedding的神经网络模型,形象的说,完成了Pretraining的过程,就类似于一个英文系或中文系的学生毕业了。

Pretraining 训练目标有两个:
1. Masked LM Prediction, 预测在MLM阶段被故意处理的15%候选词。
2. Next Sentence Prediction,预测在MLM阶段被故意拼接的50%句子。

经过不断的调整模型参数,直到模型可以准确的找到候选词和拼接句子的正确答案。

下图是BERT的模型结构,其中两个关键概念:Embedding和Self-Attention,BERT神经网络就是通过不断调节Embedding和Self-Attention的参数来实现”理解”一门语言的目的。

Embedding(词嵌入)可以理解为是对一个词的数值化表达。比如中文常用字3000个,如果要对他们进行编码,最简单的方法就是从0数到2999,也可以用一个长度是3000的数组,通过分别在[0], [1] … [2999]的数值置1,其余置0来进行编码(one-hot编码)。这两种方法都能满足区分文字的目的,但不能表示出两个字的相似性,比如,在编码上,”我”的编码([1])和”书”的编码([4])差值比和”人的编码([1282]) 小,但我们不能说在语言上”我”和“书”的关系比和”人”更近。而Embedding就希望解决这样一个问题,我们希望为一门语言的每个词进行编码,如果编码A和编码B的数值距离比编码A和编码C数值距离更近,那么语言上A代表的词和B代表的词的相似度,就比和C代表的词的相似度更高。这个编码就是Embedding。
典型的应用就是在推荐系统中,用户喜欢A商品,那么就可以从库中找到和A的Embedding最相似的Embedding对应的商品,推荐给用户。

Attention(注意力机制) 在NLP中最早用于翻译任务中的语义理解,用于获取针对特定词,句子中各个词的相关性排序。
打个比方,小C看了电影”复仇者联盟”,想去书店找更多关于”漫威”的资料,书店的书浩如烟海,在没有任何先验知识的前提下,首先能做的只能是逐本,逐页地看,但看过一遍之后,就可以知道3-1区域的漫画书籍和”漫威”关系较大,再仔细看一遍3-1区域,发现美国漫画的书籍和”漫威”关系更大,就这样带着问题找答案,最终,就知道书店里每一本书和”漫威”的相关性。这里,”漫威”就是我们的”注意力”所在,我们只关注和”漫威”相关的部分,相似度判断是小C看”复仇者联盟”积累的记忆,找到每本书和”漫威”的相关性排序是结果

以上文为例,”秦 昭 襄 [MASK] 嬴 稷 与 [MASK] 怀 王 熊 槐 在 黄 棘”,经过onehot->embedding table –> embedding 的映射,其实两个”[MASK]”的Embedding成分中,只有E(position)不同,E(token) 和E(segment)均相同,那如何知道被[MASK]的分别是什么呢?就要依赖Attention结构分析相似性并排序的能力。

在下图中,Attention的输入是一组Embedding,起初,Attention还不能很好的根据上下文推断出[MASK]的词,但在label的帮助下,经过不断地迭代,不断地调整Query,Key和Value内的变量值,Attention最终可以在输入的Embedding几乎相同(仅E(position)不同)的情况下,根据上下文的不同,推断出第一个MASK对应的是”王”而第二个是”楚”。

Fine-tuning

在Pretraining阶段理解了整个语言之后,Fine-tuning就是学习如何执行具体任务,这个阶段的算力需求也比Pretraining小很多。好比一个英文系的学生毕业后从事古典文学翻译工作,已有的语言知识要针对具体的任务做微调。

一切NLP皆分类,对于常见的NLP任务,论文中给出了如何设计分类器来进行Fine-tuning。比如,(a)图中列出的数据集都是判断两个句子的关系,Sentence1: 明天天气晴朗,Sentence2:明天暴雨,Label: Contradict,Pretraining之后BERT具备了”语感”,知道什么是话是通顺的,此时只需要将Sentence1 和Sentence2拼接:明天天气晴朗,明天暴雨,Label:Contradict,借助之前培养的”语感”,经过几轮迭代,BERT就会进一步学会”分类”。

就这样,通过将各个NLP任务转化为对一个句子的分类任务,对BERT模型进行进一步训练,就可以使模型具备完成具体任务的能力。

经过Fine-tuning阶段,模型已经Ready,就可以愉快地拿去测试了

Ref:
https://github.com/google-research/bert
https://arxiv.org/pdf/1810.04805.pdf
https://arxiv.org/pdf/1706.03762.pdf
https://www.cnblogs.com/guoyaohua/p/9429924.html

Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.