【NLP 20、Encoding编码 和 Embedding嵌入】

news2025/2/7 22:00:29

目录

一、核心定义与区别

二、常见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]
  • 缺点:维度爆炸(高维稀疏),无法表达类别间关系。

参数类型描述是否必需默认值
tensortorch.Tensor输入的整数类别索引张量(如 [0, 2, 1]-
num_classesint类别总数(决定输出维度)-

(2) 位置编码(Positional Encoding)

  • 定义:为序列数据(如文本、时间序列)添加位置信息,常用正弦/余弦函数生成。

  • 注意:

    位置编码自定义生成矩阵后叠加到词嵌入上,需与输入张量形状匹配。
  • Transformer 中的公式

参数类型描述是否必需默认值
max_seq_lenint最大序列长度(决定编码矩阵的行数)-
d_modelint特征维度(决定编码矩阵的列数)

(3) 标签编码(Label Encoding)

  • 定义:将类别映射为整数(如 "红"→0, "蓝"→1, "绿"→2),但可能引入错误的大小关系。

(4) 注意事项 

  1. 独热编码的输入限制

    • 输入张量必须是整数类型(如 torch.long)。

    • 索引值必须小于 num_classes,否则会越界。

  2. 位置编码的叠加方式

    • 需与词嵌入维度一致(d_model),且直接相加前确保形状匹配。

独热编码num_classes控制输出维度,避免索引越界
位置编码max_seq_lend_model定义编码矩阵的尺寸和特征维度

三、常见Embedding词嵌入

(1) 基础词嵌入(nn.Embedding

nn.Embedding()模块

注意:

词嵌入使用 nn.Embedding 层,输入为整数索引张量,输出为浮点数向量。
embedding_layer = nn.Embedding(num_embeddings=10000, embedding_dim=300)
参数类型描述是否必需默认值
num_embeddingsint词汇表大小(唯一符号数量)-
embedding_dimint嵌入向量的维度-
padding_idxint填充符索引(对应向量初始化为零)None
max_normfloat向量最大范数(超过时缩放)None
scale_grad_by_freqbool根据词频缩放梯度(罕见词更大更新)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)
参数类型描述是否必需默认值
embeddingstorch.Tensor预训练嵌入矩阵(形状 [num_emb, dim]-
freezebool是否冻结参数(不更新)True
padding_idxint同基础 nn.EmbeddingNone
max_normfloat同基础 nn.EmbeddingNone

如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_categoriesint类别总数(如用户数、商品数)-
embedding_dimint嵌入向量的维度-

注意:

类别嵌入将高基数类别(如用户ID)映射为低维向量,避免维度爆炸。
import torch.nn as nn

class 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) 注意事项 

  1. 嵌入层的输入要求

    • nn.Embedding 的输入为整数索引,非浮点数。

  2. 预训练嵌入的兼容性

    • 加载预训练向量时,需确保 num_embeddings 和 embedding_dim 与预训练矩阵一致。

基础词嵌入num_embeddingsembedding_dim决定嵌入层的输入输出维度
预训练嵌入embeddingsfreeze加载外部知识,控制参数更新
类别嵌入num_categoriesembedding_dim处理高基数离散特征,避免维度灾难

四、对比总结

维度EncodingEmbedding
语义保留无(仅符号化)高(捕捉语义相似性)
计算开销低(静态计算)高(需训练参数)
灵活性固定规则可自适应任务优化
典型应用数据预处理、位置编码词向量、推荐系统、图表示学习
场景推荐方法
类别特征且维度低独热编码(简单高效)
类别特征维度高(如用户ID)嵌入(避免维度灾难)
序列位置信息位置编码(如 Transformer)
需要捕捉语义相似性嵌入(如词向量)
计算资源有限优先选择静态编码(如哈希编码)

五、编码与嵌入的联合使用

在 Transformer 中,词嵌入位置编码共同构成输入表示:

参数类型描述是否必需默认值
vocab_sizeint词汇表大小(词嵌入参数)-
d_modelint特征维度(词嵌入和位置编码共享)-
max_seq_lenint最大序列长度(位置编码参数)-
import torch
import torch.nn as nn

class 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 中的词嵌入+位置编码),分别处理不同维度的信息。

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

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

相关文章

深度学习模型可视化小工具wandb

1 概述 Wandb(Weights & Biases,网址是https://wandb.ai)是一个用于机器学习项目实验跟踪、可视化和管理的工具,旨在用户更有效地监控模型训练过程、优化性能,并分享和复现实验结果‌‌。对于使用者而言&#xff…

数据库系统概论的第六版与第五版的区别,附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服务之间的通信…

软件设计模式

目录 一.创建型模式 抽象工厂 Abstract Factory 构建器 Builder 工厂方法 Factory Method 原型 Prototype 单例模式 Singleton 二.结构型模式 适配器模式 Adapter 桥接模式 Bridge 组合模式 Composite 装饰者模式 Decorator 外观模式 Facade 享元模式 Flyw…

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…

基于ansible部署elk集群

ansible部署 ELK部署 ELK常见架构 (1)ElasticsearchLogstashKibana:这种架构是最常见的一种,也是最简单的一种架构,这种架构通过Logstash收集日志,运用Elasticsearch分析日志,最后通过Kibana中…

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…

MTGNN论文解读

模型架构 MTGNN 由多个模块组合而成,目标是捕捉多变量时间序列中的空间(变量间)和时间(时序)依赖。 图学习层:用于自适应地学习图的邻接矩阵,发现变量之间的关系。图卷积模块:根据邻…

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…

分析用户请求K8S里ingress-nginx提供的ingress流量路径

前言 本文是个人的小小见解,欢迎大佬指出我文章的问题,一起讨论进步~ 我个人的疑问点 进入的流量是如何自动判断进入iptables的四表?k8s nodeport模式的原理? 一 本机环境介绍 节点名节点IPK8S版本CNI插件Master192.168.44.1…

初阶数据结构:树---堆

目录 一、树的概念 二、树的构成 (一)、树的基本组成成分 (二)、树的实现方法 三、树的特殊结构------二叉树 (一)、二叉树的概念 (二)、二叉树的性质 (三&#…

feign 远程调用详解

在平常的开发工作中,我们经常需要跟其他系统交互,比如调用用户系统的用户信息接口、调用支付系统的支付接口等。那么,我们应该通过什么方式进行系统之间的交互呢?今天,简单来总结下 feign 的用法。 1:引入依…

Sentinel的安装和做限流的使用

一、安装 Release v1.8.3 alibaba/Sentinel GitHubA powerful flow control component enabling reliability, resilience and monitoring for microservices. (面向云原生微服务的高可用流控防护组件) - Release v1.8.3 alibaba/Sentinelhttps://github.com/alibaba/Senti…