在本教程中,它教授如何使用 pytorch 开发一个简单的带有注意力的编码器-解码器模型。然而,在编码器或解码器中,self.embedding = nn.Embedding(input_size, hidden_size)
(或类似的)是定义的。在pytorch 文档中,nn.Embedding 被定义为“存储固定字典和大小的嵌入的简单查找表”。所以我很困惑,在初始化时,这个查找表是从哪里来的?它是否为索引初始化了一些随机嵌入,然后它们将被训练?真的有必要在编码器/解码器部分吗?提前致谢。
问问题
145 次
1 回答
0
首先回答最后一点:是的,我们确实需要Embedding
或等价物。至少在处理离散输入时(例如语言的字母或单词),因为这些标记被编码为整数(例如 'a' -> 1、'b' -> 2 等),但这些数字不携带含义:字母'b'不是“像'a',而是更多”,它的原始编码暗示了这一点。因此,我们提供了Embedding
使网络可以学习如何用一些有用的东西来表示这些字母,例如使元音在某种方式上彼此相似。
在初始化期间,嵌入向量以与模型中其他权重相同的方式随机采样,并且还与模型的其余部分一起得到优化。也可以从一些预训练的嵌入(例如从 word2vec、Glove、FastText)初始化它们,但必须小心不要通过随机初始化模型的反向传播破坏它们。
嵌入并不是绝对必要的,但是强制网络学习 13314(“items”)与 89137(“values”)非常相似,但与 13315(“japan”)完全不同,这将是非常浪费的。无论如何,它甚至可能不会远程收敛。
于 2020-10-05T08:32:15.977 回答