transformer简单理解

transformer论文:https://arxiv.org/pdf/1706.03762.pdf

简述

transformer是一个encoder-decoder结构,也就是说,它需要先将所有的输入序列(例如一句话)都输入到encoder中,得到一个context向量,该向量包含了原始输入序列的全部信息并进行编码后的结果,然后再使用decoder将其解码成另一种信息,例如机器翻译就是将一门语言翻译成另一种语言。

在此之前,人们将rnn用在encoder-decoder中,也就是两个网络,第一个rnn网络将原始信息生成context,第二个rnn对context进行解码。但transformer则将编码器和解码器都替换成“自注意力网络”的堆叠(当然还有其他组成结构)

注意力机制

注意力机制可以让你一次关注到全局信息,它包含三个参数:q(query)、k(key)、v(value)。其中,q是你要查询的东西,k-v是一个键值对。你需要拿q去和多个k做相似的计算,再使用该相似度与其对应的v进行加权和。

例如对于一个由三个词组成的一句话“今天/天气/晴朗”,首先将每个词映射成一个k-v键值对,这一步一般由模型训练自己得到结果,然后再将每个词作为q去进行查询,例如当“晴朗”作为q时,它会发现三个词中,除了其本身与本身的相似度(q和k的相似度也是模型自己训练出来的)较高之外,它还与“天气”这个词的相似度也很高,而与“今天”的k的相似度就相对较低,那么可以认为“晴朗”这两个字是用来描述“天气”的。

transformer使用的注意力机制

transformer就是利用注意力机制对输入序列进行编码的,不同点在于:

  1. transformer使用了自注意力机制(下图红色箭头),即qkv都是这个词向量本身,可以想到,对任何一个词来说,最相关的那个k一定也是它本身,但由于词向量本身就经过了模型训练的学习过程,故它也能和序列中的其他词向量计算出相似度
  2. 从横向来看,transformer的encoder和decoder都同时并行使用多个注意力机制来计算不同维度的相似度,就好比使用多个不同的卷积核提取图像不同的特征一样。这就是“多头注意力机制”,每个注意力模型得到的结果再使用MLP进行合并,组成一个新的输出向量
  3. 从纵向来看,transformer的encoder和decoder都使用多个layer进行堆叠,每个layer都是2中所述结构

注意到decoder的自注意力模型上加了个“masked”修饰,这是因为其处理的是时间序列的数据,例如,对于一句话来说,一般都是后出现的词会依赖之前的词,而不会反过来,故在生成第n个词时,可以将原语义中与该词相关的后面的词都给一个0权重,屏蔽掉。

注意力机制与RNN

本质上他们的功能是一样的,都是输入一个时间序列,输出另一个时间序列

只不过注意力机制更能顾全全局信息(毕竟是通过对全局信息加权和得到的),而RNN则对很久之前的word不敏感。这也是transformer选择注意力机制的原因

位置编码

注意力机制只有加权和,而没有时序信息,故还需要根据每个词出现的先后顺序进行位置编码(上图中的Positional encoding)。也就是根据顺序给每个词创建一个向量,然后和原输入词向量相加即可

注意力机制实现

主要是QKV三个向量,它们的维度如图

相同字母表示该维度相同,可以使用卷积或MLP先将不符合维度要求的QKV转换为符合要求的,attention计算过程为:

\[ result = (Q @ K^T) @ V \]

直观上,Q就是你要预测的序列,V就是潜在特征序列,K用来计算Q到每个V的分数

在NLP自注意力机制中,就是使用三个独立的MLP将同一个输入转换为QKV,其中,m为要处理的字符串长度,e为每个字符embeding的长度,L为整个字符串的长度(计算字符串中所有字符对其中某个字符的注意力分数),n可以设置为1。一般情况下 m = L

Leave a Comment