Transformer--Decoder

一、Transformer 解码器

编码器详见上篇文章

1、Decoder 层实现

解码器层同编码器层一样,需要数据输入后创建Q、K、V向量,通过依据向量之间的关系,构建attention机制,实现decoder layer层的实现。

python 复制代码
class DecoderLayer(nn.Module):
    def __init__(self,size,self_atten,scr_atten,feed_forward,dropout=0.1):
        super(DecoderLayer,self).__init__()
        """
            其中初始化传入的参数有 self_attne == 多头自注意力机制 Q K V 相等
            src_atten == 多头注意力机制 Q != K = V  普通的多头注意力机制
            feed_forward == 前馈层  == 常规的前馈连接层
        """
        self.size = size
        self.self_attention = self_atten
        self.scr_attention = scr_atten
        self.feed_forward = feed_forward
        
        self.sublayers = colon.colones(SublayerConnection(size,dropout),3)
    
    def forward(self,x,memory,src_mask,tgt_mask):
        # 传入的四个参数 
        """
            input == 输入的序列
            memory == 编码器的输出张量== 
            src_mask == 编码器的mask  == 在数据处理过程中将没有必要关注的信息进行mask处理
            tgt_mask == 解码器的mask  == 在解码的过程中将后面的信息进行mask
        """
        # 自注意力机制
        x = self.sublayers[0](x,lambda x:self.self_attention(x,x,x,tgt_mask))
        # 常规注意力机制   Q != K = V
        x = self.sublayers[1](x,lambda x:self.scr_attention(x,memory,memory,src_mask))
        return self.sublayers[2](x,self.feed_forward)

2、构建解码器

复制代码
	在解码器中,通过对解码器层的N次重复执行,从而构建解码器。

解码器中,输入值为x ,memory,rc_mask,tgt_mask四个向量,通过对解码器层中self.layer进行遍历,对数据向量进行attention计算后,最后对数据进行标准化,进行数据的输出。

python 复制代码
class Decoder(nn.Module):
    def __init__(self,layer,N):
        super(Decoder,self).__init__()
        """
        # layer == 解码器层 实例化对象
        
        """
        self.layers = colon.colones(layer,N)
        self.norm = LayerNorm(layer.size)  # 初始化标准化层
    def forward(self,x,memory,src_mask,tgt_mask):
        # src_mask == 原数据的mask张量
        # tgt_mask == 解码器的mask张量
        for layer in self.layers:
            x = layer(x,memory,src_mask,tgt_mask)
        return self.norm(x)

3、数据生成器

数据输出层 ,构建数据全连接层,采用softmax激活后进行数据的输出。

python 复制代码
class Genertor(nn.Module):
    def __init__(self,embedding_dim,vocab_size):
        super(Genertor,self).__init__()
        """
            embedding_dim: 词嵌入的维度
            vocab_size: 词表大小
        """
        self.embedding_dim = embedding_dim
        self.vocab_size = vocab_size
        self.linear = nn.Linear(embedding_dim,vocab_size)  # 构建线性层
    def forward(self,x):
        x = self.linear(x)
        return F.log_softmax(x,dim=-1)

二、Transformer model 类整体构建

python 复制代码
class EncoderDecoder(nn.Module):
    def __init__(self,encoder,decoder,src_embed,tgt_embed,generator):
        super(EncoderDecoder,self).__init__()
        """
            实现完整的transformer模型
            encoder:编码器
            decoder:解码器
            src_embed:编码器的词向量 ===> 代表源数据的词嵌入函数
            tgt_embed:解码器的词向量 ===> 代表输出数据的词嵌入函数  embedding
            generator:输出层
        """
        self.encoder = encoder
        self.decoder = decoder
        self.src_embed = src_embed
        self.tgt_embed = tgt_embed
        self.generator = generator
    def forward(self,source,target,source_mask,target_mask):
        # source target 没有经过词嵌入的初始输入数据与target数据
        # source_mask 原数据的掩码张量
        # target_mask 目标数据的掩码张量
        return self.decode(self.encode(source,source_mask),source_mask,target,target_mask)
    
    def encode(self,source,source_mask):
        # encoder 输入 source(经过词嵌入后的张量) source_mask
        return self.encoder(self.src_embed(source),source_mask)
    
    def decode(self,memory,source_mask,target,target_mask):
        # memory == 经过编码器编码后的输出张量
        # decoder 输入 input memory source_mask target_mask
        return self.decoder(self.tgt_embed(target),memory,source_mask,target_mask)
python 复制代码
def make_model(src_vocab,tgt_vocab,N=6,M=6,d_model=512,d_ff=64,head=8,dropout=0.1):
    """
    src_vocab 原数据的词表大小
    tgt_vocab 输出数据的词表大小
    d_model  表示词嵌入词表的维度
    d_ff:表示全连接层隐藏层的维度
    """
    
    c = copy.deepcopy
    # 初始化实例对象
    self_atten =src_atten = MultiHeadedAttention(head,d_model)
    feed_forward = PositionwiseFeedForward(d_model,d_ff,dropout)
    # 实例化位置编码器
    position = PositionalEncoding(d_model,dropout)

    
    # 实例化 model 模型
    """
        编码器中有两个子层 一个atten + feed_forward
        解码器中有三个子层 一个self_atten + sec_atten + feed_forward 
    
    """
    encoder_layer = Encoder_layer(d_model,self_atten,feed_forward,dropout)
    decoder_layer = DecoderLayer(d_model,self_atten,src_atten,feed_forward,dropout)

    model = EncoderDecoder(
        Encoder(c(encoder_layer),N),
        Decoder(c(decoder_layer),M),
        nn.Sequential(Embeddings(d_model,src_vocab),c(position)),
        nn.Sequential(Embeddings(d_model,tgt_vocab),c(position)),
        Genertor(d_model,tgt_vocab)
    )
    # 对模型中的整个参数进行判断  == 将矩阵中的参数服从均匀分布进行初始化
    # 对模型中维度大于1的参数进行初始化
    for p in model.parameters():
        if p.dim() > 1:
            nn.init.xavier_uniform_(p)

    return model

if __name__ == "__main__":
    result = make_model(10,20)
    print(result)
相关推荐
九章云极AladdinEdu2 分钟前
临床数据挖掘与分析:利用GPU加速Pandas和Scikit-learn处理大规模数据集
人工智能·pytorch·数据挖掘·pandas·scikit-learn·paddlepaddle·gpu算力
上海锝秉工控3 分钟前
超声波风向传感器:以科技之翼,捕捉风的每一次呼吸
大数据·人工智能·科技
说私域4 分钟前
基于开源AI智能名片、链动2+1模式与S2B2C商城小程序的流量运营与个人IP构建研究
人工智能·小程序·流量运营
xiaoxiaoxiaolll2 小时前
期刊速递 | 《Light Sci. Appl.》超宽带光热电机理研究,推动碳纳米管传感器在制药质控中的实际应用
人工智能·学习
练习两年半的工程师2 小时前
AWS TechFest 2025: 风险模型的转变、流程设计的转型、生成式 AI 从实验走向实施的三大关键要素、评估生成式 AI 用例的适配度
人工智能·科技·金融·aws
Elastic 中国社区官方博客5 小时前
Elasticsearch:智能搜索的 MCP
大数据·人工智能·elasticsearch·搜索引擎·全文检索
stbomei5 小时前
从“能说话”到“会做事”:AI Agent如何重构日常工作流?
人工智能
yzx9910135 小时前
生活在数字世界:一份人人都能看懂的网络安全生存指南
运维·开发语言·网络·人工智能·自动化
许泽宇的技术分享6 小时前
LangGraph深度解析:构建下一代智能Agent的架构革命——从Pregel到现代AI工作流的技术飞跃
人工智能·架构
乔巴先生246 小时前
LLMCompiler:基于LangGraph的并行化Agent架构高效实现
人工智能·python·langchain·人机交互