当前位置: 首页 > news >正文

transformer-实现单层encoder_layer

Encoder Layer

  • 论文地址

    https://arxiv.org/pdf/1706.03762

Encoder层介绍

  • Encoder层是Transformer编码器的核心组件,由多头自注意力和前馈神经网络两个子层构成。每个子层都包含残差连接(Residual Connection)和层归一化(Layer Normalization),有效缓解梯度消失问题并加速训练。

    image-20250428170531073

    今天这里实现的是上图中蓝色框中的单层EncoderLayer,不包含 embedding和位置编码

    主要处理流程:

    1. 多头自注意力机制:建立序列内部元素之间的依赖关系
    2. 前馈神经网络:进行非线性特征变换
    3. 残差连接 + 层归一化:在两个子层后各执行一次
    4. Dropout:最终输出前进行随机失活

数学表达

  • 子层处理流程公式化表示:
    LayerOutput = LayerNorm ( x + Sublayer ( x ) ) \text{LayerOutput} = \text{LayerNorm}(x + \text{Sublayer}(x)) LayerOutput=LayerNorm(x+Sublayer(x))

    对于Encoder层具体展开:
    z = LayerNorm ( x + MultiHeadAttention ( x ) ) o u t = LayerNorm ( z + FeedForward ( z ) ) \begin{aligned} z &= \text{LayerNorm}(x + \text{MultiHeadAttention}(x)) \\ out &= \text{LayerNorm}(z + \text{FeedForward}(z)) \end{aligned} zout=LayerNorm(x+MultiHeadAttention(x))=LayerNorm(z+FeedForward(z))


代码实现

  • 其他层的实现

    层名链接
    PositionEncodinghttps://blog.csdn.net/hbkybkzw/article/details/147431820
    calculate_attentionhttps://blog.csdn.net/hbkybkzw/article/details/147462845
    MultiHeadAttentionhttps://blog.csdn.net/hbkybkzw/article/details/147490387
    FeedForwardhttps://blog.csdn.net/hbkybkzw/article/details/147515883
    LayerNormhttps://blog.csdn.net/hbkybkzw/article/details/147516529

    下面统一在before.py中导入

  • 实现单层的encoder层

    import torch 
    from torch import nnfrom before import PositionEncoding,calculate_attention,MultiHeadAttention,FeedForward,LayerNormclass EncoderLayer(nn.Module):"""Transformer编码器层"""def __init__(self, n_heads, d_model, d_ff, dropout_prob=0.1):super(EncoderLayer, self).__init__()self.self_multi_head_att = MultiHeadAttention(n_heads, d_model, dropout_prob)self.ffn = FeedForward(d_model, d_ff, dropout_prob)self.norm1 = LayerNorm(d_model)self.norm2 = LayerNorm(d_model)self.dropout = nn.Dropout(dropout_prob)def forward(self, x, mask=None):# 自注意力子层_x = x  # 原始输入保存用于残差连接att_out = self.self_multi_head_att(x, x, x, mask)att_out += _x  # 残差连接att_out = self.norm1(att_out)  # 层归一化# 前馈子层_x = att_outffn_out = self.ffn(att_out) ffn_out += _x  # 残差连接ffn_out = self.norm2(ffn_out)  # 层归一化return self.dropout(ffn_out)  # 最终输出
    
  • 维度变化

    处理阶段张量形状示例
    输入数据[batch_size, seq_len, d_model]
    自注意力输出(不改变维度)[batch_size, seq_len, d_model]
    残差连接+层归一化[batch_size, seq_len, d_model]
    前馈网络输出(不改变维度)[batch_size, seq_len, d_model]
    最终输出[batch_size, seq_len, d_model]

使用示例

  • 测试用例

    if __name__ == "__main__":# 模拟输入:batch_size=4, 序列长度100, 维度512x = torch.randn(4, 100, 512)# 实例化编码器层:8头注意力,512维,前馈层2048维,10% dropoutencoder_layer = EncoderLayer(n_heads=8, d_model=512, d_ff=2048, dropout_prob=0.1)# 前向传播out = encoder_layer(x, mask=None)print("Input shape:", x.shape)    # torch.Size([4, 100, 512])print("Output shape:", out.shape) # torch.Size([4, 100, 512])
    

http://www.xdnf.cn/news/192007.html

相关文章:

  • JavaScript性能优化实战(6):网络请求与资源加载优化
  • 优化MySQL性能:主从复制与读写分离实践指南
  • 设计模式(行为型)解释器模式
  • 用Python做有趣的AI项目5:AI 画画机器人(图像风格迁移)
  • 蓝牙耳机开发--TWS蓝牙耳机双向通信充电盒设计
  • 0805登录_注册_token_用户信息_退出-网络ajax请求2-react-仿低代码平台项目
  • DeepSeek+Dify之三工作流引用知识库案例
  • 第十四章-PHP与HTTP协议
  • Async/Await 必须使用 try/catch 吗?
  • 大模型如何应对内容安全:原理、挑战与技术路径探讨
  • Webug4.0通关笔记02- 第2关布尔注入与第3关延时注入
  • ubantu18.04(Hadoop3.1.3)之Flink安装与编程实践(Flink1.9.1)
  • PostgreSQL与MySQL哪个适合做时空数据分析?
  • 安达发|高效智能塑料切割数控系统 - 全自动化软件解决方案
  • 信创时代技术栈选择与前景分析:国产替代背景下的战略路径与实践指南
  • 穷鬼计划:react+tailwindcss+vercel
  • Git-基本操作
  • 【MCP Node.js SDK 全栈进阶指南】高级篇(1):MCP多服务器协作架构
  • 15、项目搭建:绘制城堡蓝图——React 19 工程配置
  • Linux网络编程:TCP多进程/多线程并发服务器详解
  • OceanBase数据库-学习笔记4-租户
  • 100%提升信号完整性:阻抗匹配在高速SerDes中的实践与影响
  • 7、langChain和RAG实战:基于LangChain和RAG的常用案例实战
  • 已有 npm 项目,如何下载依赖、编译并运行项目
  • 【Kubernetes】部署 Kubernetes 仪表板(Dashboard)
  • C++ STL编程 vector的插入、删除、扩容机制、随机访问和内存交换
  • 安卓基础(HashMap和ArrayList)
  • 测试—概念篇
  • 回归问题常用模型以及优缺点和使用场景
  • Uniapp:vite.config.js全局配置