在Pytorch里面有三种编码方式,Embedding 就是其中之一,不同于 one_hot 需要用同长度的张量存 Embedding将单词映射为稠密向量,并且指定 embedding_dim维度。通过 Embedding层 转换的数据并不是经过词典映射的,而是原始数据。Embedding的输出可以作为神经网络的输入,进一步进行训练和处理。在深度学习中,Embedding是将离散的输入映射为连续的向量表示的一种技术。它在自然语言处理和推荐系统等任务中广泛使用。
One-hot 的缺点:
- one-hot 没有任何的语义信息
- one-hot 编码的 维度等于字典的长度,转换张量为一个低稠密度向量
其实一般就是前用两个参数
- num_embeddings 就是生成 num_embeddings 个嵌入向量,
- embedding_dim 就是嵌入向量的维度,即使用一个 [1, embedding_dim] 向量表示一个 词
import torch
from torch import nn
k = 49408
embedding = nn.Embedding(k, embedding_dim=16)
emb = embedding(torch.tensor([1, 4, 5, 7])).detach() # 输入数据大小不能超过 阈值k,detach是去除梯度信息
print('emb',emb.data)
# 输出是一个 [4,16] 维的张量,
tensor([[-2.0561, -1.0517, 1.1487, 1.2165, -0.7428, 0.0255, -2.3840, -0.6686,
-0.1522, -0.6380, 0.8078, 2.3382, -0.3678, -0.5860, -0.1160, 0.4851],
[-0.0821, 0.6428, -0.7851, -0.6309, -0.1035, -0.0277, 0.4757, 0.0314,
0.2354, 0.0902, 0.6876, -0.6741, -0.7009, 0.6107, -0.5739, -0.7009],
[ 0.2205, -0.5750, -0.4575, 0.2809, 0.1322, -0.4874, 0.0903, -0.9487,
0.4847, 0.5165, 0.0463, 0.2832, 0.1155, -1.0731, -0.4711, -0.4850],
[-1.3978, 0.8461, 0.4533, 0.6129, 0.4035, 0.1373, -1.1821, 1.2093,
-0.0140, 1.4716, 0.2694, 1.7981, 0.4558, 0.6396, 0.4042, -1.9535]])
注意:nn.Embedding()是可以训练的,参考 torch.nn.Embedding是否有梯度,是否会被训练
Embedding 反推输入
Embedding 在创建的时候会创建一个 [ k , H ] [k, H] [k,H] 维度的张量,可以通过 embedding.weigh 获取
embedding = nn.Embedding(k, embedding_dim=H)
原本还想证明 embedding 是可以反推输入的,但是直到下面这几行输出,我发现了什么 (ΩДΩ) (ΩДΩ) (ΩДΩ)