使用keras避免顺序过度拟合到顺序问题
Avoid overfitting in sequence to sequence problem using keras
我要训练的模型有问题。
这是一个典型的带有注意力层的seq-to-seq问题,输入是字符串,输出是提交字符串的子字符串。
例如
Input Ground Truth
-----------------------------
helloimchuck chuck
johnismyname john
(这只是一个虚拟数据,不是数据集的真实部分^^)
模型看起来像这样:
model = Sequential()
model.add(Bidirectional(GRU(hidden_size, return_sequences=True), merge_mode='concat',
input_shape=(None, input_size))) # Encoder
model.add(Attention())
model.add(RepeatVector(max_out_seq_len))
model.add(GRU(hidden_size * 2, return_sequences=True)) # Decoder
model.add(TimeDistributed(Dense(units=output_size, activation="softmax")))
model.compile(loss="categorical_crossentropy", optimizer="rmsprop", metrics=['accuracy'])
这里的问题是:
如您所见,存在过度拟合。
我在 patience=8
的验证损失上使用提前停止标准。
self.Early_stop_criteria = keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0,
patience=8, verbose=0,
mode='auto')
我正在使用单热向量来拟合模型。
BATCH_SIZE = 64
HIDDEN_DIM = 128
事实是,我尝试过其他批量大小、其他隐藏维度、10K 行、15K 行、25K 行和现在 50K 行的数据集。但是,总是过拟合,不知道为什么。
test_size = 0.2
和 validation_split=0.2
。这些是我唯一没有改变的参数。
我还确保数据集正确构建。
我唯一的想法是尝试另一个验证拆分,也许 0.33
而不是 0.2
。
我不知道 cross-validation
是否有帮助。
也许有人有更好的主意,我可以试试。提前致谢。
正如 kvish 所建议的,dropout 是一个很好的解决方案。
我首先尝试了 0.2 的 dropout。
model = Sequential()
model.add(Bidirectional(GRU(hidden_size, return_sequences=True, dropout=0.2), merge_mode='concat',
input_shape=(None, input_size))) # Encoder
model.add(Attention())
model.add(RepeatVector(max_out_seq_len))
model.add(GRU(hidden_size * 2, return_sequences=True)) # Decoder
model.add(TimeDistributed(Dense(units=output_size, activation="softmax")))
model.compile(loss="categorical_crossentropy", optimizer="rmsprop", metrics=['accuracy'])
对于 50K 行,它有效,但仍然存在过度拟合。
所以,我尝试了 0.33 的 dropout,并且效果很好。
我要训练的模型有问题。
这是一个典型的带有注意力层的seq-to-seq问题,输入是字符串,输出是提交字符串的子字符串。
例如
Input Ground Truth
-----------------------------
helloimchuck chuck
johnismyname john
(这只是一个虚拟数据,不是数据集的真实部分^^)
模型看起来像这样:
model = Sequential()
model.add(Bidirectional(GRU(hidden_size, return_sequences=True), merge_mode='concat',
input_shape=(None, input_size))) # Encoder
model.add(Attention())
model.add(RepeatVector(max_out_seq_len))
model.add(GRU(hidden_size * 2, return_sequences=True)) # Decoder
model.add(TimeDistributed(Dense(units=output_size, activation="softmax")))
model.compile(loss="categorical_crossentropy", optimizer="rmsprop", metrics=['accuracy'])
这里的问题是:
如您所见,存在过度拟合。
我在 patience=8
的验证损失上使用提前停止标准。
self.Early_stop_criteria = keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0,
patience=8, verbose=0,
mode='auto')
我正在使用单热向量来拟合模型。
BATCH_SIZE = 64
HIDDEN_DIM = 128
事实是,我尝试过其他批量大小、其他隐藏维度、10K 行、15K 行、25K 行和现在 50K 行的数据集。但是,总是过拟合,不知道为什么。
test_size = 0.2
和 validation_split=0.2
。这些是我唯一没有改变的参数。
我还确保数据集正确构建。
我唯一的想法是尝试另一个验证拆分,也许 0.33
而不是 0.2
。
我不知道 cross-validation
是否有帮助。
也许有人有更好的主意,我可以试试。提前致谢。
正如 kvish 所建议的,dropout 是一个很好的解决方案。
我首先尝试了 0.2 的 dropout。
model = Sequential()
model.add(Bidirectional(GRU(hidden_size, return_sequences=True, dropout=0.2), merge_mode='concat',
input_shape=(None, input_size))) # Encoder
model.add(Attention())
model.add(RepeatVector(max_out_seq_len))
model.add(GRU(hidden_size * 2, return_sequences=True)) # Decoder
model.add(TimeDistributed(Dense(units=output_size, activation="softmax")))
model.compile(loss="categorical_crossentropy", optimizer="rmsprop", metrics=['accuracy'])
对于 50K 行,它有效,但仍然存在过度拟合。
所以,我尝试了 0.33 的 dropout,并且效果很好。