2018年10月,Google发出一篇论文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》, BERT模型横空出世, 并横扫NLP领域11项任务的最佳成绩!
而在BERT中发挥重要作用的结构就是Transformer, 之后又相继出现XLNET,roBERT等模型击败了BERT,但是他们的核心没有变,仍然是:Transformer。
相比之前占领市场的LSTM模型和GRU模型,Transformer有两个显著的优势:
- Transformer能够利用分布式GPU进行并行训练,提升模型训练效率.
- 在分析预测更长的文本时, 捕捉间隔较长的语义关联效果更好.
1. Transformer架构
- 基于seq2seq架构的transformer模型可以完成NLP领域研究的典型任务, 如机器翻译, 文本生成等. 同时又可以构建预训练语言模型,用于不同任务的迁移学习.
- 在接下来的架构分析中, 我们将假设使用Transformer模型架构处理从一种语言文本到另一种语言文本的翻译工作, 因此很多命名方式遵循NLP中的规则. 比如: Embeddding层将称作文本嵌入层, Embedding层产生的张量称为词嵌入张量, 它的最后一维将称作词向量等.
1.1 总体架构解剖
- 输入部分:
- 原文本的词嵌入层+位置编码器
- 目标文本的词嵌入层+位置编码器
- 输出部分:
- 线性层→softmax层
- 编码器部分:
- N个编码器层堆叠而成
- 每个编码器层由两个子层连接结构组成
- 多头带掩码的注意力机制→残差连接+规范化→前向反馈→残差连接+规范化
- 解码器部分
- 由N个解码器层堆叠而成
- 每个解码器层由三个子层连接结构组成
- 第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接
- 第二个子层连接结构包括一个多头注意力子层和规范化层以及一个残差连接
- 第三个子层连接结构包括一个前馈全连接子层和规范化层以及一个残差连接
1.2 输入部分
无论源文本嵌入还是目标文本嵌入,都需要将文本中词汇的数字表示转变为向量表示, 希望在这样的高维空间捕捉词汇间的关系。包含:
- 源文本嵌入层及其位置编码器
- 目标文本嵌入层及其位置编码器
1、词嵌入层(Input Embedding)
代码实现
2、位置编码器(Position Encoding)
在Embedding层后加入位置编码器,将词汇位置不同可能会产生不同语义的信息加入到词嵌入张量中, 以弥补位置信息的缺失.
代码实现
下面大样编写一个函数用于验证位置编码器的效果
1.3 编码器部分
编码器部分: 由N个编码器层堆叠而成 , 每个编码器层由两个子层连接结构组成 , 第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接 , 第二个子层连接结构包括一个前馈全连接子层和规范化层以及一个残差连接
1.3.1
1.3.x 前馈全连接层(Feed Forward)
1.3.x 规范化层(Norm)
规范化层是所有深层网络模型都需要的标准网络层,因为随着网络层数的增加,通过多层的计算后参数可能开始出现过大或过小的情况,这样可能会导致学习过程出现异常,模型可能收敛非常的慢. 因此都会在一定层数后接规范化层进行数值的规范化,使其特征数值在合理范围内.
input → 对input进行标准化记为std_input → 输出k*std_input + b(k和b为可更新参数)
名称虽为规范化层,其实是对数据进行标准化
1.3.x 子层连接结构
对于输入到每个子层以及规范化层的过程中,还使用了残差链接(跳跃连接),因此我们把这一部分结构整体叫做子层连接(代表子层及其链接结构),在每个编码器层中,都有两个子层,这两个子层加上周围的链接结构就形成了两个子层连接结构.