我是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)
如您所见,随着历元数的增加,学习曲线得到了平滑的改善。
第三,这是问题所在。我用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个时期,然后该模型开始学习和改进。在开始培训之前,我从未见过这种高原。
谁能解释这种高原现象的发生原因,为何停止并让其逐步学习以及我如何避免这种情况?
答案 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)
}
lr = 0.0001
(RMSprop的默认学习率)
lr = 0.001
lr = 0.01
lr = 0.05
这很有趣。似乎高原是由于优化器的学习率过低引起的。参数被卡在局部最优值中,直到可以爆发为止。我以前没有看过这种模式。