You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何在MNIST数字分类任务中单层MLP性能优于多层MLP?

单层MLP在MNIST上表现优于多层的原因分析

嘿,这个现象确实挺反直觉的——按说更深的模型应该能捕捉更复杂的特征,结果反而不如单层,我来帮你拆解几个关键原因,顺便看看你代码里的小细节:

可能的核心原因

  • 数据集复杂度匹配问题:MNIST其实是个相对简单的任务,手写数字的特征(比如边缘、笔画)用单层足够多的神经元就能完全拟合了。多层MLP在这里反而有点“大材小用”,额外的层数会引入更多可训练参数,很容易在数据集上发生过拟合,或者因为模型容量过剩导致泛化能力下降。
  • 多层模型的优化难度更高:随着层数增加,梯度消失/爆炸的问题会变得更突出。反向传播时,梯度要从输出层逐层往回传,每经过一层都会乘以激活函数的导数,层数多了梯度可能衰减到几乎为0,导致深层的权重根本得不到有效更新——说白了就是那些额外的层根本没起到作用,反而拖了整个模型的后腿。
  • 你的参数搜索没覆盖多层配置:看你贴的代码,param_grid里的hidden_layer_sizes全是单个数字(比如400、300),这代表你只在搜索单层隐藏层的最优神经元数,完全没测试过(200,100)、(150,75)这种多层的组合!现在的对比根本不公平,自然看起来单层表现更好。
  • 训练参数没适配多层模型:MLP的训练效果很大程度依赖迭代次数、正则化、学习率这些参数。比如默认的max_iter可能只有200次,对于多层模型来说根本不够收敛;或者没加正则化,多层模型参数多更容易过拟合;学习率设置不合适的话,多层模型训练时还容易出现梯度震荡,没法收敛到好的解。

你提供的代码片段

param_grid={'hidden_layer_sizes':[400,300,200,100,70,50,20,10]}
grid=GridSearchCV(MLPClassifier(random_state=1),param_grid,cv=3,scoring='accuracy')
grid.fit(train_data.iloc[:,1:],train_data.iloc[:,...

给你的调整建议

  • 先扩展参数搜索范围,加入多层隐藏层的配置,比如:
    param_grid={'hidden_layer_sizes': [(400,), (300,100), (200,200), (150,75,25), (100,50,20)]}
    
    这样才能真正对比单层和多层的性能。
  • 给多层模型加上正则化,比如调整alpha参数(默认是0.0001,可以试试0.001或0.01),抑制过拟合。
  • 增加迭代次数max_iter,比如设置为1000或2000,确保多层模型有足够时间收敛。
  • 可以尝试调整学习率learning_rate_init,或者切换solver(比如从默认的adam换成sgd,配合学习率衰减),帮助多层模型更好地优化。

内容的提问来源于stack exchange,提问作者Salamat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:41:40