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

Transformer 代码剖析7 - 词元嵌入(TokenEmbedding) (pytorch实现)

一、类定义与继承关系剖析

1.1 代码结构图示

神经网络基础模块
词嵌入基类
自定义词元嵌入
构造函数定义
基类初始化
词汇量参数
维度参数
填充标识参数

1.2 代码实现精讲

"""
@author : Hyunwoong
@when : 2019-10-22
@homepage : https://github.com/gusdnd852
"""
from torch import nnclass TokenEmbedding(nn.Embedding):"""基于PyTorch实现的动态词元嵌入模块实现词元索引到高维向量的可学习映射核心功能:将离散的词元序列转换为连续的语义空间表示"""def __init__(self, vocab_size, d_model):"""词元嵌入构造器:param vocab_size: 词表容量(不同词元的总数):param d_model: 嵌入维度(与Transformer模型维度一致)设计要点:- 继承nn.Embedding的矩阵运算特性- 固化填充索引为可训练参数- 保持维度与模型其他组件兼容"""super(TokenEmbedding, self).__init__(vocab_size, # 嵌入数量 num_embeddings # 嵌入矩阵行数 = 词表大小d_model, # 嵌入维度 embedding_dim # 嵌入矩阵列数 = 模型维度padding_idx=1 # 填充符索引的特殊处理)

二、核心参数深度解读

2.1 参数矩阵可视化

假设词表容量vocab_size=10000,模型维度d_model=512时:

参数维度元素数量数学意义
weight[10000,512]5,120,000可训练的嵌入查询矩阵
padding_idxscalar1动态掩码位置标识

2.2 关键参数说明

1. vocab_size

  • 控制嵌入矩阵的行维度
  • 决定模型可处理的词元种类上限
  • 典型值域:BERT系列(~30000),GPT系列(~50000)

2. d_model

  • 控制嵌入向量的列维度
  • 与Transformer隐藏层维度严格对齐
  • 典型值域:512(原始论文)、768(BERT-base)、1024(大型模型)

3. padding_idx

  • 实现动态序列掩码的关键参数
  • 索引位置对应的梯度会被自动抑制
  • 防止填充符影响模型语义理解

三、运算过程分步推演

3.1 前向传播示例

输入序列:[3, 28, 1, 0] (1为填充符)

运算步骤:

1. 建立索引映射:

[[3],[[0.2, -0.5, ..., 1.2],  # 索引3的嵌入[28],[0.7, 1.1, ..., -0.3],   # 索引28的嵌入[1],[0.0, 0.0, ..., 0.0],    # 填充符固定值[0]][-0.9, 0.4, ..., 0.1]]   # 索引0的嵌入

2. 矩阵缩放(后续处理):

embeddings * sqrt(d_model)  # 维度对齐的数学技巧

3.2 梯度传播特性

  • 可微分性: 整个映射过程保持梯度通路
  • 参数更新: 通过反向传播调整嵌入矩阵
  • 特殊处理: padding_idx位置梯度始终为0

四、设计哲学解析

4.1 继承关系价值

TokenEmbedding
torch.nn.Embedding
torch.nn.Module
PyTorch基础设施

优势分析:

  • 复用性:继承矩阵运算和参数管理功能
  • 扩展性:保留自定义前向传播的可能性
  • 兼容性:无缝对接PyTorch生态工具

4.2 工程实践建议

1. 初始化技巧:

  • 默认采用均匀分布 U ( − 1 d m o d e l , 1 d m o d e l ) U(-\sqrt{\frac{1}{d_{model}}}, \sqrt{\frac{1}{d_{model}}}) U(dmodel1 ,dmodel1 )
  • 可扩展为Xavier/Kaiming初始化:
    # Xavier均匀初始化(默认)
    nn.init.xavier_uniform_(self.weight)# 特殊处理填充符
    self.weight.data[1].zero_()
    

2. 维度对齐策略:

# 与位置编码相加前的缩放
embeddings = embeddings * math.sqrt(d_model)

3. 混合精度训练:

# 自动转换为半精度
with autocast():embeddings = embedding_layer(input_ids)

4. 填充符处理机制:

  • 训练阶段自动跳过无效位置的计算
  • 推理阶段维持序列形状一致性

5. 计算复杂度分析:

  • 时间复杂度: O ( B ⋅ S ⋅ D ) O(B \cdot S \cdot D) O(BSD)
  • 空间复杂度: O ( V ⋅ D ) O(V \cdot D) O(VD)

完整实现细节可参考PyTorch中sparse.py 模块解析的相关文章(嵌入(Embedding)基类代码解析)或PyTorch官方Embedding文档。

相关文章:

Transformer 代码剖析7 - 词元嵌入(TokenEmbedding) (pytorch实现)

一、类定义与继承关系剖析 1.1 代码结构图示 #mermaid-svg-9COHbtmHJhpiroHM {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-9COHbtmHJhpiroHM .error-icon{fill:#552222;}#mermaid-svg-9COHbtmHJhpiroHM .error-t…...

Unity中动态切换光照贴图的方法

关键代码:LightmapSettings.lightmaps lightmapDatas; LightmapData中操作三张图:lightmapColor,lightmapDir,以及一张ShadowMap 这里只操作前两张: using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.UI;public cl…...

【JavaScript】《JavaScript高级程序设计 (第4版) 》笔记-Chapter27-工作者线程

二十七、工作者线程 工作者线程 前端开发者常说:“JavaScript 是单线程的。”这种说法虽然有些简单,但描述了 JavaScript 在浏览器中的一般行为。因此,作为帮助 Web 开发人员理解 JavaScript 的教学工具,它非常有用。单线程就意味…...

Qt基于等待条件QWaitCondition实现的任务队列模型示例

核心概念 Qt中的QWaitCondition是一个用于多线程同步的类,允许线程在某些条件满足时唤醒其他等待的线程。它通常与QMutex配合使用,协调线程之间的执行顺序,适用于生产者-消费者模型、任务队列调度等场景。 ​wait():使当前线程进…...

本地大模型编程实战(26)用langgraph实现基于SQL数据构建的问答系统(5)

本文将将扩展上一篇文章完成的 langgraph 链,继续使用基于 langgraph 链 ,对结构化数据库 SQlite 进行查询的方法。该系统建立以后,我们不需要掌握专业的 SQL 技能,可以用自然语言询问有关数据库中数据的问题并返回答案。主要完善…...

【RAG生成】生成模块核心技术解密:从理论到实践的全链路优化

RAG知识系列文章 【RAG实践】手把手Python实现搭建本地知识问答系统【RAG进阶】从基础到模块化:深度解析RAG技术演进如何重塑AI知识边界【RAG检索】RAG技术揭秘:检索≠召回?【RAG增强】解密RAG系统排序优化:从基础原理到生产实践…...

近似最近邻(ANN)算法库实战

引言:从“精确”到“近似”的思维跃迁 在电商推荐系统中,每秒需要为上百万用户找到最相关的商品——传统KNN的暴力搜索甚至无法完成一次查询,而近似最近邻(ANN)算法库如Faiss(Facebook)和Annoy…...

Linux与UDP应用2:简易聊天室

UDP应用2:简易聊天室 本篇介绍 在前面的基本使用过程中已经完成了本地和网络通信,既然一个人和一台服务器可以进行通信,那么多个人连接一台服务器也可以和这台服务器实现通信。在这个基础上,如果服务器可以将某个人发给服务器的…...

张雪峰教育观点及争议分析

李升伟 整理 张雪峰(网络常用名,本名张子彪)是中国知名的考研辅导教师、教育领域自媒体人,因其幽默犀利的语言风格和直击痛点的教育观点走红网络。以下是对他的基本介绍及综合评价: --- ### **一、基本情况** 1. **个…...

从0开始的IMX6ULL学习篇——裸机篇之分析粗略IMX6ULL与架构

目录 简单的说一下Cortex-A7架构 讨论ARMv7a-cortex系列的运行模式 寄存器 后言 让我们到NXP的官网上扫一眼。 i.MX 6ULL应用处理器_Arm Cortex-A7单核,频率为900 MHz | NXP 半导体 我们先看CPU Platform,这个是我们的核心。 这里我们的芯片是基于Ar…...

面向实时性的超轻量级动态感知视觉SLAM系统

一、重构后的技术架构设计(基于ROS1 ORB-SLAM2增强) #mermaid-svg-JEJte8kZd7qlnq3E {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JEJte8kZd7qlnq3E .error-icon{fill:#552222;}#mermaid-svg-JEJte8kZd7qlnq3E .…...

Hue UI展示中文

个人博客地址:Hue UI展示中文 | 一张假钞的真实世界 如果使用开发分支代码如master分支)编译安装,需要自己编译语言文件。例如Hue安装目录为“/opt/hue”,则安装后执行以下命令: $ cd /opt/hue $ make locales 如果…...

C#贪心算法

贪心算法:生活与代码中的 “最优选择大师” 在生活里,我们常常面临各种选择,都希望能做出最有利的决策。比如在超市大促销时,面对琳琅满目的商品,你总想用有限的预算买到价值最高的东西。贪心算法,就像是一…...

【新人系列】Python 入门专栏合集

✍ 个人博客:https://blog.csdn.net/Newin2020?typeblog 📝 专栏地址:https://blog.csdn.net/newin2020/category_12801353.html 📣 专栏定位:为 0 基础刚入门 Python 的小伙伴提供详细的讲解,也欢迎大佬们…...

SQL命令详解之数据的查询操作

目录 1 简介 2 基础查询 2.1 基础查询语法 2.2 基础查询练习 3 条件查询 3.1 条件查询语法 3.2 条件查询练习 4 排序查询 4.1 排序查询语法 4.2 排序查询练习 5 聚合函数 5.1 一般语法: 5.2 聚合函数练习 6 分组查询 6.1 分组查询语法 6.2 分组查询…...

序列化选型:字节流抑或字符串

序列化既可以将对象转换为字节流,也可以转换为字符串,具体取决于使用的序列化方式和场景。 转换为字节流 常见工具及原理:在许多编程语言中,都有将对象序列化为字节流的机制。例如 Python 中的 pickle 模块、Java 中的对象序列化…...

使用C#控制台调用本地部署的DeepSeek

1、背景 春节期间大火的deepseek,在医疗圈也是火的不要不要的。北京这边的医院也都在搞“deepseek竞赛”。友谊、北医三院等都已经上了,真是迅速啊! C#也是可以进行对接,并且非常简单。 2、具体实现 1、使用Ollama部署DeepSeek…...

Linux环境安装Nginx及版本升级指南

Linux环境安装Nginx及版本升级指南 一、安装Nginx 1. 安装前准备 # 更新系统软件包(Ubuntu/Debian) sudo apt update && sudo apt upgrade -y# CentOS/RHEL sudo yum update -y2. 安装依赖库 # Ubuntu/Debian sudo apt install -y curl wget…...

选开源CMS建站系统时,插件越多越好吗?

在选择开源CMS建站系统时,插件数量并不是唯一的衡量标准,更不能简单地说“插件越多就越好”,还是需要综合评估来考虑选择结果,以下是有关选择开源CMS系统时对插件数量的考量。 插件数量的优势插件数量可能带来的问题功能丰富性&a…...

Windows对比MacOS

Windows对比MacOS 文章目录 Windows对比MacOS1-环境变量1-Windows添加环境变量示例步骤 1:打开环境变量设置窗口步骤 2:添加系统环境变量 2-Mac 系统添加环境变量示例步骤 1:打开终端步骤 2:编辑环境变量配置文件步骤 3&#xff1…...

使用 Python 实现基于 AGA8 GERG - 2008 方程计算掺氢天然气压缩因子的示例代码

AGA8 GERG - 2008 方程是用于计算天然气混合物热力学性质的一种方法,下面是一个使用 Python 实现基于 AGA8 GERG - 2008 方程计算掺氢天然气压缩因子的示例代码。需要注意的是,AGA8 GERG - 2008 方程非常复杂,完整实现需要大量的系数和详细的…...

开源绝版经典小游戏合集

随着生活节奏的日益加快,我们常常需要一些小游戏来缓解疲惫的身心。过去,Windows 7自带的扫雷、蜘蛛纸牌等小游戏深受大家喜爱,但随着系统的更新换代,这些经典游戏逐渐淡出了人们的视野。我也曾花费不少时间寻找这些游戏&#xff…...

给虚拟机配置IP

虚拟机IP这里一共有三个地方要设置,具体说明如下: (1)配置vm虚拟机网段 如果不进行设置,每次启动机器时都可能是随机的IP,不方便我们后续操作。具体操作是:点击编辑→虚拟网络编辑器 选择VMne…...

YOLOv12以注意力机制为核心的架构:主要特点、创新点、使用方法

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

GD32F450 使用

GB32F450使用 1. 相关知识2. 烧写程序3. SPI3.1 spi基础3.2 spi代码 4. 串口4.1 串口引脚4.2 串口通信代码 问题记录1. 修改晶振频率 注意:GD32F450 总共有三种封装形式,本文所述的相关代码和知识,均为 GD32F450IX 系列。 1. 相关知识 参数配…...

Linux 动静态库和_make_进度条(一)

文章目录 一、如何理解条件编译二、动静态库1. 理论2. 实践3. 解决普通用户的sudo问题4. 技术上理解库 三、make和make_file 一、如何理解条件编译 1. gcc code.c -o code -DM 命令行级别的宏定义预处理的本质就是修改编辑我们的文本代码 头文件展开到源文件中去注释宏替换条…...

Android 图片压缩详解

在 Android 开发中,图片压缩是一个重要的优化手段,旨在提升用户体验、减少网络传输量以及降低存储空间占用。以下是几种主流的图片压缩方法,结合原理、使用场景和优缺点进行详细解析。 效果演示 直接先给大家对比几种图片压缩的效果 质量压缩 质量压缩:根据传递进去的质…...

C# 牵手DeepSeek:打造本地AI超能力

一、引言 在人工智能飞速发展的当下,大语言模型如 DeepSeek 正掀起新一轮的技术变革浪潮,为自然语言处理领域带来了诸多创新应用。随着数据隐私和安全意识的提升,以及对模型部署灵活性的追求,本地部署 DeepSeek 成为众多开发者和…...

普通人高效使用DeepSeek指南?

李升伟 整理 DeepSeek(深度求索)作为一款智能搜索引擎或AI工具,普通人可以通过以下方式高效利用它,提升学习、工作和生活效率: --- ### **一、基础功能:精准搜索** 1. **明确需求提问** 用自然语言…...

卢卡斯定理判断组合数奇偶(Codeforces Round 1006 (Div. 3)——F)

文章目录 组合数奇偶判断题意思路综上 组合数奇偶判断 【用杨辉三角阐释Lucas定理】https://www.bilibili.com/video/BV14F411P7ES?vd_source67186f29c3efb728bcff34035cf5aba2 这个视频可以简单的领会一下精神,卢卡斯定理也就是用于组合数取模。 奇偶性通过对2…...