Machine learning 可变序列批次的采样softmax损耗?

Machine learning 可变序列批次的采样softmax损耗?,machine-learning,tensorflow,deep-learning,recurrent-neural-network,sequence-to-sequence,Machine Learning,Tensorflow,Deep Learning,Recurrent Neural Network,Sequence To Sequence,背景信息:我正在研究序列到序列模型,现在我的模型接受可变长度输入张量(而不是列表),输入形状对应于[批量大小,序列长度]。但是,在我的实现中,未指定序列长度(设置为None)以允许可变长度输入。具体来说,输入序列批次仅填充到该批次中最长序列的长度。这大大加快了我的训练时间,因此我更愿意保持这种方式,而不是回到带扣的模型和/或将训练数据中的所有序列填充到相同的长度。我使用的是TensorFlow 1.0.0 问题:我目前正在使用以下公式计算损失(运行正常) 其中vocab大小通常约为40000。我

背景信息:我正在研究序列到序列模型,现在我的模型接受可变长度输入张量(而不是列表),输入形状对应于[批量大小,序列长度]。但是,在我的实现中,未指定序列长度(设置为None)以允许可变长度输入。具体来说,输入序列批次仅填充到该批次中最长序列的长度。这大大加快了我的训练时间,因此我更愿意保持这种方式,而不是回到带扣的模型和/或将训练数据中的所有序列填充到相同的长度。我使用的是TensorFlow 1.0.0

问题:我目前正在使用以下公式计算损失(运行正常)

其中vocab大小通常约为40000。我想使用采样的softmax,但我遇到了一个问题,这是由于输入形状的未指定性质造成的。根据,它要求为每个时间步分别输入。但是,我不能打电话,比如

tf.unstack(target_labels, axis=1)

因为轴心事先是未知的。有人知道我将如何实现这一点吗?有人会假设,由于dynamic_rnn和似乎在这样做时没有问题,因此可以通过某种方式使用采样的softmax损耗来实现一种变通方法。在对源代码甚至模型库进行了深入研究之后,我空手而归。如果您有任何帮助/建议,我们将不胜感激。

因此,您希望取消堆叠的原因是为每个时间步选择不同的负片样本。在批次维度上进行不同的负样本是否可行?如果你总是有相同的训练批量,这可能会起作用。我同意Aaron的观点,如果你手动进行负采样,准备真实的日志和采样的日志并计算损失,你可以查看
sampled\u softmax\u loss
nce\u loss
的源代码了解如何进行负采样。顺便说一句,填充在TensorFlow、TensorFlow褶皱或PyTorch的rnn中真的很烦人。也许更好的选择有趣,我没想到。现在我想起来了,这不是更正确的负采样方法吗?据我所知,算法(来自Cho et al.,2015)是针对给定序列,在输出分布的子集上定义的。我看不出在没有之前的输出标记的情况下如何准确地实现算法。我想是时候深入研究源代码了。另外,为什么你说填充在TF中是令人讨厌的,而不是其他的呢?谢谢你的建议。所以你想要取消堆叠的原因是为每个时间步选择不同的负片样本。在批次维度上进行不同的负样本是否可行?如果你总是有相同的训练批量,这可能会起作用。我同意Aaron的观点,如果你手动进行负采样,准备真实的日志和采样的日志并计算损失,你可以查看
sampled\u softmax\u loss
nce\u loss
的源代码了解如何进行负采样。顺便说一句,填充在TensorFlow、TensorFlow褶皱或PyTorch的rnn中真的很烦人。也许更好的选择有趣,我没想到。现在我想起来了,这不是更正确的负采样方法吗?据我所知,算法(来自Cho et al.,2015)是针对给定序列,在输出分布的子集上定义的。我看不出在没有之前的输出标记的情况下如何准确地实现算法。我想是时候深入研究源代码了。另外,为什么你说填充在TF中是令人讨厌的,而不是其他的呢?谢谢你的建议。
tf.unstack(target_labels, axis=1)