Transformer的使用
☄️

Transformer的使用

Property
Transformer 是一个很重要的结构,它虽然在常规的 table 数据中没有太大的作用,但是在序列数据中可以发挥它的能力。
一个正常的Transformer结构如下所示:
notion image
(图片来自Google网站,侵权联系删)

1. 如何“消除”掉不定长维度?

通常,Transformer被用在文本任务上,比如将下面这句话翻译成英文:
今天天气怎么样,我的朋友?
首先,将上面的输入文本进行分割,比如分割成词,或者字:
[’今天’, ‘天气’, ‘怎么样’, ‘,’, ‘我’, ‘的’, ‘朋友’, ‘?’]
通过词义字典编码为数字索引,如:
[1, 20, 12, 203, 178, 24, 97, 2902]
再保存一个索引对应的 embedding 向量,此时输入的shape变为:
input shape:vec x emb
vec是一句话中,分割得到的词或者字的个数,emb是embedding向量大小。训练过程中,通常按batch进行,此时输入为 batch_size x vector x embedding,其中 batch_size 和 embedding 都是提前设定的参数,而翻译的时候,一句话多长是不确定的。因此,我们需要知道,注意力应当集中在哪一个位置。
 

1.1 句尾加入符号cls

每一句话末尾加入cls标识,将cls位置的注意力向量抽取出来,然后进行解码,cls对应一个索引,对应一个embedding向量。
 

1.2 定义一个target

如果你的输入序列不是文本,例如任务是信息流点击预测,那么将当前信息卡片位置的向量抽取出来作为表征,进一步处理即可。
 

1.3 保留不定长

如果你需要对每一个信息流批量输出预测结果,那么可以直接保留所有结果。
 

2. transformer注意力

2.1 自注意力机制

主要原理如下,QKV 三个矩阵是计算得到的:
notion image
计算方法如下,因输入shape为 None x seq x emb,因此 w^Q 为 emb x emb(多个 attention 模块堆叠时,设计成输入与输出shape一致,可不需要加线性层进行 shape 变换):
x @ w^Q = Q
x @ w^K = K
x @ w^V = V
上述self Attention 计算过程图示如下:
notion image
一般会使用多头注意力,此时可以将多头给 concat 起来:
notion image
 

2.2 整体结构

transformer整体的结构大致如下:
notion image
其中除了 Multi-Head Attention 之外,还有两处需要注意:
  • Position Encoding:如果是做文本任务,可以试试原文中提到的三角函数位置编码;实测其他的任务中,可不用这个编码,或者自增编码;
  • Target Mask:是为了防止信息泄露,或者产生干扰,将部分信息遮蔽。
实现上的细节中需要注意,编码器的输出,到解码器中作为Q、K矩阵计算的x来源,V矩阵计算的来源则采取前一模块的输出。
 

3. 优秀代码库

上面第一个是官方代码库(tensorflow实现),第二个仓库包含了torch、TensorFlow两种版本,多个领域的应用(文本、音频、图像)。