【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) 基础词嵌入…...
【LeetCode 刷题】二叉树(3)-二叉树的属性
此博客为《代码随想录》二叉树章节的学习笔记,主要内容为二叉树的属性相关的题目解析。 文章目录 101. 对称二叉树104.二叉树的最大深度111.二叉树的最小深度222.完全二叉树的节点个数110.平衡二叉树257. 二叉树的所有路径404.左叶子之和513.找树左下角的值112. 路…...
深度学习模型可视化小工具wandb
1 概述 Wandb(Weights & Biases,网址是https://wandb.ai)是一个用于机器学习项目实验跟踪、可视化和管理的工具,旨在用户更有效地监控模型训练过程、优化性能,并分享和复现实验结果。对于使用者而言ÿ…...
数据库系统概论的第六版与第五版的区别,附pdf
我用夸克网盘分享了「数据库系统概论第五六版资源」,点击链接即可保存。 链接:https://pan.quark.cn/s/21a278378dee 第6版教材修订的主要内容 为了保持科学性、先进性和实用性,在第5版教材基础上对全书内容进行了修改、更新和充实。 在科…...
【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信
Kubernetes中Pod间的通信 本系列文章共3篇: 【Kubernetes Pod间通信-第1篇】在单个子网中使用underlay网络实现Pod到Pod的通信【Kubernetes Pod间通信-第2篇】使用BGP实现Pod到Pod的通信(本文介绍)【Kubernetes Pod间通信-第3篇】Kubernetes中Pod与ClusterIP服务之间的通信…...
python:csv文件批量导入mysql
1.导入sql文件到数据库中 mysql -u username -p要先创建一个空的数据库 CREATE DATABASE your_database_name;USE your_database_name;导入sql文件 source /path/to/your/file.sql;查看某个表格的结构,为后续数据插入做准备 DESCRIBE table_name;2.插入假数据到对应…...
软件设计模式
目录 一.创建型模式 抽象工厂 Abstract Factory 构建器 Builder 工厂方法 Factory Method 原型 Prototype 单例模式 Singleton 二.结构型模式 适配器模式 Adapter 桥接模式 Bridge 组合模式 Composite 装饰者模式 Decorator 外观模式 Facade 享元模式 Flyw…...
C++证件识别接口-身份证识别-护照识别-驾驶证识别-户口页识别
数字化信息时代,快速准确地处理各类证件信息已经成为许多行业提升效率的关键。无论是金融、物流、旅游还是公共服务领域,证件识别接口的应用极大的简化了证件信息提取的流程,提高了录入效率。 证件识别接口提升业务处理效率 传统的人工审核…...
3步打造C# API安全密盾
引言:API 安全的重要性 在数字化浪潮中,应用程序编程接口(API)已成为不同软件系统之间通信和数据交互的关键桥梁。无论是企业内部的微服务架构,还是面向外部用户的在线服务,API 都承担着数据传输和业务逻辑…...
vscode 如何通过Continue引入AI 助手deepseek
第一步: 在deepseek 官网上注册账号,得到APIKeys(deepseek官网地址) 创建属于自己的APIKey,然后复制这个key,(注意保存自己的key)! 第二步: 打开vscode,在插件市场安装Continue插件, 点击设置,添加deepseek模型,默认…...
通过docker安装部署deepseek以及python实现
前提条件 Docker 安装:确保你的系统已经安装并正确配置了 Docker。可以通过运行 docker --version 来验证 Docker 是否安装成功。 网络环境:保证设备有稳定的网络连接,以便拉取 Docker 镜像和模型文件。 步骤一:拉取 Ollama Docker 镜像 Ollama 可以帮助我们更方便地管理…...
iOS 音频录制、播放与格式转换
iOS 音频录制、播放与格式转换:基于 AVFoundation 和 FFmpegKit 的实现 在 iOS 开发中,音频处理是一个非常常见的需求,比如录音、播放音频、音频格式转换等。本文将详细解读一段基于 AVFoundation 和 FFmpegKit 的代码,展示如何实现音频录制、播放以及 PCM 和 AAC 格式之间…...
RK3576——USB3.2 OTG无法识别到USB设备
问题:使用硬盘接入到OTG接口无热插拔信息,接入DP显示屏无法正常识别到显示设备,但是能通过RKDdevTool工具烧录系统。 问题分析:由于热插拔功能实现是靠HUSB311芯片完成的,因此需要先确保HUSB311芯片驱动正常工作。 1. …...
【MySQL】语言连接
语言连接 一、下载二、mysql_get_client_info1、函数2、介绍3、示例 三、其他函数1、mysql_init2、mysql_real_connect3、mysql_query4、mysql_store_result5、mysql_free_result6、mysql_num_fields7、mysql_num_rows8、mysql_fetch_fields9、mysql_fetch_row10、mysql_close …...
20240206 adb 连不上手机解决办法
Step 1: lsusb 确认电脑 usb 端口能识别设备 lsusb不知道设备有没有连上,就插拔一下,对比观察多了/少了哪个设备。 Step 2: 重启 adb server sudo adb kill-serversudo adb start-serveradb devices基本上就可以了~ Reference https://b…...
何为运行时(Runtime)
Runtime(运行时) 是计算机程序中实际执行的阶段,指从程序启动到终止的整个运行过程。它涵盖了程序运行所需的环境、资源管理和底层支持机制。 1. 核心概念 运行时环境(Runtime Environment) 程序运行依赖的基础设施&am…...
基于ansible部署elk集群
ansible部署 ELK部署 ELK常见架构 (1)ElasticsearchLogstashKibana:这种架构是最常见的一种,也是最简单的一种架构,这种架构通过Logstash收集日志,运用Elasticsearch分析日志,最后通过Kibana中…...
【C语言设计模式学习笔记1】面向接口编程/简单工厂模式/多态
面向接口编程可以提供更高级的抽象,实现的时候,外部不需要知道内部的具体实现,最简单的是使用简单工厂模式来进行实现,比如一个Sensor具有多种表示形式,这时候可以在给Sensor结构体添加一个enum类型的type,…...
Mac上搭建k8s环境——Minikube
1、在mac上安装Minikube可执行程序 brew cask install minikub 安装后使用minikube version命令查看版本 2、安装docker环境 brew install --cask --appdir/Applications docker #安装docker open -a Docker #启动docker 3、安装kubectl curl -LO https://storage.g…...
Github - 记录一次对“不小心包含了密码的PR”的修复
Github - 记录一次对“不小心包含了密码的PR”的修复 前言 和好朋友一起开发一个字节跳动青训营抖音电商后端(now private)的项目,某大佬不小心把本地一密码commit上去并提了PR。 PR一旦发出则无法被删除,且其包含的commit也能被所有能看到这个仓库的…...
【创建模式-单例模式(Singleton Pattern)】
赐萧瑀 实现方案饿汉模式懒汉式(非线程安全)懒汉模式(线程安全)双重检查锁定静态内部类 攻击方式序列化攻击反射攻击 枚举(最佳实践)枚举是一种类 唐 李世民 疾风知劲草,板荡识诚臣。 勇夫安识义,智者必怀仁…...
MTGNN论文解读
模型架构 MTGNN 由多个模块组合而成,目标是捕捉多变量时间序列中的空间(变量间)和时间(时序)依赖。 图学习层:用于自适应地学习图的邻接矩阵,发现变量之间的关系。图卷积模块:根据邻…...
C++ 常用排序算法
排序算法 算法简介 sort // 对容器内元素进行排序 random_shuffle // 洗牌 指定范围内的元素随机调整次序 merge // 容器元素合并, 并存储到另一容器中 reverse // 反转指定范围内的元素1. sort 功能:对容器内部分区间按某种规则进行排序 函数原型&a…...
C语言:函数栈帧的创建和销毁
目录 1.什么是函数栈帧2.理解函数栈帧能解决什么问题3.函数栈帧的创建和销毁的过程解析3.1 什么是栈3.2 认识相关寄存器和汇编指令3.3 解析函数栈帧的创建和销毁过程3.3.1 准备环境3.3.2 函数的调用堆栈3.3.3 转到反汇编3.3.4 函数栈帧的创建和销毁 1.什么是函数栈帧 在写C语言…...
VSCode便捷开发
一、常用插件 Vue 3 Snippets、Vetur、Vue - Official 二、常用开发者工具 三、Vue中使用Element-UI 安装步骤: 1、在VSCode的终端执行如下指令: npm i element-ui -S 2、在main.js中全局引入: import Vue from vue; import ElementUI from …...
二、tsp学习笔记——LINUX SDK编译
开发环境:window11 wsl ubuntu24.04 lypwslDESKTOP-39T8VTC:~$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 24.04.1 LTS Release: 24.04 Codename: noble linux_sdk同步 tspi_linux_sdk_repo_202…...
langchain教程-2.prompt
前言 该系列教程的代码: https://github.com/shar-pen/Langchain-MiniTutorial 我主要参考 langchain 官方教程, 有选择性的记录了一下学习内容 这是教程清单 1.初试langchain2.prompt3.OutputParser/输出解析4.model/vllm模型部署和langchain调用5.DocumentLoader/多种文档…...
分析用户请求K8S里ingress-nginx提供的ingress流量路径
前言 本文是个人的小小见解,欢迎大佬指出我文章的问题,一起讨论进步~ 我个人的疑问点 进入的流量是如何自动判断进入iptables的四表?k8s nodeport模式的原理? 一 本机环境介绍 节点名节点IPK8S版本CNI插件Master192.168.44.1…...
初阶数据结构:树---堆
目录 一、树的概念 二、树的构成 (一)、树的基本组成成分 (二)、树的实现方法 三、树的特殊结构------二叉树 (一)、二叉树的概念 (二)、二叉树的性质 (三&#…...
Vue WebSocket简单应用 ws
webSocket应用 <template><div></div> </template><script> import { getToken } from "/utils/auth"; export default {data() {return {url: "",Socket: null, //socket对象lockReconnect: false, //锁定拒绝重连close: …...
