【NLP 20、Encoding编码 和 Embedding嵌入】
目录
一、核心定义与区别
二、常见Encoding编码
(1) 独热编码(One-Hot Encoding)
(2) 位置编码(Positional Encoding)
(3) 标签编码(Label Encoding)
(4) 注意事项
三、常见Embedding词嵌入
(1) 基础词嵌入(nn.Embedding)
(2) 预训练嵌入(from_pretrained)
(3) 类别特征嵌入(自定义类)
(4) 注意事项
四、对比总结
五、编码与嵌入的联合使用
总结
新年快乐,这几天将之前做的笔记整理了一下,补充了一点,正式开始学习!
—— 24.2.4
一、核心定义与区别
| 特性 | Encoding(编码) | Embedding(嵌入) |
|---|---|---|
| 目标 | 将数据转换为特定格式(如数值、二进制、位置信息等),以满足模型输入要求。 | 将离散符号(如单词、类别)映射到低维连续向量空间,捕捉语义或结构关系。 |
| 数学形式 | 通常为确定性规则或固定函数(如独热编码、位置编码)。 | 通过可学习的参数矩阵(如神经网络中的嵌入层)生成。 |
| 维度 | 维度可能较高(如独热编码的维度等于类别数量)。 | 维度固定且较低(如词嵌入常用 100~1000 维)。 |
| 可训练性 | 不可训练(静态规则)。 | 可训练(通过反向传播优化)。 |
| 应用场景 | 数据预处理、位置信息编码、分类标签处理。 | 词向量表示、类别特征嵌入、图节点表示。 |
二、常见Encoding编码
(1) 独热编码(One-Hot Encoding)
-
定义:将离散类别映射为二进制向量,仅一个位置为1,其余为0。
-
注意:
独热编码 使用 torch.nn.functional.one_hot,注意设置num_classes参数。 -
示例:
# 类别:["猫", "狗", "鸟"]
"猫" → [1, 0, 0]
"狗" → [0, 1, 0]
"鸟" → [0, 0, 1]
-
缺点:维度爆炸(高维稀疏),无法表达类别间关系。
| 参数 | 类型 | 描述 | 是否必需 | 默认值 |
|---|---|---|---|---|
tensor | torch.Tensor | 输入的整数类别索引张量(如 [0, 2, 1]) | 是 | - |
num_classes | int | 类别总数(决定输出维度) | 是 | - |
(2) 位置编码(Positional Encoding)
-
定义:为序列数据(如文本、时间序列)添加位置信息,常用正弦/余弦函数生成。
-
注意:
位置编码 自定义生成矩阵后叠加到词嵌入上,需与输入张量形状匹配。 -
Transformer 中的公式:

| 参数 | 类型 | 描述 | 是否必需 | 默认值 |
|---|---|---|---|---|
max_seq_len | int | 最大序列长度(决定编码矩阵的行数) | 是 | - |
d_model | int | 特征维度(决定编码矩阵的列数) | 是 |
(3) 标签编码(Label Encoding)
-
定义:将类别映射为整数(如 "红"→0, "蓝"→1, "绿"→2),但可能引入错误的大小关系。
(4) 注意事项
-
独热编码的输入限制:
-
输入张量必须是整数类型(如
torch.long)。 -
索引值必须小于
num_classes,否则会越界。
-
-
位置编码的叠加方式:
-
需与词嵌入维度一致(
d_model),且直接相加前确保形状匹配。
-
| 独热编码 | num_classes | 控制输出维度,避免索引越界 |
| 位置编码 | max_seq_len, d_model | 定义编码矩阵的尺寸和特征维度 |
三、常见Embedding词嵌入
(1) 基础词嵌入(nn.Embedding)
nn.Embedding()模块
注意:
| 词嵌入 | 使用 nn.Embedding 层,输入为整数索引张量,输出为浮点数向量。 |
embedding_layer = nn.Embedding(num_embeddings=10000, embedding_dim=300)
| 参数 | 类型 | 描述 | 是否必需 | 默认值 |
|---|---|---|---|---|
num_embeddings | int | 词汇表大小(唯一符号数量) | 是 | - |
embedding_dim | int | 嵌入向量的维度 | 是 | - |
padding_idx | int | 填充符索引(对应向量初始化为零) | 否 | None |
max_norm | float | 向量最大范数(超过时缩放) | 否 | None |
scale_grad_by_freq | bool | 根据词频缩放梯度(罕见词更大更新) | 否 | False |
import torch.nn as nn# 定义嵌入层:词汇表大小=10000,嵌入维度=300
embedding_layer = nn.Embedding(num_embeddings=10000, embedding_dim=300)# 输入:单词索引(形状 [batch_size, seq_len])
input_ids = torch.LongTensor([[1, 22, 45], [3, 8, 2]]) # 示例输入# 获取词嵌入向量
embeddings = embedding_layer(input_ids) # 输出形状 [2, 3, 300]
(2) 预训练嵌入(from_pretrained)
nn.Embedding.from_pretrained()
注意:
| 预训练嵌入 | 通过 from_pretrained 加载,freeze=True 可固定嵌入参数(适用于迁移学习)。 |
pretrained_emb = nn.Embedding.from_pretrained(glove.vectors, freeze=True)
| 参数 | 类型 | 描述 | 是否必需 | 默认值 |
|---|---|---|---|---|
embeddings | torch.Tensor | 预训练嵌入矩阵(形状 [num_emb, dim]) | 是 | - |
freeze | bool | 是否冻结参数(不更新) | 否 | True |
padding_idx | int | 同基础 nn.Embedding | 否 | None |
max_norm | float | 同基础 nn.Embedding | 否 | None |
如GloVe:
from torchtext.vocab import GloVe# 加载预训练的 GloVe 词向量
glove = GloVe(name='6B', dim=100) # 使用 100 维的 GloVe# 获取单词 "apple" 的向量
apple_vector = glove['apple'] # 形状 [100]# 将预训练向量转换为嵌入层
pretrained_emb = nn.Embedding.from_pretrained(glove.vectors, freeze=False) # freeze=True 表示不更新
(3) 类别特征嵌入(自定义类)
CategoryEmbedding
user_embedding = CategoryEmbedding(num_categories=1000, embedding_dim=64)
| 参数 | 类型 | 描述 | 是否必需 | 默认值 |
|---|---|---|---|---|
num_categories | int | 类别总数(如用户数、商品数) | 是 | - |
embedding_dim | int | 嵌入向量的维度 | 是 | - |
注意:
| 类别嵌入 | 将高基数类别(如用户ID)映射为低维向量,避免维度爆炸。 |
import torch.nn as nnclass CategoryEmbedding(nn.Module):def __init__(self, num_categories, embedding_dim):super().__init__()self.embedding = nn.Embedding(num_categories, embedding_dim)def forward(self, category_ids):return self.embedding(category_ids)# 示例:用户ID嵌入(假设有 1000 个用户)
user_embedding = CategoryEmbedding(num_categories=1000, embedding_dim=64)
user_ids = torch.tensor([5, 12, 8]) # 输入用户ID
embedded_users = user_embedding(user_ids) # 形状 [3, 64]
(4) 注意事项
-
嵌入层的输入要求:
-
nn.Embedding的输入为整数索引,非浮点数。
-
-
预训练嵌入的兼容性:
-
加载预训练向量时,需确保
num_embeddings和embedding_dim与预训练矩阵一致。
-
| 基础词嵌入 | num_embeddings, embedding_dim | 决定嵌入层的输入输出维度 |
| 预训练嵌入 | embeddings, freeze | 加载外部知识,控制参数更新 |
| 类别嵌入 | num_categories, embedding_dim | 处理高基数离散特征,避免维度灾难 |
四、对比总结
| 维度 | Encoding | Embedding |
|---|---|---|
| 语义保留 | 无(仅符号化) | 高(捕捉语义相似性) |
| 计算开销 | 低(静态计算) | 高(需训练参数) |
| 灵活性 | 固定规则 | 可自适应任务优化 |
| 典型应用 | 数据预处理、位置编码 | 词向量、推荐系统、图表示学习 |
| 场景 | 推荐方法 |
|---|---|
| 类别特征且维度低 | 独热编码(简单高效) |
| 类别特征维度高(如用户ID) | 嵌入(避免维度灾难) |
| 序列位置信息 | 位置编码(如 Transformer) |
| 需要捕捉语义相似性 | 嵌入(如词向量) |
| 计算资源有限 | 优先选择静态编码(如哈希编码) |
五、编码与嵌入的联合使用
在 Transformer 中,词嵌入和位置编码共同构成输入表示:
| 参数 | 类型 | 描述 | 是否必需 | 默认值 |
|---|---|---|---|---|
vocab_size | int | 词汇表大小(词嵌入参数) | 是 | - |
d_model | int | 特征维度(词嵌入和位置编码共享) | 是 | - |
max_seq_len | int | 最大序列长度(位置编码参数) | 是 | - |
import torch
import torch.nn as nnclass TransformerInput(nn.Module):def __init__(self, vocab_size, d_model, max_seq_len):super().__init__()self.token_embedding = nn.Embedding(vocab_size, d_model)self.position_encoding = self._generate_position_encoding(max_seq_len, d_model)def _generate_position_encoding(self, max_len, d_model):position = torch.arange(max_len).unsqueeze(1)div_term = torch.exp(torch.arange(0, d_model, 2) * (-math.log(10000.0) / d_model))pe = torch.zeros(max_len, d_model)pe[:, 0::2] = torch.sin(position * div_term)pe[:, 1::2] = torch.cos(position * div_term)return pe # 形状: [max_len, d_model]def forward(self, x):# x: [batch_size, seq_len]token_emb = self.token_embedding(x) # [batch_size, seq_len, d_model]seq_len = x.size(1)positions = self.position_encoding[:seq_len, :] # [seq_len, d_model]return token_emb + positions # [batch_size, seq_len, d_model]
总结
-
Encoding 是广义的数据转换方式,强调格式兼容性(如独热编码、位置编码)。
-
Embedding 是特殊的编码方法,通过可学习的低维向量捕捉语义信息(如词嵌入)。
-
两者常结合使用(如 Transformer 中的词嵌入+位置编码),分别处理不同维度的信息。
相关文章:
【NLP 20、Encoding编码 和 Embedding嵌入】
目录 一、核心定义与区别 二、常见Encoding编码 (1) 独热编码(One-Hot Encoding) (2) 位置编码(Positional Encoding) (3) 标签编码(Label Encoding) (4) 注意事项 三、常见Embedding词嵌入 (1) 基础词嵌入…...
雷赛LC2000
【一,概述】 这个是中型PLC 【二,外观】 网口编号: 【2】【3】 //默认ip:192.168.1.xxx 【0】【1】 可视化授权不如禾川Q系。 【三,总线轴】 因为本次带的轴是台达A2系列伺服 A2最快总线是【1ms】的倍数…...
ESP32开发工具介绍:Thonny——初学者的MicroPython利器
文章目录 引言什么是 Thonny?为什么选择 Thonny 开发 ESP32?1. **MicroPython 的天然支持**2. **极简的配置流程**3. **适合快速原型开发**如何用 Thonny 开发 ESP32?步骤 1:准备工作步骤 2:烧录 MicroPython 固件步骤 3:在 Thonny 中连接 ESP32步骤 4:编写并运行代码Th…...
【Go语言圣经】第六节:方法
第六章:方法 6.1 方法声明 在函数声明时,在其名字之前放上一个变量,这就是声明了变量对应类型的一个方法,相当于为这种类型定义了一个独占的方法。 下例为 Point 类型声明了计算两个点之间距离的方法: package mai…...
【Leetcode刷题记录】45. 跳跃游戏 II--贪心算法
45. 跳跃游戏 II 给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。 每个元素 nums[i] 表示从索引 i 向后跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i j] 处: 0 < j < nums[i]i j < n 返回到达 num…...
mysql_init和mysql_real_connect的形象化认识
解析总结 1. mysql_init 的作用 mysql_init 用于初始化一个 MYSQL 结构体,为后续数据库连接和操作做准备。该结构体存储连接配置及状态信息,是 MySQL C API 的核心句柄。 示例: MYSQL *conn mysql_init(NULL); // 初始化连接句柄2. mysql_…...
Qt网络相关
“ 所有生而孤独的人,葆有的天真 ” 为了⽀持跨平台, QT对⽹络编程的 API 也进⾏了重新封装。本章会上手一套基于QT的网络通信编写。 UDP Socket 在使用Qt进行网络编程前,需要在Qt项目中的.pro文件里添加对应的网络模块( network ). QT core gui net…...
deepseek接入pycharm 进行AI编程
要将DeepSeek接入PyCharm进行AI编程,可以按照以下步骤操作: ### 1. 获取DeepSeek API访问权限 DeepSeek通常以API的形式对外提供服务,你需要在其官方网站注册账号,申请API访问权限。在申请通过后,会获得API密钥(API Key),这是后续调用API的关键凭证。 ### 2. 安装必要…...
Verilog基础(三):过程
过程(Procedures) - Always块 – 组合逻辑 (Always blocks – Combinational) 由于数字电路是由电线相连的逻辑门组成的,所以任何电路都可以表示为模块和赋值语句的某种组合. 然而,有时这不是描述电路最方便的方法. 两种always block是十分有用的&am…...
生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (上)
今天小李哥将开启全新的技术分享系列,为大家介绍生成式AI的安全解决方案设计方法和最佳实践。近年来,生成式 AI 安全市场正迅速发展。据 IDC 预测,到 2025 年全球 AI 安全解决方案市场规模将突破 200 亿美元,年复合增长率超过 30%…...
.Net WebAPI -[HttpPut(“{fileServiceId:int}“)]
[HttpPut("{fileServiceId:int}")] 这个写法是 ASP.NET Core 中的一个路由特性,用于定义一个 HTTP PUT 请求的路由,并指定路由参数的类型。 解析 HttpPut [HttpPut]: 这是一个 ASP.NET Core 的路由特性,用于标记一个方…...
[EAI-027] RDT-1B,目前最大的用于机器人双臂操作的机器人基础模型
Paper Card 论文标题:RDT-1B: a Diffusion Foundation Model for Bimanual Manipulation 论文作者:Songming Liu, Lingxuan Wu, Bangguo Li, Hengkai Tan, Huayu Chen, Zhengyi Wang, Ke Xu, Hang Su, Jun Zhu 论文链接:https://arxiv.org/ab…...
C基础寒假练习(7)
一、有 1、2、3、4个数字,能组成多少互不相同且无重复的三位? 都是多少? #include <stdio.h> int main() {// 定义数字数组int digits[] {1, 2, 3, 4};int n sizeof(digits) / sizeof(digits[0]);// 嵌套循环遍历所有排列for (int …...
Ajax:重塑Web交互体验的人性化探索
在数字化时代,网页的交互性和响应速度已成为衡量用户体验的关键指标。Ajax(Asynchronous JavaScript and XML),作为前端与后端沟通的桥梁,凭借其异步通信的能力,极大地提升了网页的动态性和用户友好度&…...
【DeepSeek背后的技术】系列二:大模型知识蒸馏(Knowledge Distillation)
目录 1 引言2 操作步骤和公式说明2.1 准备教师模型(Teacher Model)和学生模型(Student Model)2.2 生成软标签(Soft Labels)2.3 定义蒸馏损失函数2.4 训练学生模型2.5 调整超参数2.6 评估与部署 3 其他知识蒸…...
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.14 内存映射:处理超大型数组的终极方案
2.14 内存映射:处理超大型数组的终极方案 目录 #mermaid-svg-G91Kn9O4eN2k8xEo {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-G91Kn9O4eN2k8xEo .error-icon{fill:#552222;}#mermaid-svg-G91Kn9O4eN2k…...
【C++】STL——vector的使用
目录 💕1.vector介绍 💕2.vector的基本用法 💕3.vector功能的具体用法 (讲解) 💕4.vector——size,capacity函数的使用 (简单略讲) 💕5.resizeÿ…...
springboot/ssm互联网智慧医院体检平台web健康体检管理系统Java代码编写
springboot/ssm互联网智慧医院体检平台web健康体检管理系统Java代码编写 基于springboot(可改ssm)vue项目 开发语言:Java 框架:springboot/可改ssm vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库&am…...
介绍一下Mybatis的Executor执行器
Executor执行器是用来执行我们的具体的SQL操作的 有三种基本的Executor执行器: SimpleExecutor简单执行器 每执行一次update或select,就创建一个Statement对象,用完立刻关闭Statement对象 ReuseExecutor可重用执行器 可重复利用Statement…...
Wide Deep 模型:记忆能力与泛化能力
实验和完整代码 完整代码实现和jupyter运行:https://github.com/Myolive-Lin/RecSys--deep-learning-recommendation-system/tree/main 引言 Wide & Deep 模型是一种结合了线性模型(Wide)和深度神经网络(Deep)的混…...
【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
