我正在处理时间序列,并了解到keras.layers.Masking
和keras.layers.Embedding
对于在网络中创建mask
值非常有用,该值指示要“跳过”的时间步。mask
值在整个网络中传播,以供任何支持它的层使用。
Keras documentation没有指定mask
值的任何进一步影响。我的期望是掩码将应用于模型训练和评估中的所有函数,但我没有看到任何支持这一点的证据。
mask
值是否会影响反向传播?mask
值是否影响损失函数或指标?
1.使用model.compile()
中的sample_weight
参数来告诉Keras“忽略”损失函数中的屏蔽时间步是明智还是愚蠢?
1条答案
按热度按时间3qpi33ja1#
我做了一些实验来回答这些问题。
下面是我的示例代码:
哪些输出
掩模和损耗计算
令人惊讶的是,“mae”(平均绝对误差)损失计算并没有从计算中排除屏蔽的时间步骤。相反,它假设这些时间步骤的损失为零--完美的预测。因此,每个屏蔽的时间步骤实际上都减少了计算的损失!
更详细地解释:上面的示例代码输入
x
有10个时间步。其中4个被掩码删除,因此剩下6个有效的时间步。“平均绝对误差”损失计算将6个有效时间步的损失相加,然后除以 10 而不是除以 6。在我看来这是一个bug。输出值被屏蔽
屏蔽时间步长的输出值不会影响模型定型或评估(这是应该的)。
这可以通过设置以下内容轻松测试:
y_true[~mask] = 1e6
个模型权重、预测和损失保持完全相同。
输入值被屏蔽
屏蔽时间步长的输入值不会影响模型定型或评估(这是应该的)。
类似地,我可以将
mask_value
从0更改为任何其他数字,而得到的模型权重、预测和损失保持完全相同。总结:
Q1:实际上是的-掩码影响损失函数,该函数通过反向传播用于更新权重。
Q2:是的,但口罩会以一种意想不到的方式影响损失。
Q3:一开始很愚蠢--面具应该已经被应用到损失计算中了。但是,也许
sample_weights
对纠正意外的损失计算方法是有价值的...请注意,我使用的是Tensorflow 2.7.0。