Transformer详解


1️⃣ Transformer介绍

从时序模型来看,传统的RNN,GRU,LSTM,Seq2Seq等 存在一个问题,就是不能并行计算。

Transformer结构可以解决这个问题。该结构在2017发表的论文《Attention is All you Need》 中被提出,之后用于Bert,GPT2,GPT3等模型中。

Transformer完全基于注意力机制,没有使用RNN,CNN等结构


2️⃣ 原理介绍

我们首先来看一个基于Transformer的中译英的整体架构:
在这里插入图片描述
Transformer由编码器和解码器构成,编码器中有6个encoder block;解码器中有6个decoder block。Transformer 的工作流程大体如下:

第一步:词嵌入+位置编码
首先将原始输入序列转换为固定维度的向量表示,即 词Embedding。此外由于Transformer没有使用RNN结构,没有序列顺序,因此通过引入位置编码,得到 位置Embedding 提供位置信息。

然后我们将词Embedding位置Embedding相加得到每个单词的 单词表示 x 。然后所有 单词表示x 组成下图中蓝色矩阵被称为“表示矩阵X”,其中每一行是一个 单词表示 x表示矩阵X 的维度为 n × d n×d n×d,其中n是单词个数,d是 单词表示x 的维度(论文中是512)

在这里插入图片描述

第二步:编码器
表示矩阵X 输入编码器中,经过6个encoder block得到 编码矩阵C 。C和维度和X的维度一样

在这里插入图片描述
第三步:解码器

解码器接受编码器的输出 编码矩阵C表示矩阵X。解码器根据翻译过的单词1~i翻译单词 i+1。在翻译单词 i+1 的时候需要通过 Mask (掩盖) 操作遮盖住 表示矩阵X 中 i+1及其之后的单词。
例如,首先输入翻译开始符 “<Begin>”,掩盖 表示矩阵X 中的"I have a cat",预测第一个单词 “I”;然后输入 “<Begin>” 和单词 “I”,掩盖 表示矩阵X 中的"have a cat",预测单词 “have”。
在这里插入图片描述
上面介绍了一个大致的流程,现在我们来详细介绍其中的细节。

1.输入数据准备

Transformer 中 单词表示x词Embedding位置 Embedding (Positional Encoding)相加得到
在这里插入图片描述

1.1 词嵌入

原始输入序列被转化为固定维度的向量表示,这一步通过词嵌入(如 Word2Vec、GloVe)或模型自学的嵌入向量完成

1.2 位置编码(Positional Encoding)
Transformer 不采用 RNN 的结构,没有单词的顺序信息,而这部分信息对于 NLP 来说非常重要。因此通过引入位置编码,得到 位置Embedding 来提供位置信息,位置Embedding用PE表示:
P E ( p o s , 2 i ) = sin ⁡ ( p o s 1000 0 2 i d ) , P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s 1000 0 2 i d ) PE_{(pos,2i)}=\sin\left(\frac{pos}{10000^{\frac{2i}d}}\right),\quad PE_{(pos,2i+1)}=\cos\left(\frac{pos}{10000^{\frac{2i}d}}\right) PE(pos,2i)=sin(10000d2ipos),PE(pos,2i+1)=cos(10000d2ipos)
其中, p o s pos pos 是单词在句子中的位置(从 0 开始计数), d d d是表示PE的维度 (与词 Embedding一样); i i i 是维度索引(从 0 到 ⌊ d / 2 ⌋ − 1 \lfloor d/2 \rfloor - 1 d/21

词Embedding位置Embedding相加得到每个单词的 单词表示 x

举个例子:
假设我们有一个中文句子:“我 爱 学习 人工智能”,共 4 个单词。我们将为这个句子计算位置编码,并展示如何将其与词嵌入结合。

  1. 参数设定
    假设词嵌入的维度 d = 4 d = 4 d=4(为了简化计算,通常实际中 d d d 较大,如 512)。
    句子长度为 4,因此 p o s = 0 , 1 , 2 , 3 pos = 0, 1, 2, 3 pos=0,1,2,3(对应“我”、“爱”、“学习”、“人工智能”)。
    位置编码的维度与词嵌入相同,因此 P E PE PE是一个 4×4 的矩阵(4 个位置,每个位置有 4 维)。
  2. 计算位置编码
    我们逐一计算每个位置 p o s pos pos 的位置编码向量 P E ( p o s ) PE_{(pos)} PE(pos)。由于 d = 4 d = 4 d=4,维度索引 i i i 取值为 0 , 1 0, 1 0,1【i的取值范围是 0 到 ⌊ d / 2 ⌋ − 1 \lfloor d/2 \rfloor - 1 d/21】。
    公式:
    对于 i = 0 i = 0 i=0,计算维度 0 和 1:
    P E ( p o s , 0 ) = sin ⁡ ( p o s 1000 0 0 4 ) = sin ⁡ ( p o s ) , P E ( p o s , 1 ) = cos ⁡ ( p o s 1000 0 0 4 ) = cos ⁡ ( p o s ) PE_{(pos, 0)} = \sin\left(\frac{pos}{10000^{\frac{0}{4}}}\right) = \sin(pos), \quad PE_{(pos, 1)} = \cos\left(\frac{pos}{10000^{\frac{0}{4}}}\right) = \cos(pos) PE(pos,0)=sin(1000040pos)=sin(pos),PE(pos,1)=cos(1000040pos)=cos(pos)
    (因为 1000 0 0 / 4 = 1000 0 0 = 1 10000^{0/4} = 10000^0 = 1 100000/4=100000=1
    对于 i = 1 i = 1 i=1,计算维度 2 和 3:
    P E ( p o s , 2 ) = sin ⁡ ( p o s 1000 0 2 4 ) = sin ⁡ ( p o s 1000 0 0.5 ) , P E ( p o s , 3 ) = cos ⁡ ( p o s 1000 0 2 4 ) = cos ⁡ ( p o s 1000 0 0.5 ) PE_{(pos, 2)} = \sin\left(\frac{pos}{10000^{\frac{2}{4}}}\right) = \sin\left(\frac{pos}{10000^{0.5}}\right), \quad PE_{(pos, 3)} = \cos\left(\frac{pos}{10000^{\frac{2}{4}}}\right) = \cos\left(\frac{pos}{10000^{0.5}}\right) PE(pos,2)=sin(100004
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 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值