文章目录
- 论文精读-Transformer(Attention is All You Need)
- 1.Transformer 整体结构
- 2. Transformer 的输入
- 2.1 单词 Embedding
- 2.2 位置 Embedding
- 3. Self-Attention(自注意力机制)
- 3.1 Self-Attention 结构
- 3.2 Q, K, V 的计算
- 3.3 Self-Attention 的输出
- 3.4 Multi-Head Attention
- 4. Encoder 结构
- 4.1 Add & Norm
- 4.2 Feed Forward
- 4.3 组成 Encoder
- 5. Decoder 结构
- 5.1 第一个 Multi-Head Attention
- 5.2 第二个 Multi-Head Attention
- 5.3 Softmax 预测输出单词
- 6. Transformer 总结
- QA
- Q:Transformer是如何进行计算的?
- 自注意力
- 图解计算过程
- 矩阵计算过程
- 多头注意力
- **Q:序列建模,转导模型?**
- **Q:平均注意力加权位置而降低了有效分辨率,而多头注意力可以抵消效果?**
- Q:注意力机制与自注意力?
- **1.为什么要注意力机制**
- **2.什么是注意力机制**
- **3.注意力机制模型**
- **4.Self-attention自注意力机制**
- **5.注意力机制的优缺点**
- **Q:循环注意机制而不是序列对齐的RNN或卷积的转换模型?**
- **Q:自回归?**
- **Q:Transformer模型的智能是什么?**
- **Q:只利用编码器或只利用解码器?**
- Q:模块分析?
- **Q:输入转换?**
- **Q:QKV的理解?**
- **Q:预测流程?**
- **Q:mask attention?**
- **Q:如何实现一对多输出?**
- **Q:解码器中第二个注意力机制的(编码器-解码器注意力机制)作用?**
- **Q:多个编码和解码器的作用?**
论文精读-Transformer(Attention is All You Need)
由于Attention论文写得比较精简,所以本文主要借鉴了一些网上的回答和自己的理解,可能不对,请各位大佬给出意见。
(直到QA部分参考:https://zhuanlan.zhihu.com/p/338817680,QA部分是我个人的一些疑问和回答)
1.Transformer 整体结构
首先介绍 Transformer 的整体结构,下图是 Transformer 用于中英文翻译的整体结构:
Transformer 的整体结构,左图Encoder和右图Decoder
可以看到 Transformer 由 Encoder 和 Decoder 两个部分组成,Encoder 和 Decoder 都包含 6 个 block。Transformer 的工作流程大体如下:
**第一步:**获取输入句子的每一个单词的表示向量 X,X由单词的 Embedding(Embedding就是从原始数据提取出来的Feature) 和单词位置的 Embedding 相加得到。
Transformer 的输入表示
**第二步:**将得到的单词表示向量矩阵 (如上图所示,每一行是一个单词的表示 x) 传入 Encoder 中,经过 6 个 Encoder block 后可以得到句子所有单词的编码信息矩阵 C,如下图。单词向量矩阵用 表示, n 是句子中单词个数,d 是表示向量的维度 (论文中 d=512)。每一个 Encoder block 输出的矩阵维度与输入完全一致。
Transformer Encoder 编码句子信息
第三步:将 Encoder 输出的编码信息矩阵 C传递到 Decoder 中,Decoder 依次会根据当前翻译过的单词 1~ i 翻译下一个单词 i+1,如下图所示。在使用的过程中,翻译到单词 i+1 的时候需要通过 Mask (掩盖) 操作遮盖住 i+1 之后的单词。
Transofrmer Decoder 预测
上图 Decoder 接收了 Encoder 的编码矩阵 C,然后首先输入一个翻译开始符 “”,预测第一个单词 “I”;然后输入翻译开始符 “” 和单词 “I”,预测单词 “have”,以此类推。这是 Transformer 使用时候的大致流程,接下来是里面各个部分的细节。
2. Transformer 的输入
Transformer 中单词的输入表示 x由单词 Embedding 和位置 Embedding (Positional Encoding)相加得到。
Transformer 的输入表示
2.1 单词 Embedding
单词的 Embedding 有很多种方式可以获取,例如可以采用 Word2Vec、Glove 等算法预训练得到,也可以在 Transformer 中训练得到。
2.2 位置 Embedding
Transformer 中除了单词的 Embedding,还需要使用位置 Embedding 表示单词出现在句子中的位置。**因为 Transformer 不采用 RNN 的结构,而是使用全局信息,不能利用单词的顺序信息,而这部分信息对于 NLP 来说非常重要。**所以 Transformer 中使用位置 Embedding 保存单词在序列中的相对或绝对位置。
位置 Embedding 用 PE表示,PE 的维度与单词 Embedding 是一样的。PE 可以通过训练得到,也可以使用某种公式计算得到。在 Transformer 中采用了后者,计算公式如下:
其中,pos 表示单词在句子中的位置,d 表示 PE的维度 (与词 Embedding 一样),2i 表示偶数的维度,2i+1 表示奇数维度 (即 2i≤d, 2i+1≤d)。使用这种公式计算 PE 有以下的好处:
- 使 PE 能够适应比训练集里面所有句子更长的句子,假设训练集里面最长的句子是有 20 个单词,突然来了一个长度为 21 的句子,则使用公式计算的方法可以计算出第 21 位的 Embedding。
- 可以让模型容易地计算出相对位置,对于固定长度的间距 k,PE(pos+k) 可以用 PE(pos) 计算得到。因为 Sin(A+B) = Sin(A)Cos(B) + Cos(A)Sin(B), Cos(A+B) = Cos(A)Cos(B) - Sin(A)Sin(B)。
将单词的词 Embedding 和位置 Embedding 相加,就可以得到单词的表示向量 x,x 就是 Transformer 的输入。
3. Self-Attention(自注意力机制)
Transformer Encoder 和 Decoder
上图是论文中 Transformer 的内部结构图,左侧为 Encoder block,右侧为 Decoder block。红色圈中的部分为 Multi-Head Attention,是由多个 Self-Attention组成的,可以看到 Encoder block 包含一个 Multi-Head Attention,而 Decoder block 包含两个 Multi-Head Attention (其中有一个用到 Masked)。Multi-Head Attention 上方还包括一个 Add & Norm 层,Add 表示残差连接 (Residual Connection) 用于防止网络退化,Norm 表示 Layer Normalization,用于对每一层的激活值进行归一化。
因为 Self-Attention是 Transformer 的重点,所以我们重点关注 Multi-Head Attention 以及 Self-Attention,首先详细了解一下 Self-Attention 的内部逻辑。
3.1 Self-Attention 结构
Self-Attention 结构
上图是 Self-Attention 的结构,在计算的时候需要用到矩阵Q(查询),K(键值),V(值)。在实际中,Self-Attention 接收的是输入(单词的表示向量x组成的矩阵X) 或者上一个 Encoder block 的输出。而Q,K,V正是通过 Self-Attention 的输入进行线性变换得到的。
3.2 Q, K, V 的计算
Self-Attention 的输入用矩阵X进行表示,则可以使用线性变阵矩阵WQ,WK,WV计算得到Q,K,V。计算如下图所示,注意 X, Q, K, V 的每一行都表示一个单词。
Q, K, V 的计算
3.3 Self-Attention 的输出
得到矩阵 Q, K, V之后就可以计算出 Self-Attention 的输出了,计算的公式如下:
Self-Attention 的输出
公式中计算矩阵Q和K每一行向量的内积,为了防止内积过大,因此除以 的平方根。Q乘以K的转置后,得到的矩阵行列数都为 n,n 为句子单词数,这个矩阵可以表示单词之间的 attention 强度。下图为Q乘以 ,1234 表示的是句子中的单词。
Q乘以K的转置的计算
得到 之后,使用 Softmax 计算每一个单词对于其他单词的 attention 系数,公式中的 Softmax 是对矩阵的每一行进行 Softmax,即每一行的和都变为 1.
对矩阵的每一行进行 Softmax
得到 Softmax 矩阵之后可以和V相乘,得到最终的输出Z。
Self-Attention 输出
上图中 Softmax 矩阵的第 1 行表示单词 1 与其他所有单词的 attention 系数,最终单词 1 的输出 等于所有单词 i 的值 根据 attention 系数的比例加在一起得到,如下图所示:
Zi 的计算方法
3.4 Multi-Head Attention
在上一步,我们已经知道怎么通过 Self-Attention 计算得到输出矩阵 Z,而 Multi-Head Attention 是由多个 Self-Attention 组合形成的,下图是论文中 Multi-Head Attention 的结构图。
Multi-Head Attention
从上图可以看到 Multi-Head Attention 包含多个 Self-Attention 层,首先将输入X分别传递到 h 个不同的 Self-Attention 中,计算得到 h 个输出矩阵Z。下图是 h=8 时候的情况,此时会得到 8 个输出矩阵Z。
多个 Self-Attention
得到 8 个输出矩阵 到 之后,Multi-Head Attention 将它们拼接在一起 (Concat),然后传入一个Linear层,得到 Multi-Head Attention 最终的输出Z。
Multi-Head Attention 的输出
可以看到 Multi-Head Attention 输出的矩阵Z与其输入的矩阵X的维度是一样的。
4. Encoder 结构
Transformer Encoder block
上图红色部分是 Transformer 的 Encoder block 结构,可以看到是由 Multi-Head Attention, Add & Norm, Feed Forward, Add & Norm 组成的。刚刚已经了解了 Multi-Head Attention 的计算过程,现在了解一下 Add & Norm 和 Feed Forward 部分。
4.1 Add & Norm
Add & Norm 层由 Add 和 Norm 两部分组成,其计算公式如下:
Add & Norm 公式
其中 X表示 Multi-Head Attention 或者 Feed Forward 的输入,MultiHeadAttention(X) 和 FeedForward(X) 表示输出 (输出与输入 X 维度是一样的,所以可以相加)。
Add指 X+MultiHeadAttention(X),是一种残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分,在 ResNet 中经常用到:
残差连接
Norm指 Layer Normalization,通常用于 RNN 结构,Layer Normalization 会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。
4.2 Feed Forward
Feed Forward 层比较简单,是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数,对应的公式如下。
Feed Forward
X是输入,Feed Forward 最终得到的输出矩阵的维度与X一致。
4.3 组成 Encoder
通过上面描述的 Multi-Head Attention, Feed Forward, Add & Norm 就可以构造出一个 Encoder block,Encoder block 接收输入矩阵 ,并输出一个矩阵 。通过多个 Encoder block 叠加就可以组成 Encoder。
第一个 Encoder block 的输入为句子单词的表示向量矩阵,后续 Encoder block 的输入是前一个 Encoder block 的输出,最后一个 Encoder block 输出的矩阵就是编码信息矩阵 C,这一矩阵后续会用到 Decoder 中。
Encoder 编码句子信息
5. Decoder 结构
Transformer Decoder block
上图红色部分为 Transformer 的 Decoder block 结构,与 Encoder block 相似,但是存在一些区别:
- 包含两个 Multi-Head Attention 层。
- 第一个 Multi-Head Attention 层采用了 Masked 操作。
- 第二个 Multi-Head Attention 层的K, V矩阵使用 Encoder 的编码信息矩阵C进行计算,而Q使用上一个 Decoder block 的输出计算。
- 最后有一个 Softmax 层计算下一个翻译单词的概率。
5.1 第一个 Multi-Head Attention
Decoder block 的第一个 Multi-Head Attention 采用了 Masked 操作,因为在翻译的过程中是顺序翻译的,即翻译完第 i 个单词,才可以翻译第 i+1 个单词。通过 Masked 操作可以防止第 i 个单词知道 i+1 个单词之后的信息。下面以 “我有一只猫” 翻译成 “I have a cat” 为例,了解一下 Masked 操作。
下面的描述中使用了类似 Teacher Forcing 的概念,不熟悉 Teacher Forcing 的童鞋可以参考以下上一篇文章Seq2Seq 模型详解。在 Decoder 的时候,是需要根据之前的翻译,求解当前最有可能的翻译,如下图所示。首先根据输入 “” 预测出第一个单词为 “I”,然后根据输入 “ I” 预测下一个单词 “have”。
Decoder 预测
Decoder 可以在训练的过程中使用 Teacher Forcing 并且并行化训练,即将正确的单词序列 ( I have a cat) 和对应输出 (I have a cat ) 传递到 Decoder。那么在预测第 i 个输出时,就要将第 i+1 之后的单词掩盖住,注意 Mask 操作是在 Self-Attention 的 Softmax 之前使用的,下面用 0 1 2 3 4 5 分别表示 “ I have a cat ”。
**第一步:**是 Decoder 的输入矩阵和 Mask 矩阵,输入矩阵包含 “ I have a cat” (0, 1, 2, 3, 4) 五个单词的表示向量,Mask 是一个 5×5 的矩阵。在 Mask 可以发现单词 0 只能使用单词 0 的信息,而单词 1 可以使用单词 0, 1 的信息,即只能使用之前的信息。
输入矩阵与 Mask 矩阵
第二步:接下来的操作和之前的 Self-Attention 一样,通过输入矩阵X计算得到Q,K,V矩阵。然后计算Q和 的乘积 。
Q乘以K的转置
第三步:在得到 之后需要进行 Softmax,计算 attention score,我们在 Softmax 之前需要使用Mask矩阵遮挡住每一个单词之后的信息,遮挡操作如下:
Softmax 之前 Mask
得到 Mask 之后在 Mask 上进行 Softmax,每一行的和都为 1。但是单词 0 在单词 1, 2, 3, 4 上的 attention score 都为 0。
**第四步:**使用 Mask 与矩阵 V相乘,得到输出 Z,则单词 1 的输出向量 是只包含单词 1 信息的。
Mask 之后的输出
第五步:通过上述步骤就可以得到一个 Mask Self-Attention 的输出矩阵 ,然后和 Encoder 类似,通过 Multi-Head Attention 拼接多个输出 然后计算得到第一个 Multi-Head Attention 的输出Z,Z与输入X维度一样。
5.2 第二个 Multi-Head Attention
Decoder block 第二个 Multi-Head Attention 变化不大, 主要的区别在于其中 Self-Attention 的 K, V矩阵不是使用 上一个 Decoder block 的输出计算的,而是使用 Encoder 的编码信息矩阵 C 计算的。
根据 Encoder 的输出 C计算得到 K, V,根据上一个 Decoder block 的输出 Z 计算 Q (如果是第一个 Decoder block 则使用输入矩阵 X 进行计算),后续的计算方法与之前描述的一致。
这样做的好处是在 Decoder 的时候,每一位单词都可以利用到 Encoder 所有单词的信息 (这些信息无需 Mask)。
- 利用当前位置所有前面的decoder预测信息
- 利用所有输入信息
5.3 Softmax 预测输出单词
Decoder block 最后的部分是利用 Softmax 预测下一个单词,在之前的网络层我们可以得到一个最终的输出 Z,因为 Mask 的存在,使得单词 0 的输出 Z0 只包含单词 0 的信息,如下:
Decoder Softmax 之前的 Z
Softmax 根据输出矩阵的每一行预测下一个单词:
Decoder Softmax 预测
这就是 Decoder block 的定义,与 Encoder 一样,Decoder 是由多个 Decoder block 组合而成。
6. Transformer 总结
- Transformer 与 RNN 不同,可以比较好地并行训练。
- Transformer 本身是不能利用单词的顺序信息的,因此需要在输入中添加位置 Embedding,否则 Transformer 就是一个词袋模型了。
- Transformer 的重点是 Self-Attention 结构,其中用到的 Q, K, V矩阵通过输出进行线性变换得到。
- Transformer 中 Multi-Head Attention 中有多个 Self-Attention,可以捕获单词之间多种维度上的相关系数 attention score。
QA
Q:Transformer是如何进行计算的?
自注意力
input and output:
两种Attention score(q,k 相似度)计算方法:
(ps:其中a可以看为相似度。)
总体简要计算过程如下:
图解计算过程
下面展示q1查询,并得到b1(单head Attention值)的计算过程:
当前位置的查询与其他位置点积+softmax,本质是求当前位置与其他位置的相似度。
与各个位置的值进行加权求和,得到attention值即为b1:
同理根据q2可得到b2…qi可得到bi
此外,b1,b2,…bn是可以并行执行的
矩阵计算过程
下面从矩阵计算的角度来分析整个过程:
1、计算input所有位置的q,k,v
2、计算每个位置与其他位置的点积(q*k^T)结果,即为ai,j
3、对所有ai,j进行softmax得到相似度a’i,j
4、利用相似度矩阵与所有位置的值相乘得到各个位置的Attention值 bi
input:a1,a2,a3,a4
output:b1,b2,b3,b4
多头注意力
x的输出=结合不同头加权输出=对x的各个维度进行加权输出
多头实际是对输入x的维度进行拆分后,分散在各个head中,如将x的属性维度信息放到headA,x的语义维度信息放到headB。这样的好处是1.增加了模型的表达能力2.各个头负责一部分维度的处理,各个头之间可以并行处理
关于多头注意力的应用:
至此,最大的Question解决了
Q:序列建模,转导模型?
A:
1、序列建模(Sequence Modeling)
序列建模关注的是对序列数据的预测和分析,其中模型需要捕捉时间序列或自然序列中的时序依赖关系。这种类型的模型广泛应用于各种领域,包括:
- 自然语言处理(NLP):语言模型、文本生成、机器翻译等。
- 语音识别:将语音信号转换为文本。
- 时间序列分析:股票市场预测、天气预报、销售预测等。
- 生物信息学:基因序列分析、蛋白质结构预测等。
序列建模的常见方法包括:
- 循环神经网络(RNN)及其变体,如长短期记忆网络(LSTM)和门控循环单元(GRU)。
- Transformer模型:基于自注意力机制,适用于处理长距离依赖的序列数据。
- 隐马尔可夫模型(HMM):用于建模具有隐含状态的序列数据。
2、转导模型(Transductive Models)
转导模型是机器学习中的一种半监督学习方法,它介于监督学习和无监督学习之间。在转导学习中,模型的训练包括有标签的数据和无标签的数据,但预测仅针对无标签的数据。转导模型的主要特点是利用无标签数据的分布信息来提高对未标记数据的预测准确性。
转导学习的一个典型应用是:
- 半监督学习:在标签数据稀缺但未标记数据丰富的情况下,如文本分类、图像识别等。
转导模型的常见方法包括:
- 标签传播算法(Label Propagation):通过在数据点的图结构上传播标签信息来学习标签。
- k最近邻(k-Nearest Neighbors, k-NN):利用距离度量和无标签数据的邻近性来进行预测。
- 自训练(Self-Training):使用模型自身的预测作为额外的训练信号。
3、序列建模与转导模型的联系与区别:
- 数据类型:序列建模专门针对序列数据,而转导模型可以应用于更广泛的数据类型,包括非序列数据。
- 预测目标:序列建模通常关注序列中的下一个元素或整个序列的预测,而转导模型的预测目标是利用有标签和无标签数据来提高对未标记数据的预测准确性。
- 应用场景:序列建模在需要处理时序或顺序数据的场景中更为常见,转导模型则适用于标签稀缺的场景。
Q:平均注意力加权位置而降低了有效分辨率,而多头注意力可以抵消效果?
A:在注意力机制中,平均注意力加权(即单头注意力)确实可能导致有效分辨率的降低,因为所有输入元素对输出的贡献被等权重地考虑。这可能使得模型难以捕捉序列中特定元素的重要性,特别是在处理复杂的序列数据时。(词向量是多维数据)
多头注意力机制通过使用多个“头”来并行处理输入序列,每个头学习序列的不同方面,从而解决了这个问题。下面是多头注意力如何提高有效分辨率和抵消单头注意力潜在缺陷的一些方式:
- 捕捉多维度特征:每个注意力头可以被看作是在不同的表示子空间上操作,因此它们可以独立地学习到序列数据中的不同特征,如语法结构、语义信息或句法依赖等。
- 提高模型的表达能力:通过并行处理,多头注意力允许模型同时考虑多个特征,这增加了模型的表达能力,使其能够更细致地理解输入数据。
- 保留更多信息:在单头注意力中,所有输入元素的权重被合并成一个单一的表示,这可能导致一些信息的丢失。而多头注意力通过保留每个头的独立表示,可以保留更多的原始信息。
- 增强模型的泛化能力:由于多头注意力能够捕捉更细粒度的特征,它通常能够提高模型在未见过的数据上的泛化能力。
- 灵活性和适应性:多头注意力允许模型适应不同的任务和数据类型,因为每个头可以专注于对当前任务最重要的特征。
- 注意力权重的多样性:在多头注意力中,不同头的注意力权重分布可能会有很大差异,这反映了模型对输入序列的不同部分的关注程度,从而提高了模型的分辨能力。
- 并行计算:多头注意力可以利用并行计算的优势,加快训练速度,因为每个头的计算可以独立进行。
- 最终整合:在所有头的输出被拼接并整合之后,模型通过一个线性层学习如何有效地结合这些不同头的信息,进一步增强了模型的预测能力。
总的来说,多头注意力通过在多个表示子空间上并行处理输入数据,提高了模型对序列中不同维度重要性的理解,从而提高了有效分辨率,并抵消了单头注意力可能导致的信息丢失效果。这使得多头注意力在处理复杂的序列任务,如机器翻译、文本摘要、语言理解和生成模型中,成为一种非常强大的工具。
Q:注意力机制与自注意力?
(这部分借鉴了https://zhuanlan.zhihu.com/p/265108616,篇幅比较长,可以跳过)
Attention注意力机制与self-attention自注意力机制
1.为什么要注意力机制
在Attention诞生之前,已经有CNN和RNN及其变体模型了,那为什么还要引入attention机制?主要有两个方面的原因,如下:
(1)计算能力的限制:当要记住很多“信息“,模型就要变得更复杂,然而目前计算能力依然是限制神经网络发展的瓶颈。
(2)优化算法的限制:LSTM只能在一定程度上缓解RNN中的长距离依赖问题,且信息“记忆”能力并不高。
2.什么是注意力机制
在介绍什么是注意力机制之前,先让大家看一张图片。当大家看到下面图片,会首先看到什么内容?当过载信息映入眼帘时,我们的大脑会把注意力放在主要的信息上,这就是大脑的注意力机制。
同样,当我们读一句话时,大脑也会首先记住重要的词汇,这样就可以把注意力机制应用到自然语言处理任务中,于是人们就通过借助人脑处理信息过载的方式,提出了Attention机制
3.注意力机制模型
从本质上理解,Attention是从大量信息中有筛选出少量重要信息,并聚焦到这些重要信息上,忽略大多不重要的信息。权重越大越聚焦于其对应的Value值上,即权重代表了信息的重要性,而Value是其对应的信息。
至于Attention机制的具体计算过程,如果对目前大多数方法进行抽象的话,可以将其归纳为两个过程:第一个过程是根据Query和Key计算权重系数,第二个过程根据权重系数对Value进行加权求和。而第一个过程又可以细分为两个阶段:第一个阶段根据Query和Key计算两者的相似性或者相关性;第二个阶段对第一阶段的原始分值进行归一化处理;这样,可以将Attention的计算过程抽象为如图展示的三个阶段。
在第一个阶段,可以引入不同的函数和计算机制,根据Query和某个 Keyi ,计算两者的相似性或者相关性,最常见的方法包括:求两者的向量点积、求两者的向量Cosine相似性或者通过再引入额外的神经网络来求值,即如下方式:
第一阶段产生的分值根据具体产生的方法不同其数值取值范围也不一样,第二阶段引入类似SoftMax的计算方式对第一阶段的得分进行数值转换,一方面可以进行归一化,将原始计算分值整理成所有元素权重之和为1的概率分布;另一方面也可以通过SoftMax的内在机制更加突出重要元素的权重。即一般采用如下公式计算:
第二阶段的计算结果 ai 即为 Valuei 对应的权重系数,然后进行加权求和即可得到Attention数值:
通过如上三个阶段的计算,即可求出针对Query的Attention数值,目前绝大多数具体的注意力机制计算方法都符合上述的三阶段抽象计算过程。
4.Self-attention自注意力机制
自注意力机制是注意力机制的变体,其减少了对外部信息的依赖,更擅长捕捉数据或特征的内部相关性。
自注意力机制在文本中的应用,主要是通过计算单词间的互相影响,来解决长距离依赖问题。
自注意力机制的计算过程:
1.将输入单词转化成嵌入向量;
2.根据嵌入向量得到q,k,v三个向量;
3.为每个向量计算一个score:score =q . k ;
4.为了梯度的稳定,Transformer使用了score归一化,即除以 ;
5.对score施以softmax激活函数;
6.softmax点乘Value值v,得到加权的每个输入向量的评分v;
7.相加之后得到最终的输出结果z :z= v。
接下来我们详细看一下self-attention,其思想和attention类似,但是self-attention是Transformer用来将其他相关单词的“理解”转换成我们正在处理的单词的一种思路,我们看个例子: The animal didn’t cross the street because it was too tired 这里的it到底代表的是animal还是street呢,对于我们来说能很简单的判断出来,但是对于机器来说,是很难判断的,self-attention就能够让机器把it和animal联系起来,接下来我们看下详细的处理过程。
- 首先,self-attention会计算出三个新的向量,在论文中,向量的维度是512维,我们把这三个向量分别称为Query、Key、Value,这三个向量是用embedding向量与一个矩阵相乘得到的结果,这个矩阵是随机初始化的,维度为(64,512)注意第二个维度需要和embedding的维度一样,其值在BP的过程中会一直进行更新,得到的这三个向量的维度是64低于embedding维度的。
那么Query、Key、Value这三个向量又是什么呢?这三个向量对于attention来说很重要,当你理解了下文后,你将会明白这三个向量扮演者什么的角色。
计算self-attention的分数值,该分数值决定了当我们在某个位置encode一个词时,对输入句子的其他部分的关注程度。这个分数值的计算方法是Query与Key做点乘,以下图为例,首先我们需要针对Thinking这个词,计算出其他词对于该词的一个分数值,首先是针对于自己本身即q1·k1,然后是针对于第二个词即q1·k2
接下来,把点成的结果除以一个常数,这里我们除以8,这个值一般是采用上文提到的矩阵的第一个维度的开方即64的开方8,当然也可以选择其他的值,然后把得到的结果做一个softmax的计算。得到的结果即是每个词对于当前位置的词的相关性大小,当然,当前位置的词相关性肯定会会很大
下一步就是把Value和softmax得到的值进行相乘,并相加,得到的结果即是self-attetion在当前节点的值
在实际的应用场景,为了提高计算速度,我们采用的是矩阵的方式,直接计算出Query, Key, Value的矩阵,然后把embedding的值与三个矩阵直接相乘,把得到的新矩阵Q与K相乘,乘以一个常数,做softmax操作,最后乘上V矩阵
这种通过 query 和 key 的相似性程度来确定 value 的权重分布的方法被称为scaled dot-product attention:
以上就是self-attention的计算过程,下边是两个句子中it与上下文单词的关系热点图,很容易看出来第一个图片中的it与animal关系很强,第二个图it与street关系很强。这个结果说明注意力机制是可以很好地学习到上下文的语言信息。
5.注意力机制的优缺点
attention的优点
1.参数少:相比于 CNN、RNN ,其复杂度更小,参数也更少。所以对算力的要求也就更小。
2.速度快:Attention 解决了 RNN及其变体模型 不能并行计算的问题。Attention机制每一步计算不依赖于上一步的计算结果,因此可以和CNN一样并行处理。
3.效果好:在Attention 机制引入之前,有一个问题大家一直很苦恼:长距离的信息会被弱化,就好像记忆能力弱的人,记不住过去的事情是一样的。
Q:循环注意机制而不是序列对齐的RNN或卷积的转换模型?
A:循环注意机制即自注意力机制,称为循环是因为自回归特性
- 自回归特性:在Transformer的解码器中,每个输出是自回归的,即它依赖于之前的所有输出。这意味着在生成当前位置的输出时,模型已经考虑了之前所有位置的输出。这种自回归特性在解码器的每一步中重复出现,形成了一种循环。
- 遮蔽自注意力:为了保持自回归特性,Transformer模型在解码器的自注意力机制中使用了遮蔽(Masking)。遮蔽确保了在计算当前位置的注意力权重时,只考虑了当前位置之前的输出,而忽略了当前位置之后的输出。这种遮蔽操作在每个时间步上重复应用,形成了一种循环。
- 逐个生成:在生成序列的过程中,Transformer模型通常一次生成一个元素,然后使用这个新生成的元素作为输入来生成下一个元素。这个过程重复进行,直到生成完整的序列。这种逐个生成的方式形成了一种循环,每个新生成的元素都依赖于之前生成的所有元素。
- 位置编码:虽然Transformer模型本身不具备捕捉序列顺序的能力,但通过添加位置编码,模型可以知道每个元素在序列中的位置。在生成序列的过程中,位置编码随着元素的生成而递增,这在一定程度上体现了循环性。
- 迭代细化:在某些变体的Transformer模型中,如BERT(Bidirectional Encoder Representations from Transformers),模型会在多个迭代中重复处理输入序列,每次迭代都会更新隐藏状态(对历史信息的理解,不过在Transformer中没有显示的hidden state)。这种迭代过程也可以看作是一种循环。
Q:自回归?
A:Transformer模型的自回归特性:
- 自注意力机制:在Transformer模型中,自注意力机制允许模型在序列的每个位置考虑其他所有位置的信息。这种机制使得模型能够捕捉序列内部的长距离依赖关系。
- 解码器的自回归性:在解码器中,自回归性体现在每个位置的输出不仅依赖于输入序列,还依赖于之前所有位置的输出。这意味着模型在生成当前位置的输出时,已经考虑了之前所有位置的生成结果。
- 遮蔽(Masking):为了保持自回归性,Transformer模型在解码器的自注意力层中使用遮蔽技术。遮蔽确保了解码器在预测当前位置的输出时,只能看到当前位置之前的输出,而不能直接看到当前位置之后的输出。
- 位置编码:由于Transformer模型本身不具备捕捉序列顺序的能力,因此引入了位置编码来提供序列中每个元素的位置信息。这有助于模型在自回归生成时保持正确的序列顺序。
自回归在Transformer模型中的重要性:
- 捕捉长距离依赖:自回归特性使得Transformer模型能够捕捉序列中的长距离依赖关系,这对于理解和生成复杂的序列模式至关重要。
- 灵活性:自回归允许模型在生成过程中动态地调整其决策,而不是完全依赖于输入序列。
- 并行化:虽然自回归意味着模型在生成每个输出时必须等待前一个输出的完成,但Transformer模型的自注意力机制仍然允许在计算过程中进行一定程度的并行化。
- 生成能力:自回归特性赋予了Transformer模型强大的生成能力,使其在各种生成任务中表现出色。
总的来说,自回归是Transformer模型中的一个核心特性,它使得模型能够生成连贯、有逻辑的序列输出,并在多种序列处理任务中发挥关键作用。
Q:Transformer模型的智能是什么?
A:模型参数(包括模型权重和一些配置信息)和模型结构是模型的智能。
模型参数:
- 嵌入层(Embedding Layers):
- 输入嵌入(Input Embeddings):将输入词汇映射到连续向量空间的嵌入矩阵。
- 输出嵌入(Output Embeddings):通常与输入嵌入共享权重,将输出词汇从连续向量空间映射回词汇空间。
- 编码器(Encoder):
- 自注意力层(Self-Attention Layers):每个自注意力层包含用于计算注意力权重的参数,以及用于将输入映射到查询(Q)、键(K)和值(V)表示的线性投影矩阵。
- 前馈神经网络(Feed-Forward Neural Network):每个编码器层中的FFN包含两个线性变换,中间有激活函数。
- 解码器(Decoder):
- 自注意力层:与编码器类似,但包含掩码以防止未来位置的信息流入当前位置。
- 编码器-解码器注意力层(Encoder-Decoder Attention Layers):类似于自注意力层,但查询来自解码器,而键和值来自编码器的输出。
- 前馈神经网络:与编码器中的FFN相同。
- 层归一化(Layer Normalization):
- 每个子层(自注意力和FFN)后面都有层归一化操作,包含用于归一化和缩放的参数。
- 残差连接(Residual Connections):
- 每个子层的输出都会加上其输入(残差连接),这一操作不需要额外的参数。
- softmax输出:
- 解码器的最终输出通过一个线性层和softmax函数来预测下一个词的概率分布,这个线性层有其自己的权重和偏置参数。
- 位置编码(Positional Encoding):
- 为每个输入序列的位置提供位置信息的参数,通常是预定义的固定向量或通过参数学习得到。
- 优化器参数:
- 如使用Adam优化器,则会有与优化器相关的参数,如学习率、β1、β2和ϵ等。
- 正则化参数:
- 如dropout率、标签平滑(Label Smoothing)等正则化技术涉及的参数。
(ps:Transformer中embedding的词汇表也是一个可学习的参数。实际得到的是每个词和他相应的信息(比如语义,语法,属性等等))
Q:只利用编码器或只利用解码器?
A:
编码器主要用于特征提取,解码器主要用于数据生成(预测)。
只利用编码器的情况:
- 特征提取:编码器可以用于提取数据的特征表示,这些特征可以用于分类、聚类或其他任务。
- 降维:编码器可以用于数据降维,例如在自编码器(Autoencoder)中,编码器将输入数据压缩成更小的表示。
- 生成模型的前半部分:在生成对抗网络(GAN)中,编码器可以作为生成器的一部分,生成新的数据样本。
只利用解码器的情况:
- 生成任务:解码器可以独立用于生成任务,如在某些类型的生成模型中,解码器负责从潜在空间生成数据。
- 数据重建:在自编码器的解码部分,解码器将编码器的输出重建为原始数据的近似版本。
- 序列到序列模型的解码部分:在没有成对训练数据的情况下,可以使用解码器来预测序列的下一个元素,例如在文本生成或语音合成中。
注意:
- 编码器和解码器的设计和用途取决于具体的应用场景和任务需求。
- 在某些情况下,编码器和解码器可以独立使用,但在许多任务中,它们是协同工作的,以实现更复杂的功能,如机器翻译、语音识别等。
Q:模块分析?
Q:输入转换?
input = word embedding(词嵌入,翻译为模型理解的word) + 位置编码(词顺序)
1、词嵌入
单词的 Embedding 有很多种方式可以获取,例如可以采用 Word2Vec、Glove 等算法预训练得到,也可以在 Transformer 中训练得到。
2、位置编码
Transformer 中除了单词的 Embedding,还需要使用位置编码表示单词出现在句子中的位置。**因为 Transformer 不采用 RNN 的结构,而是使用全局信息,不能利用单词的顺序信息,而这部分信息对于 NLP 来说非常重要。**所以 Transformer 中使用位置 Embedding 保存单词在序列中的相对或绝对位置。
位置 Embedding 用 PE表示,PE 的维度与单词 Embedding 是一样的。PE 可以通过训练得到,也可以使用某种公式计算得到。在 Transformer 中采用了后者,计算公式如下:
其中,pos 表示单词在句子中的位置,d 表示 PE的维度 (与词 Embedding 一样),2i 表示偶数的维度,2i+1 表示奇数维度 (即 2i≤d, 2i+1≤d)。使用这种公式计算 PE 有以下的好处:
- 使 PE 能够适应比训练集里面所有句子更长的句子,假设训练集里面最长的句子是有 20 个单词,突然来了一个长度为 21 的句子,则使用公式计算的方法可以计算出第 21 位的 Embedding。
- 可以让模型容易地计算出相对位置,对于固定长度的间距 k,PE(pos+k) 可以用 PE(pos) 计算得到。因为 Sin(A+B) = Sin(A)Cos(B) + Cos(A)Sin(B), Cos(A+B) = Cos(A)Cos(B) - Sin(A)Sin(B)。
将单词的词 Embedding 和位置 Embedding 相加,就可以得到单词的表示向量 x,x 就是 Transformer 的输入。
Q:QKV的理解?
利用QKV计算过程:
https://zhuanlan.zhihu.com/p/441459022
Q:预测流程?
Q:mask attention?
为了保持自回归性,Transformer模型在解码器的自注意力层中使用遮蔽技术。遮蔽确保了解码器在预测当前位置的输出时,只能看到当前位置之前的输出,而不能直接看到当前位置之后的输出。
Q:如何实现一对多输出?
通过自回归。
Q:解码器中第二个注意力机制的(编码器-解码器注意力机制)作用?
利用所有编码信息验证前一个解码器结果预测的正确性,来训练模型。类似反向传播中的误差损失计算。
第一个decoder用于得到查询信息Q,第二个decoder通过Q查询encoder得到的编码信息K,V和并且也从之前decoder解码出的信息k,v,来生成新的信息,新信息作为下一个decoder的输入持续输出,直到end。