N2 Embedding

前言

为了了解文本和类别信息的特征,很用必要了解Embedding操作,其也是NLP的基础,我不研究NLP,但是在一些分类任务中可能会涉及类别信息处理。

Embedding介绍

Embedding操作是将离散的符号(如单词、类别等)映射到连续的低维向量空间中的技术。它的核心思想是通过学习将每个符号映射到一个密集的低维向量表示,使得相似的符号在向量空间中距离较近,从而能够更好地表示符号之间的语义关系。

原理:
稠密表示: Embedding操作将高维的离散符号表示(通常是一个整数索引)转换为低维的稠密向量表示。这些稠密向量的维度通常由用户指定,是一个固定的参数。

学习表示: 在训练过程中,Embedding操作会学习如何将每个离散符号映射到一个合适的向量表示。这些向量表示通常是通过优化目标(如最小化损失函数)来学习的,以便于模型能够更好地完成特定的任务。

语义关系: Embedding操作使得具有相似语义的符号在向量空间中更接近。例如,在自然语言处理任务中,具有相似语义的单词在Embedding空间中的向量会更加相似,从而使得模型更容易捕捉到它们之间的语义关系。

公式:
Embedding操作可以用一个简单的矩阵乘法来表示。假设我们有一个大小为(vocab_size, embedding_dim)的Embedding矩阵 E E E,其中 vocab_size 表示词汇表的大小,embedding_dim 表示每个符号的向量维度。给定一个离散符号的整数索引 i i i,我们可以通过以下公式来计算它的向量表示:

\embedding(𝑖)=𝐸(𝑖)\

其中 E i E_i Ei 表示矩阵 E E E 的第 i i i 行,即符号索引为 i i i 的向量表示。在实际应用中,这个矩阵 E E E 是模型的参数之一,会通过训练数据来学习得到最优的值。
假设我们有一个词汇表的大小为5,每个单词用一个整数索引表示,向量维度为3。我们可以通过以下示例代码来创建一个简单的Embedding操作:

import torch
import torch.nn as nn

# 定义词汇表大小和向量维度
vocab_size = 5
embedding_dim = 3

# 创建Embedding层
embedding = nn.Embedding(vocab_size, embedding_dim)

# 输入一个整数张量
input_index = torch.tensor([1, 2, 4])

# Embedding操作
output = embedding(input_index)

print(output)

tensor([[ 2.0184, -0.3957, -0.2030],
[-0.7936, 0.6103, 0.3359],
[-2.1244, -0.0606, -0.7490]], grad_fn=)

对下面文字完成词嵌入操作

比较直观的编码方式是采用上面提到的字典序列。例如,对于一个有三个类别的问题,可以用1、2和3分别表示这三个类别。但是,这种编码方式存在一个问题,就是模型可能会错误地认为不同类别之间存在一些顺序或距离关系,而实际上这些关系可能是不存在的或者不具有实际意义的。
为了避免这种问题,引入了one-hot编码(也称独热编码)。one-hot编码的基本思想是将每个类别映射到一个向量,其中只有一个元素的值为1,其余元素的值为0。这样,每个类别之间就是相互独立的,不存在顺序或距离关系。例如,对于三个类别的情况,可以使用如下的one-hot编码:
import torch
import torch.nn as nn
import re

# 步骤 1:读取文件
file_path = '任务文件.txt'

with open(file_path, 'r', encoding='utf-8') as f:
    text = f.read()

# 步骤 2:构建词汇表
# 简单分词,这里使用空格和标点进行分词
words = re.findall(r'\b\w+\b', text.lower())
vocab = list(set(words))  # 去重,获取词汇表
vocab_size = len(vocab)
word_to_index = {word: idx for idx, word in enumerate(vocab)}

# 步骤 3:转换为索引序列
indices = [word_to_index[word] for word in words]

# 转换为张量
indices_tensor = torch.tensor(indices, dtype=torch.long)

# 步骤 4:创建Embedding层
embedding_dim = 10  # 设置Embedding维度
embedding = nn.Embedding(vocab_size, embedding_dim)

# 步骤 5:执行Embedding操作
embedded_vectors = embedding(indices_tensor)

# 打印结果
print("词汇表:", word_to_index)
print("索引序列:", indices)
print("Embedding结果:")
print(embedded_vectors)

# 输出Embedding层参数
print("Embedding层权重:")
print(embedding.weight)

词汇表: {‘就是模型可能会错误地认为不同类别之间存在一些顺序或距离关系’: 0, ‘one’: 1, ‘可以用1’: 2, ‘也称独热编码’: 3, ‘但是’: 4, ‘hot编码’: 5, ‘每个类别之间就是相互独立的’: 6, ‘例如’: 7, ‘其中只有一个元素的值为1’: 8, ‘为了避免这种问题’: 9, ‘其余元素的值为0’: 10, ‘比较直观的编码方式是采用上面提到的字典序列’: 11, ‘引入了one’: 12, ‘不存在顺序或距离关系’: 13, ‘hot编码的基本思想是将每个类别映射到一个向量’: 14, ‘对于一个有三个类别的问题’: 15, ‘这种编码方式存在一个问题’: 16, ‘对于三个类别的情况’: 17, ‘这样’: 18, ‘可以使用如下的one’: 19, ‘而实际上这些关系可能是不存在的或者不具有实际意义的’: 20, ‘2和3分别表示这三个类别’: 21}
索引序列: [11, 7, 15, 2, 21, 4, 16, 0, 20, 9, 12, 5, 3, 1, 14, 8, 10, 18, 6, 13, 7, 17, 19, 5]
Embedding结果:
tensor([[-1.3734e+00, -1.5800e+00, 1.6235e+00, -5.2885e-02, 4.2154e-01,
5.4311e-01, 1.2508e+00, 6.5347e-01, 6.8402e-02, -2.7548e-02],
[-2.5161e-01, -8.9868e-01, 1.6869e+00, 1.9899e-01, 2.0125e-01,
………………
1.8072e+00, -1.0965e+00, -1.5469e+00, 4.4424e-01, 5.8639e-01],
[ 7.9903e-01, -2.7783e-01, 4.7349e-02, 1.4422e+00, 4.7711e-01,
6.9244e-01, -4.1052e-01, -2.0870e-01, 1.3128e+00, 1.9153e+00],
[-2.5161e-01, -8.9868e-01, 1.6869e+00, 1.9899e-01, 2.0125e-01,
-8.1675e-02, -5.4962e-02, 8.1058e-01, 4.4197e-01, 8.1969e-04],
[ 6.9812e-01, -1.4408e-01, 2.2885e-02, 1.7244e+00, -3.8600e-01,
-8.6228e-01, -3.1545e-01, -7.5756e-01, -4.2194e-01, -3.9213e-01],
[-3.3284e-01, 2.1769e-01, 1.0664e+00, 5.0463e-01, 1.6820e-01,
-1.4950e+00, 1.2662e+00, 3.0968e-01, 3.1008e-01, -2.4082e-01],
[ 1.7332e+00, 9.9931e-03, 1.5297e+00, -8.3573e-01, 1.0832e+00,
3.3466e-01, 5.1437e-01, 6.1250e-01, -5.5000e-01, -1.7805e+00]],
grad_fn=)
Embedding层权重:
Parameter containing:
tensor([[-6.9088e-02, 1.7531e-01, 7.3273e-01, -2.5323e-01, 1.2783e+00,
2.3777e+00, -4.4972e-01, 2.6514e-01, 7.5056e-02, 3.2079e-01],
[ 5.9556e-01, -6.8797e-01, -1.4501e+00, -1.2488e+00, -4.0175e-01,
-1.1809e+00, 5.4635e-01, 8.3153e-01, 1.8085e+00, -1.6439e+00],
………………
-5.8283e-01, 1.4383e+00, -1.5579e+00, -4.8273e-01, 1.4578e+00],
[-1.1470e+00, -1.2748e+00, -6.0607e-01, -1.4741e+00, -2.1560e-01,
-8.4410e-01, -1.6243e+00, 1.1638e+00, 6.0583e-01, 1.3229e+00]],
requires_grad=True)

总结

在深度学习中,Embedding是一种常用的操作,通常用于将高维离散的数据(比如单词、类别等)映射到低维连续的向量空间中。Embedding层在自然语言处理(NLP)和推荐系统等领域经常被使用。

  • 21
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值