变形金刚模型一直给出相同的翻译结果



我使用官方的变形金刚教程代码对我自己的文本数据集(遗憾的是只有500多对示例)进行翻译任务的一些修改。仅对标记器进行更改(我使用tf.keras.preprocessing.text.Tokenizer()来适应我自己的文本数据集),变形器模型训练良好,最后一个epoch得到以下内容:

Epoch 30 Batch 50 Loss 0.0677 Accuracy 0.9823

但是当我使用训练有素的翻译器时,无论输入什么文本,所有的结果都是相同的。结果实际上是相当流畅和合理的(肯定是生成的,而不是训练集之一),但它与输入文本不相关。

我的参数是:

num_layers = 4
d_model = 128
dff = 512
num_heads = 8
dropout_rate = 0.1
BUFFER_SIZE = 20000
BATCH_SIZE = 64
EPOCHS = 30
MAX_TOKENS = 413

我知道这一定与数据集有关,但是有人有同样的问题吗?它收敛到局部极小值了吗?关键问题是什么?

这表明一个模型崩溃了,或者没有学习。它通常意味着出了重大问题。调试神经网络并不简单,因为没有路标,没有语法错误告诉你该走哪条路。我通常首先将实际数据可视化到模型中(不是您认为传入的数据,而是模型实际持有的数据,预处理中的错误非常常见,至少在我的代码中是这样)。但是有很多很好的关于调试神经网络的教程,所以我将引导你通过这些教程。

这里有一个这样的教程,来自我最信任的数据科学信息来源之一:

https://towardsdatascience.com/checklist-for-debugging-neural-networks-d8b2a9434f21

我建议你开始学习这个或类似的教程。当你遇到更具体的问题,你需要帮助,单独的,专门的问题,与调试步骤相关的细节(理想情况下,一些代码或示例和预期的输入/输出,如果可能的话)。你的问题太宽泛了,无法给出一个灵丹妙药。

教程的问题是Transformer调用只接受单个批处理或64个句子并将其用于训练,而不考虑数据集的剩余部分。我正在尝试修改Transformer类,以便它使用整个数据集进行训练,稍后我会发布答案

最新更新