nn.Embedding()和nn.Linear()之间的区别
最近一直在做一项在embedding后加上一些噪声的工作,起初我觉得embedding就是向量映射嘛(确实也是这样)然后就直接使用了one-hot编码送进了一个没有 bias的Linear层,当时觉得没问题,后来还是觉得没有把这个问题搞清楚,害怕出错,导致实验出错。后来就进行了一些源码的分析发现,确实在某种程度上这两者之间是可以等价的。
nn.Embedding(nums_embedding, embedding_dim)
第一个参数是embedding的数量,第二个参数是embedding后的维度。它是怎样一个过程呢,说简单点Embedding中有一个weight矩阵维度是 N∗D, N 是nums_embedding,D 为embedding_dim。这个矩阵 W 就相当于一个词典,一个有 N 个词,每个词用 D 维的向量表示。
例如:
x是一个 tensor x = (Batch, Length, Num_words) 经过Embedding后变成(Batch, Length, Num_words,D)。这个过程就相当于一个查表的过程。实际操作呢,把一个句子中的word用one-hot 的方式表示维度呢就是 N , X∗W 就实现了Embedding索引查表的过程,这个权重矩阵可以自己初始化,也可以给定一个自己预训练后的embedding矩阵。
nn.Linear(input_dim, output_dim)
这个就很熟悉了,相当于 f(x)=x∗wT+b 这个熟悉的不能再熟悉了,就是简单的线性变换嘛,如果 x 是one-hot且 b=0 你就会发现,这不就和Embedding过程一模一样了。
最后,终于是清楚了,确认之前的操作确实没有问题。

浙公网安备 33010602011771号