Keras RNN(GRU,LSTM)产生平稳状态,然后进行改进

时间:2019-01-09 21:20:48

标签: python tensorflow machine-learning keras

我是Keras的新手(具有TensorFlow后端),并且正在使用它对用户评论进行一些简单的情绪分析。由于某种原因,我的循环神经网络产生了一些我不了解的异常结果。

首先,我的数据来自UCI ML archive,是直接的情感分析培训和测试集。有2061个训练实例,很小。数据如下:

                                                text  label
0  So there is no way for me to plug it in here i...      0
1                        Good case, Excellent value.      1
2                             Great for the jawbone.      1
3  Tied to charger for conversations lasting more...      0
4                                  The mic is great.      1

第二,这是一个可产生良好结果的FFNN实现。

# FFNN model.

# Build the model.
model_ffnn = Sequential()
model_ffnn.add(layers.Embedding(input_dim=V, output_dim=32))
model_ffnn.add(layers.GlobalMaxPool1D())
model_ffnn.add(layers.Dense(10, activation='relu'))
model_ffnn.add(layers.Dense(1, activation='sigmoid'))
model_ffnn.summary()

# Compile and train.
model_ffnn.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
EPOCHS = 50
history_ffnn = model_ffnn.fit(x_train, y_train, epochs=EPOCHS,
                              batch_size=128, validation_split=0.2, verbose=3)

如您所见,随着历元数的增加,学习曲线得到了平滑的改善。

enter image description here

第三,这是问题所在。我用GRU训练了一个递归神经网络,如下所示。我还尝试了LSTM,并看到了相同的结果。

# GRU model.

# Build the model.
model_gru = Sequential()
model_gru.add(layers.Embedding(input_dim=V, output_dim=32))
model_gru.add(layers.GRU(units=32))
model_gru.add(layers.Dense(units=1, activation='sigmoid'))
model_gru.summary()

# Compile and train.
model_gru.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
EPOCHS = 50
history_gru = model_gru.fit(x_train, y_train, epochs=EPOCHS,
                            batch_size=128, validation_split=0.2, verbose=3)

但是,学习曲线很不寻常。您会看到一个平稳期,损失和准确性都不会提高到大约第17个时期,然后该模型开始学习和改进。在开始培训之前,我从未见过这种高原。

谁能解释这种高原现象的发生原因,为何停止并让其逐步学习以及我如何避免这种情况?

enter image description here

1 个答案:

答案 0 :(得分:0)

在@Gerges Dib发表评论之后,我按升序尝试了不同的学习率。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { let storyBoard = UIStoryboard(name: "Main", bundle: nil) let viewController = storyBoard.instantiateViewController(withIdentifier: "CustomerListViewController") as! CustomerListViewController let navigationController = sideMenuController!.rootViewController as! UINavigationController navigationController.pushViewController(viewController, animated: true) sideMenuController?.hideLeftView(animated: true, completionHandler: nil) }

enter image description here

lr = 0.0001(RMSprop的默认学习率)

enter image description here

lr = 0.001

enter image description here

lr = 0.01

enter image description here

lr = 0.05

enter image description here

这很有趣。似乎高原是由于优化器的学习率过低引起的。参数被卡在局部最优值中,直到可以爆发为止。我以前没有看过这种模式。