神经网络激活函数: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= Sigmoid 、tanh 、ReLU。
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 选激活时的实用顺序
- 隐藏层:先 ReLU
- 二分类输出:Sigmoid;多分类输出:Softmax(后续篇)
- 回归输出:多数情况不加激活,或按标签是否非负再决定
- 验证集上若训练不动,再检查学习率、初始化,其次才换激活变体

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_relu 与 y_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 篇)加上激活(本篇)之后,网络的前向计算路径齐了;接下来要解决的是:损失怎样把错误信号送回每一层的权重------即反向传播。
下一篇进入反向传播:说明损失怎样把梯度一层层传回到各层的权重与偏置,网络怎样更新参数并真正学起来。
系列导航:
- 上一篇:【机器学习】(23)------ 神经网络入门
- 下一篇(预告):反向传播------神经网络如何更新权重
如果本篇对你有帮助,欢迎点赞、收藏、关注博主,机器学习专栏持续更新中,下次更新不迷路。