使用深度学习将一个嵌入映射到另一个嵌入

数据挖掘 深度学习 喀拉斯 词嵌入 嵌入
2022-03-04 19:33:51

我正在尝试编写一个具有一个嵌入的输入向量的模型(例如E1) 并预测第二个嵌入中的对应向量E2. 两者都是 n 维实稠密向量Rn.

具体一个是skipgram word embedding,另一个是node2vec graph embedding。我有大约 30 000 个训练示例,它们提供了两者之间的映射。因为它们都是真实的向量,所以编写一个简单的 MLP 来学习一个到另一个的非线性变换似乎是一项微不足道的任务(我实际上并不关心这里的过度拟合,因为域是封闭的) .

但是,我似乎无法让它正常工作。

在 Keras 中,天真地这样的事情应该可以工作:

in = Input(e1_dim)
hidden = Dense(some_value, activation="tanh")(in)
out = Dense(e2_dim)(hidden)

我尝试添加更多隐藏层,但我认为我的问题在于输入和输出向量在域 (-1,1) 中,因此初始化器、损失函数和激活函数的选择至关重要。

我尝试将初始化程序设置为 RandomUniform,但仍然没有好的结果。对于损失,我尝试了 MAE en cosine_proximity,但两者似乎都产生了可怕的结果。特别是 cosine_proximity 似乎没有超过 -0.5,这可能是一个迹象。关于将一个嵌入映射到另一个嵌入的架构和损失函数的选择(本质上是高维非线性回归?)

1个回答

你应该考虑几个因素:

  • some_value是这里的关键。您可能应该选择一个大于e1_dim和的值e2_dim由于高嵌入维度需要大量内存,这可能是一个问题。
  • 如果e2_dim有界(1,+1),您可能想tanh在最后一层(即在 之后Dense(e2_dim))设置激活。有了这些,您可能希望用 ReLU 替换隐藏层的激活,以避免不必要地压缩梯度
  • 如果您的嵌入是定向的,或者它们在单位球中,那么您应该可以使用cosine_proximity. 也许更好的选择是使用von Mises-Fischer distance,但我认为这并不简单。否则,你可以试试World-Mover's Distance

话虽如此,许多嵌入式空间映射都假设嵌入式空间是近似同构的,并且只是进行线性变换。你可能想看看相关的双语嵌入映射文献;你可以从Artetxe et al., 2016的工作开始。我不知道在您的场景中是否在任何程度上满足了上述假设(skipgramnode2vec),但您可以使用VF2 算法评估这一点,如 Artetxe 等人。做过。