【问题标题】:Keras: good result with MLP but bad with Bidirectional LSTMKeras:MLP 的结果很好,但双向 LSTM 的结果很差
【发布时间】:2020-04-18 16:51:54
【问题描述】:

我用Keras 训练了两个神经网络:一个MLP 和一个Bidirectional LSTM

我的任务是预测句子中的单词顺序,因此对于每个单词,神经网络必须输出一个实数。当处理一个包含 N 个单词的句子时,将输出中的 N 个实数排序,以获得表示单词位置的整数。

我在数据集上使用相同的数据集和相同的预处理。唯一不同的是,在LSTM 数据集中,我添加了填充以获得相同长度的序列。

在预测阶段,使用LSTM,我排除了从填充向量创建的预测,因为我在训练阶段屏蔽了它们。

MLP 架构:

mlp = keras.models.Sequential()

# add input layer
mlp.add(
    keras.layers.Dense(
        units=training_dataset.shape[1],
        input_shape = (training_dataset.shape[1],),
        kernel_initializer=keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None),
        activation='relu')
    )

# add hidden layer
mlp.add(
    keras.layers.Dense(
        units=training_dataset.shape[1] + 10,
        input_shape = (training_dataset.shape[1] + 10,),
        kernel_initializer=keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None),
        bias_initializer='zeros',
        activation='relu')
    )

# add output layer
mlp.add(
    keras.layers.Dense(
        units=1,
        input_shape = (1, ),
        kernel_initializer=keras.initializers.RandomUniform(minval=-0.05, maxval=0.05, seed=None),
        bias_initializer='zeros',
        activation='linear')
    )

双向 LSTM 架构:

model = tf.keras.Sequential()
model.add(Masking(mask_value=0., input_shape=(timesteps, features)))
model.add(Bidirectional(LSTM(units=20, return_sequences=True), input_shape=(timesteps, features)))
model.add(Dropout(0.2))
model.add(Dense(1, activation='linear'))

使用 LSTM 可以更好地解决该任务,它应该可以很好地捕捉单词之间的依赖关系。

但是,使用MLP 我取得了不错的结果,但使用LSTM 的结果非常糟糕。

由于我是初学者,有人能理解我的LSTM 架构有什么问题吗?我快疯了。

提前致谢。

【问题讨论】:

    标签: python keras neural-network lstm mlp


    【解决方案1】:

    对于这个问题,MLP 表现更好,其实我并不意外。

    LSTM 的架构,无论是否是双向的,都假设位置对结构非常重要。彼此相邻的词比更远的词更有可能相关。

    但是对于您的问题,您已删除该位置并正在尝试恢复它。对于这个问题,具有全局信息的 MLP 可以在排序方面做得更好。

    也就是说,我认为在改进 LSTM 模型方面还有一些工作要做。


    您可以做的一件事是确保每个模型的复杂性相似。您可以使用count_params 轻松完成此操作。

    mlp.count_params()
    model.count_params()
    

    如果我不得不猜测,您的 LSTM 会小得多。只有 20 个units,对于 NLP 问题来说似乎很小。我使用512 作为Product Classification problem 来处理字符级信息(大小为128 的词汇,大小为50 的嵌入)。在更大的数据集上训练的词级模型,比如AWD-LSTM,可以进入成千上万的units

    所以你可能想增加这个数字。您可以通过增加 LSTM 中units 的数量直到参数计数相似,来获得两个模型之间的比较。但是您不必止步于此,您可以继续增加尺寸,直到您开始过度拟合或训练开始时间过长。

    【讨论】:

    • 是的,我嵌入了这些词。如果我没记错的话,嵌入大小约为 300。总共,每个单词有 837 个特征(嵌入 + 一个热点)。那么,我必须把单位等于特征的数量吗?但是我的 LSTM 有 137,321 个参数,而 MLP 有 1.400.000。你说得对,我的模型太简单了。
    • 感谢您的更新!所以是的,我会尝试为 200 使用 10 倍以上的隐藏单元。另请参阅我的更新,MLP 实际上可能更适合这个问题。但至少现在这将是一场公平的战斗!
    • 谢谢,我试试。但是,我注意到的另一件事是参数shuffle 默认为True。你认为我必须把它交给False吗?
    • 我会将其保留为默认值 True。这是最佳做法。
    • 嗯,增加units,损失为nan。我确定数据集中没有缺失值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-13
    • 2021-02-20
    • 2019-08-14
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 2018-11-20
    相关资源
    最近更新 更多