【问题标题】:Problem with text prediction LSTM neural networks文本预测 LSTM 神经网络的问题
【发布时间】:2019-11-08 10:22:48
【问题描述】:

我正在尝试使用递归神经网络 (LSTM) 和书籍数据集进行文本预测。不管我尝试改变图层大小或其他参数多少,它总是过拟合。

我一直在尝试更改层数、LSTM 层中的单元数、正则化、归一化、batch_size、shuffle 训练数据/验证数据、将数据集更改为更大。现在我尝试使用 ~140kb txt 书。我也试过 200kb、1mb、5mb。

创建训练/验证数据:

sequence_length = 30

x_data = []
y_data = []

for i in range(0, len(text) - sequence_length, 1):
    x_sequence = text[i:i + sequence_length]
    y_label = text[i + sequence_length]

    x_data.append([char2idx[char] for char in x_sequence])
    y_data.append(char2idx[y_label])

X = np.reshape(x_data, (data_length, sequence_length, 1))
X = X/float(vocab_length)
y = np_utils.to_categorical(y_data)

# Split into training and testing set, shuffle data
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=0.2, shuffle=False)

# Shuffle testing set
X_test, y_test = shuffle(X_test, y_test, random_state=0)

创建模型:

model = Sequential()
model.add(LSTM(256, input_shape=(X.shape[1], X.shape[2]), return_sequences=True, recurrent_initializer='glorot_uniform', recurrent_dropout=0.3))
model.add(LSTM(256, return_sequences=True, recurrent_initializer='glorot_uniform', recurrent_dropout=0.3))
model.add(LSTM(256, recurrent_initializer='glorot_uniform', recurrent_dropout=0.3))
model.add(Dropout(0.2))
model.add(Dense(y.shape[1], activation='softmax'))

编译模型:

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

我得到以下特征:

我不知道如何处理这种过度拟合,因为我在网上搜索,尝试了很多东西,但似乎都没有效果。

我怎样才能获得更好的结果?这些预测现在似乎不太好。

【问题讨论】:

  • 我不确定问题是什么但是如果你有足够的时代,模型总是过拟合。这就是为什么您要根据验证集提前停止。您可以尝试延迟过拟合、减少过拟合、分析过拟合,但您的模型总是介于过拟合和欠拟合之间(两者都发生在数据集的子集上)。
  • 在 10 纪元提前停止?你也尝试过非常极端的正则化或辍学吗?而且,您的验证错误不会增加,因此您的网络不会变得更糟。您可能没有过度拟合,但可能只是提取了数据集中可用的尽可能多的知识。你的验证错误永远不会像你的训练错误那么好。您的图表显示,是的,它可能正在学习训练中的噪音,但这并不会以样本中更糟糕的模型为代价。经典的过拟合会显示蓝线开始向上弯曲(或向下弯曲以提高准确性)。
  • 正如@Dan 正确暗示的那样,您没有过拟合;这将需要您的 val loss 开始增加(精度降低),这显然不会在这里发生(请参阅this thread)。您的模型刚刚饱和,无法进一步学习(但也不会变得更糟)。此外,默认情况下不应使用 dropout - 它可能导致performance degradation
  • 如果需要,我会在 5 点提前停止......如果你真的想提前 30 轮停止,你可以随时降低学习率或 ES epsilon,但它不会改变任何事情总体最终结果。 ES 适用于过拟合和饱和(不知道确切的词,但这个词很清楚),所以无论如何都使用它是一个好习惯。
  • @michalovsky 您的网络中有多少参数?请参阅 model.summary()。您可能应该将堆叠 LSTM 的数量从 3 个减少到 1 个或 2 个对您有用。

标签: python tensorflow machine-learning keras neural-network


【解决方案1】:

以下是我接下来要尝试的一些事情。 (本人也是业余爱好者,如有错误请指正)

  1. 尝试从文本中提取vector representation。试用 word2vec、GloVe、FastText、ELMo。提取向量表示,然后将它们输入网络。你也可以创建一个embedding layer 来帮助解决这个问题。这个blog 有更多信息。
  2. 256 经常性单位可能太多。我认为永远不应该从庞大的网络开始。从小处着手。看看你是否欠拟合。如果是,那就扩大规模。
  3. 关闭优化器。我发现亚当倾向于过度拟合。我使用 rmsprop 和 Adadelta 取得了更好的成功。
  4. 也许,attention is all you need? Transformers 最近为 NLP 做出了巨大贡献。也许您可以在您的网络中尝试implementing simple soft attention mechanism。如果您还不熟悉,这里是nice video series。上面有一个interactive research paper
  5. CNN 在 NLP 应用程序中也是 pretty dope。尽管它们直观地对文本数据没有任何意义(对大多数人来说)。也许你可以尝试利用它们,堆叠它,等等。玩。这是一个guide,关于如何使用它进行句子分类。我知道,你的域是不同的。但我认为直觉继续存在。 :)

【讨论】:

  • 感谢您的回答,我的应用程序是面向字符的,而不是单词,因此不需要嵌入。这就像 x = 50 个字符的顺序,y = 一个带有下一个字符的热标签,然后移动一个字符和下一个 50 个字符。我会尝试你描述的其他想法。
猜你喜欢
  • 2022-08-15
  • 1970-01-01
  • 1970-01-01
  • 2017-08-02
  • 1970-01-01
  • 1970-01-01
  • 2022-12-23
  • 1970-01-01
  • 2017-12-02
相关资源
最近更新 更多