激活函数与非线性
ReLU、Sigmoid、Tanh、GELU 等函数为网络引入非线性或转换输出。
学习目标
- 用 ReLU 组合出绝对值
- 没有激活的多层网络为什么仍然线性?
- 说明:ReLU 可以产生折点,但不会自动学到合适参数;概率输出也不能任意替换隐藏激活。
为什么需要这个概念
激活函数是施加在层输出上的非线性映射。ReLU、Sigmoid、Tanh、GELU 的输出范围和导数不同,因此会同时影响表示能力与梯度传播。
学习前需要掌握
背景与问题
如果把两个全连接层直接相连,后一层仍只是在前一层的线性结果上做线性变换。无论堆多深,整体都可以合并成一个仿射变换,无法因此获得弯曲的决策边界。
概念定义
激活函数是施加在层输出上的非线性映射。ReLU、Sigmoid、Tanh、GELU 的输出范围和导数不同,因此会同时影响表示能力与梯度传播。
直观理解
ReLU 像按条件打开的开关:某个隐藏特征在正区间传递数值,在负区间停止响应。不同神经元打开的区域不同,多层组合便能拼出分段的非线性函数。
核心原理
仿射层计算 ,逐元素激活计算 。激活通常保持张量形状,改变的是每个位置的数值和局部导数;它不会自动增添特征维度。
ReLU 在正区间导数为 1,负区间为 0。若某神经元对全部训练样本都落在负区间,沿该分支的梯度可能长期为零,形成死亡 ReLU。LeakyReLU 给负半轴保留斜率,但并不能修复错误标签或过大的学习率。
Sigmoid 把实数映射到 0 到 1,适合解释二元概率;当输入绝对值很大时,导数接近零。Tanh 同样会饱和,GELU 则平滑地按输入大小调节输出。隐藏层激活与输出概率变换应分开:交叉熵等组合损失需要原始 logits。
数学表达
核心公式
激活函数是施加在层输出上的非线性映射。ReLU、Sigmoid、Tanh、GELU 的输出范围和导数不同,因此会同时影响表示能力与梯度传播。
变量含义
z激活前 logit 或隐藏值
计算步骤
- 1先对 x 和 -x 分别截断负值。
- 2把两个非负响应相加,得到绝对值。
代码对应位置
示例 1用 ReLU 组合出绝对值的最小验证:使用完整构造输入核对用 ReLU 组合出绝对值,输出只表示本例计算。
变量解释
| 变量 | 含义 |
|---|---|
z | 激活前 logit 或隐藏值 |
完整数值示例
用 ReLU 组合出绝对值
已知条件
- 输入 x 为 -2、0、3
- 两个隐藏单元分别计算 ReLU(x) 与 ReLU(-x)
计算步骤
- 先对 x 和 -x 分别截断负值。
- 把两个非负响应相加,得到绝对值。
计算结果
两条分支相加得到 2、0、3;单个仿射函数无法在整条数轴上表示这个折点。
处理前后对比
- ReLU 可以产生折点,但不会自动学到合适参数;概率输出也不能任意替换隐藏激活。
案例推演与判断
在 x=-2 时,正向单元为 0,反向单元为 2;在 x=3 时恰好相反。最终输出可以写成 。这个构造展示非线性来自激活与分支组合,并不来自“层数”这个数字。
如果删掉两个 ReLU,同样的加法变成 x+(-x)=0,结构仍在却失去目标函数。反向传播时还要注意零点不可微,框架选择一个约定的次梯度;这不妨碍函数前向计算。
计算与实现步骤
- 先对 x 和 -x 分别截断负值。
- 把两个非负响应相加,得到绝对值。
代码实现
示例 1
用 ReLU 组合出绝对值的最小验证
example_01.py用途:使用完整构造输入核对用 ReLU 组合出绝对值,输出只表示本例计算。
import torch
x = torch.tensor([-2., 0., 3.])
y = torch.relu(x) + torch.relu(-x)
print(y.tolist())
print(tuple(y.shape))代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
使用完整构造输入核对用 ReLU 组合出绝对值,输出只表示本例计算。
y- 目标标签或连续目标值。
Step 1 · 1–5 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import torch
x = torch.tensor([-2., 0., 3.])
y = torch.relu(x) + torch.relu(-x)
print(y.tolist())
print(tuple(y.shape))预期输出或运行结果
[2.0, 0.0, 3.0] (3,)
常见错误 · 5 条
- 层多即非线性
- CE 前 Softmax
- 激活等于损失
- 死亡 ReLU
- 确认样本轴、特征轴以及 X 与 y 的第一维完全对应。
实际应用
- MLP、CNN 隐藏层的非线性表示
- 二分类推理时把单个 logit 转成概率
常见错误
- 层多即非线性
- CE 前 Softmax
- 激活等于损失
- 死亡 ReLU
常见问题
没有激活的多层网络为什么仍然线性?
矩阵乘法与偏置可以逐层合并为一个矩阵和一个偏置;中间没有非线性时,深度不会改变这个函数族。
这个示例能说明什么边界?
ReLU 可以产生折点,但不会自动学到合适参数;概率输出也不能任意替换隐藏激活。