【机器学习】(26)—— 浅层神经网络

发布时间:2026/7/27 13:55:36
【机器学习】(26)—— 浅层神经网络 浅层神经网络拟合非线性文章目录浅层神经网络拟合非线性1. 不一定靠人写交叉项2. 两类点直线不够用3. 改一个权重后面哪些会变3.1 输入全是 03.2 中间再插一层3.3 显示值没变中间也可能变了4. 隐藏层数、宽度、学习率和激活5. 先和逻辑回归比一下6. 用 sklearn 跑圆环数据7. 调参时少走弯路8. 适用边界与常见误区8.1 适用边界8.2 常见误区9. 关键术语速查10. 延伸阅读11. 小结摘要第 2325 篇讲过网络结构、激活和反向传播。本篇做一件具体的事面对直线分不开的二维数据用一层或很少层隐藏单元加上 ReLU让训练和测试损失都降到能看的水平。对照第 17 篇的手工特征交叉看看网络怎样在训练里自己学出弯曲的分界并比较隐藏层数、神经元个数、学习率和激活函数。适合想动手核对前几篇结论的读者。1. 不一定靠人写交叉项第 17 篇用品牌 × 车身这类交叉给线性模型补非线性。有用但组合要人一个个试。换一条路隐藏层做加权和再接激活训练时自己找比较有用的组合方式。本篇用二维合成点来演示——内圈一类、外圈一类直线往往切不好浅层 ReLU 网络常常可以。做法人这边模型这边特征交叉指定组合在扩展后的特征上做线性 / 逻辑回归浅层网络选定层宽、学习率、激活在原始坐标上拟合弯曲边界两条路可以并存表格业务里仍可先交叉或用树模型。本篇只是把第 2325 篇串成一次能跑通的实验。调学习率时若损失抖得很厉害可以回到第 25 篇看梯度是否过大隐藏层全用 Sigmoid 又怎么都学不动可以回到第 24 篇看饱和。表面上是在试参数底下还是前面讲过的概念。2. 两类点直线不够用平面上两类标签一类大致在内圈一类在外圈。随便画一条直线都会错不少点。可以把目标写清楚例如训练集和测试集的损失都降到0.2 以下也可用 log loss / 交叉熵具体数字随实现会有差别要紧的是两边都够低别只盯着训练。这和第 18 篇说的一样只报训练分数不够。「0.2」只是练习里常用的门槛不是什么物理定律。自己的项目里应换成业务能接受的 log loss、F1 或 AUC并在验证集上定阈值第 0911 篇。3. 改一个权重后面哪些会变动手前先用第 23 篇的前向直觉避开两个常见误会。3.1 输入全是 0三个输入都是0 00时隐藏单元变成ReLU ⁡ ( b j ) \operatorname{ReLU}(b_j)ReLU(bj​)——权重乘输入一项没了只剩偏置再过激活。输出由这些激活和输出侧权重决定。随机初始化下输出可正可负可为 0取决于偏置但「输入为 0 时权重项贡献为 0」是确定的。3.2 中间再插一层前馈是从输入算到输出。在已有隐藏层和输出之间再插一层改的是新层之后的计算更靠前的输入和原来的隐藏层在权重没动时前向公式不会自己变。这和「改连到某个h 2 h_2h2​的权重」不一样那种改法只影响h 2 h_2h2​和它后面的节点不影响同层里用不到这个权重的神经元。3.3 显示值没变中间也可能变了ReLU ⁡ ( 0 ) \operatorname{ReLU}(0)ReLU(0)和ReLU ⁡ ( − 5 ) \operatorname{ReLU}(-5)ReLU(−5)都是 0但预激活z zz已经不同。看结果时别只看最终显示也要想到z zz有没有挪——和第 25 篇里死 ReLU 是同一类现象。4. 隐藏层数、宽度、学习率和激活超参数可以先从这里试过大时常见情况隐藏层数先1 层更深更容易过拟合也更难训每层神经元数3个左右先试过宽训练很好看测试变差学习率0.01附近过大易震荡或死 ReLU过小收敛很慢激活隐藏层用ReLU深层里少默认整网都用 Sigmoid下面这一组经常能把两侧损失压得比较低1 个隐藏层大约 3 个神经元 学习率 ≈ 0.01 激活 ReLU不是唯一答案。换随机种子、换噪声合适宽度可能是 4 或 8。比较稳妥的做法是一次只改一类超参数并同时看训练和测试。若 3 个神经元不够先加到 8、16不必直接上三层隐藏。加层带来的优化难度通常比稍微加宽更麻烦。学习率可以在{ 0.001 , 0.01 , 0.1 } \{0.001, 0.01, 0.1\}{0.001,0.01,0.1}上粗扫出现震荡再往小取一档。5. 先和逻辑回归比一下同一批数据先跑逻辑回归分界面是直线测试损失往往停在较高位置。再换成hidden_layer_sizes(3,)的多层感知机MLP用 ReLU 之后边界可以折起来损失多半会明显下降。这和第 24 篇对得上没有非线性激活多加层也帮不上大忙有了 ReLU浅层就可能够用。第 17 篇若手写x 1 2 x 2 2 x_1^2x_2^2x12​x22​之类特征线性模型也能分圆环但特征要人想网络把这部分交给训练。汽车数据也一样若油耗和重量、排量的关系明显弯曲可以先多项式或分桶再试MLPRegressor/MLPClassifier。本篇用二维点只是为了把分界画清楚。特征尺度差得大时建议加标准化圆环例子量纲接近问题不大真实车况里尺度一拉开MLP 更敏感把StandardScaler放进 Pipeline并且仍只在训练集上fit第 15、19 篇。6. 用 sklearn 跑圆环数据importnumpyasnpfromsklearn.datasetsimportmake_circlesfromsklearn.model_selectionimporttrain_test_splitfromsklearn.linear_modelimportLogisticRegressionfromsklearn.neural_networkimportMLPClassifierfromsklearn.metricsimportlog_loss,accuracy_score X,ymake_circles(n_samples800,noise0.08,factor0.45,random_state0)X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.25,random_state0,stratifyy)defreport(name,model):model.fit(X_train,y_train)p_trmodel.predict_proba(X_train)p_temodel.predict_proba(X_test)print(name,{train_logloss:round(log_loss(y_train,p_tr),3),test_logloss:round(log_loss(y_test,p_te),3),test_acc:round(accuracy_score(y_test,model.predict(X_test)),3),})report(linear,LogisticRegression(max_iter1000))# 起点1 隐层、3 个神经元、ReLU、较小学习率report(mlp_3,MLPClassifier(hidden_layer_sizes(3,),activationrelu,learning_rate_init0.01,max_iter2000,random_state0,),)# 对照更宽以及学习率过大report(mlp_wide,MLPClassifier(hidden_layer_sizes(32,),activationrelu,learning_rate_init0.01,max_iter2000,random_state0),)report(mlp_lr_big,MLPClassifier(hidden_layer_sizes(3,),activationrelu,learning_rate_init0.5,max_iter2000,random_state0),)大致趋势具体数字会随版本波动线性测试 log loss 偏高准确率接近随机或略好一点mlp_3两侧 log loss 明显下降常常能到 0.2 附近或更低过宽训练更好测试不一定更好第 21 篇学习率过大可能不稳定、收敛差把activationlogisticSigmoid和relu对调再跑这类任务上 ReLU 通常更省事和第 24、25 篇一致。若要看分界可在网格上predict再着色。逻辑回归多半是一条直带MLP 更常见折线或环状分隔。若 MLP 看起来仍像一条直线检查激活是不是设成了identity或神经元太少、随机种子不理想——换个random_state再试。7. 调参时少走弯路先画数据确认真的是直线不好分再上网络。先跑逻辑回归作对照否则看不出网络多带来了什么。从浅、窄、ReLU、中等学习率开始以测试集也不差为准。一次只改深度、宽度、学习率、激活里的一类并记下训练和测试结果。已经发散就重新初始化再试别在坏掉的权重上继续堆改动。划分、泄漏、过拟合曲线仍按第 1822 篇来看。若怎么调测试都差可能是噪声太大、特征不够或该换别的模型而不是再叠十层。损失已经低于 0.2 之后也不必急着加宽到上百个神经元去刷训练分。时间更值得花在数据是否干净、划分是否合理、阈值是否符合业务上。8. 适用边界与常见误区8.1 适用边界本篇是二维教学实验高维表格还要编码、标准化并处理类别不平衡。MLPClassifier的求解器和批大小因版本而异对比时固定random_state和迭代上限。下一篇会讲多分类一对多 / Softmax本篇仍是二分类。8.2 常见误区误区更稳妥的做法一上来很深很宽先用 1 层、大约 3 个神经元跑通只看训练损失测试 / 验证一起看学习率从 1.0 起步容易不稳从 0.01 附近扫网络一定强过交叉特征小数据上手工特征或树模型可能更稳调不好就怪反向传播写错sklearn 已封装好先查数据和超参数测试好看就收工再确认没有泄漏阈值也符合业务不必执着某一个神奇的损失数字更有用的是改了什么、曲线怎么变、原因能否说清楚。9. 关键术语速查术语含义MLP多层感知机全连接前馈网络宽度某隐藏层的神经元个数深度隐藏层层数口语里有时也指整体层数决策边界分类模型在特征空间里的分界前馈计算从输入单向到输出基线用来对比的简单模型如逻辑回归10. 延伸阅读资源适合看什么sklearn MLPClassifierhidden_layer_sizes、activation、learning_rate_initsklearn make_circles圆环示例数据专栏第 17 篇手工非线性专栏第 2325 篇结构、激活、反向专栏第 18 篇为何要看测试损失11. 小结本篇把前面几篇收成一次可复现的实验数据线性不好分 → 用逻辑回归作对照 → 一层隐藏、少量神经元、ReLU、合适学习率 → 训练和测试一起看。可以从「大约 3 个神经元、学习率约 0.01、ReLU」起步再按验证结果加减宽度和层数。跑通之后可以对照第 23 篇的参数计数宽度从 3 加到 32参数量明显增加过拟合风险也会上去。画数据 → 逻辑回归对照 → 浅层 ReLU → 一次改一类超参数 → 看训练与测试下一篇讲神经网络上的多分类一对多与 Softmax把二分类里的「高效 / 非高效」扩展到车型、品牌档位等更多标签。系列导航上一篇【机器学习】25—— 反向传播下一篇预告神经网络多分类——一对多与 Softmax如果本篇对你有帮助欢迎点赞、收藏、关注博主机器学习专栏持续更新中下次更新不迷路。