我正在松散地遵循使用 Transformer 模型生成文本的 Tensorflow 教程。我创建了模型并对其进行了几次训练以进行测试,但是该模型在不到一个训练阶段的时间内就获得了 > 98% 的准确度(这对于文本生成任务来说是不可能的)并且当我要求它自己产生一个序列。如果我采用模型的 logits 输出的 argmax,我几乎总是以重复序列结束,例如“你你你你你......”或“to to to to to to to to...”
在给定特定输入起始序列的情况下分析模型的输出,我相信模型正在学习预测刚刚说的单词,而不是下一个单词,这显然是一项非常琐碎且无用的任务。
我开始相信这个问题是因为我的序列在被分割成输入和输出序列之前被填充到最大长度,这些序列在 1 个标记上移动。
例如,这是输入序列和目标序列的一个示例,由下式给出
tar_inp = target[:, :-1]
tar_real = target[:, 1:]
Target input: [ 2 24 4 6 254 1 3002 11 7999 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0]
Target real: [ 24 4 6 254 1 3002 11 7999 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0]
您可以看到最后一个非填充标记 7999 包含在输入序列和目标序列中,因为教程似乎没有考虑额外的填充。不过我不明白,因为教程中没有提到这一点。
我认为前瞻掩码考虑到了这一点,但这对我来说没有意义。我是在寻找我的问题的正确区域还是隐藏在其他地方?