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 小时前
《数据挖掘》第一章 绪论 读书笔记
人工智能·数据挖掘
gis分享者4 小时前
学习threejs,实现Transformer架构三维模拟
深度学习·transformer·threejs·三维·renderpass·effectcomposer·unrealbloompass
汐ya~4 小时前
GELab-Zero:面向 Android 的开源移动端 GUI Agent,让 AI 像人一样用手机
android·人工智能·开源
嵌入式-老费4 小时前
esp32开发与应用(用ai开发esp32)
人工智能
草莓熊Lotso4 小时前
【Linux网络】从 0 到工业级:TCP 服务器多线程 / 线程池全实现 + 远程命令执行实战
linux·运维·服务器·网络·人工智能·网络协议·tcp/ip
快递鸟社区4 小时前
快递鸟海运查询接口全面解析:从入门到精通,助力跨境物流可视化
java·前端·人工智能
踩着两条虫4 小时前
可视化设计器组件系统:从交互核心到 AI 智能代理的落地实践
开发语言·前端·人工智能·低代码·设计模式·架构
TG_yunshuguoji4 小时前
云代理商:云端部署的Hermes Agent 如何接入Slack?
人工智能·云计算·ai 智能体·hermes agent
ChampaignWolf4 小时前
ABAP的代理时刻:SAP-ABAP-1、ABAP MCP服务器和VS Code云扩展将于2026年第二季度上线
运维·服务器·人工智能