Transformer详解

12. Transformer

12.1 Introduction

在这里插入图片描述

在这里插入图片描述

12.2 在 Seq2Seq 架构中计算 Attention

在 Seq2Seq 章节中,我们并没有深入讨论如何求解 α i \alpha_i αi 的过程。本节中,我们将使用和 Transformer 中一样的计算方式在 Seq2Seq 架构中计算权重向量 α i \alpha_i αi

12.2.1 计算 Key k : i k_{:i} k:i 和 Query q : j q_{:j} q:j

在这里插入图片描述

h 有 m 个,s 有 j 个。每个 h 都与 W k W_k Wk 相乘,得到一个 k,共计有 m 个 k,拼接在一起组成大 K。同理,将当前的 s j s_j sj W Q W_Q WQ 相乘,得到一个 q。注意,这里就一个 q,不是所有 s 都要与 W Q W_Q WQ 相乘。

在这里插入图片描述

12.2.2 计算 α : j \alpha_{:j} α:j

将 K 转置后与 q : j q_{:j} q:j 相乘,再经过 Softmax 得到 α : j \alpha_{:j} α:j

在这里插入图片描述

12.2.3 计算 Value v : i v_{:i} v:i

正如前面所说,本章节中我们使用和 Transformer 一样的 Attention 计算方法。这里我们还需要计算 Value。上面的 k : i k_{:i} k:i 叫做 Key, q : j q_{:j} q:j 叫做 Query。

在这里插入图片描述

12.2.4 千呼万唤始出来:计算 c j c_j cj

如下图所以,每一个 h i h_i hi W V W_V WV 相乘,得到 v : i v_{:i} v:i,共有 m 个。 α : j \alpha_{:j} α:j 一共也有 m 个。对应相乘,再累加,得到 c j c_j cj。千呼万唤始出来,终于求得了 c j c_j cj。 问:现在求得了 c j c_j cj,那么之后怎么求得 s j + 1 s_{j+1} sj+1 你知道么?不知道的赶紧去看 Seq2Seq + Attention 章节。快,跑步快去看。

在这里插入图片描述

12.3 Attention without RNN

上一节是在 RNN 网络中应用 Attention。我们之前说过:Attention 可以脱离 RNN 而存在,可以用在任何 NN 上。现在我们来搭建一个 脱离 RNN 的 Attention 网络。

Transformer 就是由 Attention 层 和 Self-Attention 层组成的。

你现在还记得 Self-Attention 是怎么计算的么?不记得,再跑回去看,跑快点。看完再回来。

既然是由 Attention 层和 Self-Attention 层组成的,现在我们先来搭建 Attention 层。

12.3.1 Attention 层

现在回忆 Seq2Seq 模型的基本元素。

在这里插入图片描述

12.3.1.1 计算 Encoder 中的两个变量:Key、Value

现在计算 Key, Value,Query。其中,Encoder 中有两个:Key、Value。

在这里插入图片描述

12.3.1.5 计算 Decoder 中的变量:Value

计算完Encoder中的两个变量:Key、Value。再来计算 Decoder 中的变量:Value。

在这里插入图片描述

12.3.1.3 计算 α i \alpha_i αi

在这里插入图片描述

12.3.1.4 计算 c i c_i ci

在这里插入图片描述

12.3.1.5 重复上面的四个步骤

同样,对于 x 2 ′ x_2^{\prime} x2 的计算过程如下:

在这里插入图片描述

在这里插入图片描述

第 j 个位置 c o n t e x t j context_j contextj 的计算过程如下:

在这里插入图片描述

12.3.1.6 Summary

在第 j 个位置, c o n t e x t j context_j contextj 的计算公式是: c : j = V ⋅ S o f t m a x ( K T q : j ) c_{:j} = V \cdot Softmax(K^Tq_{:j}) c:j=VSoftmax(KTq:j)。而 q : j q_{:j} q:j x j ′ x_j^{\prime} xj 相关,矩阵 K K K 、矩阵 V V V 又和 [ x 1 , … , x m ] [x_1, \ldots, x_m] [x1,,xm] 相关。所以, c : j c_{:j} c:j 是一个关于 x j ′ x_j^{\prime} xj [ x 1 , … , x m ] [x_1, \ldots, x_m] [x1,,xm] 的函数。

在这里插入图片描述

现在来终极总结 Attention 层:全在图中。

三个变量:Encoder 中有两个:Key: W K W_K WK; Query: W Q W_Q WQ,Decoder 中有一个: Value: W V W_V WV

在这里插入图片描述

12.3.2 Self-Attention

搭建了 Attention 层,现在来搭建 Self-Attention 层。现在你还记得为什么要搭建 Self-Attention 层么?不记得?真的不记得了?要不,你再想想?

因为 Transformer 就是由 Attention 层 和 Self-Attention 层组成的。现在我们要来自己搭建一个 Transformer 。

这里,我们就不一步步从头开始搭建 Self-Attention 层了,不懂的同学多读几遍 前面章节的 Self-Attention 和 上一小节的 Attention 层。直接上图:

我又要来重复一下:Attention 层用于 Seq2Seq 架构,里面有 Encoder 和 Decoder。而 Self-Attention 不是用在 Seq2Seq 架构上的,只有一个序列。所以图中的 context 是自己和自己计算的,所以叫做 Self-Attention。

对比这幅图和上一张图,你发现区别在哪里了么?区别是:C 的计算公式不一样。Attention 层中是: C = A t t n ( X , X ′ ) C = Attn(X, X^{\prime}) C=Attn(X,X),而在 Self-Attention 中是: C = A t t n ( X , X ) C = Attn(X, X) C=Attn(X,X)

划重点,敲黑板了!在 Self-Attention 中, c i c_i ci 并非只依赖 x i x_i xi,而是依赖于所有 x x x。关键词:所有 x x x

在这里插入图片描述

12.3.2.1 计算 Key, Value, Query

你不会在 Self-Attention 中计算 Attention?私信我,给我发红包,我给你单独补课。

那我手把手教你一遍。红包不要忘了喂。

首先,Key, Value, Query 公式般上来。

在这里插入图片描述

12.3.2.2 计算 α i \alpha_i αi

第二步:Key 与 Query 计算得到 α i \alpha_i αi

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

12.3.2.3 计算 c i c_i ci

第三步: α : i \alpha_{:i} α:i v : 1 , … , v : m v_{:1}, \ldots, v_{:m} v:1,,v:m 计算得到 c : i c_{:i} c:i。注意,仔细看下图的公式,是第 i 个位置的 α \alpha α 与 所有 value,计算得到第 i 个位置的 context。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

12.3.2.4 Summary

在这里插入图片描述

在这里插入图片描述

12.4 Attention 与 Self-Attention 之 Summary

前面两个章节,我们搭建了 Attention 和 Self-Attention,现在我们来总结一下上面的内容。学习就要勤于总结,在总结中思考,在总结中强化记忆。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

12.5 搭建 Multi-Head

如图,Multi-Head 就是一个多头怪,是将多个 Single Attention 组合在一起。

在这里插入图片描述

12.5.1 Multi-Head Self-Attention

上一节中,我们搭建了 Self-Attention。这个就是 single-head self-attention。

在这里插入图片描述

我们将 L 个 single-head self-attention 组合在一起就变成了 Multi-Head Self-Attention。但是这 L 个single-head self-attention 不共享参数。

在这里插入图片描述

在这里插入图片描述

12.5.2 Multi-Head Attention

同样,Multi-Head Attention 就是将 L个Single-Head Attentions 组合在一起。同理,她们之间也不共享参数。

在这里插入图片描述

12.6 Stacked Self-Attention Layers

现在,我们来堆叠多层 Self-Attention。

基本架构是:一个 Self-Attention Layer 上面堆一个 Dense Layer。

在这里插入图片描述

注意:1. 全联接层是用的同一个参数矩阵 W U W_U WU。2. u : i u_{:i} u:i 依赖于所有 x x x

在这里插入图片描述

我们还可以将上面的结构–Self-Attention Layer + Dense Layer 重复多层。

在这里插入图片描述

注意:一个 encoder block 不是等于 multi-head self-attention + dense layer,是约等于。为了方便理解,我们简化了模型。在真正的 Transformer 中,还需要添加 Add & Norm 层。在 Multi-Head Self-Attention Layer 上添加一层 Add & Norm,之后添加 Dense Layer,之后再添加 Add & Norm 层。
在这里插入图片描述

在这里插入图片描述

12.7 第一个里程碑:Transformer’s Encoder

首先,我们来定义 Block:Self-Attention Layer + Dense Layer。

在这里插入图片描述

我们来堆叠 6 层,中国人喜欢 6,天天说 666。发明 Transformer 的老外是不是来中国住了一段时间,被 666 洗脑了,于是就搭了6 层。

在这里插入图片描述

12.8 Stacked Attention Layers

首先,我们来回忆一下 Attention 层。

在这里插入图片描述

Transformer 是一个 Seq2Seq 架构的模型。前面我们也说了 Attention 是一个用于 Seq2Seq 架构的计算方法。既然是 Seq2Seq 架构就有 Encoder 和 Decoder 了。

上一小节中,我们搭建好了 Encoder 网络,由 6 个 blocks 组成。每个 block 由 Self-Attention + Dense Layer 组成。如图所示:

在这里插入图片描述

搭建好了 Encoder ,我们再来搭建 Decoder。同样,也是由 Multi-Head Self-Attention 组成。

在这里插入图片描述

现在,我们来搭建多层 Attention Layers。

第一层的 Encoder 输出 是 u : i u_{:i} u:i,有 m 个。Decoder 输出是: c : j c_{:j} c:j,有 t 个。我们用 一个 Multi-Head Attention Layer 将 u : i u_{:i} u:i c : j c_{:j} c:j 两者桥接起来,输出是 z : k z_{:k} z:k,有 t 个。

在这里插入图片描述

最后搭一个全联接层。注意,这里和前面一样,全联接层共享 W S W_S WS

在这里插入图片描述

在这里插入图片描述

我们将上面的结构称作一个 Decoder 网络的 Block。

注意,一个 decoder block 不是等于 multi-head self-attention + multi-head attention + dense layer,是约等于。为了方便理解,我们简化了模型。在真正的 Transformer 中,还需要添加 Add & Norm 层。

在这里插入图片描述

在这个 Block 中,Encoder 的输入是 512 * m 维,Decoder 的输入是 512 * t 维。如果是翻译中-英任务,m 就是中文句子的长度,t 就是英语句子的长度。

在这里插入图片描述

12.9 第二个里程碑 — 终点:Transformer

直接上图。

左边是 Encoder 的 Block。右边是 Decoder 的 Block。

划重点,敲黑板。Encoder 的输出 U U U 会当作为 Decoder 中每个 Block 的输入。Decoder 中每个Block 的另一个输入是前一个Block的输出。

在这里插入图片描述

12.10 Seq2Seq vs. Transformer

在 Seq2Seq 模型中,Encoder 的输入是 m 个向量,Decoder 的输入是 t 个向量。看上图,是不是和 Transformer 的Encoder 和 Decoder输入一样。所以,Seq2Seq 模型能做的事都可以用 Transformer 做,而且效果会更好。当前,代价是巨大的计算量。

在这里插入图片描述

12.11 Summary

12.11.1 From Single-Head to Multi-Head

在这里插入图片描述

在这里插入图片描述

12.11.2 Encoder Network of Transformer

注意:一个 encoder block 不是等于 multi-head self-attention + dense layer,是约等于。为了方便理解,我们简化了模型。在真正的 Transformer 中,还需要添加 Add & Norm 层。

在这里插入图片描述

12.11.3 Decoder Network of Transformer

注意,同样:一个 decoder block 不是等于 multi-head self-attention + multi-head attention + dense layer,是约等于。为了方便理解,我们简化了模型。在真正的 Transformer 中,还需要添加 Add & Norm 层。

在这里插入图片描述

12.11.4 Transformer Model

在这里插入图片描述

12.12 再理解 Transformer

12.12.1 Introduction

在这里插入图片描述

注意,在 Decoder 中,第一个 Multi-Head Attention 是 Masked Multi-Head Attention。因为 Decoder 网络,Attention 只能 Attention 之前的词汇,不能 Attention 之后的词汇。

在这里插入图片描述

12.12.2 Scaled Dot-Product Attention

https://paperswithcode.com/method/scaled

首先,Key 和 Query 通过 矩阵乘计算,然后进行 Scale。之后进行 Mask 操作,这是为了防止前面词看到后面词的一种方法,在 Decoder 中使用,但在 Encoder 中不使用。然后,进行 Softmax,得到的是 权重,是 Query 中每个样本在 Key 中所有样本上的分布。之后再与 Value 进行矩阵乘法。

在这里插入图片描述

12.12.2.1 为什么要除以根号 d k d_k dk

答案是:防止内积总和过大。

如图所示,112 和 96 如果直接做 Softmax,由于 S o f t m a x ( x i ) = e x i ∑ c = 1 C e x c Softmax(x_i) = \frac{e^{x_i}}{\sum_{c=1}^{C}e^{x_c}} Softmax(xi)=c=1Cexcexi,虽然 112 比 96 大不了多少,但当使用 指数函数的时候,112 得到的值会远大于 96,那么,112 经过 Softmax 就会接近 1,而 96 经过 Softmax 就会接近 0,这样就会达不到 Attention 的效果。通过 除以根号 d k d_k dk 就能比较好的处理这种“过于分散”的情况,效果也好很多。

在这里插入图片描述

12.12.2.2 为什么是根号 d k d_k dk,而不是别的数?

Scaled dot-product attention is an attention mechanism where the dot products are scaled down by d k \sqrt{d_k} dk . Formally we have a query Q, a key K and a value V and calculate the attention as:

A t t e n t i o n ( Q , K , V ) = S o f t m a x ( Q K T d k ) V Attention(Q,K,V)=Softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=Softmax(dk QKT)V

If we assume that q and k are d k − d i m e n s i o n a l d_k-dimensional dkdimensional vectors whose components are independent random variables with mean 0 and variance 1, then their dot product, q ⋅ k = ∑ i = 1 d k u i v i q \cdot k=\sum_{i=1}^{d_k}u_iv_i qk=i=1dkuivi, has mean 0 and variance dk. Since we would prefer these values to have variance 1, we divide by d k \sqrt{d_k} dk .

12.12.3 Multi-Head Attention

Multi-Head Attention 是 Scaled Dot-Product Attention 的一个封装。

首先,将 Key、Query、Value 切分成多份,每一份分别做 Scaled Dot-Product Attention,得到的结果在 Concat 拼接起来,再通过一个全联接层,得到 Multi-Head Attention 的结果。

在这里插入图片描述

12.12.4 位置编码

在普通的RNN中,隐式的就含有位置编码,因为当前步的运算必须等前一步运算完才能进行。Transformer 的位置编码方式是:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ PE_{pos, 2i} &…
偶数位置使用 sin 函数。奇数位置使用 cos 函数。 d m o d e l d_{model} dmodel 表示词汇的embedding的长度。

假设第一个位置的词汇Embeddings的长度是128,Pos = 1, d = 128,位置向量编码为:
KaTeX parse error: No such environment: align at position 8: \begin{̲a̲l̲i̲g̲n̲}̲ PE = [sin(1/10…
词汇原先的 Embedding 向量会和 位置编码向量拼接在一起,拼接得到的值会作为词汇的最终 表示向量。

12.12.5 Add & Norm

如图所示,在 Transformer 结构中有很多 Add & Norm 层。在 Encoder 和 Decoder 中都有。

在这里插入图片描述

Add & Norm 具体就是一个归一化操作。输入 X 经过 Self-Attention 得到输出 Z,此时将 X 与 Z 相加,再做一个Batch Normalization。

将 X 与 Z 相加,这个操作就是残差联接,可以将神经网络堆叠到很深的网络结构。Self-Attention 是对 X 进行提取,通过将 X 与 Z 相加,不仅可以获得进一步富集的特征,还可以保留原始的特征。将 X 与 Z 相加,等于是让神经网络只负责富集特征的工作,原始的特征会通过相加操作保留下来。而如果没有这种操作,相当于让神经网络不仅要做富集特征的事情,还要保留原始特征的任务,神经网络的任务就会比较繁重。可以理解成“集中力量办大事”,让神经网络集中力量只干一件事:富集特征。

在这里插入图片描述

12.12.6 Decoder 中的几个要点

在这里插入图片描述

仔细看下图的 Decoding 过程。

在这里插入图片描述

12.13 Transformer 的思考

Transformer 现在成为很多任务的标配了。刚开始学习 Transformer 时,感觉是惊为天人。随着时间的积累,对 Transformer 的不断反刍、不断思考,慢慢有了新的感悟,发觉 Transformer 应该是作者基本功扎实,不死看论文 & 懂得融汇变通、集众家所长的产物。正如李笑来在《把时间当作朋友》中说的:把时间当作朋友,去积累,去感悟。Transformer 就是作者对各种技术的思考和感悟。抛砖引玉,欢迎交流。

  1. Attention 非常有用,CNN里的 Kernel 也很有用,两者结合在一起,变成了 Multi-Head Attention;
  2. Attention 可以脱离 RNN存在,但 RNN 天然带有 位置编码,位置编码很有用,于是 Transformer 引入了 位置编码。为什么位置编码用了正弦和余弦函数,是为了并行化。
  3. Seq2Seq 是 NLP 问题建模的标准范式,所以 Transformer 依然沿用了 Seq2Seq 架构。
  4. 深的神经网络总是比浅的网络好,所以,作者沿用了 Residual 的方法,通过 Add & Norm 将网络堆叠多层。
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Transformer 是一种用于自然语言处理任务的深度学习模型,它是由 Google 在 2017 年提出的。相比于传统的循环神经网络和卷积神经网络Transformer 采用了全新的 Encoder-Decoder 架构,使用了自注意力机制(Self-Attention Mechanism)来处理输入序列,从而在机器翻译、文本摘要、对话生成等任务上取得了很好的效果。 Transformer 本质上是一个 Encoder-Decoder 架构,其中 Encoder 和 Decoder 都是由多个相同的层堆叠而成。每个层都包含了两个子层,分别是 Multi-Head Attention 和 Feed Forward Neural Network。其中 Multi-Head Attention 是 Transformer 的核心,它使用了自注意力机制来计算输入序列中每个词与其他词之间的关系,从而更好地捕捉上下文信息。 Transformer 的训练过程分为两个阶段:第一阶段是无监督的预训练,使用大量的无标注数据来训练模型;第二阶段是有监督的微调,使用有标注的数据来微调模型,使其适应特定的任务。 下面是一个简单的 Transformer 模型的实现代码: ```python import torch import torch.nn as nn import torch.nn.functional as F class Transformer(nn.Module): def __init__(self, input_dim, hidden_dim, output_dim, num_layers, num_heads, dropout): super().__init__() self.embedding = nn.Embedding(input_dim, hidden_dim) self.encoder_layers = nn.ModuleList([EncoderLayer(hidden_dim, num_heads, dropout) for _ in range(num_layers)]) self.decoder_layers = nn.ModuleList([DecoderLayer(hidden_dim, num_heads, dropout) for _ in range(num_layers)]) self.fc_out = nn.Linear(hidden_dim, output_dim) self.dropout = nn.Dropout(dropout) self.scale = torch.sqrt(torch.FloatTensor([hidden_dim])).to(device) def forward(self, src, trg, src_mask, trg_mask): src_len, batch_size = src.shape trg_len, batch_size = trg.shape src_pos = torch.arange(0, src_len).unsqueeze(1).repeat(1, batch_size).to(device) trg_pos = torch.arange(0, trg_len).unsqueeze(1).repeat(1, batch_size).to(device) src = self.dropout((self.embedding(src) * self.scale) + src_pos) trg = self.dropout((self.embedding(trg) * self.scale) + trg_pos) for layer in self.encoder_layers: src = layer(src, src_mask) for layer in self.decoder_layers: trg = layer(trg, src, trg_mask, src_mask) output = self.fc_out(trg) return output ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值