nn.embedding 如何开发编码器-解码器模型?

how does nn.embedding for developing an encoder-decoder model works?

this tutorial中,它教导了如何使用 pytorch 开发一个简单的带有注意力的编码器-解码器模型。 但是,在编码器或解码器中,定义了 self.embedding = nn.Embedding(input_size, hidden_size) (或类似的)。在 pytorch documents 中,nn.Embedding 被定义为“存储固定字典和大小的嵌入的简单查找 table”。 所以我很困惑,在初始化中,这个查找 table 是从哪里来的?它是否为索引初始化一些随机嵌入,然后对它们进行训练?真的有必要在 encoder/decoder 部分吗? 提前致谢。

先回答最后一点:是的,我们确实需要 Embedding 或同等水平。至少在处理离散输入时(例如语言的字母或单词),因为这些标记被编码为整数(例如 'a' -> 1,'b' -> 2 等),但是那些数字没有意义:字母 'b' 不是“像 'a',而是更多”,这是其原始编码所暗示的。所以我们提供 Embedding 以便网络可以学习如何用有用的东西来表示这些字母,例如以某种方式使元音彼此相似。

在初始化期间,嵌入向量以与模型中其他权重相同的方式随机采样,并与模型的其余部分一起进行优化。也可以从一些预训练的嵌入中初始化它们(例如从 word2vec、Glove、FastText),但是必须小心不要通过随机初始化模型的反向传播来破坏它们。


嵌入不是绝对必要的,但是强制网络学习 13314 ('items') 与 89137 ('values') 非常相似是非常浪费的,但是与 13315 ('japan') 完全不同。而且它可能甚至不会远程收敛。