【问题标题】:Training a RNN to output word2vec embedding instead of logits训练 RNN 以输出 word2vec 嵌入而不是 logits
【发布时间】:2024-07-10 08:40:02
【问题描述】:

传统上,RNN 似乎使用 logits 来预测序列中的下一个时间步。在我的情况下,我需要 RNN 来输出 word2vec(50 深度)向量预测。这意味着成本函数基于 2 个向量:Y 系列中下一个单词的实际向量和Y_hat,网络预测。

我尝试使用 cosine distance 成本函数,但网络似乎没有学习(我让它在 AWS P3 上再运行 10 个小时,成本始终在 0.7 左右)

这样的模型可能吗?如果是这样,应该使用什么成本函数?

TF 中的余弦距离:

cosine_distance = tf.losses.cosine_distance(tf.nn.l2_normalize(outputs, 2), tf.nn.l2_normalize(targets, 2), axis=2)

更新: 我正在尝试预测 word2vec,因此在采样期间我可以根据预测向量的最近邻居选择下一个单词。

【问题讨论】:

  • 很难说为什么没有发生收敛,因为它可能是许多超参数的函数。但是,有一件事让我印象深刻:在损失计算中发生标准化的余弦距离不会模棱两可吗?可能有无限多个具有相同损失的向量(例如,任何重新缩放)。因此,也许在训练过程中,它会围绕相似向量的一系列不同缩放比例振荡,并且这些比例会不断产生相同的损失,因此看不出它们之间有任何区别。
  • 也许在损失之前将归一化步骤添加为一层,因此网络只能产生归一化向量,而梯度将是 w.r.t.每个组件中的标准化值。否则,也许尝试使用不同的损失,例如向量差的均方误差,也许还添加一个核正则化器来惩罚预测向量的 l2 范数。至少,只是看看收敛特性是否与余弦距离情况不同。如果不是,那么可能需要研究批量大小、梯度问题和其他超参数。
  • 我也被成本只有一个标量值所困扰,因为 word2vec 的“空间”信息会丢失。我也尝试过使用 MSE,但我无法让它工作。我会尝试你的建议,看看我是否能让 MSE 工作

标签: python tensorflow machine-learning deep-learning


【解决方案1】:

您想要预测词嵌入的原因是什么?您从哪里获得“基本事实”词嵌入?对于 word2vec 模型,您通常会在未来的模型中重新使用经过训练的词嵌入。如果您训练了一个嵌入大小为 50 的 word2vec 模型,那么您将拥有 50 维的嵌入,您可以保存并在未来的模型中使用。如果您只想重新创建现有的地面实况 word2vec 模型,那么您可以只使用这些值。典型的 word2vec 将通过continuous-bag-of-words or skip-gram 获得常规的 softmax 输出,然后保存生成的词嵌入。

如果您确实有理由尝试生成一个创建尝试匹配 w​​ord2vec 的模型,那么查看您的损失函数这里有一些建议。我不认为你应该标准化你的输出或目标——你可能希望它们不受影响(如果你已经标准化它们,目标就不再是“基本事实”目标。此外,你似乎正在使用@987654323 @ 现在已被弃用并替换为 axis。您是否为 dim 尝试了不同的值?这应该代表计算余弦距离的维度,我认为 0th 维度将是错误的维度(因为这可能应该是批量大小。我会尝试使用 axis=-1(最后一个维度)或 axis=1 的值,看看你是否发现任何差异。

另外,您的优化器/学习率是多少?如果学习率太小,那么您实际上可能无法朝着正确的方向移动。

【讨论】:

  • 您可能想要这样做的一个原因是,您现在拥有一个训练有素的网络,能够将以前看不见的单词映射到它的向量嵌入表示中。特别是如果您从生成 word 嵌入向量的基于字符的模型开始。目标值将是构成原始单词的给定单热编码字符值矩阵的整个嵌入向量。在单词大小的限制下,这将允许您嵌入原本不在 word2vec 字典中的新单词。
  • 谢谢。我已经用一些背景更新了我的问题,为什么我希望模型输出 word2vec。对于轴,确实这是错误的,实际代码中的一个是 2,因为我的输入是形状(批量大小 * 序列 len * 嵌入深度)。我已经更新了代码。学习率从 0.01 开始下降到 0.00x。我也在使用斯坦福预训练的 GloVe word2vecs
  • @silkAdmin 我仍然不清楚为什么学习传统的词嵌入是不够的,或者为什么你不能首先使用 GloVe word2vecs?你什么时候做这个采样?你是说你有一个单词序列并且你想预测下一个单词吗? “连续词袋”模型是在给定目标词之前和之后的几个词的上下文的情况下尝试预测词的模型。因此,从这个意义上说,您似乎仍然应该通过 softmax 使用连续的词袋来训练词嵌入。为什么这对您的任务不起作用?
  • 我确实使用了预训练的 word2vec。与传统文本生成 RNN 模型的唯一区别是我希望网络输出 word2vec 估计而不是概率。这将允许我在采样期间在我的字典中搜索“最近的向量”,而不是使用随机函数来选择下一个单词。
  • 现在说得通了——我假设你也在使用cosine_distance 来选择最近的向量?既然你已经固定了轴——你的学习是否更好?你试过没有学习率衰减吗?如果什么都没学(或学得很少),你就不想降低学习率