激活函数
为什么一百层直线叠起来还是直线?——给网络引入「弯折」
多叠几层,真的更强吗?
上一课那台猜水果的机器,输出端挂着一个 ——我们当时一笔带过,说它「把总分压成概率」。 这一课就来正面回答:这个 σ 到底是什么?为什么非有它不可?
这堵「天花板」其实已经撞见过两次:第 4 课《线性变换》发现「线性叠线性还是线性」, 第 7 课那台机器又卡在「单个神经元只能切一条直线」。这一课,我们把它正面拆掉。
先做个实验:把两台水果神经元前后接起来(两层),中间不放任何激活函数 (或者说,激活函数就是 本身):
把第一层的结果代入第二层:
是两个矩阵相乘,结果还是一个矩阵——叫它 。 是两个向量的组合,结果还是一个向量——叫它 。 于是:
两层网络等价于一层网络。继续叠,也是一样——三层、一百层,最终都能压缩成「一个矩阵 + 一个偏置」。 层数带来的只有运算量,没有表达能力。 对那台猜水果的机器来说,这意味着:无论叠多少层,它本质上还是只有一层,它在特征空间里能画的,永远只是一条直线。
「一层」意味着什么:永远是直线
既然多层纯线性网络等价于一层,那就直视这一层能做什么。还记得上一课那张能拖动的平面吗? 神经元的输出永远是一张「平的」图像,判定边界永远是直的——二维空间里,y = Wx + b 画出的就是一条直线(高维里则是超平面)。
回到 XOR 问题:(0,0)→否,(1,0)→是,(0,1)→是,(1,1)→否。 「否」的两个点在对角线上,「是」的两个点也在对角线上。无论你把直线(超平面)摆在哪个角度,都无法把两类点分开。
推广一下:圆形区域、月牙形、任意不规则形状的决策边界——纯线性的网络全部做不到。 而现实中的绝大多数问题都有这样的非线性结构。
打个直观的比方:线性变换只能把一整张纸拉伸、旋转、平移,纸始终是平的, 一条直线无论怎么变都还是直线。非线性则像在纸上「折」一道弯—— 折过几次之后,原本被一条直线死死分开的两类点,就能被叠进同一侧、或圈进不同区域。 每加一层「线性变换 + 一次弯折」,网络就多一次折纸的机会,能表达的形状也就越复杂。
这个「插在层与层之间的非线性函数」,正是本课的主角——激活函数(activation function)。 它紧跟在每一层的线性变换 之后,给网络添上一道「弯折」,「多层 = 一层」的魔咒就此打破。下面就来认认,常用的激活函数都有哪几种、各自脾气如何。
常见的激活函数:阶跃、Sigmoid、tanh
带着「给每层添一道弯折」这个目标,我们把常用的激活函数一个一个认下来。 先说最直接的——阶跃函数:z < 0 时输出 0,z ≥ 0 时输出 1。 它确实「弯」了——可惜太死板:除了 z=0 那个跳变点,其余地方完全平坦, 输出对输入的任何风吹草动都毫无反应。这样的函数没法做精细的调整,实践中几乎没人用。
历史上解法是把阶跃函数「平滑」掉——做成一条 S 型曲线,就是大名鼎鼎的 Sigmoid:
Sigmoid 平滑、好懂、输出还正好落在 0~1 之间能当概率读,一度是最流行的激活函数。但它也有自己的短板:
当 z 很大(比如 10)或很小(−10)时,Sigmoid 的输出已经非常接近 1 或 0,曲线几乎水平。 这一段叫饱和区:输入再怎么变,输出几乎纹丝不动,函数变得很迟钝。 网络叠得很深时,这种迟钝会一层层累积起来,拖慢学习——至于它具体怎么作怪, 等到后面讲训练的课程(第 12、13 课)我们再把这笔账算清楚。
顺着 Sigmoid 往下,还有一个常打照面的「近亲」——tanh(双曲正切)。 它的形状同样是一条 S 曲线,区别在输出范围:Sigmoid 把结果挤在 0~1, tanh 则铺在 −1~1、正好以 0 为中心。
「以 0 为中心」是个实打实的好处:每层的输出均匀分布在 0 两侧,一层层往后传时更稳, 所以同样是 S 形,tanh 往往比 Sigmoid 表现更好。但它毕竟还是 S 形,两端饱和这个老毛病并没躲过去。
ReLU:又简单又好用
既然 Sigmoid 的两端会「饱和变迟钝」,有没有更干脆的函数—— 在正区间永远保持灵敏、原样放过,不打一点折扣?
最简单的方案:正数直接放过,负数全部归零。
ReLU 在实践中效果惊人——不是因为它有多精妙,而是因为它刚好解决了最关键的问题。 现代深层网络(ResNet、BERT、GPT)的隐藏层默认用 ReLU 或其变体。
ReLU 也有个小毛病:z < 0 时输出恒为 0、斜率也为 0,这个神经元就此「躺平」、再难被唤醒。 于是有了两个常见的改良版——LeakyReLU(负区间不再压到 0,而是留一点微弱的斜率,让神经元不至于彻底躺平)和GELU(Transformer 的标配,正区间类似 ReLU,但在 0 附近用一道平滑的过渡代替生硬的折角):
四种主力激活函数都认完了。光看曲线还不够过瘾——下面把它们装回上一课那台苹果神经元, 给输出端接上一个可切换的「弯折器」,自己上手转一转最直观。转旋钮改变总分 , 点上方按钮在阶跃 / Sigmoid / tanh / ReLU 之间切换,看红点(当前工作点)落在曲线哪里, 再留意底下那个「此处斜率」——每种函数的脾气,几乎都写在这条曲线的形状里:
回到开篇:那道天花板,顶开了吗?
绕了一圈,别忘了最初那堵墙:第 1、2 站算明白了——纯线性的网络叠多少层都等于一层,判定边界永远是直的。 第 7 课图 7-4 那个例子最典型:只看一个特征个头大小 x,好苹果偏偏挤在中间一段(太小、太大都不是), 而单个神经元 只有一个分界点,怎么也框不住「中间一段」。现在就用激活函数,把这道坎正面跨过去。
办法正是开篇那套「一层套一层」——只不过这次中间放上激活函数。设好苹果的合格区间是 。 第一层放两个神经元,各盯一个边界;为把逻辑看得最透,激活先用最直白的阶跃(换成 Sigmoid/ReLU 道理一样,只是边界更柔和):
随手代三个数进去验一验,正好对上第 7 课图 7-4 的三类样本:
- 太小(x=0.2):阶跃(−0.2)=0,阶跃(−0.5)=0 → y = 0,判「不是」✓
- 适中(x=0.55):阶跃(0.15)=1,阶跃(−0.15)=0 → y = 1,判「是」✓
- 太大(x=0.85):阶跃(0.45)=1,阶跃(0.15)=1 → y = 0,判「不是」✓
把这套结构画成网络、让你亲手转一转就更直观了——拖动个头大小 x,看两个神经元怎么轮流亮起、输出怎么在「中间一段」托出 y=1:
点睛之笔全在激活函数上:若中间不放它,,是个雷打不动的常数—— 两层又塌回一层、毫无用处(正是开篇证过的「多层 = 一层」)。正因为阶跃把两条直线各「折」成 0/1 的台阶,第二层一相减,才凭空托起中间那一段「带」。
这就是激活函数的全部意义:它让层数真正变成表达能力。第 7 课单个神经元框不住的「中间一段」,两层带激活轻松搭出; 再多堆几层、多放几个神经元,圆、月牙、任意复杂的边界都能这样「折」「拼」出来。开篇那道天花板,到此顶开。
总结
没有激活函数,那台猜水果的机器叠再多层也只能切一条直线,表达能力为零。激活函数打破线性叠加的魔咒,让每一层真正增加表达能力。 它既要能「弯」、又得够灵敏:Sigmoid 平滑好懂但两端会饱和变迟钝,ReLU 靠 max(0,z) 的一刀,正区间永远灵敏、又快又稳,推动了深度学习革命。
这一课你亲手证明了
- 线性的诅咒:纯线性多层 = 一层,层数不带来表达能力。
- 激活函数:层间的非线性函数,打破「层层相消」的循环,让层数真正变成表达能力。
- Sigmoid:平滑的 S 曲线、输出 0~1,但两端饱和、会变迟钝。
- tanh:Sigmoid 的近亲,输出 −1~1、以 0 为中心,通常更好训练。
- ReLU:max(0,z),正区间斜率恒为 1、又快又稳,深层网络的救星。
- LeakyReLU / GELU:ReLU 的改良版,前者救「躺平」的神经元,后者是 Transformer 标配。
学习小测验
做完这一课,来检测一下核心知识点。选出你的答案后点击「提交」,即可看到正确选项与讲解。
神经网络与训练
神经元、激活函数都齐了——把它们叠成一张「网络」,再让这张网络自己「学」,到底是怎么回事?