Transformer 架构—Encoder-Decoder

文章目录


前言

最初的Transformer是基于广泛应用在机器翻译领域的Encoder-Decoder架构:

Encoder:

将由 token 组成的输入序列转成由称为隐藏状态(hidden state)或者上下文(context)的embedding向量组成的序列。

Decoder:

根据 Encoder 的隐藏状态迭代生成组成输出序列的 token。

从上图我们可以看到:

  • 输入文本被 tokenized 成 token embedding。由于注意力机制不知道 token 的相对位置,因此我们需要一种方法将一些有关 token 位置的信息注入到输入中,以对文本的顺序性质进行建模。因此,token embedding 与包含每个 token  的位置信息的 position embedding 相组合。
  • encoder 由一堆 encoder 层组成,类似于计算机视觉中堆叠的卷积层。decoder也是如此,它有自己的 decoder 层块。
  • encoder 的输出被馈送到每隔 decoder 层,然后 decoder 生成序列中最可能的下一个 token 的预测。然后,此步骤的输出被反馈到 decoder 以生成下一个 token,依次类推,直到到达特殊的序列结束(End of Sequence,EOS)token。以上图为例,想象一下 decoder 已经预测了“Die”和“Zeit”。现在,它将根据这两个预测 token 以及所有 encoder 的输出来预测下一个 token “fliegt”。在下一步中,decoder 继续将“fliegt”作为附加输入。我们重复这个过程,直到 decoder 预测出 EOS token 或者达到最大输出长度限制。

Transformer 架构最初是为机器翻译等序列到序列任务而设计的,但 encoder 和 decoder 块很快就被改编为独立模型。尽管现在有数千种不同的 Transformer 模型,但大多数属于以下三种类型之一:

(1)Encoder-only

这些模型将文本输入序列转换为丰富的数字表示,非常适合文本分类或命名实体识别等任务。BERT(Bidirectional Encoder Representation Transformers)及其变体,例如 RoBERTaDistilBERT,都属于此类架构。在该架构中为给定 token 计算的表示取决于左侧(token之前)和右侧(token之后)的上下文。所以通常称为双向注意力(bidirectional attention)。

(2)Decoder-only

用户给定一段文本提示,这些模型将通过迭代预测最可能出现的下一个单词来自动补充余下的文本。GPT(Generative Pretrained Transformer)模型系列属于此类。在该架构中为给定 token 计算的表示仅取决于左侧上下文。所以通常称为因果注意力(causal attention)或自回归注意力(autoregression attention)。

(3)Encoder-Decoder

它们用于对从一个文本序列到另一个文本序列的复杂映射进行建模,比如机器翻译和文本摘要。除了我们所看到的结合了 encoder 和 decoder

以下是一个使用 PyTorch 实现的简单 Transformer Encoder - Decoder 模型的代码示例: ```python import torch import torch.nn as nn # 定义 Transformer Encoder - Decoder 模型 class TransformerModel(nn.Module): def __init__(self, d_model, nhead, num_encoder_layers, num_decoder_layers, dim_feedforward): super(TransformerModel, self).__init__() # 定义 Encoderencoder_layer = nn.TransformerEncoderLayer(d_model=d_model, nhead=nhead, dim_feedforward=dim_feedforward, dropout=0.0) # 定义 Encoder self.transformer_encoder = nn.TransformerEncoder(encoder_layer, num_layers=num_encoder_layers) # 定义 Decoderdecoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead, dim_feedforward=dim_feedforward, dropout=0.0) # 定义 Decoder self.transformer_decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_decoder_layers) # 定义线性层用于输出 self.fc = nn.Linear(d_model, d_model) def forward(self, src, tgt): # 通过 Encoder 处理输入序列 memory = self.transformer_encoder(src) # 通过 Decoder 处理目标序列和 Encoder 的输出 output = self.transformer_decoder(tgt, memory) # 通过线性层得到最终输出 output = self.fc(output) return output # 初始化模型参数 d_model = 512 nhead = 8 num_encoder_layers = 6 num_decoder_layers = 6 dim_feedforward = 2048 # 创建模型实例 model = TransformerModel(d_model, nhead, num_encoder_layers, num_decoder_layers, dim_feedforward) # 模拟输入数据 src = torch.randn(10, 32, d_model) # 输入序列,形状为 (序列长度, 批次大小, 特征维度) tgt = torch.randn(10, 32, d_model) # 目标序列,形状为 (序列长度, 批次大小, 特征维度) # 前向传播 output = model(src, tgt) print(output.shape) ``` 在上述代码中,首先定义了一个 `TransformerModel` 类,该类继承自 `nn.Module`。在类的初始化方法中,定义了 TransformerEncoderDecoder 部分,以及一个线性层用于输出。在 `forward` 方法中,实现了模型的前向传播过程,即先通过 Encoder 处理输入序列,然后将 Encoder 的输出作为记忆传递给 Decoder,最后通过线性层得到最终输出。最后,模拟了输入数据并进行了前向传播,打印出输出的形状。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JOYCE_Leo16

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值