输入和目标已归一化到[0,1]且全层用ReLU,为何网络输出超过1?
全ReLU网络输入输出归一至[0,1]后输出超过1的核心原因
- 输出层无上界约束
ReLU激活函数本身的取值范围是[0, +∞),如果你的网络输出层也使用ReLU作为激活,没有额外添加sigmoid或者值域截断操作,只要输出层的线性计算结果大于1,ReLU会直接输出原值,自然会出现超过1的情况。你对目标数据做的[0,1]归一化只是设置了拟合的目标区间,并没有给网络输出添加强制值域限制。 - 多层非负输出的累加放大效应
所有层都用ReLU的情况下,每一层的输出都是非负值,叠加多层线性变换后很容易出现数值放大:比如前一层输出的多个特征值均为0.9,下一层对应权重均为2,仅单组特征的线性计算结果就达到1.8,多特征累加后数值会进一步升高,ReLU不会对这部分大于0的数值做压缩,最终输出自然会超出1的上限。 - 训练拟合不充分/损失无强制约束
常用的回归损失(比如MSE)只会惩罚预测值和真实值的偏差,不会强制把输出限制在[0,1]区间内。如果你的训练轮次不足、数据集分布存在长尾,或者梯度更新出现震荡,都可能导致网络的预测输出暂时甚至长期偏离目标区间,出现大于1的结果。 - 推理输入分布偏移
如果你的归一化参数是基于训练集统计得到的,当推理阶段输入的样本属于超出训练集分布的OOD(out-of-distribution)样本时,即使你用相同参数做归一化,也可能出现输入值超出[0,1]的情况,经过多层ReLU网络的放大后,输出更容易超过1。
如果你需要强制输出落在[0,1]区间,可直接在输出层替换ReLU为sigmoid激活,或者在输出后添加值域截断操作。
内容的提问来源于stack exchange,提问作者Min Lee
相关产品推荐
相关产品推荐

