第 05 章:什么是激活函数?
从 Sigmoid、Tanh、ReLU 到 GELU,理解神经网络为什么能够学习复杂规律
上一章我们从一个神经元开始,认识了:
[
z=Wx+b
]
然后:
[
a=f(z)
]
这里的:
[
f
]
就是我们今天要重点学习的:
Activation Function —— 激活函数
如果你正在从 Java 后端转向 AI,这一章非常重要。
因为你以后学习:
CNN
RNN
LSTM
Transformer
BERT
GPT
Qwen
DeepSeek
都会不断遇到:
ReLU
GELU
SiLU
Softmax
Sigmoid
Tanh
而理解它们的关键并不是背公式,而是先搞明白:
为什么神经网络一定需要激活函数?
一、先回顾一个神经元
上一章我们知道,一个简单神经元:
[
z=w_1x_1+w_2x_2+\cdots+w_nx_n+b
]
然后:
[
a=f(z)
]
也就是:
Input
↓
Weight
↓
Weighted Sum
↓
+ Bias
↓
Activation Function
↓
Output
其中:
W、b
↓
模型参数
而:
f
↓
Activation Function
通常不是模型通过训练得到的参数,而是我们选择的函数。
二、最关键的问题:为什么不能直接输出 z?
假设我们有一个神经元:
[
z=2x+1
]
然后第二层:
[
y=3z+2
]
代入:
[
y=3(2x+1)+2
]
得到:
[
y=6x+5
]
发现了吗?
无论我们堆多少层:
Linear
↓
Linear
↓
Linear
↓
Linear
↓
Linear
最终还是:
[
y=Wx+b
]
也就是说:
堆很多层线性函数,最终仍然只是一个线性函数。
这就非常麻烦。
三、为什么线性模型不够?
因为现实世界大量问题都是非线性的。
例如:
输入
↓
复杂规律
↓
输出
不是简单的:
[
y=ax+b
]
比如:
图像识别
像素
↓
边缘
↓
纹理
↓
形状
↓
眼睛
↓
脸
↓
猫
语音识别
声音波形
↓
频率
↓
音素
↓
词
↓
句子
LLM
Token
↓
Embedding
↓
Attention
↓
MLP
↓
Attention
↓
MLP
↓
……
↓
Next Token
这些都不是简单的线性关系。
所以神经网络需要一种东西:
让网络具备非线性表达能力。
这就是激活函数最核心的作用。
四、激活函数最重要的作用:引入非线性
记住这一句话:
Activation Function 的核心作用之一,就是给神经网络引入非线性。
没有激活函数:
Linear
↓
Linear
↓
Linear
仍然可以合并成:
Linear
有激活函数:
Linear
↓
Non-linear Activation
↓
Linear
↓
Non-linear Activation
↓
Linear
模型就能够表达更加复杂的函数。
五、什么叫“非线性”?
先看:
[
y=2x+1
]
这是线性的。
它画出来是一条直线。
而:
[
y=x^2
]
是非线性的。
genui{"graphable_function_v2_learning_block_parameterized":{"expressions":[{"latex":"y=2x+1"},{"latex":"y=x^2"}],"locale_override":"zh-CN"}}
你可以把它简单理解为:
Linear
=
一条直线
Non-linear
=
可以出现弯曲、分段、复杂变化
神经网络就是利用这种非线性,把简单的数学运算组合成非常复杂的函数。
六、第一个经典激活函数:Sigmoid
Sigmoid 是机器学习历史上非常重要的激活函数。
公式:
[
\sigma(x)=\frac{1}{1+e^{-x}}
]
它最大的特点:
[
0<\sigma(x)<1
]
也就是说:
输入很小
↓
输出接近 0
输入 = 0
↓
输出 = 0.5
输入很大
↓
输出接近 1
genui{"graphable_function_v2_learning_block_parameterized":{"expressions":[{"latex":"y=\frac{1}{1+e^{-x}}"}],"locale_override":"zh-CN"}}
它的形状大概是一个:
S 型曲线
七、为什么 Sigmoid 曾经非常流行?
因为它非常适合表达:
概率。
例如:
模型输出:
0.95
可以理解成:
这个样本属于正类的概率约为 95%。
例如:
垃圾邮件?
模型:
[
0.93
]
可以理解成:
93% 的概率是垃圾邮件。
所以 Sigmoid 在:
Binary Classification
二分类
中非常常见。
八、Sigmoid 最大的问题:梯度消失
这就是深度学习历史上非常重要的问题。
Sigmoid:
[
\sigma(x)=\frac{1}{1+e^{-x}}
]
它的导数:
[
\sigma'(x)=\sigma(x)(1-\sigma(x))
]
由于:
[
0<\sigma(x)<1
]
所以导数最大值只有:
[
0.25
]
而且当:
x 非常大
或者:
x 非常小
导数都会非常接近:
[
0
]
也就是:
输入很大
↓
Sigmoid
↓
梯度 ≈ 0
或者:
输入很小
↓
Sigmoid
↓
梯度 ≈ 0
九、为什么梯度接近 0 很麻烦?
因为神经网络训练依赖:
Gradient —— 梯度
我们上一章讲过:
Loss
↓
Backward
↓
Gradient
↓
Update Parameters
如果:
[
Gradient\approx0
]
那么:
参数更新
↓
几乎不动
于是:
模型学习得非常慢,甚至几乎学不动。
这就是:
Vanishing Gradient —— 梯度消失
十、为什么深层网络特别容易出现梯度消失?
因为反向传播依赖:
Chain Rule —— 链式法则
假设:
Layer 5
↓
Layer 4
↓
Layer 3
↓
Layer 2
↓
Layer 1
反向传播时:
Gradient
↓
× g₅
↓
× g₄
↓
× g₃
↓
× g₂
↓
× g₁
假设每层梯度都是:
[
0.1
]
那么:
[
0.1^5=0.00001
]
如果有 20 层:
[
0.1^{20}=10^{-20}
]
梯度几乎就没了。
所以:
深层网络 + 不合适的激活函数,可能导致梯度越来越小。
十一、第二个经典激活函数:Tanh
Tanh:
[
tanh(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}}
]
输出范围:
[
(-1,1)
]
也就是说:
x → -∞
↓
-1
x = 0
↓
0
x → +∞
↓
1
genui{"graphable_function_v2_learning_block_parameterized":{"expressions":[{"latex":"y=\tanh(x)"}],"locale_override":"zh-CN"}}
它也是一个 S 型曲线。
十二、Tanh 和 Sigmoid 有什么区别?
最重要的区别:
| Sigmoid | Tanh | |
|---|---|---|
| 输出范围 | (0,1) | (-1,1) |
| 中心 | 0.5 | 0 |
| 是否零中心 | ❌ | ✅ |
| 梯度消失 | 有 | 有 |
Sigmoid:
[
0\sim1
]
Tanh:
[
-1\sim1
]
Tanh 是:
Zero-centered —— 零中心
这通常让优化更加方便。
所以在早期神经网络中:
Sigmoid
↓
Tanh
Tanh 经常是一个更好的选择。
十三、但是 Tanh 仍然存在梯度消失
虽然 Tanh 比 Sigmoid 更好一些,但它依然会:
x → 很大
↓
Tanh → 1
↓
Gradient → 0
或者:
x → 很小
↓
Tanh → -1
↓
Gradient → 0
所以:
Tanh 并没有彻底解决深层网络的梯度消失问题。
这时候我们需要一个更加简单的激活函数。
十四、ReLU 登场
ReLU:
Rectified Linear Unit
公式非常简单:
[
ReLU(x)=\max(0,x)
]
也就是:
如果 x < 0:
0
如果 x ≥ 0:
x
例如:
| x | ReLU(x) |
|---|---|
| -5 | 0 |
| -2 | 0 |
| -1 | 0 |
| 0 | 0 |
| 1 | 1 |
| 2 | 2 |
| 5 | 5 |
十五、ReLU 为什么这么受欢迎?
它简单到令人发指:
def relu(x):
return max(0, x)
正数:
x = 5
↓
5
负数:
x = -5
↓
0
而且对于:
[
x>0
]
它的导数:
[
ReLU'(x)=1
]
这意味着:
在正数区域,梯度不会因为 ReLU 本身而不断缩小。
这对深层网络训练非常有帮助。
十六、ReLU 的另一个特点:稀疏激活
假设:
输入:
-3
2
-1
5
-8
4
经过 ReLU:
0
2
0
5
0
4
很多神经元输出:
0
这意味着:
部分神经元在某些输入下不会被激活。
这种稀疏性在一定程度上有助于表示学习和计算效率。
十七、ReLU 的问题:Dying ReLU
ReLU 虽然很好,但并不完美。
看:
[
ReLU(x)=\max(0,x)
]
如果:
[
x<0
]
那么:
[
ReLU(x)=0
]
同时:
[
ReLU'(x)=0
]
于是:
x < 0
↓
输出 0
↓
梯度 0
↓
参数可能长期得不到更新
这个神经元可能就:
“死掉了”。
这就是:
Dying ReLU
十八、什么情况下 ReLU 容易“死亡”?
例如某个神经元长期得到:
z < 0
那么:
ReLU(z) = 0
并且:
gradient = 0
它就很难重新恢复。
当然现代网络的初始化、优化器、学习率等都会影响这种现象,实际情况没有这么绝对。
十九、Leaky ReLU
为了解决 ReLU 在负数区域:
[
gradient=0
]
的问题,可以让负数区域保留一个很小的斜率。
例如:
[
LeakyReLU(x)=
\begin{cases}
x,&x>0\
0.01x,&x\le0
\end{cases}
]
也就是:
正数
↓
x
负数
↓
0.01x
genui{"graphable_function_v2_learning_block_parameterized":{"expressions":[{"latex":"y=x","restrictions":["x>0"]},{"latex":"y=0.01x","restrictions":["x\le 0"]}],"locale_override":"zh-CN"}}
这样:
负数区域
↓
仍然存在梯度
所以一定程度上缓解:
Dying ReLU。
二十、ReLU 家族
你以后会看到一堆名字:
ReLU
Leaky ReLU
PReLU
ELU
GELU
SiLU
Swish
不要一看到名字就害怕。
核心思想都是:
通过某种非线性函数,把神经元的输入转换成输出。
二十一、现代 Transformer 更重要的:GELU
现在进入和 LLM 非常相关的:
GELU
全称:
Gaussian Error Linear Unit
它在 Transformer 系列模型中非常重要。
经典定义:
[
GELU(x)=x\Phi(x)
]
其中:
[
\Phi(x)
]
是标准正态分布的累积分布函数。
二十二、GELU 为什么和 ReLU 不一样?
ReLU:
负数
↓
直接砍掉
↓
0
GELU:
负数
↓
不是简单地全部变成 0
↓
而是平滑地压制
所以它不是:
突然:
0 → x
而是更加平滑。
可以把它粗略理解成:
ReLU:
“负数全部不要。”
GELU:
“负数不是完全不要,
而是根据输入大小进行平滑处理。”
二十三、GELU 的近似公式
实际工程中经常看到:
[
GELU(x)
\approx
\frac{x}{2}
\left(
1+\tanh
\left[
\sqrt{\frac{2}{\pi}}
\left(x+0.044715x^3\right)
\right]
\right)
]
第一次看到这个公式:
不要慌。
你目前完全没必要背它。
只需要知道:
GELU
=
一种平滑的非线性激活函数
以及:
它在 Transformer / NLP 模型历史上非常重要。
二十四、为什么 Transformer 喜欢 GELU?
一个重要原因是:
GELU 的函数形状更加平滑。
相比:
ReLU:
max(0,x)
GELU:
平滑地处理输入
在很多 Transformer 架构中,这种性质表现得很好。
例如经典 BERT 的 Transformer FFN 就使用 GELU。
很多早期 Transformer/LLM 架构也大量采用 GELU。
二十五、但是现在很多 LLM 又喜欢 SiLU / SwiGLU
这时候你会发现:
“老师,你前面说 GELU 很重要,为什么现在又冒出来 SiLU?”
因为:
模型架构一直在发展。
SiLU:
[
SiLU(x)=x\sigma(x)
]
也叫:
Swish
它与 GELU 的形状比较接近:
平滑
+
非线性
+
不会像 ReLU 那样简单粗暴地截断负数
现代一些 Transformer/LLM 架构中会使用:
SiLU
SwiGLU
GEGLU
等结构。
二十六、SwiGLU 是什么?
你以后看 LLM 架构,很可能遇到:
SwiGLU
它不是简单的一个激活函数。
而是一种:
Gated Linear Unit 结构 + Swish/SiLU
粗略理解:
输入
↓
两条分支
↓
一条负责内容
一条负责门控
↓
相乘
↓
输出
可以粗略表示:
[ SwiGLU(x)
SiLU(xW_1)\odot(xW_2)
]
然后再经过一个线性层。
这里:
[
\odot
]
表示逐元素相乘。
二十七、为什么 LLM 喜欢这种结构?
因为相比简单:
Linear
↓
ReLU
↓
Linear
一些门控结构能够提供更加灵活的特征变换能力。
你以后学习:
Transformer
↓
FFN
↓
SwiGLU
时,就会再次遇到这里的知识。
二十八、激活函数到底解决了什么问题?
现在总结一下。
没有激活函数:
Linear
↓
Linear
↓
Linear
↓
Linear
最终:
Linear
表达能力有限。
加入:
Activation
之后:
Linear
↓
Non-linear
↓
Linear
↓
Non-linear
↓
Linear
就能够构建复杂的非线性函数。
所以:
激活函数让深度神经网络真正具备强大的函数表达能力。
二十九、为什么说神经网络是“万能函数逼近器”?
这是一个非常重要的理论结果:
Universal Approximation Theorem —— 通用逼近定理
简单理解:
一个具有足够神经元和合适非线性激活函数的神经网络,可以在一定条件下:
逼近非常广泛的一类连续函数。
这意味着:
复杂规律
↓
拆成很多简单计算
↓
通过多层神经网络组合
↓
逼近复杂函数
所以神经网络为什么强?
并不是因为:
“一个神经元特别聪明。”
而是:
大量简单计算单元 + 非线性 + 多层组合。
三十、一个非常重要的直觉
可以把:
Neuron
想象成一个非常简单的积木。
一个:
Neuron
很简单。
但是:
100 个 Neuron
可以组成更复杂的结构。
再:
1000 个
再:
1000000 个
再:
数十亿参数
最终:
复杂度会非常惊人。
这就是深度学习的基本思想之一。
三十一、Sigmoid、Tanh、ReLU、GELU 对比
这是这一章最值得保存的一张表:
| 激活函数 | 输出范围 | 优点 | 缺点 | 常见场景 |
|---|---|---|---|---|
| Sigmoid | (0,1) | 可表示概率 | 梯度消失 | 二分类输出 |
| Tanh | (-1,1) | 零中心 | 梯度消失 | 早期 RNN 等 |
| ReLU | [0,+∞) | 简单、训练快 | Dying ReLU | CNN/深度网络 |
| Leaky ReLU | (-∞,+∞) | 缓解神经元死亡 | 负区间仍较简单 | 部分深度网络 |
| GELU | (-∞,+∞) | 平滑 | 计算更复杂 | Transformer/BERT 等 |
| SiLU | (-∞,+∞) | 平滑、非单调 | 计算复杂 | 现代深度网络/LLM |
| Softmax | (0,1),和为 1 | 概率分布 | 特殊用途 | 多分类输出 |
注意:
Softmax 和 ReLU/GELU 的用途并不完全一样。
Softmax 更多用于把一组 logits 转换成概率分布。
三十二、Softmax 为什么也叫“激活函数”?
Softmax:
[ softmax(z_i)
\frac{e^{z_i}}
{\sum_j e^{z_j}}
]
假设模型输出:
猫:2.0
狗:1.0
鸟:0.1
经过 Softmax:
猫:0.66
狗:0.24
鸟:0.10
于是:
概率总和:
1.00
所以:
Softmax 可以把一组分数转换成概率分布。
三十三、LLM 的输出为什么不是直接“选一个词”?
这和 Softmax 有很大关系。
假设词表:
100,000 Tokens
模型最后输出:
100,000 个 logits
例如:
我 → 3.1
喜欢 → 7.2
吃 → 4.5
苹果 → 8.3
……
然后经过:
Softmax
得到:
我 0.01
喜欢 0.08
吃 0.03
苹果 0.15
……
然后再根据:
Sampling / Greedy / Temperature / Top-K / Top-P
等策略选择下一个 Token。
这个我们后面讲 LLM 时会详细拆。
三十四、激活函数和梯度之间的关系
这是这一章的核心核心。
训练:
Forward
↓
Loss
↓
Backward
↓
Gradient
而激活函数本身也会参与梯度计算。
例如:
Linear
↓
ReLU
↓
Linear
↓
Loss
反向传播时:
Loss
↓
Linear Gradient
↓
ReLU Gradient
↓
上一层
所以:
激活函数的导数性质会直接影响神经网络是否容易训练。
三十五、梯度消失
简单理解:
每一层梯度都 < 1
↓
连续乘很多次
↓
越来越小
↓
接近 0
最终:
前面的层
↓
几乎收不到梯度
↓
几乎不学习
这就是:
Vanishing Gradient
Sigmoid/Tanh 在深层网络中尤其容易出现这个问题。
三十六、梯度爆炸
反过来。
如果某些梯度:
> 1
不断相乘:
[
2\times2\times2\times\cdots
]
就可能越来越大。
例如:
[
2^{20}=1,048,576
]
于是:
Gradient
↓
越来越大
↓
参数更新巨大
↓
Loss 爆炸
↓
训练不稳定
这就是:
Exploding Gradient
三十七、所以激活函数不是越复杂越好
这点很重要。
一个好的激活函数通常需要考虑:
非线性能力
+
梯度性质
+
计算效率
+
数值稳定性
+
实际训练效果
所以:
不是“公式越复杂越厉害”。
ReLU 的公式极其简单:
[
\max(0,x)
]
却在深度学习历史上产生了巨大影响。
三十八、PyTorch 中怎么使用?
ReLU
import torch.nn as nn
activation = nn.ReLU()
GELU
activation = nn.GELU()
Sigmoid
activation = nn.Sigmoid()
Tanh
activation = nn.Tanh()
例如:
model = nn.Sequential(
nn.Linear(10, 64),
nn.ReLU(),
nn.Linear(64, 32),
nn.ReLU(),
nn.Linear(32, 1)
)
结构:
10
↓
64
↓
ReLU
↓
32
↓
ReLU
↓
1
三十九、Transformer 中的激活函数
现在提前看一下 Transformer。
一个经典 Transformer 的 FFN 可以粗略理解为:
Input
↓
Linear
↓
GELU
↓
Linear
↓
Output
也就是:
[
FFN(x)=W_2,GELU(W_1x+b_1)+b_2
]
你现在已经完全可以理解这个公式:
W₁
↓
第一层参数
GELU
↓
非线性
W₂
↓
第二层参数
这就是为什么我们现在先学激活函数。
四十、现代 LLM 中的 SwiGLU
一些现代 LLM 使用:
Input
↓
Linear
↓
SiLU / Gate
↓
Element-wise Multiply
↓
Linear
↓
Output
所以当你以后看到:
SwiGLU
不要觉得这是一个完全陌生的概念。
它本质上还是:
线性变换 + 非线性 + 门控机制。
四十一、一个非常重要的认知:激活函数不是“激活一个神经元这么简单”
名字叫:
Activation Function
容易让人产生误解。
实际上它不是:
“判断这个神经元有没有被激活。”
更准确地说:
它对线性变换后的结果进行非线性映射。
例如:
[
z=Wx+b
]
经过:
[
a=f(z)
]
这个:
[
f
]
就是激活函数。
四十二、这一章你应该形成这样的脑图
Activation Function
│
┌──────────────┼──────────────┐
↓ ↓ ↓
Sigmoid Tanh ReLU
│ │ │
(0,1) (-1,1) [0,+∞) │ │ │ 梯度消失 梯度消失 Dying ReLU │ ↓ Leaky ReLU │ ↓ 更现代的激活函数 │ ┌──────────┴──────────┐ ↓ ↓ GELU SiLU │ │ ↓ ↓ Transformer LLM
四十三、把这一章和上一章连起来
上一章:
[
z=Wx+b
]
这一章:
[
a=f(z)
]
合起来:
[
\boxed{a=f(Wx+b)}
]
这就是一个神经网络层最核心的计算。
然后多层:
[
a_1=f(W_1x+b_1)
]
[
a_2=f(W_2a_1+b_2)
]
[
a_3=f(W_3a_2+b_3)
]
……
最终:
[
y=f(W_n a_{n-1}+b_n)
]
这就是:
深度神经网络。
四十四、再把它和第 02 章连接
第 02 章:
Parameter
↓
Prediction
↓
Loss
↓
Gradient
↓
Update
现在:
Parameter
=
Weight + Bias + ...
而:
Prediction
=
经过多个 Layer + Activation 计算得到
完整过程:
Input
↓
W₁x + b₁
↓
Activation
↓
W₂x + b₂
↓
Activation
↓
...
↓
Prediction
↓
Loss
↓
Backpropagation
↓
Gradient
↓
Optimizer
↓
Update Parameters
到这里,神经网络训练的骨架已经非常完整了。
四十五、这一章最重要的 8 个结论
① 激活函数最重要的作用
引入非线性。
② 没有激活函数
Linear
+
Linear
+
Linear
最终仍然是一个线性变换。
③ Sigmoid
[
\frac{1}{1+e^{-x}}
]
适合概率输出,但深层网络容易梯度消失。
④ Tanh
[
\tanh(x)
]
输出:
[
(-1,1)
]
零中心,但同样存在梯度消失问题。
⑤ ReLU
[
\max(0,x)
]
简单、高效,是深度学习历史上非常重要的激活函数。
⑥ ReLU 的问题
负数区域:
[
gradient=0
]
可能产生:
Dying ReLU。
⑦ GELU
[
GELU(x)=x\Phi(x)
]
是一种平滑的非线性函数,在 Transformer/BERT 等架构中非常重要。
⑧ SiLU / SwiGLU
现代深度网络和部分 LLM 中非常常见。
四十六、面试题
Q1:为什么神经网络需要激活函数?
因为如果没有激活函数,多层线性变换最终仍然可以合并成一个线性变换,网络无法有效表达复杂的非线性关系。
Q2:ReLU 为什么比 Sigmoid 更适合深层网络?
ReLU 在正数区域导数为 1,不容易像 Sigmoid 那样在大正数/大负数区域产生严重的梯度饱和,因此通常更容易训练深层网络。
Q3:ReLU 有什么缺点?
负数区域输出为 0、梯度为 0,部分神经元可能长期不更新,形成 Dying ReLU。
Q4:GELU 和 ReLU 有什么区别?
ReLU 对负数直接截断为 0,而 GELU 通过平滑函数对输入进行非线性变换,不是简单的硬截断。
Q5:什么是梯度消失?
在反向传播过程中,如果连续多层的梯度因子都比较小,经过链式法则不断相乘后,梯度会越来越接近 0,使前面的网络层几乎无法得到有效更新。
Q6:什么是梯度爆炸?
反向传播过程中梯度不断变大,导致参数更新过大,使训练不稳定甚至 Loss 数值爆炸。
四十七、本章最终知识地图
Neural Network
│
↓
Linear Layer
│
z = Wx + b
│
↓
┌──────────────────┐
│ Activation │
│ │
│ Sigmoid │
│ Tanh │
│ ReLU │
│ Leaky ReLU │
│ GELU │
│ SiLU │
└────────┬─────────┘
↓
Non-linearity
│
↓
Multiple Layers
│
↓
Deep Neural Network
│
↓
Forward
│
↓
Loss
│
↓
Backward
│
┌───────┴────────┐
↓ ↓
Gradient Vanishing Gradient Explosion
│
↓
Update
│
↓
Training
五十三、现在你真正需要记住的不是公式,而是这一句话
神经网络之所以强大,不是因为一个神经元很复杂,而是因为大量简单的线性变换通过非线性激活函数层层组合,最终可以逼近非常复杂的函数。
可以把它浓缩成:
[ \boxed{ \text{Neural Network}
\text{Linear Transformation}
+
\text{Non-linearity}
+
\text{Many Layers}
}
]
而训练过程就是:
[
\boxed{
\text{Forward}
\rightarrow
\text{Loss}
\rightarrow
\text{Backward}
\rightarrow
\text{Gradient}
\rightarrow
\text{Update}
}
]
下一章:第 06 章
下一章我们就可以正式进入深度学习训练中最核心的数学工具之一:
第 06 章:什么是梯度与反向传播?——从导数、链式法则到 Backpropagation,彻底搞懂神经网络是怎么“学会”的
这一章会把前面所有东西真正串起来:
一个神经元
↓
y = wx + b
↓
Loss
↓
∂L/∂w
↓
Gradient
↓
Chain Rule
↓
Backpropagation
↓
计算每一个 Weight 的梯度
↓
Optimizer
↓
更新参数
并且会手算一个两层神经网络的完整反向传播过程,再用 PyTorch 的 autograd 对照,让你真正理解:
为什么模型只要不断做 Forward + Backward + Update,就能够从一堆随机参数逐渐“学会”任务。