LESSON 08 · 卷 神经网络

激活函数

为什么一百层直线叠起来还是直线?——给网络引入「弯折」

第 1 站

多叠几层,真的更强吗?

上一课那台猜水果的机器,输出端挂着一个 ——我们当时一笔带过,说它「把总分压成概率」。 这一课就来正面回答:这个 σ 到底是什么?为什么非有它不可?

这堵「天花板」其实已经撞见过两次:第 4 课《线性变换》发现「线性叠线性还是线性」, 第 7 课那台机器又卡在「单个神经元只能切一条直线」。这一课,我们把它正面拆掉。

先做个实验:把两台水果神经元前后接起来(两层),中间不放任何激活函数 (或者说,激活函数就是 本身):

x水果特征第一层(神经元①)W₁x + b₁h中间结果第二层(神经元②)W₂h + b₂y最终输出
图 8-1两台神经元首尾相接:输入 先过第一层得到中间结果 再过第二层得到 。中间不放激活函数——下面就来算算,这「两步」能不能省成「一步」。
第一层 
第二层 

把第一层的结果代入第二层:

是两个矩阵相乘,结果还是一个矩阵——叫它 是两个向量的组合,结果还是一个向量——叫它 。 于是:

两层网络等价于一层网络。继续叠,也是一样——三层、一百层,最终都能压缩成「一个矩阵 + 一个偏置」。 层数带来的只有运算量,没有表达能力。 对那台猜水果的机器来说,这意味着:无论叠多少层,它本质上还是只有一层,它在特征空间里能画的,永远只是一条直线

第 2 站

「一层」意味着什么:永远是直线

既然多层纯线性网络等价于一层,那就直视这一层能做什么。还记得上一课那张能拖动的平面吗? 神经元的输出永远是一张「平的」图像,判定边界永远是直的——二维空间里,y = Wx + b 画出的就是一条直线(高维里则是超平面)。

直线画不出圆

回到 XOR 问题:(0,0)→否,(1,0)→是,(0,1)→是,(1,1)→否。 「否」的两个点在对角线上,「是」的两个点也在对角线上。无论你把直线(超平面)摆在哪个角度,都无法把两类点分开。

推广一下:圆形区域、月牙形、任意不规则形状的决策边界——纯线性的网络全部做不到。 而现实中的绝大多数问题都有这样的非线性结构。

打个直观的比方:线性变换只能把一整张纸拉伸、旋转、平移,纸始终是平的, 一条直线无论怎么变都还是直线。非线性则像在纸上「折」一道弯—— 折过几次之后,原本被一条直线死死分开的两类点,就能被叠进同一侧、或圈进不同区域。 每加一层「线性变换 + 一次弯折」,网络就多一次折纸的机会,能表达的形状也就越复杂。

要打破「多层等于一层」这个诅咒,需要在层与层之间加什么?想想看,30 秒。

这个「插在层与层之间的非线性函数」,正是本课的主角——激活函数(activation function)。 它紧跟在每一层的线性变换 之后,给网络添上一道「弯折」,「多层 = 一层」的魔咒就此打破。下面就来认认,常用的激活函数都有哪几种、各自脾气如何。

第 3 站

常见的激活函数:阶跃、Sigmoid、tanh

带着「给每层添一道弯折」这个目标,我们把常用的激活函数一个一个认下来。 先说最直接的——阶跃函数:z < 0 时输出 0,z ≥ 0 时输出 1。 它确实「弯」了——可惜太死板:除了 z=0 那个跳变点,其余地方完全平坦, 输出对输入的任何风吹草动都毫无反应。这样的函数没法做精细的调整,实践中几乎没人用。

图 8-2阶跃函数:除了 z=0 处的一记「突跳」,其余地方完全水平、斜率恒为 0。输出非 0 即 1,对输入的细微变化毫无反应——这正是它「太死板」的来由。

历史上解法是把阶跃函数「平滑」掉——做成一条 S 型曲线,就是大名鼎鼎的 Sigmoid

图 8-3阶跃函数(虚线)是「硬」的非线性,几乎处处平坦、太死板;Sigmoid(蓝线)是「软」的阶跃,处处平滑、有起有伏,调起来顺手得多。

Sigmoid 平滑、好懂、输出还正好落在 0~1 之间能当概率读,一度是最流行的激活函数。但它也有自己的短板:

Sigmoid 的饱和区

当 z 很大(比如 10)或很小(−10)时,Sigmoid 的输出已经非常接近 1 或 0,曲线几乎水平。 这一段叫饱和区:输入再怎么变,输出几乎纹丝不动,函数变得很迟钝。 网络叠得很深时,这种迟钝会一层层累积起来,拖慢学习——至于它具体怎么作怪, 等到后面讲训练的课程(第 12、13 课)我们再把这笔账算清楚。

顺着 Sigmoid 往下,还有一个常打照面的「近亲」——tanh(双曲正切)。 它的形状同样是一条 S 曲线,区别在输出范围:Sigmoid 把结果挤在 0~1, tanh 则铺在 −1~1、正好以 0 为中心

图 8-4tanh(红线)和 Sigmoid(蓝虚线)形状相同,但 tanh 输出在 −1~1、以 0 为中心。这让每层输出有正有负、更均衡,通常比 Sigmoid 更好训练;不过两端一样会压平、饱和变迟钝。

「以 0 为中心」是个实打实的好处:每层的输出均匀分布在 0 两侧,一层层往后传时更稳, 所以同样是 S 形,tanh 往往比 Sigmoid 表现更好。但它毕竟还是 S 形,两端饱和这个老毛病并没躲过去。

第 4 站

ReLU:又简单又好用

既然 Sigmoid 的两端会「饱和变迟钝」,有没有更干脆的函数—— 在正区间永远保持灵敏、原样放过,不打一点折扣?

最简单的方案:正数直接放过,负数全部归零。

图 8-5ReLU(红线)正区间的导数(蓝虚线)永远是 1,输出原样放过、毫不衰减。2012 年 AlexNet 用 ReLU 替代 Sigmoid,在 ImageNet 上引发深度学习革命。

ReLU 在实践中效果惊人——不是因为它有多精妙,而是因为它刚好解决了最关键的问题。 现代深层网络(ResNet、BERT、GPT)的隐藏层默认用 ReLU 或其变体。

ReLU 也有个小毛病:z < 0 时输出恒为 0、斜率也为 0,这个神经元就此「躺平」、再难被唤醒。 于是有了两个常见的改良版——LeakyReLU(负区间不再压到 0,而是留一点微弱的斜率,让神经元不至于彻底躺平)和GELU(Transformer 的标配,正区间类似 ReLU,但在 0 附近用一道平滑的过渡代替生硬的折角):

图 8-6ReLU 的两个改良版。LeakyReLU(蓝线)把负区间的「死平」抬成一道缓坡,神经元不会彻底躺平;GELU(红线)把 0 处的尖折角磨成平滑曲线,是 GPT、BERT 等 Transformer 的默认选择。(为看得清楚,图中负区间斜率有所放大。)

四种主力激活函数都认完了。光看曲线还不够过瘾——下面把它们装回上一课那台苹果神经元, 给输出端接上一个可切换的「弯折器」,自己上手转一转最直观。转旋钮改变总分 , 点上方按钮在阶跃 / Sigmoid / tanh / ReLU 之间切换,看红点(当前工作点)落在曲线哪里, 再留意底下那个「此处斜率」——每种函数的脾气,几乎都写在这条曲线的形状里:

给输出端换一个「弯折器」:
尺寸大小0.50×0.40颜色0.50×2.80酸甜度0.50×1.60水分0.50×0.40加权总分 z0.20Σ wᵢxᵢ + (−2.4)z激活:Sigmoid(z)z输出0.55
加权总分 z = 0.20Sigmoid(z) = 0.55;此处斜率(导数)= 0.25
平滑、好懂、还能当概率读。但把颜色/酸甜拧到两端、z 变大时曲线压平、斜率趋近 0,变得很迟钝。
🎛 四个旋钮 = 四个输入特征
尺寸大小0.50
颜色0.50
偏绿偏红
酸甜度0.50
水分0.50
多汁
互动 8-A同一台机器,四种激活函数任意切换。「阶跃」太死板、处处平坦;「Sigmoid」平滑 S 形、输出 0~1;「tanh」也是 S 形但以 0 为中心、输出 −1~1;「ReLU」正区间原样放过、斜率恒为 1。
第 5 站

回到开篇:那道天花板,顶开了吗?

绕了一圈,别忘了最初那堵墙:第 1、2 站算明白了——纯线性的网络叠多少层都等于一层,判定边界永远是直的。 第 7 课图 7-4 那个例子最典型:只看一个特征个头大小 x,好苹果偏偏挤在中间一段(太小、太大都不是), 而单个神经元 只有一个分界点,怎么也框不住「中间一段」。现在就用激活函数,把这道坎正面跨过去。

办法正是开篇那套「一层套一层」——只不过这次中间放上激活函数。设好苹果的合格区间是 。 第一层放两个神经元,各盯一个边界;为把逻辑看得最透,激活先用最直白的阶跃(换成 Sigmoid/ReLU 道理一样,只是边界更柔和):

第一层  —— x 够大了吗?过了 0.4 就亮(=1)
     —— x 太大了吗?过了 0.7 也亮(=1)
第二层  —— 够大、但还没太大,才判「是」

随手代三个数进去验一验,正好对上第 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:

个头 x0.55神经元①(够大了吗)权重 1加权和 z0.15偏置 −0.4阶跃函数输出 h1神经元②(太大了吗)权重 1加权和 z-0.15偏置 −0.7阶跃函数输出 h0+1−1输出 y = h₁ − h₂y =1🍎是苹果好苹果带 0.4~0.7太小适中太大
个头大小 x = 0.55
z₁ = 0.15 → h₁ = 1;z₂ = -0.15 → h₂ = 0;y = h₁−h₂ = 1 → 判「是苹果
拖动个头大小 x:太小(<0.4)时两个神经元都不亮,y=0;进入 0.4~0.7 这段,只有 h₁ 亮、h₂ 还没亮,y=1 判「是苹果」;继续拖大(>0.7),h₂ 也亮起来、把 h₁ 抵消,y 又回到 0。单个神经元只有一个分界点,两层带激活却能凭空托起「中间一段」——这就是激活函数把第 7 课难题解决的全过程。
互动 8-B两层带激活,亲手搭出「中间一段」。第一层两个阶跃神经元(够大了吗 / 太大了吗)分别在 0.4、0.7 处亮起;第二层相减 只在 0.4~0.7 之间等于 1。拖动滑块就能看到:太小两个都灭、适中只亮 h₁、太大两个都亮被抵消——单个神经元那「一个分界点」做不到的事,两层带激活轻松搭了出来。

点睛之笔全在激活函数上:若中间不放它,是个雷打不动的常数—— 两层又塌回一层、毫无用处(正是开篇证过的「多层 = 一层」)。正因为阶跃把两条直线各「折」成 0/1 的台阶,第二层一相减,才凭空托起中间那一段「带」。

这就是激活函数的全部意义:它让层数真正变成表达能力。第 7 课单个神经元框不住的「中间一段」,两层带激活轻松搭出; 再多堆几层、多放几个神经元,圆、月牙、任意复杂的边界都能这样「折」「拼」出来。开篇那道天花板,到此顶开。

第 6 站

总结

本课核心 · TAKEAWAY

没有激活函数,那台猜水果的机器叠再多层也只能切一条直线,表达能力为零。激活函数打破线性叠加的魔咒,让每一层真正增加表达能力。 它既要能「弯」、又得够灵敏:Sigmoid 平滑好懂但两端会饱和变迟钝,ReLU 靠 max(0,z) 的一刀,正区间永远灵敏、又快又稳,推动了深度学习革命。

这一课你亲手证明了

  • 线性的诅咒:纯线性多层 = 一层,层数不带来表达能力。
  • 激活函数:层间的非线性函数,打破「层层相消」的循环,让层数真正变成表达能力。
  • Sigmoid:平滑的 S 曲线、输出 0~1,但两端饱和、会变迟钝。
  • tanh:Sigmoid 的近亲,输出 −1~1、以 0 为中心,通常更好训练。
  • ReLU:max(0,z),正区间斜率恒为 1、又快又稳,深层网络的救星。
  • LeakyReLU / GELU:ReLU 的改良版,前者救「躺平」的神经元,后者是 Transformer 标配。
小测验

学习小测验

做完这一课,来检测一下核心知识点。选出你的答案后点击「提交」,即可看到正确选项与讲解。

Q1如果把很多层神经元叠起来,但每一层都不加激活函数(即都是线性的),会发生什么?
Q2关于 ReLU 激活函数 f(x)=max(0, x),下面哪种描述是对的?
NEXT · 第 9 课

神经网络与训练

神经元、激活函数都齐了——把它们叠成一张「网络」,再让这张网络自己「学」,到底是怎么回事?

0 人点赞,0 人看过