为什么高级 LSTM 模型会产生与更简单模型相同的结果?

数据挖掘 深度学习 分类 nlp lstm rnn
2022-02-04 20:15:54

我已经实现了这篇文章中提出的模型,它是一个文本分类模型,它使用句子表示,而不仅仅是单词表示来对文本进行分类。

model=tf.keras.Sequential()
embeding_layer=layers.Embedding(self.vocab_size,self.word_vector_dim,weights=[word_embeding_matrix],trainable=False,mask_zero=False)
model.add(TimeDistributed(embeding_layer))
model.add(TimeDistributed(tf.keras.layers.LSTM(50)))
model.add(tf.keras.layers.Bidirectional(costumized_lstm.Costumized_LSTM(50)))
model.add(layers.Dense(6,activation='softmax'))
opt=tf.keras.optimizers.Adam(learning_rate=0.001)
model.compile(optimizer=opt,loss='categorical_crossentropy',metrics=['accuracy',self.f1_m,self.precision_m, self.recall_m])
self.model=model

我使用一个包含 40000 个文档和 6 个不同标签的数据集来训练它。(30000 用于训练,10000 用于测试)。我使用预训练的词嵌入,该模型的输入是(样本、句子、单词)。它达到了 84% 的准确率。问题是我可以用这个简单的模型很容易地达到这个精度:

        model=tf.keras.Sequential()
    embeding_layer=layers.Embedding(self.vocab_size,self.word_vector_dim,weights=[word_embeding_matrix],trainable=False,mask_zero=False)
    model.add(embeding_layer)
    model.add(tf.keras.layers.Bidirectional(layers.LSTM(50)))
    model.add(layers.Dense(6,activation='softmax'))
    opt=tf.keras.optimizers.RMSprop(learning_rate=0.001)
    model.compile(optimizer=opt,loss='categorical_crossentropy',metrics=['accuracy',self.f1_m,self.precision_m, self.recall_m])
    self.model=model

这个不是基于句子表示的,这个模型的输入是(样本,单词)。第一个模型是什么?我的实施错了吗?我该怎么办?

两种模型的训练过程如下图所示。我也使用了所有技巧来克服过度拟合,但我没有得到任何结果。请问有什么建议吗? 在此处输入图像描述

2个回答

如果您可以使用更简单的模型获得较高的结果,那真是个好消息!总是选择更简单的模型,因为它们可能比复杂模型在更少的事情上出错(奥卡姆剃刀)。

没什么好担心的,这可能会发生。

显然,始终可能存在实现问题,因此请始终确保您的代码运行得更好。

从论文中复制结果总是很困难,因为您的工作和他们的工作之间可能存在许多不同之处:

  • 代码可能不同
  • 数据可能不同
  • 软件包版本可能不同
  • 随机性可能受到不同的控制
  • 权重可能以不同方式初始化
  • 数据可能以不同的方式输入模型
  • 硬件可能不同,尤其是 GPU 可能会导致结果略有不同

以下是我建议采取的几个步骤:

  1. 将您的数据与论文中使用的数据进行比较。您的数据集仅包含 40k 个示例,而它们的范围从 ~335k 到 ~1.57m。因此,对于更复杂的模型,您的数据集可能太小了。分别查看训练和验证数据的准确度分数也有助于弄清楚这一点。此外,我会检查定性方面,例如您的数据是否真的与评级/评论相关?或者您正在处理具有非常不同语义或不同结构的数据?

  2. 使用作者的实现测试您的数据。他们论文中的资源链接似乎不起作用,但我会尝试获取他们的代码并使用他们的实现来查看您的代码是否存在相关差异以及它在您的数据集上的执行方式。

  3. 使用作者的数据集测试您的实现。这样,您可以进一步验证第一个要点,即检查观察到的行为在多大程度上是由数据集的差异驱动的。