深度学习------多层感知机
目录
从 “异或门搞不定” 到 “复杂数据能拟合”:多层感知机入门笔记
今天学多层感知机,一开始被 “感知机”“隐藏层”“激活函数” 这些术语绕得有点懵,直到老师用 “逻辑门” 举例子,才突然打通了思路 —— 原来多层感知机不是凭空来的,而是为了解决 “感知机搞不定的问题” 才诞生的。整理了一下我觉得最关键的知识点,用自己能看懂的话记下来,也帮和我一样刚入门的小伙伴捋捋逻辑。
一、先搞懂 “前传”:感知机是啥?为啥它连异或门都搞不定?
老师开篇先带我们回顾了 “感知机”—— 这是 1957 年就提出的模型,算是神经网络的 “老祖宗”。它的逻辑特别简单:给输入x(比如两个二进制数),乘上权重w(控制输入的重要性),加个偏置b(调整激活难度),最后用阶跃函数判断:如果总和大于 0,输出 1;否则输出 0。
1. 感知机的 “拿手好戏”:实现简单逻辑门
感知机最直观的例子就是做逻辑门,老师让我们动手调权重,很快就搞懂了:
- 与门:只有两个输入都是 1,输出才是 1。比如设
w1=0.5, w2=0.5, b=-0.7—— 算一下:输入 (1,1) 时,0.51+0.51-0.7=0.3>0,输出 1;输入 (1,0) 时,0.5-0.7=-0.2<0,输出 0,正好符合与门真值表。 - 与非门:和与门相反,两个输入都是 1 才输出 0。只要把权重改成负数、偏置调正就行,比如
w1=-0.5, w2=-0.5, b=0.7,输入 (1,1) 时总和是 - 1+0.7=-0.3<0,输出 0,完美。 - 或门:只要有一个输入是 1,输出就是 1。设
w1=0.5, w2=0.5, b=-0.3—— 输入 (1,0) 时,0.5-0.3=0.2>0,输出 1,正好对得上。
这时候我还觉得感知机挺好用,直到老师抛出 “异或门” 的问题。
2. 感知机的 “死穴”:线性不可分
异或门的真值表很简单:输入 (0,0) 输出 0,(1,0) 输出 1,(0,1) 输出 1,(1,1) 输出 0。我跟着老师试了半天调w和b,不管怎么改,都没办法用一条直线把 “输出 1” 和 “输出 0” 的点分开 —— 老师说,这就是感知机的局限性:只能表示 “线性可分” 的空间,也就是能用一条直线(或高维空间的平面)把两类数据分开的情况。
而异或门需要 “曲线” 才能分开(比如一个正方形把 (1,0) 和 (0,1) 框起来),感知机没这个能力。这时候老师问:“那想处理这种非线性的问题,怎么办?”—— 答案就是今天的主角:多层感知机。
二、多层感知机的 “核心魔法”:加个隐藏层,搞定非线性
多层感知机的思路特别直接:既然单层感知机只能画直线,那我就 “组合多个感知机”,用它们的输出再做一次计算 —— 中间这个 “组合层”,就是 “隐藏层”。
1. 用多层感知机实现异或门:原来隐藏层是这么用的
老师用异或门举了个例子,一下子就懂了:
- 先做两个 “中间感知机”:一个模拟 “或非门”,一个模拟 “与门”;
- 把这两个中间结果当 “新输入”,再喂给一个 “或门”;
- 最后输出的就是异或的结果。
简单说,隐藏层的作用是 “把原始特征组合成新的、更有用的特征”。比如异或门里,隐藏层把 “x1 和 x2” 组合成 “x1 或非 x2”“x1 与 x2”,这些新特征就是线性可分的,再用一个感知机就能判断。
老师还画了个结构图:输入层(x1、x2)→ 隐藏层(h1、h2,两个感知机)→ 输出层(y,一个感知机)。原来多层感知机就是 “多层感知机串起来”,但这里有个关键 ——必须加 “激活函数”,不然再多层也没用。
2. 激活函数:给网络加 “拐弯” 的能力
一开始我没搞懂激活函数的作用,老师举了个反例:如果没有激活函数,隐藏层的输出就是 “w*x + b” 的线性组合,再传给输出层,最后还是线性的 —— 相当于把多个线性函数叠在一起,结果还是线性的,跟单层感知机没区别。
激活函数的作用,就是给这个过程加 “非线性”,让网络能处理曲线分割的问题。老师讲了几个常用的:
- 阶跃函数:感知机用的就是它,输入大于 0 输出 1,否则 0,但它不连续,梯度不好算,现在很少用;
- sigmoid 函数:把输入映射到 0-1 之间,像 “压缩” 一样,但缺点是输入太大或太小时,梯度会接近 0(梯度消失),训练慢;
- tanh 函数:比 sigmoid 好点,映射到 - 1-1 之间,中心在 0,梯度消失问题轻一点,但还是有;
- ReLU 函数:现在最常用的!输入大于 0 就输出本身,小于 0 就输出 0,简单好算,梯度不容易消失,还能避免过拟合(负数直接归 0,相当于 “关闭” 部分神经元)。
老师说,现在做实验一般先试 ReLU,除非有特殊场景,比如输出需要 0-1 的概率(这时候用 sigmoid),不然 ReLU 是首选 —— 简单、高效、不容易出问题。
三、多层感知机的 “实战细节”:结构、训练和避坑
搞懂了核心逻辑,老师还讲了很多实战中要注意的点,这些都是新手容易踩坑的地方。
1. 网络结构:隐藏层多少层?神经元多少个?
多层感知机的结构主要看 “隐藏层数量” 和 “每层的神经元个数”,这两个都是 “超参数”,没有标准答案,老师给了个新手思路:
- 隐藏层数量:从简单开始,先试 1 层隐藏层(很多简单任务 1 层就够了),如果效果不好再加 2-3 层(太深的话容易过拟合,还难训练);
- 神经元个数:每层先设 32 或 64 个,比如输入特征有 10 个,隐藏层神经元可以设 32 个 —— 太少的话,特征组合不够,容易欠拟合;太多的话,参数多,训练慢还容易过拟合。
比如做 “手写数字分类(MNIST)”,输入是 28*28=784 个像素,隐藏层可以设 128 个神经元,输出层设 10 个神经元(对应 10 个数字),再用 Softmax 转概率,这样结构就很清晰。
2. 训练过程:前向传播算预测,反向传播调参数
多层感知机的训练和线性回归有点像,但多了隐藏层,流程变成了两步:
- 前向传播:输入从输入层进去,经过隐藏层(乘权重 + 加偏置 + 激活函数),最后到输出层,算出预测结果;
- 反向传播:用损失函数(比如分类用交叉熵,回归用平方损失)算预测和真实值的误差,然后从输出层往回算每个权重对误差的影响(梯度),再用梯度下降调权重 —— 这一步框架会帮我们做,但得知道逻辑:误差从后往前传,权重跟着梯度调。
3. 避坑重点:过拟合和欠拟合怎么破?
今天最让我头疼的是 “过拟合” 和 “欠拟合”,老师用学生考试的例子讲得特别明白:
- 欠拟合:就像学生没听懂知识点,连作业题(训练集)都做不对 —— 原因是模型太简单,比如用单层感知机做异或门,或者隐藏层神经元太少;
- 过拟合:就像学生死记硬背作业题,作业(训练集)考满分,考试(新数据)全错 —— 原因是模型太复杂,把训练集里的 “噪声” 当成了规律,比如隐藏层太多,神经元太多。
怎么解决呢?老师提了几个实用方法:
- 用验证集和测试集:把数据分成 3 份,训练集练模型,验证集调超参数(比如改隐藏层个数),测试集最后评估效果 —— 别把验证集当训练集用,不然还是会过拟合;
- K 折交叉验证:如果数据少,就把训练集分成 K 份(比如 5 份),每次用 4 份训练、1 份验证,轮 5 次取平均误差,这样能充分利用数据;
- 防过拟合技巧:权重衰减(给权重加 “惩罚”,不让它太大)、暂退法(训练时随机 “关掉” 一些神经元,避免依赖某几个特征)—— 这些方法框架里都有现成的,调用就行。
四、写在最后:原来多层感知机没那么难
今天学完最大的感受是:多层感知机的核心不是 “复杂”,而是 “解决问题”—— 为了处理感知机搞不定的线性不可分,才加了隐藏层;为了让隐藏层有用,才加了激活函数。以前觉得 “隐藏层” 很神秘,现在发现它就是 “组合特征的工具”,把原始特征变成更有用的新特征,帮模型更好地拟合数据。
接下来打算用 PyTorch 搭个简单的多层感知机,先试试解决异或问题,再挑战一下 MNIST 手写数字分类 —— 毕竟光懂理论不行,动手练了才记得牢。如果和我一样刚入门,建议先从 “异或门” 这个小例子入手,搞懂隐藏层和激活函数的作用,再往复杂任务上靠,这样学起来会轻松很多~
更多推荐


所有评论(0)