前言
文章根据李宏毅老师的视频讲解总结而成。
一、Self-attention
1.1 序列标签的输入输出
模型的输入格式复杂多样,有输入是一个向量或者一个向量集. 当输入形式是一个句子时,可以对每个单词进行编码,主要有两种方式:1. One-hot Encoding 2. Word Embedding,大致如下图所示。
当然输入的形式可能是一个音频的,此时把音频划分成帧:
输入的形式也可能是一个图:
1.2 面临的问题
- 每个标签具有上下文联系,如何结合上下文?FC(全连接层)可以考虑它的相邻关系。
- 如何考虑整个序列?使用滑动窗口。
1.3 自注意力机制结构
自注意力整体结构如下图所示:
当然,我们还可以加多个Self-attention模块:
接下来主要看一下Self-attention模块:
其中,每个b向量都是考虑了每个a向量之后的结果(这里可能与FC有点相似,其实这里是对每个样本进行的考虑,而FC是对单个样本进行的),那b是如何考虑每个样本之间的联系呢?我们首先需要一个标量来衡量每个样本之间的联系程度,这里使用
α
\alpha
α。
α
\alpha
α有两种方式获得:1.点乘方式 2.相加方式
其中W都是矩阵。
这里主要介绍一下Dot-product的方式。
- 首先,根据获取q向量以及k向量,在根据点乘获取相关度,自己的q也能与自己的k作一个点乘。
- 获取到四个相似度,再经过一个softmax层,获取到
α
′
\alpha^{'}
α′,称作attention scores,后面都是根据这个分数作进一步操作:
- 让每个向量乘以v矩阵
W
v
W^v
Wv 获取每个4个v向量,再让每个attention score乘以对应v向量,最后按位相加,生成b1向量,同理b2,b3,b4(其实是并行计算的)也是如此。
整体,写成矩阵相乘形式,如下:
其中I、Q、K、V:
1.4 Multi-head Self-attention(多头注意力机制)
结构如下,主要新增的点在于对于每个q、k、v在分别乘上两个不同的矩阵,把qkv变成双份。 这时总共要学习九个矩阵参数。
每个向量获得两个b向量,再经过一个输出矩阵转成1个b向量。因此总共要学习10个矩阵。
1.5 把位置信息引入self-attention
每个样本之间的位置可能很重要,但是之前没有考虑位置(因为之前都是并行处理的,每个样本之间处理方式是相同的)。
方法:把每个位置编成一个向量,成为位置向量,然后加到原始向量上就可以了。
其中
e
i
e^i
ei是手动设置的,也可以学习出来。
二、Transformer
主要为了解决sentence to sentence的问题,并且输入与输出的长度不等。这类问题的整体架构为编码器-解码器架构。
Transformer的整体架构如下:其中左半部分是编码器,右半部分是解码器。
2.1 编码器Encoder
编码器的输入与输出向量个数相同。
再进一步,Encoder由许多Block组成:
每个Block的详细结构如下:
2.2 解码器Decoder
这里解码器主要描述一下Autoregressive(AT)结构,另外还有Non-Autoregressive(NAT)
AT解码器的整体结构如下:
Decoder首先要接入Encoder输出的结果,再给Decoder一个初始的向量(称为START,它是一个特殊的向量),Docker输出的结果经过softmax后会得到每个分类结果的概率,把概率最大值对应的单词或者字符作为结果进行输出。下一步再把该向量作为下次一个字符的输入,以此来生成下一个单次,在你的distribution中应该有一个特殊的标识例如EOF作为结束的标志。
其中Decode的详细结构如下所示:
它与编码器的主要区别是多了这部分,其称之为Cross attention:
并把一开始的Multi-Head Attention改成了Masked版本的,下面是Masked版本的Attention:即当前的输出向量只结合了当前以及之前的向量特征从而获取的结果
Cross attention的详细结果如下:
由当前向量获取到q向量,再分别与Encoder的输出向量的k、v向量计算最后的v向量,可以简化成Encoder提供两个k、v向量,Decoder出一个q向量,所以中间的连线是如下图所示:
2.3 训练部分
有两点需要注意:
- 输出结果的交叉熵损失
- 使用Ground Truth作为输入
总结
本文,主要讲解了自注意力机制,以及著名的Transformer模型。