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()
相关推荐
荆棘鸟智能5 小时前
城市感知设备怎么统一接入?从多协议网关到设备模型的中间件架构设计
人工智能·算法·边缘计算
火山引擎开发者社区5 小时前
当 AI 内容真假难辨,谁来为真实签名 —— 证书中心 C2PA 内容可信溯源服务正式发布
人工智能
百万蹄蹄向前冲5 小时前
风扇转了一晚上MVP专家团翻车事故
前端·人工智能
米小虾5 小时前
你的 harness 技巧有保质期:176 组对照实验显示,上下文管理的收益从 35.7 分跌到 2.7 分
人工智能·agent
飞哥数智坊5 小时前
一个周末,6个项目,我第一次感觉 AI 编程真的进入了新阶段
人工智能·ai编程
AOI小白新手上路5 小时前
秦方方 2025《基于深度学习的单幅图像去雨算法研究与应用》( 河南理工硕士论文)蒸馏文档
人工智能
米小虾5 小时前
一周 AI 观察(9.15–9.21):同一个星期里,token 有了官方标准,Gemini 进了三家真实公司,TPU 变成了抵押品
人工智能
冬奇Lab5 小时前
LLM 自动化测试系列(01):为什么测试是 LLM 落地的新战场
人工智能
冬奇Lab5 小时前
一天一个开源项目(第224篇):ARTEMIS —— 谷歌开源的移动端 AI 自动化框架,让 AI 助手像人一样操作手机
人工智能·开源·测试
蓝速科技6 小时前
会议室门牌公告通知发布选型与落地指南丨蓝速科技
大数据·运维·数据库·人工智能·科技