TensorFlow中单神经元神经网络无法学习线性数据集问题咨询
问题根因分析
1. 输入特征未做归一化是核心问题
你生成的X取值范围为[-1000, 1000],数值跨度极大,搭配学习率仅为0.01的SGD优化器时,单次梯度更新的步长完全不足以适配大数值范围下的参数调整,即使训练1000轮也无法收敛到正确的权重和偏置。
而你测试用的小体量数据集X取值范围仅为[-7, 14],数值跨度极小,因此不需要归一化也能正常训练,完全符合该问题的特征。
修复方案:对输入X做归一化处理,缩放到[-1, 1]或[0, 1]区间即可,示例代码:
# 归一化到[0,1]区间 X = (X - X.min()) / (X.max() - X.min()) # 或者归一化到[-1,1]区间 X = 2 * (X - X.min()) / (X.max() - X.min()) - 1
如果不想做归一化,也可以直接把SGD的学习率调大到0.1以上,适配大数值输入的更新需求。
2. 两层模型的激活函数配置错误
你在两层模型的第一层添加了sigmoid激活函数,sigmoid的特性是输入绝对值大于5时,输出会被压缩到接近0或1,同时梯度几乎为0,出现梯度饱和现象。你的输入X范围为[-1000, 1000],几乎所有输入都会进入sigmoid的饱和区,梯度消失导致模型参数几乎无法更新,因此训练效果仅比单层模型略好,完全无法收敛。
修复方案:线性拟合任务不需要添加非线性激活函数,若要使用多层结构可以直接去掉sigmoid激活,或者先完成输入归一化避免输入落入sigmoid的饱和区。
补充说明
你选择的MAE损失函数、神经元数量配置本身没有问题,不需要额外调整。
内容的提问来源于stack exchange,提问作者guilerme_coppola84
相关产品推荐
相关产品推荐

