为什么我的注意力模型不如非注意力模型

我的任务是将英文句子转换为德文句子。我首先使用普通的编码器-解码器网络进行了尝试,取得了相当不错的结果。随后,我尝试使用与之前完全相同的模型,但加入了Bahdanau注意力机制。然而,没有注意力的模型表现超过了有注意力的模型。

没有注意力的模型在5个epoch内损失从大约8.0降至1.4,在10个epoch内降至1.0,之后损失仍在继续减少,但速度变慢了。

有注意力的模型在5个epoch内损失从大约8.0降至2.6,之后几乎没有继续学习。

两个模型都没有过拟合,因为验证集的损失也在减少。

每个英文句子在填充后包含47个单词,每个德文句子在填充后包含54个单词。我的训练集中有7000个英文和7000个德文句子,验证集中有3000个句子。

我几乎尝试了一切方法:不同的学习率,不同的优化器,不同的批次大小,不同的激活函数,尝试应用批量和层归一化,以及对编码器和解码器使用不同数量的LSTM单元,但这些都没有带来显著的差异,除了归一化和增加数据量,后者使得损失降至大约1.5,但之后又停止学习!

为什么会发生这种情况?为什么带有Bahdanau注意力的模型失败了,而没有注意力的模型表现良好?

编辑1 – 我尝试在注意力之前、之后以及注意力前后都应用层归一化。结果在每种情况下大致相同。但这次,损失在5个epoch内从大约8.0降至2.1,然后又几乎没有继续学习。但大多数学习是在第一个epoch完成的,因为在第一个epoch结束时损失大约达到了2.6,然后在下一个epoch降至2.1,之后几乎没有继续学习。

尽管如此,没有任何注意力的模型依然超过了同时应用了注意力和层归一化的模型。这可能是什么原因?我的结果是否可能的?为什么一个没有任何归一化、没有dropout层的普通编码器-解码器网络能够表现得比同时应用了注意力和层归一化的模型更好?

编辑2 – 我尝试增加数据量(比之前多7倍),这次两个模型的表现都有了很大提升。但没有注意力的模型仍然表现得比有注意力的模型更好。为什么会这样?

编辑3 – 我尝试通过首先只传递整个训练数据集中的一个样本来调试模型。损失从大约9.0开始减少并收敛到0。然后,我尝试传递2个样本,损失再次从大约9.0开始,但这次在前400个epoch内一直在1.5和2.0之间徘徊,然后慢慢减少。这是一个当我只用2个样本训练时的损失减少图:

enter image description here

这是一个当我只用1个样本训练时的损失减少图:

enter image description here


回答:

感谢大家的帮助……这是一个实现问题……解决这个问题后,注意力模型的表现超过了普通的编码器-解码器模型!

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注