仅仅使用pytorch来手撕transformer架构(3):编码器模块和编码器类的实现和向前传播

仅仅使用pytorch来手撕transformer架构(2):编码器模块和编码器类的实现和向前传播

往期文章:
仅仅使用pytorch来手撕transformer架构(1):位置编码的类的实现和向前传播

最适合小白入门的Transformer介绍

仅仅使用pytorch来手撕transformer架构(2):多头注意力MultiHeadAttention类的实现和向前传播

# Transformer 编码器模块
class TransformerBlock(nn.Module):def __init__(self, embed_size, heads, dropout, forward_expansion):super(TransformerBlock, self).__init__()self.attention = MultiHeadAttention(embed_size, heads)self.norm1 = nn.LayerNorm(embed_size)self.norm2 = nn.LayerNorm(embed_size)self.feed_forward = nn.Sequential(nn.Linear(embed_size, forward_expansion * embed_size),nn.ReLU(),nn.Linear(forward_expansion * embed_size, embed_size),)self.dropout = nn.Dropout(dropout)def forward(self, value, key, query, mask):attention = self.attention(value, key, query, mask)x = self.dropout(self.norm1(attention + query))forward = self.feed_forward(x)out = self.dropout(self.norm2(forward + x))return out# 编码器
class Encoder(nn.Module):def __init__(self, src_vocab_size, embed_size, num_layers, heads, device, forward_expansion, dropout, max_length):super(Encoder, self).__init__()self.embed_size = embed_sizeself.device = deviceself.word_embedding = nn.Embedding(src_vocab_size, embed_size)self.position_embedding = PositionalEncoding(embed_size, dropout, max_length)self.layers = nn.ModuleList([TransformerBlock(embed_size,heads,dropout=dropout,forward_expansion=forward_expansion,)for _ in range(num_layers)])self.dropout = nn.Dropout(dropout)def forward(self, x, mask):N, seq_length = x.shapex = self.dropout(self.position_embedding(self.word_embedding(x)))for layer in self.layers:x = layer(x, x, x, mask)return x

1.编码器模块的实现

这段代码实现了一个Transformer编码器模块(Transformer Block),它是Transformer架构的核心组件之一。Transformer架构是一种基于自注意力机制(Self-Attention)的深度学习模型,广泛应用于自然语言处理(NLP)任务,如机器翻译、文本生成等。以下是对代码的详细解释:


1.1 类定义

class TransformerBlock(nn.Module):

TransformerBlock 是一个继承自 PyTorch 的 nn.Module 的类,表示一个Transformer编码器模块。nn.Module 是 PyTorch 中所有神经网络模块的基类,用于定义和管理神经网络的结构。


2.2 初始化方法

def __init__(self, embed_size, heads, dropout, forward_expansion):super(TransformerBlock, self).__init__()self.attention = MultiHeadAttention(embed_size, heads)self.norm1 = nn.LayerNorm(embed_size)self.norm2 = nn.LayerNorm(embed_size)self.feed_forward = nn.Sequential(nn.Linear(embed_size, forward_expansion * embed_size),nn.ReLU(),nn.Linear(forward_expansion * embed_size, embed_size),)self.dropout = nn.Dropout(dropout)
参数解释
  • embed_size: 嵌入向量的维度,表示每个词或标记(token)的特征维度。
  • heads: 多头注意力机制中的头数(Multi-Head Attention)。
  • dropout: Dropout比率,用于防止过拟合。
  • forward_expansion: 前馈网络(Feed-Forward Network, FFN)中隐藏层的扩展因子。
组件解释
  1. 多头注意力机制(MultiHeadAttention

    self.attention = MultiHeadAttention(embed_size, heads)
    

    这是Transformer的核心部分,实现了多头注意力机制。它允许模型在不同的表示子空间中学习信息。MultiHeadAttention 的具体实现没有在这段代码中给出,但通常它会将输入分为多个“头”,分别计算注意力权重,然后将结果拼接起来。

  2. 层归一化(LayerNorm

    self.norm1 = nn.LayerNorm(embed_size)
    self.norm2 = nn.LayerNorm(embed_size)
    

    层归一化(Layer Normalization)是一种归一化方法,用于稳定训练过程并加速收敛。它对每个样本的特征进行归一化,而不是像批量归一化(Batch Normalization)那样对整个批次进行归一化。

  3. 前馈网络(Feed-Forward Network

    self.feed_forward = nn.Sequential(nn.Linear(embed_size, forward_expansion * embed_size),nn.ReLU(),nn.Linear(forward_expansion * embed_size, embed_size),
    )
    

    前馈网络是一个简单的两层全连接网络。它的作用是进一步处理多头注意力机制的输出。forward_expansion 参数控制隐藏层的大小,通常设置为一个较大的值(如4),表示隐藏层的维度是输入维度的4倍。

  4. Dropout

    self.dropout = nn.Dropout(dropout)
    

    Dropout 是一种正则化技术,通过随机丢弃一部分神经元的输出来防止过拟合。dropout 参数表示丢弃的概率。


3. 前向传播方法

def forward(self, value, key, query, mask):attention = self.attention(value, key, query, mask)x = self.dropout(self.norm1(attention + query))forward = self.feed_forward(x)out = self.dropout(self.norm2(forward + x))return out
参数解释
  • value: 值向量,用于计算注意力权重后的加权求和。
  • key: 键向量,用于计算注意力权重。
  • query: 查询向量,用于计算注意力权重。
  • mask: 掩码,用于防止某些位置的信息泄露(如在自注意力中屏蔽未来信息)。
流程解释
  1. 多头注意力

    attention = self.attention(value, key, query, mask)
    

    首先,使用多头注意力机制计算注意力输出。valuekeyquery 是输入的三个部分,mask 用于控制哪些位置的信息可以被关注。

  2. 残差连接与层归一化

    x = self.dropout(self.norm1(attention + query))
    

    将注意力输出与输入的 query 进行残差连接(attention + query),然后通过层归一化(LayerNorm)。最后,应用 Dropout 防止过拟合。

  3. 前馈网络

    forward = self.feed_forward(x)
    

    将经过归一化的输出传递到前馈网络中进行进一步处理。

  4. 第二次残差连接与层归一化

    out = self.dropout(self.norm2(forward + x))
    

    将前馈网络的输出与之前的输出 x 进行残差连接,再次通过层归一化和 Dropout。

  5. 返回结果

    return out
    

    最终返回处理后的输出。


4. 总结

Transformer编码器模块,其核心包括:

  • 多头注意力机制(MultiHeadAttention)。
  • 残差连接(Residual Connection)。
  • 层归一化(LayerNorm)。
  • 前馈网络(Feed-Forward Network)。
  • Dropout 正则化。

这些组件共同作用,使得Transformer能够高效地处理序列数据,并在许多NLP任务中取得了优异的性能。

2.编码器的实现

这段代码定义了一个完整的 Transformer 编码器(Encoder),它是 Transformer 架构中的一个重要组成部分。编码器的作用是将输入序列(如源语言文本)转换为上下文表示,这些表示可以被解码器(Decoder)用于生成目标序列(如目标语言文本)。以下是对代码的详细解释:


1. 类定义

class Encoder(nn.Module):

Encoder 是一个继承自 PyTorch 的 nn.Module 的类,用于定义 Transformer 编码器的结构。nn.Module 是 PyTorch 中所有神经网络模块的基类,用于定义和管理神经网络的结构。


2. 初始化方法

def __init__(self, src_vocab_size, embed_size, num_layers, heads, device, forward_expansion, dropout, max_length):super(Encoder, self).__init__()self.embed_size = embed_sizeself.device = deviceself.word_embedding = nn.Embedding(src_vocab_size, embed_size)self.position_embedding = PositionalEncoding(embed_size, dropout, max_length)self.layers = nn.ModuleList([TransformerBlock(embed_size,heads,dropout=dropout,forward_expansion=forward_expansion,)for _ in range(num_layers)])self.dropout = nn.Dropout(dropout)
参数解释
  • src_vocab_size: 源语言词汇表的大小,即输入序列中可能的标记(token)数量。
  • embed_size: 嵌入向量的维度,表示每个词或标记的特征维度。
  • num_layers: 编码器中 Transformer 块(TransformerBlock)的数量。
  • heads: 多头注意力机制中的头数。
  • device: 运行设备(如 CPU 或 GPU)。
  • forward_expansion: 前馈网络(FFN)中隐藏层的扩展因子。
  • dropout: Dropout 比率,用于防止过拟合。
  • max_length: 输入序列的最大长度,用于位置编码。
组件解释
  1. 词嵌入(word_embedding

    self.word_embedding = nn.Embedding(src_vocab_size, embed_size)
    

    词嵌入层将输入的标记(token)索引映射为固定维度的嵌入向量。src_vocab_size 是词汇表的大小,embed_size 是嵌入向量的维度。

  2. 位置编码(position_embedding

    self.position_embedding = PositionalEncoding(embed_size, dropout, max_length)
    

    位置编码层用于为每个标记添加位置信息,使得模型能够捕捉序列中的顺序关系。PositionalEncoding 的具体实现没有在这段代码中给出,但通常它会根据标记的位置生成一个固定维度的向量,并将其与词嵌入相加。

  3. Transformer 块(TransformerBlock

    self.layers = nn.ModuleList([TransformerBlock(embed_size,heads,dropout=dropout,forward_expansion=forward_expansion,)for _ in range(num_layers)]
    )
    

    编码器由多个 Transformer 块组成。每个 Transformer 块包含多头注意力机制和前馈网络。num_layers 表示 Transformer 块的数量。

  4. Dropout

    self.dropout = nn.Dropout(dropout)
    

    Dropout 是一种正则化技术,通过随机丢弃一部分神经元的输出来防止过拟合。dropout 参数表示丢弃的概率。


3. 前向传播方法

def forward(self, x, mask):N, seq_length = x.shapex = self.dropout(self.position_embedding(self.word_embedding(x)))for layer in self.layers:x = layer(x, x, x, mask)return x
参数解释
  • x: 输入序列,形状为 (N, seq_length),其中 N 是批次大小,seq_length 是序列长度。
  • mask: 掩码,用于防止某些位置的信息泄露(如在自注意力中屏蔽未来信息)。
流程解释
  1. 词嵌入与位置编码

    x = self.dropout(self.position_embedding(self.word_embedding(x)))
    
    • 首先,将输入序列 x 通过词嵌入层(word_embedding)得到嵌入向量。
    • 然后,将嵌入向量与位置编码(position_embedding)相加,为每个标记添加位置信息。
    • 最后,应用 Dropout 防止过拟合。
  2. 逐层传递

    for layer in self.layers:x = layer(x, x, x, mask)
    
    • 输入序列 x 逐层传递到每个 Transformer 块中。在每个块中:
      • valuekeyquery 都是 x,因为这是自注意力机制(Self-Attention)。
      • mask 用于控制哪些位置的信息可以被关注。
    • 每个 Transformer 块的输出会作为下一层的输入。
  3. 返回结果

    return x
    
    • 最终返回编码器的输出,形状为 (N, seq_length, embed_size),表示每个位置的上下文表示。

4. 总结

Transformer 编码器,其主要功能包括:

  1. 词嵌入与位置编码:将输入标记转换为嵌入向量,并添加位置信息。
  2. 多层 Transformer 块:通过多头注意力机制和前馈网络逐层处理输入序列。
  3. 掩码机制:通过掩码控制注意力的范围,避免信息泄露。
  4. Dropout 正则化:防止过拟合。

编码器的输出是一个上下文表示,可以被解码器用于生成目标序列。这种架构在机器翻译、文本生成等任务中表现出色。

作者码字不易,觉得有用的话不妨点个赞吧,关注我,持续为您更新AI的优质内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/73068.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《OpenCV》—— dlib(换脸操作)

文章目录 dlib换脸介绍仿射变换在 dlib 换脸中的应用 换脸操作 dlib换脸介绍 dlib 换脸是基于 dlib 库实现的一种人脸替换技术,以下是关于它的详细介绍: 原理 人脸检测:dlib 库中包含先进的人脸检测器,如基于 HOG(方向…

机器学习中的梯度下降是什么意思?

梯度下降(Gradient Descent)是机器学习中一种常用的优化算法,用于最小化损失函数(Loss Function)。通过迭代调整模型参数,梯度下降帮助模型逐步逼近最优解,从而提升模型的性能。 1.核心思想 梯…

三、Docker 集群管理与应用

(一)项目案例 1、准备主机 (1)关闭防火墙,或者开放TCP端口2377(用于集群管理通信)、TCP/UPD端口7946(用于节点之间的通信)、UDP端口4789(用于overlay网络流…

网络DNS怎么更改?

访问速度慢或某些网站无法打开?改变网络DNS设置可能会帮助解决这些问题。本文将详细介绍如何更改网络DNS,包括更改的原因、具体步骤。 一、为什么要更改DNS? 更改DNS的原因有很多,以下是一些主要的考虑因素:某些公共DNS服务器的响应速度比…

江科大51单片机笔记【12】DS18B20温度传感器(上)

写在前言 此为博主自学江科大51单片机(B站)的笔记,方便后续重温知识 在后面的章节中,为了防止篇幅过长和易于查找,我把一个小节分成两部分来发,上章节主要是关于本节课的硬件介绍、电路图、原理图等理论…

基于springboot+vue的佳途旅行分享预约平台

一、系统架构 前端:vue2 | element-ui | html 后端:springboot | mybatis-plus 环境:jdk1.8 | mysql | maven | node 二、代码及数据库 三、功能介绍 01. web端-注册 02. web端-登录 03. web端-系统主页1 04. web端-系统主页2 05. we…

【数据结构】2算法及分析

0 章节 1.4到1.5小节。 掌握算法概念、特性、描述、算法性能时间复杂度和空间复杂度; 理解递归含义? 掌握实现递归的条件和时机; 应用简单递归问题的算法设计; 重点 算法…

【一起学Rust | Tauri2.0框架】基于 Rust 与 Tauri 2.0 框架实现软件开机自启

文章目录 前言 一、准备工作1.1 环境搭建1.2 创建 Tauri 项目1.3 添加依赖 二、实现开机自启的基本原理2.1 开机自启的基本概念2.2 Tauri 应用的生命周期 三、Windows 平台实现3.1 Windows 注册表机制3.2 实现步骤3.3 注意事项 四、Linux 平台实现4.1 Linux systemd 服务4.2 实…

一周热点-OpenAI 推出了 GPT-4.5,这可能是其最后一个非推理模型

在人工智能领域,大型语言模型一直是研究的热点。OpenAI 的 GPT 系列模型在自然语言处理方面取得了显著成就。GPT-4.5 是 OpenAI 在这一领域的又一力作,它在多个方面进行了升级和优化。 1 新模型的出现 GPT-4.5 目前作为研究预览版发布。与 OpenAI 最近的 o1 和 o3 模型不同,…

css中的浮动

在 CSS 中,浮动(float)是一种定位元素的方式,它允许元素脱离正常的文档流,并向左或向右移动,直到其边缘碰到包含块或者另一个浮动元素的边缘。下面从多个方面详细介绍 CSS 浮动: 一&#xff0c…

element-plus中form表单组件的使用

1.如何让每个表单项对齐? 问题描述:如下图,每个表单项的输入框/下拉框/日期选择器是没有对齐的,我们希望它们纵向是对齐的。 解决方案:给el-form标签,加上label-width"100px"即可。意思就是给每个…

线性搜索算法

何时使用线性搜索算法? 当处理一个小数据集时。当搜索存储在连续内存中的数据集时。 线性搜索算法在什么情况下优于其他搜索算法? 当列表或数组未排序时,或者当输入的大小相对较小时,首选线性搜索算法。它易于实现,并…

踩坑记录:yolov5环境版本要求比较严苛?

在安装yolov5环境时,numpy安装失败报错metadata-generation-failed 报错如下: Collecting numpy1.18.5 (from -r /*****/yolov5-5.0/requirements.txt (line 5))Using cached https://pypi.tuna.tsinghua.edu.cn/packages/01/1b/d3ddcabd5817be02df0e6…

Java设计模式系列:单例模式的7种实现与适用场景

一、单例模式核心价值与实现原则 1. 使用场景 全局配置类(如数据库连接池)日志记录器Spring默认Bean作用域硬件设备访问(如打印机)2. 设计三原则 私有构造器:禁止外部实例化静态实例持有:全局唯一访问点延迟加载(可选):避免资源浪费二、七种单例实现方式深度解析 1.…

OpenManus-通过源码方式本地运行OpenManus,含踩坑及处理方案,chrome.exe位置修改

前言:最近 Manus 火得一塌糊涂啊,OpenManus 也一夜之间爆火,那么作为程序员应该来尝尝鲜 1、前期准备 FastGithub:如果有科学上网且能正常访问 github 则不需要下载此软件,此软件是提供国内直接访问 githubGit&#…

【最新】DeepSeek 实用集成工具有那些?

deepseek 系列github仓库地址 【主页】deepseek-aiDeepSeek-R1DeepSeek-V3DeepSeek-VL2【本文重点介绍】awesome-deepseek-integration 注意:以下内容来自awesome-deepseek-integration DeepSeek 实用集成(awesome-deepseek-integration) 将…

开源!速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器

开源!速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器 目录 开源!速度100Kb/s的有线和无线双模ESP32S3芯片的DAP-Link调试器本项目未经授权,禁止商用!本项目未经授权,禁止商用!本项目未经授权&…

Flink测试环境Standalone模式部署实践

1.JDK环境 参考官方文档: https://nightlies.apache.org/flink/flink-docs-release-1.20/release-notes/flink-1.18/ 2.下载Flink:https://flink.apache.org/downloads/ 本次验证用的是:https://www.apache.org/dyn/closer.lua/flink/flink…

在16卡服务器上使用最新版的CUDA和驱动训练`llama - 2 - 7b`和`llama - 2 - 70b`模型,并生成训练指标数据

要在16卡服务器上使用最新版的CUDA和驱动训练llama - 2 - 7b和llama - 2 - 70b模型,并生成训练指标数据,你可以按照以下步骤进行: 1. 环境准备 确保你的服务器已经安装了最新版的CUDA和驱动,并且安装了必要的Python库&#xff0…

macOS 终端优化

macOS 安装、优化、还原、升级 Oh My Zsh 完全指南 🚀 Oh My Zsh 是 macOS 终端增强的利器,它能提供强大的自动补全、主题定制和插件支持,让你的终端更高效、更炫酷。本文将全面介绍 如何安装、优化、还原、重新安装和升级 Oh My Zsh&#x…