在序列模型中使用填充时,Keras 验证准确性是否有效/可靠?

数据挖掘 机器学习 喀拉斯 张量流 序列到序列 语言模型
2022-03-10 15:57:07

我有一组不同长度的非零序列,我正在使用 Keras LSTM 对这些序列进行建模。我使用 Keras Tokenizer 进行标记(标记从 1 开始)。为了使序列具有相同的长度,我使用padding

填充示例:

# [0,0,0,0,0,10,3]
# [0,0,0,0,10,3,4]
# [0,0,0,10,3,4,5]
# [10,3,4,5,6,9,8]

为了评估模型是否能够泛化,我使用了一个 70/30 比率的验证集。在每个 epoch 结束时,Keras 显示了训练和验证的准确性。

我最大的疑问是使用填充时Keras 验证准确度是否可靠(当您在多个 epoch 上运行 Keras 时,在每个 epoch 结束时它会打印训练准确度和验证准确度)。因为验证集可以简单地是0 的序列 --> [0,0,0]由于有很多 0 的序列(因为 padding),模型可以很容易地正确地学习和预测 0 的序列,从而创建一个假的高验证精度。换句话说,模型可能学习零序列而不是学习真实序列。

那么,填充是否会影响 Keras 中的验证准确性?

1个回答

我知道这个答案为时已晚,但我认为它对其他读者有用。

简短的回答是肯定的!填充影响准确性。

为了处理填充的不良影响,您可以定义新的指​​标。这个新指标必须忽略与填充相关的类。

在本文中,提出了一个用于 POS 标记的 BiLSTM 模型作为序列标记任务。忽略一个类(填充类)的特殊精度度量被呈现给:

from keras import backend as K
 
def ignore_class_accuracy(to_ignore=0):
    def ignore_accuracy(y_true, y_pred):
        y_true_class = K.argmax(y_true, axis=-1)
        y_pred_class = K.argmax(y_pred, axis=-1)
 
        ignore_mask = K.cast(K.not_equal(y_pred_class, to_ignore), 'int32')
        matches = K.cast(K.equal(y_true_class, y_pred_class), 'int32') * ignore_mask
        accuracy = K.sum(matches) / K.maximum(K.sum(ignore_mask), 1)
        return accuracy
    return ignore_accuracy

请注意,在这种情况下使用 one-hot 标签。最后,您可以像这样传递新的准确性:

model.compile(loss='categorical_crossentropy',
              optimizer=Adam(0.001),
              metrics=['accuracy', ignore_class_accuracy(0)])

在训练模型中,将报告这样的输出(正常准确率为 91%,新的特殊准确率为 81%):

Epoch 1/10 1679/2054 [=======================>......] - ETA: 2:33 -
loss: 0.2901 - accuracy: 0.9147 - ignore_accuracy: 0.8118