一、为什么出现?
RNN虽然能捕捉记忆,但是有两个问题:
1、无法并行计算,计算效率低下
2、一些早期记忆会随着步数增加而逐渐遗忘,难以捕捉远距离元素的关系
在这样的背景下,Tansformer诞生了
二、整体架构
1、Word Embedding
初始输入X=将输入的单词转换为数字向量X1 + 将位置信息转换为数字向量X2
1.1、为什么需要位置信息?
传统的RNN是通过串行输入信息,其数字天然包含了隐藏的上下文和位置信息
而Transformer允许并行输入序列,transformer的自注意力机制会同时关注并行序列中的所有词语,计算一个词与其他所有词的关系。但模型是不知道这个词在原序列中的位置关系。如果没有位置信息,模型在学习“我爱你”和“你爱我”的时候,这俩句话顺序不同,语义相反,但此时模型难以区分这种顺序差异,可能会认为这俩句话是一个意思。
2、Self-Attention结构
2.1、单个self-attention结构
单个self-attention结构就长这样:
2.2、Q、K、V分别代表什么意思?
把Q、K、V可以想象成生活当中的查字典,比如你在读英语论文中,看到一个不认识的单词“attention”,你去词典里面查这个单词,那么:
-
Q(Query):就是你想要查的问题:这个单词代表什么意思?
——它代表你现在想要查什么信息
-
K(Key):这个单词在字典中的索引
——它代表现在数据库里面有哪些索引?标识
-
V(Value):这个单词在字典中的解释
——它代表这个标识代表什么信息?
在transformer中,这个Q、K、V就表示成了:每一个序列的词都要查下本体和其他词的关联:
-
在处理句子“狗追猫”时,那么每一个词都会生成自己的Q:
-
狗的Q可能表示为:我要做什么样的动作?/我的动词是什么?
-
追的Q可能表示为:我的动作执行者是谁?/谁来承担这个动作?/我的作用对象是谁?
-
-
同时,每一个词也会生成自己的K、V:
-
追的K可能表示:我是一个动作索引/标识;V可能表示:表示追赶的行为
-
猫的K可能表示:是一种动物标签/索引;V可能表示:表示一种常见动物,能跑会叫···
-
那么注意力机制通过计算Q和K的匹配度,即计算这个查询和哪一个索引最匹配,然后和V相乘,最终得到了这些词的相关性表示。
2.3、Q、K、V是怎么来的呢?
Self-Attention的输入为X,X通过线性变化矩阵W_Q、W_K、W_V变化得到的。
其中,W_Q、W_K、W_V是一个可学习的权重矩阵,初始值是随机的。可学习说明是通过反向传播和梯度下降来进行调整权重的。
那么得到Q、K、V后,就可以输出计算self-attention的值了。
2.4、Multi-head-Attention
顾名思义,就是由多个attention结构合一起:
将输入的矩阵X分别传入到h个不同的Attention层,得到不同的输出Z1、Z2...Zh,然后将这些矩阵拼接,再进行线性变化,得到新的矩阵Z0。
为什么要多头注意力机制?
——并行学习不同子空间特征。
可以这么理解:你在抓拍一个场景:
- 你可能先关注“人物之间的位置关系”
- 再关注“人物的动作”
- 最后关注“表情动作”
多头注意力就是从多个视角来分析这个场景,从而让分析更全面。
3、Encoder-Decoder结构
encoder-decoder可以理解为将现实问题转换为数学问题,解决完再转换为现实问题的解决方案来输出
3.1、Encoder结构
Encoder由N个Encoder层组成
①、Add&Norm层组件(残差连接+层归一化)
- Add:减少“梯度消失”,把当前模块的输入和输出加起来,既保留输出注意力计算的新特征,也保留了原输入信息的特征
- Norm:对数据进行标准化处理,让模型更收敛
②、Feed Forward组件
- 两层全连接网络,增强特征表达
3.2、Decoder结构
Decoder也是由N个相同的Decoder层组成
①、Masked-Multi-Head Attention(掩码多头自注意力)
在解码器生成输出的时候,是一个单词接着一个单词的生成。比如“I am a man”,在指向“am”的时候,后面的单词都会被掩码遮盖掉,这样模型无法知道后面的单词是什么,只能看到当前位置之前的内容并基于之前的内容进行预测。从而生成更符合内容的上下文内容。
②、Multi-Head Attention(多头注意力)
建立起编码器输出和解码器输入之间的关系,接收来自编码器的V、K输入和上一层解码器的Q输入,可以这么理解:询问编码器:关于输入,还需要注意什么?
注: Encoder是通过多层Encoder堆叠而成,这么做是为了能够进一步理解深层次的特征,更加融合上下文,从而输出更准确的结果。
4、输出
将归一化的特征映射到词汇表,输出每个单词的生成概率,最高概率的词就是模型的生成结果
三、总结
- transformer没有用RNN,而是用了encoder-decoder架构
- 通过前馈神经网络和自注意力机制生成中间状态
- 自注意力机制是语义理解的钥匙
- 多头注意力来并行计算不同子空间特征
- transformer为大模型奠定基础