网站改版 报价,公司网站源码 带wap手机站,互动网站如何做,品牌建设题目目录 一、核心定义与区别 二、常见Encoding编码 (1) 独热编码#xff08;One-Hot Encoding#xff09; (2) 位置编码#xff08;Positional Encoding#xff09; (3) 标签编码#xff08;Label Encoding#xff09; (4) 注意事项 三、常见Embedding词嵌入 (1) 基础词嵌入… 目录 一、核心定义与区别 二、常见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) 注意事项 独热编码的输入限制 输入张量必须是整数类型如 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_embeddings10000, embedding_dim300)
参数类型描述是否必需默认值num_embeddingsint词汇表大小唯一符号数量是-embedding_dimint嵌入向量的维度是-padding_idxint填充符索引对应向量初始化为零否Nonemax_normfloat向量最大范数超过时缩放否Nonescale_grad_by_freqbool根据词频缩放梯度罕见词更大更新否False
import torch.nn as nn# 定义嵌入层词汇表大小10000嵌入维度300
embedding_layer nn.Embedding(num_embeddings10000, embedding_dim300)# 输入单词索引形状 [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 加载freezeTrue 可固定嵌入参数适用于迁移学习。
pretrained_emb nn.Embedding.from_pretrained(glove.vectors, freezeTrue)
参数类型描述是否必需默认值embeddingstorch.Tensor预训练嵌入矩阵形状 [num_emb, dim]是-freezebool是否冻结参数不更新否Truepadding_idxint同基础 nn.Embedding否Nonemax_normfloat同基础 nn.Embedding否None
如GloVe
from torchtext.vocab import GloVe# 加载预训练的 GloVe 词向量
glove GloVe(name6B, dim100) # 使用 100 维的 GloVe# 获取单词 apple 的向量
apple_vector glove[apple] # 形状 [100]# 将预训练向量转换为嵌入层
pretrained_emb nn.Embedding.from_pretrained(glove.vectors, freezeFalse) # freezeTrue 表示不更新 (3) 类别特征嵌入自定义类 CategoryEmbedding
user_embedding CategoryEmbedding(num_categories1000, embedding_dim64)
参数类型描述是否必需默认值num_categoriesint类别总数如用户数、商品数是-embedding_dimint嵌入向量的维度是-
注意
类别嵌入将高基数类别如用户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_categories1000, embedding_dim64)
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处理高基数离散特征避免维度灾难 四、对比总结
维度EncodingEmbedding语义保留无仅符号化高捕捉语义相似性计算开销低静态计算高需训练参数灵活性固定规则可自适应任务优化典型应用数据预处理、位置编码词向量、推荐系统、图表示学习
场景推荐方法类别特征且维度低独热编码简单高效类别特征维度高如用户ID嵌入避免维度灾难序列位置信息位置编码如 Transformer需要捕捉语义相似性嵌入如词向量计算资源有限优先选择静态编码如哈希编码 五、编码与嵌入的联合使用
在 Transformer 中词嵌入和位置编码共同构成输入表示
参数类型描述是否必需默认值vocab_sizeint词汇表大小词嵌入参数是-d_modelint特征维度词嵌入和位置编码共享是-max_seq_lenint最大序列长度位置编码参数是-
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 中的词嵌入位置编码分别处理不同维度的信息。