Transformer模型-7- Decoder

概述

image.png

Decoder也是N=6层堆叠的结构,每层被分3层: 两个注意力层和前馈网络层,同Encoder一样在主层后都加有Add&Norm,负责残差连接和归一化操作。

Encoder与Decoder有三大主要的不同

  1. 第一层 Masked Multi-Head Attention: 采用Masked操作
  2. 第二层 Multi-Head Attention: K, V矩阵是使用Encoder编码信息矩阵C进行计算,而Q使用上一个Decoder的输出计算。
  3. 概率计算输出: Linear和Softmax作用于前向网络层的输出后面,来预测对应的word的probabilities

Encoder的输入矩阵用X表示,输出矩阵用C表示

流程图表示如下:

Positional Encoding特征值Output Embedding带掩码的多头注意力层多头注意力层前馈网络层Add&NormLinearSoftmaxOutputProbilities

分析如下:

  1. 我们将 输入转换为嵌入矩阵,再加上位置编码,输入解码器
  2. 解码器收到输入,将其发送给带掩码的多头注意力层,生成注意力矩阵M
  3. 将注意力矩阵M和Encoder输出的特征值R作为多头注意力层的输入,输出第二层注意力矩阵
  4. 从第二层的多头注意力层得到注意力矩阵,送入前馈网络层,后者将解码后的特征作为输出
  5. 前馈网络层的输出经过Add&Norm后,做linear及Softmax回归,并输出目标句子的特征

Decoder 的输入

Decoder的输入结构与encoder的一样。

Transformer模型-4-Inputs-笔记

Masked Multi-Head Attention

输入组成


由如下几个部分组成

1.初始输入:前一时刻Decoder输入+前一时刻Decoder的预测结果 + Positional Encoding
3.中间输入:Encoder Embedding
4.Shifted Right:在输出前添加 起始符(Begin),方便预测第一个Token

Shifted Right是在起始位添加起始符(Begin),让整个输入向后移一位,是为了在T-1时刻需要预测T时刻的输出。

举例: I like eat hamburg

正常的输出序列位置关系如下:

1  0"I"
2  
以下是一个使用 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__() # 定义 Encoder 层 encoder_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`。在类的初始化方法中,定义了 Transformer 的 Encoder 和 Decoder 部分,以及一个线性层用于输出。在 `forward` 方法中,实现了模型的前向传播过程,即先通过 Encoder 处理输入序列,然后将 Encoder 的输出作为记忆传递给 Decoder,最后通过线性层得到最终输出。最后,模拟了输入数据并进行了前向传播,打印出输出的形状。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值