Transformer结构介绍和Pyotrch代码实现
关注B站查看更多手把手教学:
基本结构介绍
Transformer结构是近年来自然语言处理(NLP)领域的重要突破,它完全基于注意力机制(Attention Mechanism)来实现,克服了传统RNN模型无法并行计算以及容易丢失长距离依赖信息的问题。
Transformer模型主要由Encoder和Decoder两部分组成。这两部分都包含多个相同的层,每层都由一个自注意力(Self-Attention)子层和一个前馈神经网络(Feed Forward Neural Network)子层组成。在每个子层之间还使用了残差连接(Residual Connection)和层归一化(Layer Normalization)。
在Encoder部分,输入序列首先经过Word Embedding和Positional Encoding,然后输入到多个Encoder层中。在每个Encoder层中,输入序列会先经过Self-Attention子层,该子层会计算输入序列中每个位置的表示对所有位置的依赖关系,得到加权后的表示。然后,加权后的表示会经过Feed Forward Neural Network子层进行非线性变换。最后,通过残差连接和层归一化得到该层的输出。
在Decoder部分,与Encoder类似,输入序列也会经过Word Embedding和Positional Encoding。但是,在Decoder的Self-Attention子层中,需要考虑到不能看到未来信息的问题,因此需要使用Masked Self-Attention。此外,Decoder还需要一个Encoder-Decoder Attention子层来计算对Encoder输出的依赖关系。最后,通过多个Decoder层的堆叠得到最终的输出序列。
Pytorch代码实现
以下是Transformer结构的一个简化版实现,包括Encoder和Decoder部分,以及相应的代码注释。请注意,为了简洁起见,这个实现省略了一些高级功能,如dropout、层标准化中的可学习参数等。
import torch
import torch.nn as nn
import torch.nn.functional as F
# Transformer模型
class Transformer(nn.Module):
def __init__(self, d_model, nhead, num_encoder_layers, num_decoder_layers, dim_feedforward=2048):
super(Transformer, self).__init__()
# Encoder部分
self.encoder = Encoder(d_model, nhead, num_encoder_layers, dim_feedforward)
# Decoder部分
self.decoder = Decoder(d_model, nhead, num_decoder_layers, dim_feedforward)
def forward(self, src, tgt, src_mask=None, tgt_mask=None, memory_mask=None, src_key_padding_mask=None, tgt_key_padding_mask=None):
# Encoder得到memory
memory = self.encoder(src, src_mask=src_mask, src_key_padding_mask=src_key_padding_mask)