
在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 是可以反推输入的,但是直到下面这几行输出,我发现了什么 (ΩДΩ) (ΩДΩ) (ΩДΩ)




















