NLP —— Transformer底层源码剖析(编码器部分)

Transformer 编码器部分组成

代码部分:

1.单层编码器

python 复制代码
"""
    编码器层
    由两部分组成
        ① 多头自注意力层 + 层归一化 + 残差连接
        ② 前馈网络 + 层归一化 + 残差连接
"""
class EncoderLayer(nn.Module):
    def __init__(self, d_model, multi_head_self_attention, feed_forward_obj, dropout_p):
        super().__init__()
        """
            维度、多头自注意力、前馈网络、随机失活
        """
        self.d_model = d_model
        self.multi_head_self_attention = multi_head_self_attention
        self.feed_forward_obj = feed_forward_obj
        self.dropout_p = dropout_p
        """
            第①部分
            第②部分
        """
        self.multi_layer = SubLayerConnection(self.d_model, self.dropout_p)
        self.feed_forward_layer = SubLayerConnection(self.d_model, self.dropout_p)

    def forward(self, data):
        """
            # 1- 数据经过第一个层的处理:多头自注意力子层
                 这里data 输入数据,自注意力,data=Q=K=V

            # 2- 数据经过第二个层的处理:前馈网络子层
                 第一个模块处理后的数据,带入前馈网络相关的第二模块
        """
        multi_output = self.multi_layer(
            data,
            lambda x: self.multi_head_self_attention(query=x, key=x, value=x, mask=None)
        )

        encoder_output = self.feed_forward_layer(
            multi_output,
            lambda y: self.feed_forward_obj(y)
        )

        return encoder_output

2.N层编码器层

python 复制代码
"""
    N层编码器层
"""
class Encoder(nn.Module):
    def __init__(self, encoder_layer, N=6):
        super().__init__()
        """
            复制N分,深拷贝
        """
        self.encoder_layer_list = clones(encoder_layer,N)
        """
            【可选】最后输出做一次归一化层 处理,保证数据更加平稳。
        """
        self.layer_norm = LayerNorm(encoder_layer.d_model)

    def forward(self, data):
        """
            输入数据进行 N层的 编码处理,最终输出
        """
        for layer in self.encoder_layer_list:
            data = layer(data)

        return self.layer_norm(data)

3.测试使用 N层编码器

python 复制代码
"""
    使用 N层编码器 -> 得到编码器输出
"""
def use_encoder():
    
    position_data = use_positional_encoding()
    d_model = 512
    dropout_p = 0.1
    num_heads = 8   #多头数    512/8 = 64 子维度

    """
        多头自注意力对象
        前馈网络对象
        单层编码器对象
    """
    multi_head_self_attention = MultiHeadAttention(d_model, num_heads, dropout_p)
    feed_forward_obj = FeedForward(d_model=d_model, output_dim=1024, dropout=dropout_p)

    encoder_layer = EncoderLayer(
        d_model=d_model,
        multi_head_self_attention=multi_head_self_attention,
        feed_forward_obj=feed_forward_obj,
        dropout_p=dropout_p
    )

    encder = Encoder(encoder_layer,6)
    output = encder(position_data)
    print(f"编码器最终的输出结果是:{output.shape}")

if __name__ == "__main__":
    test_encoder()
相关推荐
逸模4 小时前
告别熬夜手工整理台账,逸模智能归集实现项目数据自动化存档
大数据·运维·人工智能·笔记·其他·信息可视化·自动化
weixin_397574095 小时前
生产管理和设备管理:制造执行层的AI痛点
人工智能·制造
冬奇Lab5 小时前
Agent 系列(16):工具链设计——让 LLM 用对工具的五个原则
人工智能·llm·agent
冬奇Lab5 小时前
每日一个开源项目(第125篇):taste-skill - 给 AI 装上审美,让前端不再千篇一律
人工智能·开源·agent
Ajie'Blog5 小时前
Copilot Agent Tasks API 开放:AI 编程开始进入后台任务时代
服务器·前端·javascript·人工智能·copilot·ai编程
SEONIB_Explorer6 小时前
AI SEO 与传统SEO成本对比:哪种更划算?
人工智能
一次旅行6 小时前
AI领域每日资讯报告
人工智能
Python私教6 小时前
Cursor + Claude Code 全流程实战:搭一套生产级 AI 编程工作流(2026 最新版)
人工智能·语言模型·qwen·ollama·本地大模型·大模型部署·deepseek
来让爷抱一个6 小时前
MonkeyCode 的 Git 协作功能:团队开发新范式
人工智能·ai编程