NLP —— Transformer底层源码剖析(解码器部分+输出)

Transformer 解码器组成部分

Transformer 解码器由 (解码器输入层数据 + 编码器输出数据),

最终输出层通过(线性层+Softmax权重)输出

输出部分代码:

python 复制代码
"""
    输出层
    N层解码器 输出值 带入 经过 线性 + 权重 最后输出 【batch_size, seq_len, d_model】
"""
class Output(nn.Module):
    def __init__(self, d_model, vocab_size):
        super().__init__()
        self.linear = nn.Linear(in_features=d_model, out_features=vocab_size)

    def forward(self, input_data):
        return torch.softmax(self.linear(input_data), dim=-1)

解码器代码:

1.解码器器层

由三部分组成

① 掩码多头自注意力层 + 层归一化 + 残差连接

② 交叉注意力层 + 层归一化 + 残差连接

③ 前馈网络 + 层归一化 + 残差连接

python 复制代码
"""
    解码器器层
    由三部分组成
        ① 掩码多头自注意力层 + 层归一化 + 残差连接
        ② 交叉注意力层 + 层归一化 + 残差连接
        ③ 前馈网络 + 层归一化 + 残差连接
"""
class DecoderLayer(nn.Module):
    def __init__(self, d_model, mask_multi_self_atten_obj, multi_head_atten_obj, feed_forward_obj):
        super().__init__()

        self.d_model = d_model
        """
            三个层 对象实例
        """
        self.mask_multi_self_atten_obj = mask_multi_self_atten_obj
        self.multi_head_atten_obj = multi_head_atten_obj
        self.feed_forward_obj = feed_forward_obj

        """
            三个部分层
        """
        self.mask_multi_self_atten_layer = SubLayerConnection(d_model)
        self.multi_head_atten_layer = SubLayerConnection(d_model)
        self.feed_forward_layer = SubLayerConnection(d_model)

    def forward(self, data, mask, encoder_output):
        """
        :param data:    输入部分数据 (位置编码 + 词嵌入层)
        :param mask:    掩码
        :param encoder_output:  编码器成输出值
        :return:    解码器最后输出
        """
        mask_multi_self_atten_output = self.mask_multi_self_atten_layer(
            data,
            lambda x: self.mask_multi_self_atten_obj(query=x,key=x,value=x,mask=mask)
        )

        multi_head_atten_output = self.multi_head_atten_layer(
            mask_multi_self_atten_output,
            lambda y: self.multi_head_atten_obj(query=y,key=encoder_output,value=encoder_output)
        )

        feed_forward_output = self.feed_forward_layer(
            multi_head_atten_output,
            lambda z: self.feed_forward_obj(z)
        )

        return feed_forward_output

2.N层解码器层

python 复制代码
"""
    N层 解码器层
"""
class Decoder(nn.Module):
    def __init__(self, decoder_layer_obj):
        super().__init__()

        self.decoder_layer_list = clones(decoder_layer_obj, 6)
        """
            【可选】多一次层归一化处理,让数据更稳定。
        """
        self.layer_norm = LayerNorm(decoder_layer_obj.d_model)

    def forward(self, data, mask, encoder_output):
        for decoder_layer in self.decoder_layer_list:
            data = decoder_layer(data, mask, encoder_output)

        return self.layer_norm(data)

3.全流程测试 从编码输入层 ->.编码器输出 + 解码器输入层 -> N层解码器 ->. 输出部分

**构建解码器部分

  1. 解码器端 输入部分
  2. 解码器三个部分
  3. 拼接单层解码器
  4. 多层解码器层
  5. 准备掩码. 【num_heads, seq_len, seq_len】
  6. 词嵌入层
  7. 位置编码层
  8. N层 编码器 输入 -> 输出**
python 复制代码
def use_Decoder():
    """
        准备数据
    """
    d_model = 512
    dropout_p = 0.1
    max_len = 20    #最大翻译词的长度
    num_heads = 8
    encoder_output = use_encoder()
    print(f'编码器输出{encoder_output}')

    # 解码器的原始数据目标数据
    decoder_input_data = torch.tensor([
        # 2条句子 每条4个词,词索引
        [1, 2, 3, 4],
        [5, 6, 7, 8]
    ])

    """
        构建解码器部分
        1. 解码器端 输入部分
        2. 解码器三个部分
        3. 拼接单层解码器
        4. 多层解码器层
        5. 准备掩码. 【num_heads, seq_len, seq_len】
        6. 词嵌入层
        7. 位置编码层
        8. N层 编码器 输入 -> 输出
    """
    # 1
    embed = Embedding(vocab_size=1200, d_model=d_model)
    position_encoding = PositionalEncoding(d_model=d_model,max_len=max_len,dropout_p=dropout_p)
    # 2
    feed_forward = FeedForward(d_model=d_model,output_dim=1024, dropout_p=dropout_p)
    mulit_att = MultiHeadAttention(d_model=d_model,num_heads=num_heads,dropout_p=dropout_p)
    mulit_self_att = MultiHeadAttention(d_model=d_model,num_heads=num_heads,dropout_p=dropout_p)
    # 3
    decoder_layer = DecoderLayer(
        mask_multi_self_atten_obj=mulit_self_att,
        multi_head_atten_obj=mulit_att,
        feed_forward_obj=feed_forward,
        d_model=d_model
    )
    # 4
    decoder = Decoder(decoder_layer)
    # 5
    mask = torch.zeros(size=(num_heads, len(decoder_input_data[0]), len(decoder_input_data[0])))
    # 6
    input_data = embed(decoder_input_data)
    # 7.
    input_data = position_encoding(input_data)
    # 8.
    decoder_result = decoder(
        data=input_data,
        mask=mask,
        encoder_output=encoder_output
    )

    print(f"解码器最终的结果:{decoder_result.shape}")
    return decoder_result
相关推荐
迦南的迦 亚索的索4 小时前
机器学习_01_基础
人工智能·机器学习
百珏4 小时前
AI 应用技术演进串讲大纲
人工智能·后端·架构
工业机器人销售服务4 小时前
泡沫箱码垛(易碎),伯朗特机器人宽幅吸盘+低真空,吸气泡沫箱无压痕
人工智能
lally.4 小时前
CVE-2026-45727:CloakBrowser `cloakserve` 中由 `fingerprint` 引出的路径穿越与目录删除
人工智能·安全架构
财经资讯数据_灵砚智能4 小时前
基于全球经济类多源新闻的NLP情感分析与数据可视化(夜间-次晨)2026年5月17日
大数据·人工智能·python·信息可视化·自然语言处理
Bacon4 小时前
装上就回不去了:CodeGraph 让 AI 编程效率飙升 92%,它到底做了什么?
前端·人工智能·后端
XD7429716364 小时前
科技早报|2026年5月18日:AI 平台开始补生产级控制面
人工智能·科技·云基础设施·科技新闻·开发者工具·自托管·科技早报
前端小超人rui4 小时前
Prompt 提示词原理/组成/编写原则/编写技巧
人工智能·大模型·prompt
前端不太难4 小时前
AI 不只是聊天框:鸿蒙 App 新入口
人工智能·状态模式·harmonyos