torch.nn.ReLU()的作用

发布时间:2026/8/14 2:26:51
torch.nn.ReLU()的作用 torch.nn.ReLU()的作用torch.nn.ReLU()—— 最常用的激活函数 一句话 ReLU 把负数变成0正数原样保留。相当于整流器——只让正信号通过。 公式 $$\text{ReLU}(x)\max(0,x)$$importtorchimporttorch.nnasnn relunn.ReLU()xtorch.tensor([-3.0,-1.0,0.0,2.0,5.0])print(relu(x))# tensor([0., 0., 0., 2., 5.])# ↑负数变0 ↑正数不变图像 │ ● │ ● │ ● │ ● │ ● ────────┼────────────── ●●●●●●│ ← 负数全被截断成0-3-10123为什么要用激活函数 如果没有激活函数多层神经网络等价于一层矩阵乘法套矩阵乘法还是矩阵乘法表达能力极弱。 没有激活函数 yW2(W1·x)W·x → 还是线性学不了复杂规律 有激活函数 yW2(ReLU(W1·x))→ 非线性能拟合任意复杂函数 ReLU 给网络引入非线性让它能学到如果 A 则 B这种非线性关系。 为什么 ReLU 比 sigmoid 好 sigmoid ReLU 输出范围(0,1)[0,∞)梯度 两端趋近0梯度消失 正数区恒为1稳定 计算 复杂e 指数 简单max(0,x) 训练速度 慢 快 梯度消失问题sigmoid 在 x 很大或很小时梯度几乎为0深层网络传着传着梯度就没了学不动。ReLU 在正数区梯度恒为1不会有这个问题。 在 LLM 中的角色 GPT 用的是 ReLU 的改进版 GELU你在 Ch04 见过# Ch04 的 FeedForward 里classFeedForward(nn.Module):def__init__(self,cfg):self.layersnn.Sequential(nn.Linear(emb_dim,4*emb_dim),# 放大GELU(),# ← 和 ReLU 一样的位置但更平滑nn.Linear(4*emb_dim,emb_dim),# 缩小)输入(768)→ Linear → 放大到3072→ GELU激活 → Linear → 缩回768↑ GELU 和 ReLU 都是非线性开关 GELU 是 ReLU 的平滑版本效果更好 速记 特性 说明 作用 负数→0正数保留 公式max(0,x)为什么用 引入非线性让网络能学复杂规律 优势 计算快、无梯度消失 LLM 里 GPT 用它的平滑版 GELU 一句话ReLU 就是负的砍掉正的留下给神经网络注入非线性能力是训练能收敛的关键组件之一。