相当于一个简单的存储固定大小的词典的嵌入向量的查找表,即,给定一个编号,嵌入层就能返回这个编号对应的嵌入向量,嵌入向量反映了各个编号代表的符号之间的语义关系。input为一个编号列表,output为对应的符号嵌入向量列表
最早用于维度变化,也最常在nlp中所使用,即词嵌入操作,通俗来讲就是将文字转换为一串数字。词嵌入的过程,就相当于是制造出一本字典的过程。计算机可以通过这个字典来间接地识别文字。词嵌入向量的意思也可以理解成:词在神经网络中的向量表示。
现被使用于空间操作中,对于graph中各节点之间特征的潜在影响关系捕获。
Embedding的输入参数如下:
Embedding(
num_embeddings: int,
embedding_dim: int,
padding_idx: Union[int, NoneType] = None,
max_norm: Union[float, NoneType] = None,
norm_type: float = 2.0,
scale_grad_by_freq: bool = False,
sparse: bool = False,
_weight: Union[torch.Tensor,
NoneType] = None)
参数解释
关于输入、输出维度
| - Input: :math:(*)
, LongTensor of arbitrary shape containing the indices to extract
| - Output: :math:(*, H)
, where *
is the input shape and :math: H=\text{embedding_dim}
| >>> # an Embedding module containing 10 tensors of size 3
| >>> embedding = nn.Embedding(10, 3)
| >>> # a batch of 2 samples of 4 indices each
| >>> input = torch.LongTensor([[1,2,4,5],[4,3,2,9]])
| >>> embedding(input)
| tensor([[
| [-0.0251, -1.6902, 0.7172],
| [-0.6431, 0.0748, 0.6969],
| [ 1.4970, 1.3448, -0.9685],
| [-0.3677, -2.7265, -0.1685]],
| [[ 1.4970, 1.3448, -0.9685],
| [ 0.4362, -0.4004, 0.9400],
| [-0.6431, 0.0748, 0.6969],
| [ 0.9124, -2.3616, 1.1151]
| ]])
the shape of output:(2,4,3)
nn.embedding的输入只能是编号,不能是隐藏变量,比如one-hot,或者其它,这种情况,可以自己建一个自定义维度的线性网络层,参数训练可以单独训练或者跟随整个网络一起训练(看实验需要)
*
如果你指定了padding_idx,注意这个padding_idx也是在num_embeddings尺寸内的,比如符号总共有500个,指定了padding_idx,那么num_embeddings应该为501
*
embedding_dim的选择要注意,根据自己的符号数量,举个例子,如果你的词典尺寸是1024,那么极限压缩(用二进制表示)也需要10维,再考虑词性之间的相关性,怎么也要在15-20维左右,虽然embedding是用来降维的,但是>- 也要注意这种极限维度,结合实际情况,合理定义