不同批次的 LSTM 相同句子在填充序列时预测不同的分数

LSTM same sentence in different batch predict different score when padding sequence

比如我用LSTM做一个4类分类器

test_data = [
    'I have a flower', 
    'The stars are beautiful,because of a flower that cannot be seen.',
    'You know one loves the sunset,when one is so sad.'
]
test_gen = create_generator(test_data, batch_size=1)  # do padding
res = model.predict_generator(test_gen)

句子I have a flower预测分数可能喜欢:

[0.92, 0.07, 0.001, 0.009]

当我让batch_size为16时,预测分数可能

[0.84, 0.12, 0.02, 0.02]

因为句子 I have a flowertest_data 中的其他句子短,所以 它被填充到相同的长度,填充项可能是 0 或其他东西。 最后导致了这么大的不同(0.08=0.92-0.84是一个很大的数字)。

我只想知道:这是正常现象吗? 否则,如何消除这种不确定性?

Embedding添加参数mask_zero=True或添加Masking层可以消除这种“不确定性”,例如:

inputs = keras.Input(shape=(None,), dtype="int32")
x = layers.Embedding(input_dim=5000, output_dim=16, mask_zero=True)(inputs)
outputs = layers.LSTM(32)(x)

model = keras.Model(inputs, outputs)

keras-masking_and_padding

可以跳过padding值0,所以模型不会从padding值0学习知识,同一句话在不同batch输出相同的分数。