Transformer知识梳理
文章目录
- Transformer知识梳理
- 什么是Transformer?
- 语言模型
- 迁移学习
- Transformer结构
- 注意力层
- 原始结构
- 总结
什么是Transformer?
语言模型
Transformer模型本质上都是预训练语言模型,大部分采用自监督学习(Self-supervised Learning)的方式在大量生语料上进行训练,也就是说,训练这些Transformer模型完全不需要人工标注数据。
自监督学习是一种训练目标可以根据模型的输入自动计算的训练方法。
例如下面两个常见的预训练任务:
- 基于句子的前n个词来预测下一个词,因为输出依赖于过去和当前的输入,因此该任务被称为因果语言建模(causal language modeling);
- 基于上下文(周围的词语)来预测句子中被遮盖掉的词语(masked word),因此该任务被称为遮盖语言建模(masked language modeling)。
这些语言模型虽然可以对训练过的语言产生统计意义上的理解,例如可以根据上下文预测被遮盖掉的词语,但是如果直接拿来完成特定任务,效果往往并不好。
因此,我们通常还会采用迁移学习(transfer learning)方法,使用特定任务的标注语料,以有监督学习的方法对预训练模型参数进行微调(fine-tune),以取得更好的性能。
迁移学习
预训练是一种从头开始训练模型的方式:所有的模型权重都被随机初始化,然后在没有任何先验知识的情况下开始训练:
这个过程不仅需要海量的训练数据,而且时间和经济成本都非常高。
基于此,绝大多数情况下,都不会从头开始训练模型,而是将别人预训练好的模型权重通过迁移学习应用到自己的模型中,即使用自己的任务语料对模型进行“二次训练”,通过微调参数使模型适用于新任务。
这种迁移学习的好处是:
- 预训练时模型很可能已经见过与我们任务类似的数据集,通过微调可以激发出模型在预训练过程中获得的知识,将基于海量数据获得的统计理解能力应用于特定的任务;
- 由于模型已经在大量数据上进行过预训练,微调时只需要很少的数据量就可以达到不错的性能;
- 在特定任务上获得优秀性能所需的时间和计算成本都可以很小。
例如,可以选择一个在大规模英文浴帘上预训练好的模型,使用arXiv语料进行微调,以生成一个面向学术/研究领域的模型。这个微调的过程只需要很少的数据:我们相当于将预训练模型已经获得的知识“迁移“到了新的领域,因此被称为迁移学习。
与头从开始训练相比,微调模型所需的时间、数据、经济和环境成本都要低的多,并且与完整的预训练相比,微调训练的约束更少,因此迭代尝试不同的微调方案也更快、更容易。实践证明,即使是对于自定义任务,除非你有大量的语料,否则相比训练一个专门的模型,基于预训练模型进行微调会是一个更好的选择。
在绝大部分情况下,我们都应该尝试找到一个尽可能接近我们任务的预训练模型,然后微调它,也就是所谓的“站在巨人的肩膀上”。
Transformer结构
标准的Transformer模型主要由两个模块构成:
-
Encoder(左边):负责理解输入文本,为每个输入构造对应的语义表示(语义特征);
-
Decoder(右边):负责生成输出,使用Encoder输出的语义表示结合其他输入来生成目标序列。
这两个模块可以根据任务的需要而单独使用:
- 纯Encoder模型:适用于只需要理解输入语义的任务,例如句子分类,命名实体识别;
- 纯Decoder模型:适用于生成式任务,例如文本生成;
- Encoder-Decoder模型或Seq2Seq模型:适用于需要基于输入的生成式任务,例如翻译、摘要等。
注意力层
Transformer模型的标志就是采用了注意力层(Attention Layers)的结构,提出Transformer结构的论文名字就是《Attention Is All You Need》。顾名思义,注意力层的作用就是让模型在处理文本时,将注意力只放在某些词语上。
例如要将英文“You like this course”翻译为法语,由于法语中“like”的变位方式因主语而异,因此需要同时关注相邻的词语“You”。同样地,在翻译“this”时还需要注意“course”,因为“this”的法语翻译会根据相关名字的极性而变化。对于复杂的句子,要正确翻译某个词语,甚至需要关注离这个词很远的词。
同样的概念也适用于其他NLP任务:虽然词语本身就有语义,但是其深受上下文的影响,同一个词语出现在不同上下文中可能会有完全不同的语义(例如“我买了一个苹果”和“我买了一个苹果手机”中的“苹果)
原始结构
Transformer模型本来是为了翻译任务而设计的。在训练过程中,Encoder接受源语言的句子作为输入,而Decoder则接受目标语言的翻译作为输入。在Encoder中,由于翻译一个词语需要依赖于上下文,因此注意力层可以访问句子中的所有词语;而Decoder是顺序地进行解码,在生成每个词语时,注意力层只能访问前面已经生成的单词。
例如,假设翻译模型当前已经预测了三个词语,模型会把这三个词语作为输入送入Decoder,然后Decoder结合Encoder所有的源语言输入来预测第四个词语。
实际训练中为了加快速度,会将整个目标序列都送入Decoder,然后在注意力层中通过Mask遮盖掉未来的词语来防止信息泄露。例如我们在预测第三个词语时,应该只能访问到已生成的前两个词语,如果Decoder能够访问到序列中的第三个(甚至是后面的)词语,就相当于作弊了。
原始的Transformer模型结构如下图所示,Encoder在左,Decoder在右:
其中,Decoder中的第一个注意力层关注Decoder过去所有的输入,而第二个注意力层则是使用Encoder的输出,因此Decoder可以基于整个输入句子来预测当前词语。这对于翻译任务非常有用,因为同一句话在不同语言下的词语顺序可能并不一致(不能逐词翻译),所以出现在源语言句子后部的词语反而可能对目标语言句子前部词语的预测非常重要。
在Encoder/Decoder的注意力层中,还会使用Attention Mask遮盖掉某些词语来防止模型关注它们,例如为了将数据处理为相同长度而向序列中添加的填充(padding)字符。
总结
以上就是关于Transformer的基本知识以及Transformer模型结构的介绍,后续我们将继续带来Transformer的深入探索。