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()
相关推荐
老金带你玩AI36 分钟前
ChatGPT 12月合并额度:以后提问还得先打草稿?
人工智能
久曲健的测试窝42 分钟前
2026软件测试工具选型指南:双模式如何化解UI脚本维护难题
运维·人工智能·科技·aigc
CQU_JIAKE1 小时前
10.30【大模型】
人工智能
LMT流氓兔1 小时前
第五单元——第十六课:给书店助手加上网页界面
java·开发语言·jvm·人工智能·oracle·langchain·1024程序员节
小许学java1 小时前
AI通识与基础
人工智能·langchain
代码方舟1 小时前
零信任架构实战:基于天远企业法人四要素高级版构建自动化电子印章授权与签约准入网关
人工智能·架构·自动化·区块链
专注仿真1 小时前
梯度提升类(XFBoost)算法详解与代码实例
开发语言·人工智能·python·算法·大模型训练·控制算法
IT_陈寒2 小时前
JavaScript的this坑人实录,这次我真的记下来了
前端·人工智能·后端
一只游鱼2 小时前
LangGraph快速入门 —— Agent 是怎么转起来的
人工智能·ai·agent·langgraph
Rocky Ding*2 小时前
深入浅出GroundingPI技术解析:精确空间感知如何迁移到机器人动作
论文阅读·人工智能·深度学习·机器学习·aigc·ai-native·具身智能