为了处理不同长度的序列,我们使用分桶和填充。在分桶中,我们为一些 max_len 制作不同的桶,我们这样做是为了减少填充量,在制作不同的桶之后,我们在不同的桶上训练不同的模型。
这是我到目前为止发现的。但我不明白的是,所有不同的模型是如何训练的,以及它们是如何用于翻译新句子的?
为了处理不同长度的序列,我们使用分桶和填充。在分桶中,我们为一些 max_len 制作不同的桶,我们这样做是为了减少填充量,在制作不同的桶之后,我们在不同的桶上训练不同的模型。
这是我到目前为止发现的。但我不明白的是,所有不同的模型是如何训练的,以及它们是如何用于翻译新句子的?
在训练和推理时,算法都需要选择最适合当前输入句子(或批次)的网络。通常,它只取输入大小大于或等于句子长度的最小桶。
例如,假设只有两个桶[10, 16]
和[20, 32]
:第一个桶接受任何输入到长度10
(填充到恰好10
)并输出翻译后的句子到长度16
(填充到16
)。同样,第二个存储桶处理最大长度的输入20
。这些桶对应的两个网络接受不相交的输入集。
那么对于length这个句子,8
最好选择第一个bucket。请注意,如果这是一个测试句子,第二个存储桶也可以处理它,但在这种情况下,它的神经网络已经在更大的句子上训练,从11
到20
单词,所以它可能不能很好地识别这个句子。对应于第一个存储桶的网络已经接受了输入1
的训练10
,因此是一个更好的选择。
25
如果测试句子的长度超过任何可用的桶,您可能会遇到麻烦。这里没有通用的解决方案。这里最好的做法是修剪20
单词的输入并尝试翻译。