torch nn.Embedding 举例

依据最大索引转向量:在最后一维上增加一个维度,将索引转化为一个浮点向量

 
import torch
from torch import nn

embedding = nn.Embedding(num_embeddings=8,
                        embedding_dim=3,
                            padding_idx=0)


index = torch.tensor([1,3,5,7])
print(embedding(index).shape)  #torch.Size([4, 3])

 

    

 
import torch
from torch import nn

embedding = nn.Embedding(num_embeddings=8,
                        embedding_dim=3,
                            padding_idx=0)

 
index = torch.tensor([[1,3,5,7],[1,3,0,0]])
index=index.permute(1,0)
print(embedding(index).shape) #torch.Size([4, 2, 3])
    

 

    

 


 

  

 

    

 


nn.Embedding

num_embeddings

 
nn.Embedding中num_embeddings理论上指索引的个数,
但这有个前提,索引编码从0开始,并且一个连一个,
不能跳跃,一般情况下也不会跳跃,但跳跃也没有关系

实际上num_embeddings指提供的索引中的最大值 
比如,本例如果num_embeddings低于8将报错,而实际上的索引个数只有4个
正常情况下索引编码都是从0开始,也无跳跃

 

    

nn.Embedding模板类生成的对象

 
import torch
from torch import nn

embedding = nn.Embedding(num_embeddings=6,embedding_dim=3,padding_idx=0)
batch_vec = torch.arange(start=0,end=6,step=1).reshape(2,3)
embedding(batch_vec).shape  # torch.Size([2, 3, 3])

该对象将索引矩阵升了一维,所升的这一维就是索引所转向量的维度,
pytorch的维度是这样的(dim=0,dim=1),
升的这一维默认放在更高的维度,就是(dim=0,dim=1,dim=2) 

 

    

随机性与有效性:起点是随机的,终点是有效的(但不一定是最好的,)

 
import torch
from torch import nn

embedding = nn.Embedding(num_embeddings=6,embedding_dim=3,padding_idx=0)
batch_vec = torch.arange(start=0,end=6,step=1).reshape(2,3)
embedding(batch_vec)
tensor([[[ 0.0000,  0.0000,  0.0000],
            [-0.9986,  0.2995, -1.3050],
            [-0.8627,  0.4689, -0.1170]],

        [[-0.3458,  1.2517, -0.7372],
            [ 0.4307, -0.3824,  0.1640],
            [-1.2211,  1.0763,  1.4638]]], grad_fn=EmbeddingBackward0)

 
AI所要训练的参数是在定义nn.Embedding模板类时初始化的
nn.Embedding模板类在初始化参数时,是随机的,
这样随机地将一个整数索引转换为n维浮点向量,有效吗?

其实它的思想跟神经网络层的思想是一样的,参数随机初始化,
在训练时梯度下降,逐步向不随机的方向,就是标签的方向靠近
随机当然是无效的,训练后才有效

 

  

 

    
参考