相同参数下MLPRegressor双隐层评分低于单隐层原因咨询
实验配置说明
实验基于UCI翼型自噪声数据集开展回归预测任务,两组对照实验仅隐藏层结构不同,其余训练参数完全一致,各隐藏层神经元数量固定为5:
- 单隐层配置代码:
regr = MLPRegressor( hidden_layer_sizes=(5,), activation='logistic', solver='sgd', alpha=0.0001, learning_rate='constant', learning_rate_init=0.001, random_state=1 ).fit(X_treino, Y_treino)
- 双隐层配置代码:
regr = MLPRegressor( hidden_layer_sizes=(5,5,), activation='logistic', solver='sgd', alpha=0.0001, learning_rate='constant', learning_rate_init=0.001, random_state=1 ).fit(X_treino, Y_treino)
实验观测结果:双隐层模型的评分远低于单隐层模型。
核心成因
Logistic激活函数的梯度消失问题
Logistic(Sigmoid)激活的梯度最大值仅为0.25,反向传播过程中梯度每穿过一层就会至少衰减到原来的1/4。双隐层结构下,梯度传回第一层隐藏层时已经衰减到原值的1/16以下,浅层权重几乎无法得到有效更新,模型很难收敛到合理参数区间。单隐层结构只需要穿过一层激活,梯度衰减幅度小,训练稳定性反而更高。训练配置不匹配深模型收敛需求
实验使用固定0.001学习率的SGD求解器,且没有手动调整最大迭代次数——sklearn中MLPRegressor的默认最大迭代次数仅为200。双隐层模型参数量更大、损失曲面更复杂,需要更多迭代步才能收敛,200步大概率还没收敛就触发了停止条件;单隐层参数量少、收敛速度快,200步足够到达较优的参数位置。窄隐藏层的信息瓶颈
两层都设置为5个神经元时,第一层提取的特征必须先压缩到5维才能传入第二层,这个过程会丢失大量有效信息。翼型自噪声本身是特征维度很低的小数据集,这种过窄的堆叠结构反而比单隐层直接映射的信息传递效率更低,直接拉低模型效果。固定随机种子的初始化偏差放大
虽然固定了random_state=1保证可复现,但更深的模型对初始权重的敏感度远高于浅模型。这个固定种子分配的初始权重,很可能让双隐层的部分神经元一开始就落在Logistic激活的梯度饱和区,进一步拖慢收敛;单隐层参数少,初始化带来的偏差影响非常有限。
快速验证方案
- 将激活函数替换为
relu,从根源上降低梯度消失的影响 - 适当调大初始学习率,或直接换用
adam求解器,同时把max_iter调到1000以上,给深模型足够的收敛步数 - 若要测试双隐层效果,可适当放宽每层神经元数量,避免过窄层造成的信息损耗
- 训练前务必对输入特征做标准化处理,MLP对特征尺度非常敏感,未标准化的输入会进一步拖慢深模型收敛
内容的提问来源于stack exchange,提问作者Igor Gonzaga

