关于tf.keras.losses中Reduction参数SUM与SUM_OVER_BATCH_SIZE的疑问
Keras MeanAbsoluteError: Reduction 参数计算逻辑与命名疑问解答
首先要明确:你的推导完全正确! 我们先结合你的例子再梳理一遍,然后解答命名的疑问。
一、验证你的计算逻辑
给定输入:
y_true = [[0., 2.], [0., 0.]] y_pred = [[3., 1.], [2., 5.]]
1. Reduction.SUM 场景
计算逻辑是每个样本的MAE值直接求和:
- 第一个样本的MAE:
(abs(3-0) + abs(1-2)) / 2 = 4/2 = 2 - 第二个样本的MAE:
(abs(2-0) + abs(5-0)) / 2 =7/2=3.5 - 最终损失:
2 + 3.5 = 5.5,和你得到的结果完全一致。
2. 默认的 Reduction.SUM_OVER_BATCH_SIZE 场景
计算逻辑是所有样本MAE的总和除以批量大小(样本数量):
- 用SUM场景的总和
5.5除以样本数2,得到5.5/2=2.75,和你推导的结果匹配。
二、为什么命名为 SUM_OVER_BATCH_SIZE?
这个命名确实容易让人困惑,它的本质就是批量样本的平均损失,命名的逻辑来自它的计算步骤:
- 先对批量内所有样本的损失值做**求和(SUM)**操作
- 再将这个总和除以批量大小(OVER_BATCH_SIZE)
之所以不直接叫MEAN,是因为在Keras的设计逻辑里,损失的平均有两种维度:一种是按样本数量平均(就是SUM_OVER_BATCH_SIZE),另一种是按所有元素总数平均。而MeanAbsoluteError本身是先计算每个样本的元素平均误差,再进行批量维度的处理,所以用SUM_OVER_BATCH_SIZE来明确它是“先求和样本损失,再除以样本数”的平均方式。
简单来说,这个命名是在描述它的计算过程,而不是直接描述结果(平均损失),这才导致了你的疑问。
内容的提问来源于stack exchange,提问作者Rajdeep Dutta
相关产品推荐
相关产品推荐

