Transformer架构:编码器部分代码实现(基于PyTorch)

使用Pytorch从零实现Transformer模型 2017年Google在论文《Attention is All You Need》中提出了Transformer模型,并成功应用到NLP领域。该模型完全基于自注意力机制Attention mechanism实现,弥补了传统的RNN模型的不足。本文笔者将详解使用Pytorch从零开始逐步实现Transformer模型。 阅读详情


相关文章

Transformer架构:结构介绍:网页链接
Transformer架构:输入部分代码实现(基于PyTorch):网页链接
Transformer架构:核心模块代码实现(基于PyTorch):网页链接
Transformer架构:解码器部分代码实现(基于PyTorch):网页链接
Transformer架构:输出部分代码实现(基于PyTorch):网页链接
Transformer架构:整体实现代码(基于PyTorch):网页链接


一、编码器的核心作用

在Transformer架构中,编码器(Encoder)是特征提取的核心模块,负责将输入序列(如文本、图像patch)转换为包含上下文信息的特征表示。其核心能力体现在:

  1. 上下文建模:通过自注意力机制捕捉序列中任意位置的依赖关系(如文本中“代词”与“指代对象”的关联)。
  2. 特征逐层抽象:通过多层堆叠的编码器层,从输入中逐层提取从简单到复杂的特征(如文本中从“词向量”→“短语语义”→“句子主题”)。

二、编码器整体工作流程图

在这里插入图片描述
核心模块的代码实现在 Transformer架构:核心模块代码实现(基于PyTorch) 中


三、编码器层(EncoderLayer):单一层级的特征变换

编码器层是构成编码器的基本单元,每个层包含“自注意力子层”和“前馈网络子层”,通过子层连接结构实现特征的深度加工。

3.1 代码实现与结构解析

class EncoderLayer(nn.Module):
    def __init__(self, embedding_dim, self_attention, feedforward, dropout):
        super().__init__()
        self.self_attention = self_attention  # 多头自注意力模块
        self.feedforward = feedforward        # 前馈全连接模块
        self.embedding_dim = embedding_dim    # 词嵌入维度(如512)
        # 克隆2个子层连接结构(分别用于注意力子层和前馈子层)
        self.sublayer = clones(SublayerConnection(embedding_dim, dropout), 2)

    def forward(self, x, mask):
        # 第一个子层:自注意力 + 残差连接 + 规范化
        x = self.sublayer[0](x, lambda x: self.self_attention(x, x, x, mask))
        # 第二个子层:前馈网络 + 残差连接 + 规范化
        x = self.sublayer[1](x, self.feedforward)
        return x

3.2 关键细节解析:

  1. 模块依赖:

    • self_attention:多头注意力实例(如8头,MultiHeadedAttention类),用于计算自注意力。
    • feedforward:前馈网络实例(PositionwiseFeedForward类),用于非线性特征变换。
    • sublayer:通过clones函数复制的2个子层连接结构,封装了“残差连接+LayerNorm+Dropout”逻辑。
  2. 前向传播流程:

    • 自注意力子层:
      输入x通过lambda x: self.self_attention(x, x, x, mask)实现自注意力计算(query=key=value=x),再经self.sublayer[0]完成残差连接与规范化。
    • 前馈网络子层:
      注意力输出通过前馈网络进行非线性变换,再经self.sublayer[1]处理,最终输出当前编码器层的结果。
  3. 张量形状变化:
    输入x形状为[batch_size, seq_len, embedding_dim],经过两层子处理后形状保持不变,确保多层堆叠时的兼容性。


四、编码器(Encoder):多层堆叠的深度特征提取

编码器由N个相同的编码器层堆叠而成,通过多层迭代强化特征表示,最终输出包含全局上下文的序列特征。

4.1 代码实现与结构解析

class Encoder(nn.Module):
    def __init__(self, layer, N):
        super().__init__()
        # 克隆N个编码器层(如N=6,构成6层编码器)
        self.layers = clones(layer, N)
        # 最终规范化层(输出前的最后一次特征分布调整)
        self.norm = LayerNorm(embedding_dim)

    def forward(self, x, mask):
        # 依次通过N个编码器层
        for layer in self.layers:
            x = layer(x, mask)
        # 最终规范化
        return self.norm(x)

4.2 关键细节解析:

  1. 多层堆叠逻辑:
    通过clones(layer, N)复制N个相同的编码器层(如Transformer原论文中N=6),形成深度网络结构。每层的输出作为下一层的输入,实现特征的逐层抽象。

  2. 最终规范化:
    所有编码器层处理完毕后,通过LayerNorm进行最终规范化,确保输出特征的分布稳定性,为后续解码器(或下游任务)提供一致的输入。

  3. 掩码作用:
    mask在整个编码器流程中传递,用于屏蔽输入序列中的无效位置(如填充的PAD token),确保自注意力计算仅关注有效元素。


五、核心设计思想

  1. 模块化堆叠:
    编码器层通过“自注意力+前馈网络”的固定模块重复堆叠,平衡了模型复杂度与可扩展性。增加层数可提升特征抽象能力,但需配合残差连接避免梯度消失。

  2. 自注意力的核心价值:
    每个编码器层中的自注意力机制允许序列中的每个元素“关注”其他所有元素,从而捕捉长距离依赖(如文本中跨句子的语义关联),这是Transformer超越RNN的关键。

  3. 与输入模块的衔接:
    编码器的输入通常是经过“词嵌入+位置编码”的序列(见《Transformer架构:输入部分代码实现》),其输出可直接作为解码器的“记忆”(如机器翻译任务),或用于文本分类等下游任务。


六、完整代码

from Transformer_moduls import *

# 编码器层类 EncoderLayer 实现思路分析
# init函数 (self, size, self_attn, feed_forward, dropout):
    # 实例化多头注意力层对象self_attn # 前馈全连接层对象feed_forward  size词嵌入维度512
    # clones两个子层连接结构 self.sublayer = clones(SublayerConnection(size,dropout),2)
# forward函数 (self, x, mask)
    # 数据经过子层连接结构1 self.sublayer[0](x, lambda x: self.self_attn(x, x, x, mask))
    # 数据经过子层连接结构2 self.sublayer[1](x, self.feed_forward)
class EncoderLayer(nn.Module):
    def __init__(self,embedding_dim,self_attention,feedforward,dropout):
        super().__init__()
        # 实例化多头注意力层对象
        self.self_attention = self_attention

        # 前馈全连接层对象feed_forward
        self.feedforward = feedforward

        # size词嵌入维度512
        self.embedding_dim = embedding_dim

        # clones两个子层连接结构 self.sublayer = clones(SublayerConnection(size,dropout),2)
        self.sublayer = clones(SublayerConnection(embedding_dim,dropout),2)

    def forward(self,x,mask):


        x = self.sublayer[0](x, lambda x:self.self_attention(x,x,x,mask))

        x = self.sublayer[1](x,self.feedforward)

        return  x

# 编码器类 Encoder 实现思路分析
# init函数 (self, layer, N)
    # 实例化多个编码器层对象self.layers   通过方法clones(layer, N)
    # 实例化规范化层 self.norm = LayerNorm(layer.size)
# forward函数 (self, x, mask)
    # 数据经过N个层 x = layer(x, mask)
    #  返回规范化后的数据 return self.norm(x)
class Encoder(nn.Module):
    def __init__(self,layer,N):
        # 参数layer 1个编码器层
        # 参数 编码器层的个数

        super().__init__()

        # 实例化多个编码器层对象
        self.layers = clones(layer,N)

        # 实例化规范化层
        self.norm = LayerNorm(embedding_dim)

    def forward(self,x,mask):
        # 数据经过N个层 x = layer(x, mask)
        for layer in self.layers:
            x = layer(x,mask)

        #  返回规范化后的数据 return self.norm(x)
        return self.norm(x)

def test_encoder():
    x = torch.arange(8).reshape(2,-1)
    x = untest_input(x)
    self_attention = MutiHeadAttention(8,embedding_dim,dropout)
    feedforward = PositionwiseFeedForward(embedding_dim,d_ff)
    encoder_layer = EncoderLayer(embedding_dim,self_attention,feedforward,dropout)
    encoder = Encoder(encoder_layer,6)
    # 此处应该使用padding mask,为演示方便用全0mask
    mask = torch.zeros(heads,4,4)
    encoder_result = encoder(x,mask)
    print(f'{"*"*30}编码后的值{"*"*30}')
    print(encoder_result)
    print(f'编码后的形状:{encoder_result.shape}')
    return encoder_result


if __name__ == '__main__':
    test_encoder()

Transformer代码(Pytorch实现和详解)!!! 这个是第一版,有些代码如果不对,欢迎在评论指正,后续会慢慢改,我也是刚接触transformer,若有些地方理解不对还请指正。 阅读详情

相关推荐

第TR3周:Pytorch复现Transformer

Transformer可以看作是seq2seq模型的一种,因此,先从seq2seq的角度对Transformer进行宏观结构的学习。下图1先便是Transformer整体结构图,与seq2seq模型类似,Transformer模型结构中的左半部分为编码器,右半部分为解码器,下面我们来一步步拆解Transformer。在某种程度上,可以将Transformer看作是Seq2Seq的一种演变,Transformer可以执行Seq2Seq任务,并且相对于传统的Seq2Seq模型具有更好的性能和可扩展性。

lihuhelihu的博客 3022

Transformer代码实现【pytorch】

【代码】Transformer代码实现【pytorch】

m0_51474171的博客 2195

别再手动转格式了!用Java+LibreOffice命令行实现Word批量转PDF(附Docker部署避坑指南)

本文详细介绍了如何利用Java和LibreOffice命令行实现企业级Word批量转PDF的自动化解决方案,包括多线程优化、Docker化部署及常见问题排查。通过代码示例和实战经验,帮助开发者高效处理文档转换需求,提升工作效率并避免常见陷阱。

552

Transformer的PyTorch实现(超详细)

文本主要介绍一下如何使用 PyTorch 复现 Transformer,实现简单的机器翻译任务。请先花上 15 分钟阅读我的这篇文章 Transformer详解,再来看文本,方能达到醍醐灌顶,事半功倍的效果 数据预处理 这里我并没有用什么大型的数据集,而是手动输入了两对德语→英语的句子,还有每个字的索引也是我手动硬编码上去的,主要是为了降低代码阅读难度,我希望读者能更关注模型实现的部分 # S: Symbol that shows starting of decoding input # E: Symbol

mathor的博客 6万+

香橙派5使用RK3588S内置NPU加速yolov5推理,实时识别数字达到50fps

香橙派5采用了RK3588S,内置的NPU达到了6Tops的算力,博主这里记录一下自己的踩坑过程,好不容易做出来的不能以后忘记了(手动狗头)。这里博主还在B站上发布了效果视频,大家感兴趣的话可以看一下。其中解决了先验框标注位置不对,或者出现非常多的框的问题

weixin_51651698的博客 2万+

PID循迹控制算法

前言  让小车进行循迹最重要的是获取车相对于循迹线的位置,关于循迹模块的原理我已经在之前的一篇博客上讲过,如果大家没看过的话可以点此链接:PID循迹模块原理。 PID循迹原理简介 图1 循迹车寻线行走图示 图2 市场常见循迹传感器  PID循迹的原理我们大致可以用常识性思维去思考下,如图1所示为循迹车寻线行走图示,现在小车要按照中间那条黑线循迹行走,如果车头往左偏则需要控制方向盘让车往右转,车头往又偏则需要让车往左转。但是仅仅只有左转和右转的话,车一到左边就向右转,一到右边就向左转,则车会来回在线左右晃动

Dinvent的博客 7万+

Transformer模型的Pytorch实现

Transformer模型的Pytorch实现解读。

牧羊女 2677

86 arduino 电机yl_(八)arduino入门:直流电机控制

一、本节介绍在本实验中,您将学习如何使用驱动芯片L293D和SunFounder Uno板控制小型直流(DC)电机的方向和速度。为了使初学者更容易,我们将让直流电机左右旋转,自动加速和减速。二、材料准备1 *小型直流电机1 * L293D1 * Arduino Uno板1 *面包板1 * USB数据线杜邦线三、原理讲解L293D这是一个非常实用的芯片,可以独立控制两台直流电机。在这个实验中,只有一...

weixin_29163857的博客 3567

Transformer的Pytorch实现

使用Pytorch编程实现Transformer并进行训练和预测

ing100的博客 3168

130页5万字某市档案馆数字档案馆建设方案

【版权声明】本资料来源网络,仅用于行业知识分享,供个人学习参考,请勿商用。【侵删致歉】如有侵权请联系小编,将在收到信息后第一时间进行删除!完整资料领取见文末,部分资料内容:国家档案局证实颁布《数字档案馆建设指南》, 明确了数字档案馆建设原则、要求、目标,对相关系统建设内容、功能要求进行了概括和详细说明。数字档案馆系统建设应以 OAIS 参考模型为设计基础,以实现数字资源的长期保存与可信管理。设计的数字档案馆系统架构如下图。图-1 数字档案馆体系结构数字档案馆建设包括五大层次和三大保障体系:

zuoan1993的博客 1180

【新能源汽车DCDC变换器测试优化全攻略:解决电能质量/发热/过充等核心痛点】

高压直流转12V低压的DCDC变换器是新能源汽车电源系统的核心枢纽,承担着为整车低压附件、控制器及12V蓄电池供电/补电的关键作用。在新能源汽车乘用车、商用车等不同车型实际运营中,因PDU内DC/AC等模块干扰、DCDC自身设计缺陷、整车匹配性不佳及测试验证不充分,频发12V输出电能质量差导致后端元器件烧毁、变换器发热严重、蓄电池过充/欠充、智能补电功能失效等问题,还伴随低压侧电压瞬跌/浪涌、电磁干扰超标、振动后接触不良、高温下效率骤降等行业高频故障,直接影响整车可靠性和运营安全性。本文基于国标。

优快云-新能源汽车研发测试专业博主 1266

从零开始读懂Transformer:架构解析与PyTorch实现

本文深入解析了Transformer架构及其PyTorch实现,主要内容包括: 背景介绍:Transformer作为现代NLP基础架构,彻底改变了序列建模方式,成为BERT、GPT等大模型的核心 架构总览:详细图解了Transformer的四大组成部分: 输入部分(词嵌入+位置编码) 编码器(多头注意力+前馈网络) 解码器(自注意力+编码器-解码器注意力) 输出部分(线性层+softmax) 关键实现: 词嵌入层将离散token转为连续向量 位置编码通过正弦/余弦函数显式加入顺序信息 提供了PyTorch代

yun_kumo1028的博客 1483

GEE 案例:基于陆地卫星8号(大气层顶反射率数据)LANDSAT/LC08/C02/T1_TOA的生态遥感指数RSEI计算、可视化和下载

摘要:基于GEE的遥感生态指数(RSEI)计算方法 本文介绍了利用Google Earth Engine(GEE)平台计算遥感生态指数(RSEI)的全流程方法。主要内容包括:研究区域定义、Landsat8数据获取与去云预处理、关键生态指标计算(地表温度LST、植被指数NDVI、湿度指数WET和建筑指数NDBSI)、主成分分析(PCA)降维处理,以及结果可视化与数据导出。通过结合多源遥感指标并采用归一化处理,构建了综合反映区域生态环境质量的RSEI指数。该方法为生态环境监测提供了高效的技术方案,所有计算过程均

此星光明博客 444

【PyTorch][chapter 27][李宏毅深度学习][transformer-1]

Batch Nomralization 切出来的样本如下:样本长度变化较大的时候,算出来的均值和方差变化较大。相对RNN, LSTM ,transformer 可以并行计算,本篇重点介绍transformer 的Encoder 架构以及实现.3.2.2 当序列特别长的时候,前面的信息会丢失。全称神经信息处理系统大会), 是一种seq2seq 的模型.采用的Encoder-Decoder 结构,应用比较广泛。3.1: 现有技术:在seq2seq 里面常用的是 LSTM, RNN,GRU,CNN.

4AM_明朝百晓生 965

QT里获取UUID当做唯一文件名称

QT里获取UUID当做唯一文件名称

542

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

大语言模型底层架构丨带你认识Transformer

本文主要介绍Transformer 结构。

华为云官方博客 2688

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Transformer

Positional Encoding位置编码,通常通过为每个位置生成一个唯一的向量,并将这个向量加到对应位置的词嵌入向量上,来实现。Transformer模型中使用的是一种固定的、基于正弦和余弦函数的编码方案,该方案允许模型捕获单词间的相对和绝对位置关系。每个编码器层由两个子层连接结构组成。第一个子层连接结构包括一个。和规范化层以及一个残差连接。第二个子层连接结构包括一个。和规范化层以及一个残差连接。和规范化层以及一个残差连接。和规范化层以及一个残差连接。和规范化层以及一个残差连接。

mvnmvn的专栏 338

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Transformer讲解(二)- NLP变形金刚-详细code介绍

Transformer代码从零解读(Pytorch版本)_哔哩哔哩_bilibili公众号【NLP从入门到放弃】后台回复【代码解析】获取视频涉及的代码和PPThttps://www.bilibili.com/video/BV1dR4y1E7aL?spm_id_from=333.999.0.0

计算机视觉 653

【AI大模型】深入Transformer架构:编码器部分的实现与解析(上)

编码器部分:* 由N个编码器层堆叠而成 * 每个编码器层由两个子层连接结构组成 * 第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接 * 第二个子层连接结构包括一个前馈全连接子层和规范化层以及一个残差连接掩代表遮掩,码就是我们张量中的数值,它的尺寸不定,里面一般只有1和0的元素,代表位置被遮掩或者不被遮掩,至于是0位置被遮掩还是1位置被遮掩可以自定义,因此它的作用就是让另外一个张量中的一些数值被遮掩,也可以说被替换, 它的表现形式是一个张量.

2301_76820214的博客 7116

Transformer编码器的理解与PyTorch实现

Transformer编码器的理解与Pytorch实现Transformer的整体结构 Transformer的整体结构 论文:Attention is All You Need Transformer模型是2017年Google公司在论文《Attention is All You Need》中提出的。自提出伊始,该模型便在NLP和CV界大杀四方,多次达到SOTA效果。2018年,Google公司再次发布论文《Pre-training of Deep Bidirectional Transformers f

一直特立独行的猫 7905

PyTorch从零开始实现Transformer

使用Pytorch实现Attention is all you need

阿正的梦工坊 4万+

Transformer架构:输入部分代码实现(基于PyTorch)

Transformer输入部分将离散文本转换为连续向量,包含两大核心组件:词嵌入(Embedding)将词索引映射为512维向量并进行缩放处理,使语义相似的词向量距离更近;位置编码(Positional Encoding)通过正弦余弦函数为每个位置生成独特编码,叠加在词向量上以保留序列顺序信息。代码实现展示了PyTorch中Embedding层和自定义位置编码类的使用,包括矩阵生成、缩放操作和Dropout应用。最终输出为融合语义和位置信息的张量,形状为[batch_size, seq_len, embed

Springfield3006的博客 1192

【Transformer系列(5)】Transformer代码超详细解读(Pytorch)

手把手教你用pytorch代码实现transformer模型

路人贾的博客 1万+

Transformer架构:整体实现代码(基于PyTorch)

Transformer架构解析 Transformer是一种基于自注意力机制的序列转换模型,采用编码器-解码器结构实现端到端序列建模。其核心优势在于并行计算能力、长距离依赖捕捉和跨模态对齐。模型由六大组件构成:输入处理模块(词嵌入+位置编码)、编码器(处理源序列)、解码器(生成目标序列)、多头注意力机制、前馈网络和输出层。工作流程包括源序列向量化、编码器特征提取、解码器序列生成和词汇概率输出。通过多头自注意力和位置编码等机制,Transformer有效解决了传统RNN模型在长序列处理上的局限性,广泛应用于机

Springfield3006的博客 1559

Transformer架构:输出部分代码实现(基于PyTorch)

本文介绍了Transformer架构中输出部分(Generator)的实现与作用。Generator通过线性层将解码器输出的高维特征映射到词表维度,再使用log_softmax归一化,生成每个位置的概率分布。其核心功能包括特征映射、概率归一化和生成决策支持。文章详细解析了Generator类的代码实现,展示了张量形状变化,并说明其与NLLLoss损失函数的配合方式。此外,还介绍了推理阶段的贪婪搜索预测逻辑,以及输出部分极简主义的设计思想。输出部分作为连接模型与任务目标的最后一环,对Transformer的整

Springfield3006的博客 1038

Transformer 代码详解(Pytorch版)

前言 基于上一篇经典网络架构学习-Transformer的学习,今天我们来使用pytorch 搭建自己的transformer模型,加深对transformer的理解,不仅在NLP领域绕不开transformer,而且在CV领域也是很火热,很多模型都用到了注意力机制。 Transformer完整代码 安装好pytorch开发环境,可以直接跑的。也可以直接用cpu跑我下面的transformer代码,数据集比较小,在2G内存就够了。 # ===============================

一璐有你的专栏 6万+
上一篇: 人工智能概念之九:深度学习概述
下一篇: 人工智能概念:常用的模型压缩技术(剪枝、量化、知识蒸馏)
.30-06Springfield
博客等级 码龄7年 321粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值