Transformer--Decoder

天空闲话  金牌会员 | 2024-12-29 22:51:59 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 806|帖子 806|积分 2418

一、Transformer 解码器

编码器详见上篇文章
1、Decoder 层实现

解码器层同编码器层一样,需要数据输入后创建Q、K、V向量,通过依据向量之间的关系,构建attention机制,实现decoder layer层的实现。
  1. class DecoderLayer(nn.Module):
  2.     def __init__(self,size,self_atten,scr_atten,feed_forward,dropout=0.1):
  3.         super(DecoderLayer,self).__init__()
  4.         """
  5.             其中初始化传入的参数有 self_attne == 多头自注意力机制 Q K V 相等
  6.             src_atten == 多头注意力机制 Q != K = V  普通的多头注意力机制
  7.             feed_forward == 前馈层  == 常规的前馈连接层
  8.         """
  9.         self.size = size
  10.         self.self_attention = self_atten
  11.         self.scr_attention = scr_atten
  12.         self.feed_forward = feed_forward
  13.         
  14.         self.sublayers = colon.colones(SublayerConnection(size,dropout),3)
  15.    
  16.     def forward(self,x,memory,src_mask,tgt_mask):
  17.         # 传入的四个参数
  18.         """
  19.             input == 输入的序列
  20.             memory == 编码器的输出张量==
  21.             src_mask == 编码器的mask  == 在数据处理过程中将没有必要关注的信息进行mask处理
  22.             tgt_mask == 解码器的mask  == 在解码的过程中将后面的信息进行mask
  23.         """
  24.         # 自注意力机制
  25.         x = self.sublayers[0](x,lambda x:self.self_attention(x,x,x,tgt_mask))
  26.         # 常规注意力机制   Q != K = V
  27.         x = self.sublayers[1](x,lambda x:self.scr_attention(x,memory,memory,src_mask))
  28.         return self.sublayers[2](x,self.feed_forward)
复制代码
2、构建解码器

  1.         在解码器中,通过对解码器层的N次重复执行,从而构建解码器。
复制代码
解码器中,输入值为x ,memory,rc_mask,tgt_mask四个向量,通过对解码器层中self.layer进行遍历,对数据向量进行attention计算后,末了对数据进行标准化,进行数据的输出。
  1. class Decoder(nn.Module):
  2.     def __init__(self,layer,N):
  3.         super(Decoder,self).__init__()
  4.         """
  5.         # layer == 解码器层 实例化对象
  6.         
  7.         """
  8.         self.layers = colon.colones(layer,N)
  9.         self.norm = LayerNorm(layer.size)  # 初始化标准化层
  10.     def forward(self,x,memory,src_mask,tgt_mask):
  11.         # src_mask == 原数据的mask张量
  12.         # tgt_mask == 解码器的mask张量
  13.         for layer in self.layers:
  14.             x = layer(x,memory,src_mask,tgt_mask)
  15.         return self.norm(x)
复制代码
3、数据生成器

数据输出层 ,构建数据全连接层,采用softmax激活后进行数据的输出。
  1. class Genertor(nn.Module):
  2.     def __init__(self,embedding_dim,vocab_size):
  3.         super(Genertor,self).__init__()
  4.         """
  5.             embedding_dim: 词嵌入的维度
  6.             vocab_size: 词表大小
  7.         """
  8.         self.embedding_dim = embedding_dim
  9.         self.vocab_size = vocab_size
  10.         self.linear = nn.Linear(embedding_dim,vocab_size)  # 构建线性层
  11.     def forward(self,x):
  12.         x = self.linear(x)
  13.         return F.log_softmax(x,dim=-1)
复制代码
二、Transformer model 类团体构建

  1. class EncoderDecoder(nn.Module):
  2.     def __init__(self,encoder,decoder,src_embed,tgt_embed,generator):
  3.         super(EncoderDecoder,self).__init__()
  4.         """
  5.             实现完整的transformer模型
  6.             encoder:编码器
  7.             decoder:解码器
  8.             src_embed:编码器的词向量 ===> 代表源数据的词嵌入函数
  9.             tgt_embed:解码器的词向量 ===> 代表输出数据的词嵌入函数  embedding
  10.             generator:输出层
  11.         """
  12.         self.encoder = encoder
  13.         self.decoder = decoder
  14.         self.src_embed = src_embed
  15.         self.tgt_embed = tgt_embed
  16.         self.generator = generator
  17.     def forward(self,source,target,source_mask,target_mask):
  18.         # source target 没有经过词嵌入的初始输入数据与target数据
  19.         # source_mask 原数据的掩码张量
  20.         # target_mask 目标数据的掩码张量
  21.         return self.decode(self.encode(source,source_mask),source_mask,target,target_mask)
  22.    
  23.     def encode(self,source,source_mask):
  24.         # encoder 输入 source(经过词嵌入后的张量) source_mask
  25.         return self.encoder(self.src_embed(source),source_mask)
  26.    
  27.     def decode(self,memory,source_mask,target,target_mask):
  28.         # memory == 经过编码器编码后的输出张量
  29.         # decoder 输入 input memory source_mask target_mask
  30.         return self.decoder(self.tgt_embed(target),memory,source_mask,target_mask)
复制代码
  1. def make_model(src_vocab,tgt_vocab,N=6,M=6,d_model=512,d_ff=64,head=8,dropout=0.1):
  2.     """
  3.     src_vocab 原数据的词表大小
  4.     tgt_vocab 输出数据的词表大小
  5.     d_model  表示词嵌入词表的维度
  6.     d_ff:表示全连接层隐藏层的维度
  7.     """
  8.    
  9.     c = copy.deepcopy
  10.     # 初始化实例对象
  11.     self_atten =src_atten = MultiHeadedAttention(head,d_model)
  12.     feed_forward = PositionwiseFeedForward(d_model,d_ff,dropout)
  13.     # 实例化位置编码器
  14.     position = PositionalEncoding(d_model,dropout)
  15.    
  16.     # 实例化 model 模型
  17.     """
  18.         编码器中有两个子层 一个atten + feed_forward
  19.         解码器中有三个子层 一个self_atten + sec_atten + feed_forward
  20.    
  21.     """
  22.     encoder_layer = Encoder_layer(d_model,self_atten,feed_forward,dropout)
  23.     decoder_layer = DecoderLayer(d_model,self_atten,src_atten,feed_forward,dropout)
  24.     model = EncoderDecoder(
  25.         Encoder(c(encoder_layer),N),
  26.         Decoder(c(decoder_layer),M),
  27.         nn.Sequential(Embeddings(d_model,src_vocab),c(position)),
  28.         nn.Sequential(Embeddings(d_model,tgt_vocab),c(position)),
  29.         Genertor(d_model,tgt_vocab)
  30.     )
  31.     # 对模型中的整个参数进行判断  == 将矩阵中的参数服从均匀分布进行初始化
  32.     # 对模型中维度大于1的参数进行初始化
  33.     for p in model.parameters():
  34.         if p.dim() > 1:
  35.             nn.init.xavier_uniform_(p)
  36.     return model
  37. if __name__ == "__main__":
  38.     result = make_model(10,20)
  39.     print(result)
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

天空闲话

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表