我在训练一个模型时遇到了问题。
这是一个典型的带有注意力层的序列到序列问题,输入是一个字符串,输出是从提交的字符串中提取的子串。
例如:
Input Ground Truth-----------------------------helloimchuck chuckjohnismyname john
(这只是一个示例数据,不是数据集的真实部分 ^^)
模型看起来是这样的:
model = Sequential()model.add(Bidirectional(GRU(hidden_size, return_sequences=True), merge_mode='concat', input_shape=(None, input_size))) # Encodermodel.add(Attention())model.add(RepeatVector(max_out_seq_len))model.add(GRU(hidden_size * 2, return_sequences=True)) # Decodermodel.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 = 64HIDDEN_DIM = 128
问题是,我尝试了不同的批量大小,不同的隐藏维度,10K行、15K行、25K行和现在的50K行的数据集。然而,总是存在过拟合,我不知道为什么。
test_size = 0.2
和 validation_split=0.2
是唯一没有改变的参数。
我还确保了数据集的正确构建。
我唯一的想法是尝试使用不同的验证分割,也许是0.33
而不是0.2
。
我不知道交叉验证
是否会有所帮助。
也许有人有更好的建议,我可以尝试。提前感谢您。
回答:
正如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))) # Encodermodel.add(Attention())model.add(RepeatVector(max_out_seq_len))model.add(GRU(hidden_size * 2, return_sequences=True)) # Decodermodel.add(TimeDistributed(Dense(units=output_size, activation="softmax")))model.compile(loss="categorical_crossentropy", optimizer="rmsprop", metrics=['accuracy'])
使用50K行数据时,它起作用了,但仍然存在过拟合。
所以,我尝试了0.33的dropout率,结果完美解决了问题。