关于nn.embedding的维度的定义,函数的理解,一些需要注意的点

被刻印的时光 ゝ 提交于 2020-03-09 18:23:51

关于nn.embedding的维度的定义,函数的理解,一些需要注意的点

定义

首先简单介绍一下nn.embedding,函数调用形式如下

torch.nn.Embedding(num_embeddingsembedding_dimpadding_idx=Nonemax_norm=Nonenorm_type=2.0scale_grad_by_freq=Falsesparse=False_weight=None)

其为一个简单的存储固定大小的词典的嵌入向量的查找表,意思就是说,给一个编号,嵌入层就能返回这个编号对应的嵌入向量,嵌入向量反映了各个编号代表的符号之间的语义关系。

输入为一个编号列表,输出为对应的符号嵌入向量列表。

参数解释

  • num_embeddings (python:int) – 词典的大小尺寸,比如总共出现5000个词,那就输入5000。此时index为(0-4999)

  • embedding_dim (python:int) – 嵌入向量的维度,即用多少维来表示一个符号。

  • padding_idx (python:intoptional) – 填充id,比如,输入长度为100,但是每次的句子长度并不一样,后面就需要用统一的数字填充,而这里就是指定这个数字,这样,网络在遇到填充id时,就不会计算其与其它符号的相关性。(初始化为0)

  • max_norm (python:floatoptional) – 最大范数,如果嵌入向量的范数超过了这个界限,就要进行再归一化。

  • norm_type (python:floatoptional) – 指定利用什么范数计算,并用于对比max_norm,默认为2范数。

  • scale_grad_by_freq (booleanoptional) – 根据单词在mini-batch中出现的频率,对梯度进行放缩。默认为False.

  • sparse (booloptional) – 若为True,则与权重矩阵相关的梯度转变为稀疏张量。

变量

~Embedding.weight (Tensor) –形状为 (num_embeddings, embedding_dim) 的学习权重采用标准正态分布N(0,1)进行初始化

I/O形状

  • 输入: (∗) , 包含提取的编号的任意形状的长整型张量。

  • 输出: (∗,H) , 其中 * 为输入的形状,H为embedding_dim

一些注意的点

  •  nn.embedding的输入只能是编号,不能是隐藏变量,比如one-hot,或者其它,这种情况,可以自己建一个自定义维度的线性网络层,参数训练可以单独训练或者跟随整个网络一起训练(看实验需要)
  • 如果你指定了padding_idx,注意这个padding_idx也是在num_embeddings尺寸内的,比如符号总共有500个,指定了padding_idx,那么num_embeddings应该为501
  • embedding_dim的选择要注意,根据自己的符号数量,举个例子,如果你的词典尺寸是1024,那么极限压缩(用二进制表示)也需要10维,再考虑词性之间的相关性,怎么也要在15-20维左右,虽然embedding是用来降维的,但是也要注意这种极限维度,结合实际情况,合理定义
  • 其他的好像也没啥要注意的啦~,欢迎评论区补充(●′ω`●)
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!