如何让神经网络正确实现线性回归?sigmoid激活函数是否为失效原因?
问题解答
故障原因
你遇到的拟合失败问题确实是sigmoid激活函数导致的,核心有两点:
- 输出层使用sigmoid:sigmoid的输出范围固定在*01之间*,你需要拟合的目标值最大可达3,即便训练阶段只用01的样本训练,推理时输入大于1的数值,输出也永远无法超过1,这就是你给出的预测图中蓝线到1后直接走平的根本原因。
- 隐藏层sigmoid的梯度饱和问题:当神经元输入加权和的绝对值偏大时,sigmoid的导数会趋近于0,反向传播时出现梯度消失,参数几乎停止更新,所以你调整学习率和epoch数量也很难得到理想的拟合效果。
修复方案
激活函数替换
- 输出层直接移除激活函数(使用线性/恒等激活):回归任务的输出是无界连续值,不需要用sigmoid做范围压缩。
- 隐藏层替换为ReLU激活:公式为
f(x) = max(0, x),正输入区间导数恒为1,不存在梯度饱和问题,适配回归任务的训练需求。
代码适配修改
你当前使用的evaluate函数是为手写数字分类任务设计的,逻辑是取输出层最大值的索引计算分类准确率,完全不适用回归任务,建议替换为计算MSE(均方误差)的逻辑,方便观测训练进度。

蓝线代表网络的预测结果,绿线代表训练数据,网络预测所用输入为0到3之间间隔0.01的数值。
内容的提问来源于stack exchange,提问作者thebasqueinterdisciplinarian
相关产品推荐
相关产品推荐

