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框架信息
相关推荐
吃好睡好便好3 小时前
在Matlab中绘制二维直方图
开发语言·人工智能·学习·算法·matlab
byzh_rc3 小时前
[自然语言处理-入门] 语音识别
人工智能·自然语言处理·语音识别
z小猫不吃鱼3 小时前
05 Pytorch之 ViT-B/16 源码逐行解析
人工智能·pytorch·python
甄心爱学习3 小时前
【自然语言处理】词汇与表征
人工智能·自然语言处理
技术钱3 小时前
大语言模型出现幻觉的原因与缓解方案
人工智能·python·语言模型·自然语言处理
xG8XPvV5d3 小时前
PyTorch特征提取器源码精析
人工智能·pytorch·python
刘一说3 小时前
AI科技热点日报 | AI Hot News Daily 2026年5月19日
人工智能·科技·chatgpt
一只理智恩3 小时前
Vibe Coding的编程思路
人工智能
Hello Mr.Z3 小时前
双机双卡训练yolov5(yolov5+pytorch+DDP+NCCL+RDMA全栈解析)
人工智能·pytorch·yolo