函数与图像
本章节我们将把常见函数的图像直观的展示出来,看懂图像的形状比记住公式更重要。
损失函数曲面、激活函数,本质都是这些基础形状的变体,每个函数都配了可切换的交互图像,动手切换、拖动,比看静态插图有效得多。
为什么要专门学"看图"
数学公式描述的是"规则",图像描述的是"规则长什么样"。
很多深度学习的核心问题,本质上都是"曲线或曲面形状"问题:
| 深度学习问题 | 本质上的形状问题 |
|---|---|
| 为什么某些损失函数更容易优化 | 看它的曲面是不是"碗状"(凸函数) |
| 为什么 sigmoid 会导致训练变慢 | 看它的图像在两端有多"平" |
| 为什么 ReLU 成了默认选择 | 看它的图像有多"简单" |
带着"这是什么形状、两端怎么样、中间怎么样"的问题去看每一个函数,会比死记公式记得更牢。
五种基础函数图像
线性函数:y = kx + b
形状是一条直线。 是斜率,决定倾斜程度和方向(k>0 向右上,k<0 向右下); 是截距,决定直线与 y 轴的交点。
定义域、值域都是全体实数,变化率(斜率)处处相同,这是"线性"这个词的含义。
在 AI 中的角色:神经元最基础的运算 正是一条高维空间中的线性函数。权重控制方向和倾斜程度,偏置控制整体平移。
二次函数:y = ax² + bx + c
形状是一条抛物线。 开口向上(碗状),有最小值; 开口向下(倒扣的碗),有最大值。
顶点是曲线的转折点,可以用配方法求出:,图像关于顶点所在的竖直线对称。
在 AI 中的角色:最简单的凸函数长这样。均方误差损失(MSE)在很多简化场景下就接近这种"碗状"曲面--梯度下降在碗状曲面上非常容易找到最低点,因为无论从哪个方向下山,都会走向同一个谷底。
指数函数:y = aˣ(a>0 且 a≠1)
形状是一条不断加速上升(a>1 时)或不断衰减(0<a<1 时)的曲线,永远不会碰到 x 轴,x 轴是它的水平渐近线。
定义域是全体实数,值域是 。输入线性增长,输出是"爆炸式"增长,这是指数函数最核心的性质。
在 AI 中的角色:softmax 里的 、Adam 优化器动量项里的指数衰减,都是在利用"放大差异"或"逐渐遗忘"的性质。
对数函数:y = logₐx(a>0 且 a≠1)
和指数函数正好是"镜像"关系(以直线 y=x 为对称轴)。曲线在 x 从 0 开始迅速上升,然后增长越来越慢。
定义域是 ,值域是全体实数。输入越大,增长越慢,与指数函数完全相反。
在 AI 中的角色:交叉熵损失里的 ,正是利用对数"在 0 附近极其陡峭、在 1 附近趋于平缓"的形状--模型越自信却错得越离谱,惩罚越重。
三角函数:y = sin(x)、y = cos(x)
形状是波浪线,不断重复(周期性),永远在 -1 到 1 之间摆动(有界性)。sin(x) 从原点出发向上,cos(x) 在 x=0 处达到最大值 1。
周期为 ,值域是 。
在 AI 中的角色:Transformer 的位置编码直接用不同频率的 sin/cos 波形叠加,给序列中每个位置生成一个独特又有规律的"坐标"(第三章展开)。
三种关键的 AI 激活函数
激活函数是神经网络每一层的"非线性来源",它们的形状直接决定了训练的难易。
sigmoid:σ(x) = 1 / (1 + e⁻ˣ)
形状是一条 S 形曲线,从 0 缓慢爬升到 1,中间(x=0 附近)爬升最快,两端趋于平坦。
值域是开区间 ,常被解释为"概率"。
最大的副作用:两端的斜率趋近于 0。当输入的绝对值很大时(比如 x=10 或 x=-10),sigmoid 曲线几乎是平的,梯度几乎为零。
在深层网络里,如果很多层都用 sigmoid,梯度在反向传播时会被这些"平坦区域"一层层削弱,最终传不到前面的层--这就是梯度消失问题最直观的几何来源。
ReLU:f(x) = max(0, x)
形状是一条折线:x<0 时贴着 x 轴(输出恒为 0),x≥0 时是一条斜率为 1 的直线。
负半轴导数恒为 0,正半轴导数恒为 1,没有 sigmoid 那种"逐渐变平"的过程,计算也极其简单(只需一次比较)。
正半轴的梯度永远是 1,不会随输入变大而衰减,大大缓解了梯度消失问题,这是 ReLU 成为默认激活函数的直觉原因。
它也有自己的问题:负半轴梯度恒为 0,可能导致某些神经元"死掉"不再更新--这从图像形状上也能直接看出来。
tanh:f(x) = (eˣ - e⁻ˣ) / (eˣ + e⁻ˣ)
和 sigmoid 很像的 S 形曲线,但以原点为中心、值域是 。
相比 sigmoid,tanh 的输出以 0 为中心。如果下一层网络的输入均值接近 0,训练往往更稳定,这是 tanh 在某些场景更受欢迎的原因。
但它并没有解决"两端变平"的根本问题,这也是后来 ReLU 系列函数流行起来的背景。
交叉熵为什么用 -log(p)
二分类问题里,模型预测"正确类别"的概率为 ,交叉熵损失就是 。
直觉上你可能会想:用 当损失不是更简单吗?两条曲线放在一起,差距立刻可见。
实例
import math
# ---- 第一部分:sigmoid 导数随 |x| 增大而衰减 ----
def sigmoid(x):
return 1 / (1 + math.exp(-x))
def sigmoid_grad(x):
s = sigmoid(x)
return s * (1 - s) # sigmoid 的导数公式
print(sigmoid_grad(0)) # 峰值处:0.25,已经是 sigmoid 导数的最大值
print(sigmoid_grad(5)) # |x|=5 时:只剩不到 0.007
print(sigmoid_grad(10)) # |x|=10 时:约 0.0000456,梯度几乎消失
# ---- 第二部分:-log(p) 的惩罚增长 ----
for p in [1.0, 0.5, 0.1, 0.01]:
print(p, -math.log(p)) # p 越小惩罚越陡,p=0.01 时惩罚已达 4.6
执行以上代码输出结果为:
0.25 0.006648056670790155 4.5395807735957664e-05 1.0 0.0 0.5 0.6931471805599453 0.1 2.302585092994046 0.01 4.605170185988091
两个数字值得记住:sigmoid 导数的峰值只有 0.25;p 从 0.5 降到 0.01 时, 的惩罚从 0.69 涨到 4.6。
把"形状直觉"用起来的三个场景
| 场景 | 看什么形状 | 判断依据 |
|---|---|---|
| 判断损失函数是否好优化 | 曲面是否接近"碗状"(凸) | 越接近碗状,梯度下降越容易找到全局最低点;坑坑洼洼(非凸)可能陷入局部最优 |
| 判断激活函数是否拖慢训练 | 图像两端是否"变平" | 越平,梯度消失问题越明显 |
| 判断函数是否适合做概率输出 | 值域是否有界 | 值域压缩在 (0,1) 类区间才能解释成概率,这是 sigmoid、softmax 被选中的直接原因 |
练习:不看公式,只凭直觉判断--ReLU 和 sigmoid,哪一个更适合放在网络的最后一层做"二分类概率输出"?为什么?
点击查看答案
sigmoid 更适合,因为它的值域是 ,天然可以解释成"属于某一类的概率"。
ReLU 的值域是 ,没有上界,不能直接当作概率使用。
本章小结
| 函数 | 形状关键词 | 对应 AI 概念 |
|---|---|---|
| 线性函数 | 直线,处处斜率相同 | 神经元的加权求和 wx+b |
| 二次函数 | 碗状 / 倒扣碗状 | 损失函数曲面(凸函数直觉) |
| 指数函数 | 加速上升或衰减 | softmax、动量项 |
| 对数函数 | 增长越来越慢 | 交叉熵损失 |
| 三角函数 | 周期性波浪 | 位置编码 |
| sigmoid | S 形,两端变平 | 概率输出,梯度消失的来源 |
| ReLU | 折线,负半轴归零 | 默认激活函数 |
| tanh | S 形,以 0 为中心 | 需要"零均值输出"的场景 |
