为了处理不同长度的序列,我们使用分桶和填充。在存储桶中,我们为某些 max_len 创建不同的存储桶,这样做是为了减少填充量,在创建不同的存储桶后,我们在不同的存储桶上训练不同的模型。
这是我迄今为止发现的。但我不明白的是,这些不同的模型是如何训练的以及它们如何用于翻译新句子?
最佳答案
在训练和推理时,算法都需要选择最适合当前输入句子(或批处理)的网络。通常,它只是取输入大小大于或等于句子长度的最小桶。
例如,假设只有两个存储桶 [10, 16]
和 [20, 32]
:第一个存储桶接受长度为 的任何输入10
(恰好填充到 10
),并输出长度为 16
的翻译句子(填充到 16
)。同样,第二个存储桶处理长度为 20
的输入。与这些桶对应的两个网络接受不相交的输入集。
那么,对于长度8
的句子,最好选择第一个桶。请注意,如果这是一个测试句子,第二个存储桶也可以处理它,但在这种情况下,它的神经网络已经接受了更大句子的训练,从 11
到 20
单词,所以很可能不能很好地识别这句话。与第一个存储桶对应的网络已在输入 1
到 10
上进行了训练,因此是更好的选择。
如果测试语句的长度25
,比任何可用的存储桶都长,您可能会遇到麻烦。这里没有通用的解决方案。这里最好的做法是将输入修剪为 20
个单词,并尝试翻译。
关于machine-learning - Seq2Seq模型中Bucketing的概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49367871/