【机器学习】(24)—— 神经网络激活函数

神经网络激活函数:ReLU、Sigmoid 与非线性

文章目录

  • [神经网络激活函数:ReLU、Sigmoid 与非线性](#神经网络激活函数:ReLU、Sigmoid 与非线性)
    • [1. 问题从哪里来](#1. 问题从哪里来)
    • [2. 什么是激活函数](#2. 什么是激活函数)
    • [3. Sigmoid:压到 0~1](#3. Sigmoid:压到 0~1)
      • [3.1 和逻辑回归的关系](#3.1 和逻辑回归的关系)
    • [4. tanh:压到 -1~1](#4. tanh:压到 -1~1)
    • [5. ReLU:小于 0 置零,否则原样通过](#5. ReLU:小于 0 置零,否则原样通过)
      • [5.1 选激活时的实用顺序](#5.1 选激活时的实用顺序)
    • [6. 手算:同一套权重,加上 ReLU 之后](#6. 手算:同一套权重,加上 ReLU 之后)
    • [7. 完整神经网络的三块积木](#7. 完整神经网络的三块积木)
    • [8. 动手:有无激活,能否合并成单层](#8. 动手:有无激活,能否合并成单层)
    • [9. 能力边界与常见误区](#9. 能力边界与常见误区)
      • [9.1 适用边界](#9.1 适用边界)
      • [9.2 常见误区](#9.2 常见误区)
    • [10. 关键术语速查](#10. 关键术语速查)
    • [11. 延伸阅读](#11. 延伸阅读)
    • [12. 小结](#12. 小结)

摘要 :第 23 篇证明过:隐藏层如果只做加权求和,叠多少层都等价于一层线性模型。要让网络学弯、学交叉,必须在神经元输出上插入非线性 ------这就是激活函数(Activation Function) 。本文衔接第 06 篇已熟悉的 Sigmoid,讲清 tanh 与 ReLU,用手算和代码对比「有无激活」的差别,并说明隐藏层为何常常默认从 ReLU 起步。适合刚读完神经网络结构入门的读者。


1. 问题从哪里来

第 23 篇的结论是:

y ′ = W ( 2 ) ( W ( 1 ) x + b ( 1 ) ) + b ( 2 ) y' = W^{(2)}(W^{(1)}\mathbf{x}+\mathbf{b}^{(1)})+b^{(2)} y′=W(2)(W(1)x+b(1))+b(2)

仍可合并成「某个 W eff x + b eff W_{\text{eff}}\mathbf{x}+b_{\text{eff}} Weffx+beff」。加层改变了参数摆放,没有改变「整体仍是线性」这件事。

要学非线性关系,就得在层与层之间塞进非线性数学运算 。你其实早就用过一次:逻辑回归把线性得分 z z z 送进 Sigmoid,才得到 ( 0 , 1 ) (0,1) (0,1) 概率(第 05、06 篇)。神经网络把同一思路用到每一个隐藏神经元上------不只是最后输出那一下。


2. 什么是激活函数

激活函数作用在神经元「加权和」之后、把结果交给下一层之前:

text 复制代码
z = w·x + b
a = f(z)          ← 激活
下一层拿 a 当输入
符号 含义
z z z 预激活值(pre-activation),线性部分
f f f 激活函数
a a a 激活后的输出,进入下一层

有了非线性 f f f,再堆层才有意义:每一层都在前一层的非线性结果上继续变换,整体可以逼近很复杂的输入--输出关系。第 17 篇靠人手做特征交叉;激活之后的网络,才更接近「自动学组合」的那条路。

也可以把激活想成「闸门」:线性部分先算出一个分数 z z z,激活再决定这个分数以什么形状往下传------压到概率区间、压到对称区间,或干脆把负数掐掉。闸门不同,网络能表示的函数族就不同。

常见三类: f = f= f= SigmoidtanhReLU


3. Sigmoid:压到 0~1

σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1+e^{-z}} σ(z)=1+e−z1

输出落在 ( 0 , 1 ) (0,1) (0,1),曲线呈 S 形。第 06 篇查表直觉仍然适用: z = 0 z=0 z=0 时 σ = 0.5 \sigma=0.5 σ=0.5; z z z 很大时逼近 1; z z z 很负时逼近 0。

在网络里,Sigmoid 可以作为:

  • 输出层:二分类概率(逻辑回归同款)
  • 隐藏层:能用,但深层网络里不如 ReLU 常见

原因稍后与「梯度消失」一起说:两端太平,梯度容易变得极小。

汽车高效分类里,若最后一层输出的是「是否高效」的概率,用 Sigmoid 仍然很自然;但若在每一层隐藏单元上都套 Sigmoid,训练深层时往往更难受------这和「输出层要概率」不是同一需求,别混着用。

3.1 和逻辑回归的关系

逻辑回归可以看成:没有隐藏层 、输出激活为 Sigmoid 的网络。

加上隐藏层并在隐藏单元上也用非线性之后,模型才从「一条(超)平面」走向「可弯折的决策面」。参数变多,第 21 篇的过拟合控制依旧适用。


4. tanh:压到 -1~1

tanh ⁡ ( z ) = e z − e − z e z + e − z \tanh(z) = \frac{e^{z}-e^{-z}}{e^{z}+e^{-z}} tanh(z)=ez+e−zez−e−z

形状也像 S,但值域是 ( − 1 , 1 ) (-1,1) (−1,1),大致关于原点对称(零中心),有时比 Sigmoid 更适合当隐藏激活。

Sigmoid tanh
值域 ( 0 , 1 ) (0,1) (0,1) ( − 1 , 1 ) (-1,1) (−1,1)
零点附近 偏正 可正可负
深层隐藏层 较少作默认 曾常用,现多被 ReLU 替代

两端同样会饱和: ∥ z ∥ \|z\| ∥z∥ 很大时斜率接近 0,深层训练仍可能吃力。

早期不少教程默认隐藏层用 tanh;现在更常见的起点是 ReLU,tanh 仍值得认识,因为它帮助理解「零中心」与「饱和」这两个训练现象。


5. ReLU:小于 0 置零,否则原样通过

ReLU(Rectified Linear Unit,修正线性单元)

ReLU ⁡ ( z ) = max ⁡ ( 0 , z ) \operatorname{ReLU}(z) = \max(0,\ z) ReLU(z)=max(0, z)

  • z < 0 z < 0 z<0 → 输出 0 0 0
  • z ≥ 0 z \ge 0 z≥0 → 输出 z z z

它看起来「有一半是直线」,但整体仍是非线性 (折线),因此「线性套 ReLU 再套线性」不能再合并成单层线性------第 23 篇的反例被打破了。

工程上隐藏层常从 ReLU 起步,常见理由:

说明
计算便宜 不用指数,比 Sigmoid / tanh 快
深层更好训 正半轴梯度为 1,相对不易「梯度消失」
够用 很多表格 / 图像任务上表现稳定

「梯度消失」可以先建立直觉:反传时若每层梯度都乘一个很小的数(Sigmoid 饱和区导数接近 0),靠输入的那几层几乎学不动。ReLU 在 z > 0 z>0 z>0 时导数为 1,这条链不那么容易断。细节会在反向传播篇展开。

也有代价:若大量神经元长期 z < 0 z<0 z<0,可能「死掉」很少更新(dying ReLU);可用 Leaky ReLU 等变体,入门阶段先掌握标准 ReLU 即可。

5.1 选激活时的实用顺序

  1. 隐藏层:先 ReLU
  2. 二分类输出:Sigmoid;多分类输出:Softmax(后续篇)
  3. 回归输出:多数情况不加激活,或按标签是否非负再决定
  4. 验证集上若训练不动,再检查学习率、初始化,其次才换激活变体

6. 手算:同一套权重,加上 ReLU 之后

沿用第 23 篇的微型网络。输入 x = ( 1.0 , 2.0 ) \mathbf{x}=(1.0,\ 2.0) x=(1.0, 2.0),

z 1 = 0.7 , z 2 = 0.4 \begin{aligned} z_1 &= 0.7,\quad z_2 = 0.4 \\ \end{aligned} z1=0.7,z2=0.4

(加权和结果与上篇相同。)

无激活 时: h = ( 0.7 , 0.4 ) h=(0.7,\ 0.4) h=(0.7, 0.4),再线性得到 y ′ = − 0.24 y'=-0.24 y′=−0.24,且可合并成等效单层。

加 ReLU 后:两者都 > 0 >0 >0,故 a = ReLU ⁡ ( z ) = z a=\operatorname{ReLU}(z)=z a=ReLU(z)=z,这一组数碰巧与无激活相同。换一组权重让某个 z z z 变负,差别就出现了:

设 z 1 = 0.7 z_1=0.7 z1=0.7, z 2 = − 0.5 z_2=-0.5 z2=−0.5,则

a 1 = 0.7 , a 2 = ReLU ⁡ ( − 0.5 ) = 0 a_1=0.7,\quad a_2=\operatorname{ReLU}(-0.5)=0 a1=0.7,a2=ReLU(−0.5)=0

输出若仍用 y ′ = − 1.0 + 0.8 a 1 + 0.5 a 2 y'=-1.0+0.8 a_1+0.5 a_2 y′=−1.0+0.8a1+0.5a2:

y ′ = − 1.0 + 0.8 × 0.7 + 0.5 × 0 = − 0.44 y'=-1.0+0.8\times 0.7+0.5\times 0 = -0.44 y′=−1.0+0.8×0.7+0.5×0=−0.44

若没有 ReLU, z 2 = − 0.5 z_2=-0.5 z2=−0.5 会继续乘进下一层,结果不同。更重要的是:无法再写成与「无隐藏层线性模型」完全等价的固定 W eff W_{\text{eff}} Weff------因为「小于 0 砍掉」阻断了线性合并。

再看汽车直觉:某个隐藏单元可能表示「偏重且大排量」一类的组合信号。当加权和为负时,ReLU 相当于说「这个组合当前不成立,先别往下传」;为正时则按强度传递。这种开关式行为,是纯线性层给不了的。


7. 完整神经网络的三块积木

到这里,日常说的「神经网络」通常包含:

组件 作用
分层节点 输入 / 隐藏 / 输出
权重与偏置 层与层之间的可学习连接
激活函数 把非线性塞进前向路径;不同层可用不同 f f f

常见搭配:

  • 隐藏层:ReLU(默认起点)
  • 二分类输出:Sigmoid
  • 回归输出:常常不用激活,或按标签范围另选

提醒:网络灵活,不代表一定优于精心设计的特征交叉;数据干净、评估正确(第 18~22 篇)仍然优先。网络是多一条路,不是免检通行证。

对汽车油耗这类中小表格,常见路径是:线性 / 逻辑回归基线 → 少量手工特征 → 浅层 ReLU 网络。若浅层都过拟合,先加数据或加强正则,而不是先换更花的激活。


8. 动手:有无激活,能否合并成单层

python 复制代码
import numpy as np

X = np.array([[1.0, 2.0], [0.5, 1.0]])
W1 = np.array([[0.5, -0.4], [0.1, 0.3]])
b1 = np.array([0.0, 0.2])
W2 = np.array([0.8, 0.5])
b2 = -1.0

def forward_linear(x):
    h = x @ W1 + b1
    return h @ W2 + b2

def forward_relu(x):
    z = x @ W1 + b1
    a = np.maximum(z, 0.0)  # ReLU
    return a @ W2 + b2

# 制造一个会触发 ReLU 截断的权重
W1_neg = W1.copy()
W1_neg[0, 1] = -2.0  # 让 h2 更容易为负

def forward_relu_neg(x):
    z = x @ W1_neg + b1
    a = np.maximum(z, 0.0)
    return z, a, a @ W2 + b2

print("all-positive hidden, linear vs relu:")
print(" linear", [forward_linear(x) for x in X])
print(" relu  ", [forward_relu(x) for x in X])

print("\nwith negative pre-activation:")
for x in X:
    z, a, y = forward_relu_neg(x)
    y_lin = (x @ W1_neg + b1) @ W2 + b2
    print(f"x={x}, z={z}, a={a}, y_relu={y:.4f}, y_no_act={y_lin:.4f}")

# 无激活时可合并;有 ReLU 后对全体 x 不存在单一 W_eff
W_eff = W1 @ W2
b_eff = b1 @ W2 + b2
print("\neffective linear matches no-act:", np.allclose(X @ W_eff + b_eff, [forward_linear(x) for x in X]))

当隐藏预激活有正有负时,y_reluy_no_act 会分开;无激活时仍能被 W_eff 复现。这就是激活函数的存在感。

若在隐藏层改用 1/(1+np.exp(-z)),数值会落在 ( 0 , 1 ) (0,1) (0,1),一般也不能再与「无隐藏的线性模型」全局等价------非线性一旦插入,合并技巧就失效。ReLU 只是最容易手算、也最常作为默认的那一种。


9. 能力边界与常见误区

9.1 适用边界

  • 本篇讲前向里的非线性;训练时梯度如何过激活,见下一篇反向传播。
  • 还有 Softmax、GELU、Swish 等;入门先吃透 Sigmoid / tanh / ReLU。
  • 输出激活要服从任务:概率用 Sigmoid / Softmax,任意实数回归通常裸输出。

9.2 常见误区

误区 正解
有隐藏层就有非线性 还要有非线性激活
ReLU「是直线」所以是线性模型 折线整体非线性,且不可随意合并层
隐藏层必须用 Sigmoid 深层更常从 ReLU 起
激活选得越花哨越好 先 ReLU + 数据纪律,再谈花式变体
输出也一律 ReLU 回归标签可为负时会被错误截断
激活可以替代清洗与划分 脏数据、泄漏、不平衡仍按第 18~22 篇处理

选型时不必纠结「哪一种绝对最好」:先保证前向里真的有非线性,再用验证集比较 ReLU 与少数备选。多数入门项目里,隐藏 ReLU + 合适输出激活,已经够用。


10. 关键术语速查

术语 含义
激活函数 对 z z z 做非线性变换得到 a a a
预激活 z z z 加权和 w ⋅ x + b w\cdot x+b w⋅x+b
Sigmoid 映射到 ( 0 , 1 ) (0,1) (0,1)
tanh 映射到 ( − 1 , 1 ) (-1,1) (−1,1)
ReLU max ⁡ ( 0 , z ) \max(0,z) max(0,z)
梯度消失 深层梯度过小,靠前层难更新
饱和 激活落在斜率近 0 的区段

11. 延伸阅读

资源 适合看什么
专栏第 06 篇 Sigmoid 与概率直觉
专栏第 23 篇 无激活时为何仍线性
NumPy maximum ReLU 的向量化写法
专栏第 21 篇 网络变强后的过拟合控制

12. 小结

激活函数把非线性插进「加权和 → 下一层」之间。Sigmoid、tanh、ReLU 是三条常用曲线;隐藏层多数情况先试 ReLU,二分类输出仍常用 Sigmoid。没有激活,多层只是线性模型的花式写法;有了激活,堆层才开始具备拟合弯曲关系的能力。

前向路径可以写成:

text 复制代码
z = Wx + b → a = f(z) → 再进入下一层

结构(第 23 篇)加上激活(本篇)之后,网络的前向计算路径齐了;接下来要解决的是:损失怎样把错误信号送回每一层的权重------即反向传播。

下一篇进入反向传播:说明损失怎样把梯度一层层传回到各层的权重与偏置,网络怎样更新参数并真正学起来。

系列导航


如果本篇对你有帮助,欢迎点赞、收藏、关注博主,机器学习专栏持续更新中,下次更新不迷路。

相关推荐
威联通安全存储1 小时前
TS-h1677AXU-RP在工程机械机器人弧焊中的部署
大数据·人工智能·python·机器人
IT_陈寒1 小时前
Java线程池踩了个坑,任务居然默默消失了
前端·人工智能·后端
科技之门1 小时前
存量破局・价值新生 高格办公探寻办公资产全新增长曲线
大数据·人工智能
数据皮皮侠AI1 小时前
退市监督数据(2000-2024)
大数据·人工智能·笔记·机器学习·回归
rain_sxr1 小时前
渲染隔离的红利与陷阱:CSS contain 与 content-visibility 实战
人工智能·content-visibility
DLYSB_1 小时前
边缘计算时代:基于轻量级 API 与多协议抽象的“软硬协同”智能告警终端架构实践
人工智能·架构·边缘计算·报警灯
cd_949217211 小时前
中国机器人AI数据采集公司推荐:觅蜂科技以一站式数采方案强势出圈
人工智能·科技·机器人
m0_547486661 小时前
《人工智能通识》全套PPT课件2026版
人工智能·人工智能导论