前言
大家好,我是半虹,这篇文章来讲(Bidirectional Encoder Representations from Transformers)
目录
0 概述
1 模型架构
2 模型输入
3 预训练和微调
正文
0 概述
从某种程度上来说,深度学习至关重要的一环就是表征学习,也就是学习如何得到数据的向量表示
对于自然语言领域,一个典型的场景是学习文本的向量表示,关于这一点,前人已经做了很多探索
从一开始的 one-hot,到后来的 word2vec ,然后到 ELMo ,最后到现在的 BERT 及其众多变种
这些技术的发展代表着自然语言表征学习的历史进程,为各项自然语言处理任务提供了有力的支撑
在这里,我们不会展开说每种技术的细节以及它们之间的发展关系,这些内容会在之后有一篇文章单独介绍
现在大家只需要清楚,本文介绍的 BERT \text{BERT}BERT 本质上就是一个语言表征模型,用来获取文本向量表示
1 模型架构
事实上,BERT 的模型架构非常简单,就是 Transformer 的编码器,具体的结构如下图所示
编码器由若干个编码层堆叠而成,而且模型中上一个编码层的输出会作为下一个编码层的输入
编码层包括多头注意力机制和前馈神经网络两个子模块,每个子模块后有残差连接和层正则化
由于我们在上一篇文章中已经非常详细介绍过模型细节,所以这里就不再重复
BERT 有两个版本,它们的架构是一样的,不同之处仅在于超参,具体的区别如下 :
BERT-BASE :编码层数量是 12,多头注意力头数是 12,隐藏层维度是 768 ,总参数量是 110M
BERT-LARGE:编码层数量是 24,多头注意力头数是 16,隐藏层维度是 1024,总参数量是 340M
2 模型输入
首先明确一件事情, BERT 这个模型的输入输出究竟是啥
给定一段文本序列, BERT 的目标是得到序列中每个词元的向量表示
然而,计算机是无法直接识别文本的,我们需要先将其转化成数字表示,这样才能够作为模型的输入
通常,只需要将输入文本经过嵌入层,得到对应每个词元的可学习向量,然后通过数据进行训练即可
除了词元本身之外,模型还需要词元的位置信息以及用于区分不同句子的分割信息
这些都可以通过添加不同的嵌入层解决,最后同一词元的各种嵌入会以按元素相加的方式来进行融合
这里注意,对于原始输入文本,模型会在其中插入一些特殊标记后才将其送进嵌入层,特殊标记如下:
[CLS]:将该标记插入到文本开头,当模型训练完后,该标记的向量表示可表征整段文本的语义
[SEP]:当文本中包含两个句子时,将该标记插入到两个句子中间,可起到相当于分隔符的作用
[PAD]:将该标记插入到文本末尾,使得同一批量里文本长度相同,要注意该标记可以多次插入
这样说可能还不是很清晰,下面看一个实际的例子:
最后再来对比一下 Transformer 和 BERT 两个模型间输入表示的差异
Transformer的输入表示由词元表示、位置表示相加得到
BERT的输入表示由词元表示、位置表示、分割表示相加得到
Transformer 的位置表示不需要学习,能够直接计算得到
BERT 的位置表示由嵌入层中的可学习向量经过数据训练得到