NLP —— Transformer底层源码剖析(框架使用)

本篇是结合前面几篇把,Transformer 最终整个框架封装好直接拿来使用实例代码。

目录

[Transformer 原理](#Transformer 原理)

各个部分Transformer手写底层代码剖析

使用Transformer框架

1.定义Transformer类

(编码输入部分、解码输入部分、编码器、解码器、输出)

[2.Transformer对象 前向传播](#2.Transformer对象 前向传播)

(编码输入数据、解码输入数据、掩码)

[3. Transformer 实例对象使用](#3. Transformer 实例对象使用)

4.测试框架

5.打印Transformer框架信息


Transformer 原理

链接:https://blog.csdn.net/i_k_o_x_s/article/details/161060029

整体Transformer框架回顾

各个部分Transformer手写底层代码剖析

  1. Transformer 底层源码剖析(输入部分)

https://blog.csdn.net/i_k_o_x_s/article/details/161065795?spm=1001.2014.3001.5502

  1. Transformer底层代码剖析(通用部分)

https://blog.csdn.net/i_k_o_x_s/article/details/161096897?spm=1001.2014.3001.5502

  1. Transformer底层源码剖析(编码器部分)

https://blog.csdn.net/i_k_o_x_s/article/details/161173312?spm=1001.2014.3001.5502

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

https://blog.csdn.net/i_k_o_x_s/article/details/161176836?spm=1001.2014.3001.5502


使用Transformer框架

1.定义Transformer类
(编码输入部分、解码输入部分、编码器、解码器、输出)
2.Transformer对象 前向传播
(编码输入数据、解码输入数据、掩码)
python 复制代码
​
class SelfTransformer(nn.Module):
    def __init__(self, encoder_input, decoder_input, encoder, decoder:Encoder, output):
        super().__init__()

        self.encoder_input = encoder_input
        self.decoder_input = decoder_input
        self.encoder = encoder
        self.decoder = decoder
        self.output = output

    def forward(self, encoder_input_data, decoder_input_data, mask):
        # 1. 编码器 输入部分得到的数据
        en_embd_data = self.encoder_input(encoder_input_data)

        # 2. 编码器层得到的数据
        encoder_output = self.encoder(en_embd_data)

        # 3. 解码器 输入样本数据
        de_embd_data = self.decoder_input(decoder_input_data)

        # 4. 解码器的 N层 解码层处理
        decoder_data = self.decoder(data=de_embd_data, mask=mask, encoder_output=encoder_output)

        # 5. 输出部分
        return self.output(decoder_data)

​
3. Transformer 实例对象使用
python 复制代码
def get_self_transformer():
    # 设置常量
    d_model = 512
    dropout_p = 0.1
    en_vocab_size = 1000
    de_vocab_size = 4000
    en_max_len = 50
    de_max_len = 60
    num_heads = 8
    output_dim_size = 1024

    # ============== 编码器部分 ===============
    en_ebd = Embedding(vocab_size=en_vocab_size,d_model=d_model)
    en_pos = PositionalEncoding(d_model=d_model, dropout_p=dropout_p, max_len=en_max_len)
    en_multi_self_attn = MultiHeadAttention(d_model=d_model, num_heads=num_heads, dropout_p=dropout_p)
    en_ffn = FeedForward(d_model=d_model, output_dim=output_dim_size, dropout_p=dropout_p)

    #组装编码器
    encoder_layer = EncoderLayer(
        d_model=d_model,
        multi_head_self_attention=en_multi_self_attn,
        feed_forward_obj=en_ffn,
        dropout_p=dropout_p
    )

    #编码器
    encoder = Encoder(encoder_layer, N=6)

    # ============= 解码器部分 ================
    de_edb = Embedding(vocab_size=de_vocab_size,d_model=d_model)
    de_pos = PositionalEncoding(d_model=d_model, dropout_p=dropout_p, max_len=de_max_len)
    mask_multi_self_att = MultiHeadAttention(d_model=d_model, num_heads=num_heads, dropout_p=dropout_p)
    multi_att = MultiHeadAttention(d_model=d_model, num_heads=num_heads, dropout_p=dropout_p)
    de_ffn = FeedForward(d_model=d_model, output_dim=output_dim_size, dropout_p=dropout_p)

    # ============= 组装解码器 =================
    decoder_layer = DecoderLayer(
        d_model=d_model,
        mask_multi_self_atten_obj=mask_multi_self_att,
        multi_head_atten_obj=multi_att,
        feed_forward_obj=de_ffn,
    )

    decoder = Decoder(decoder_layer)

    # 输出层
    output = Output(d_model=d_model,vocab_size=de_vocab_size)


    # ============= 组装 Transformer 框架 ===================
    self_transformer = SelfTransformer(
        encoder_input=nn.Sequential(en_ebd, en_pos),
        encoder=encoder,
        decoder_input=nn.Sequential(de_edb, de_pos),
        decoder=decoder,
        output=output
    )

    print(f'架构结构信息:{self_transformer}')
    return self_transformer
4.测试框架
python 复制代码
def use_self_transformer():
    # 1. 拿到transformes乱讲
    self_transformer = get_self_transformer()

    # 2. 数据级 编码器端输入
    en_intput_data = torch.tensor([
        [1, 2, 3, 4],
        [5, 6, 7, 8]
    ])

    #3 # 数据集 解码器端 输入
    de_intput_data = torch.tensor(
        [[222, 2344, 456, 356],
        [2456, 131, 456, 67]]
    )

    # 4. 解码器的掩码
    """
        torch.triu(..., diagonal=0)
        triu = Upper Triangle 上三角
        保留对角线及以上的 1,对角线以下全部变成 0
    """
    mask = torch.triu(torch.ones([8, 4, 4]), diagonal=0)

    # 5. 调用框架
    result = self_transformer(
        en_intput_data,
        de_intput_data,
        mask
    )

    print(f"最终输出结果的张量形状:{result.shape}")
    print(f"最终输出结果的张量求和结果:{result.sum()}")

if __name__ == "__main__":
    use_self_transformer()
5.打印Transformer框架信息
相关推荐
西柚研究生12345642 分钟前
论文分析15:跨层特征交互的多尺度无人机小目标检测算法
人工智能·算法·目标检测
fthux6 小时前
装闭 RenoPit 源码解析(07):装修闭坑知识库与AI Prompt构建
人工智能·ai·开源·github·open source·renopit
zyplayer-doc8 小时前
VuePress类静态文档站和动态知识库怎么选:两种技术路线的适用场景
javascript·人工智能·后端·安全·智能手机
KKKlucifer8 小时前
拨开接口黑盒迷雾:运营商第三方合作接口安全审计与准入管控落地实践
网络·人工智能·安全
梦梦代码精9 小时前
连锁品牌数字化:从门店扩张到用户资产运营的技术底座
大数据·人工智能·低代码·docker·开源·代码规范
咕噜咕噜啦啦9 小时前
vLLM框架
人工智能·qwen·vllm
启雀AI9 小时前
AI 驱动的视频课程自动摘要与知识点提取:ASR + LLM 流水线工程实践
人工智能·阿里云·华为云·音视频·培训saas平台
Mac的实验室9 小时前
2026年8月最新实操:谷歌Gmail邮箱手机号注册扫码发短信提示“无法验证”怎么办?(附100%成功绕过指南)
人工智能
MindUp9 小时前
AI辅助PPT生成工具的内容组织能力实测:8款产品的文档解析与排版效果对比
人工智能