为什么点积太大会导致 Softmax 梯度问题,以及这个问题是如何被解决的
以下内容由AI辅助生成
一、问题背景:我们到底在担心什么?
在 Transformer 的注意力机制中,有一个非常经典的公式:
很多人在第一次看到这个公式时都会产生疑问:
- 为什么注意力机制使用点积来计算相关性?
- 为什么点积之后要接一个 softmax?
- 最关键的是:为什么一定要除以
?
如果只是把它当成论文中的经验公式,那么对注意力机制的理解仍然停留在表面。事实上,这个结构并不是为了“效果更好看”,而是为了解决一个在训练过程中非常具体、而且非常致命的问题。
二、softmax 的作用,以及它对输入尺度的敏感性
softmax 的定义如下:
它的作用是把一组实数打分映射为一个概率分布。但 softmax 有一个非常重要的性质:
softmax 对输入的整体尺度极其敏感
当输入数值较为温和时,softmax 会产生一个相对平滑的分布;而当输入整体变大时,softmax 的输出会迅速变得极端。
一个简单的数值例子
情况一:输入尺度适中
1 | 输入: z = [1, 0] |
两个位置都有明显概率,模型仍然保留不确定性。
情况二:输入尺度变大
1 | 输入: z = [10, 0] |
此时 softmax 的输出已经几乎等同于 one-hot 分布 [1, 0]。
这是因为指数函数会将线性差距放大为指数级差距,只要输入的整体尺度变大,softmax 的输出就会迅速向极端塌缩。
三、注意力分数为什么会天然变大:点积的统计性质
在注意力机制中,softmax 的输入来自查询向量和键向量的点积:
对于单个 query-key 对,这个分数可以写成:
在常见训练设置中(例如经过 LayerNorm 之后),可以合理假设:
- 各维度的
相互独立 - 均值为 0
- 方差为 1
点积方差的数学推导
在上述假设下,对于每一项
- 均值:
- 方差:
当
因此标准差为:
关键结论:点积的典型数值规模与
成正比
这并非实现细节或偶然现象,而是高维点积在统计意义上的必然结果。
具体数值示例
| 维度 |
点积标准差 |
典型点积范围 |
|---|---|---|
| 64 | 8 | [-16, 16] |
| 128 | 11.3 | [-23, 23] |
| 512 | 22.6 | [-45, 45] |
当
四、softmax 的梯度结构:什么是 Jacobian?
softmax 是一个向量到向量的函数:
- 输入:
- 输出:
当输入和输出都是向量时,需要描述这样一件事:
某一个输入分量发生微小变化,会如何影响所有输出分量
所有这些“偏导关系”组成的一整张表,称为 Jacobian 矩阵:
softmax 的 Jacobian 具体形式
对于 softmax,其 Jacobian 有明确的数学形式:
关键观察:
- 当
(饱和状态)时, - 当
时,
梯度大小直接由输出概率本身控制
五、softmax 饱和:输出分布发生了什么变化
对比:适中尺度 vs 大尺度
输入尺度适中时(例如
1 | 位置: 1 2 3 4 |
在这种状态下,多个位置都具有非零概率,输出对输入变化是敏感的。
输入尺度变大时(例如
1 | 位置: 1 2 3 4 |
此时,几乎所有概率质量都集中在单一位置,其余位置的概率被压缩到接近零。
这种从“平滑分布”到“极端分布”的转变,称为 softmax 饱和(saturation)。
六、梯度是如何在 softmax 处消失的
在反向传播中,梯度的传递遵循链式法则:
未饱和状态:梯度正常传播
1 | 反向传播路径: |
饱和状态:梯度被截断
1 | 反向传播路径: |
梯度不是在网络深处逐层衰减的,而是在 softmax 这一层被直接截断的
这是一种发生位置非常明确的梯度消失问题。
七、从点积到梯度消失的完整因果链
将前面的所有环节串联起来,可以得到一条完整因果链:
1 | 高维点积统计性质 |
问题的本质是:点积让 softmax 过早进入了饱和区间,从而导致梯度消失。
八、为什么这不是梯度爆炸问题
这一现象有时会被误认为是梯度爆炸,但两者在机制上完全不同。
梯度爆炸 vs 梯度消失对比
| 特征 | 梯度爆炸 | 本文讨论的问题 |
|---|---|---|
| 梯度大小 | 趋向无穷大 | 趋向零 |
| 发生原因 | 导数累乘 > 1 | softmax 饱和导致 ∂s/∂z ≈ 0 |
| 数值稳定性 | 数值溢出 | 数值下溢 |
| 训练表现 | 参数震荡、NaN | 参数停止更新 |
关键区别:
softmax 的梯度由其输出概率控制,具体形式为
softmax 只会压缩梯度,而不会放大梯度。
因此,这里出现的问题不是梯度失控增大,而是梯度被系统性压缩并最终消失。
九、根本解决方案:Scaled Dot-Product Attention
既然问题的根源在于点积的方差与维度成正比(
缩放后的统计性质
缩放后,点积的方差变为:
效果:
- 控制点积的典型尺度稳定在常数级别(与维度无关)
- 防止 softmax 过早进入饱和区
- 保持输出对输入变化的敏感性
- 让梯度能够持续传回 Q 和 K
这一步的本质是方差归一化(variance normalization)。
十、为什么是
三种缩放方式的对比
| 缩放方式 | 点积方差 | softmax 行为 | 问题 |
|---|---|---|---|
| 不做缩放 | 很快饱和 | 梯度消失 | |
| 除以 |
过于均匀 | 区分能力不足,所有位置概率接近 | |
| 除以 |
稳定且可学习 | ✓ 最优 |
直观解释
- 不做缩放:点积方差随
线性增长,softmax 很快饱和 - **除以
**:矫枉过正,点积方差变成 ,当 很大时会让所有注意力权重过于平均,失去了“注意”的意义 - **除以
**:恰好让方差归一化到 1,既不会饱和也不会过于平滑
这一选择与 Xavier 初始化、LayerNorm 等方法背后的统计思想是一致的:保持信号的方差在网络中稳定传播。
十一、总结
点积过大不会导致梯度爆炸,而是会使 softmax 过早进入饱和状态。一旦 softmax 的输出分布变得极端,其 Jacobian 中的梯度项会趋近于零,导致梯度在这一层被有效截断,学习信号无法继续传播到 Q 和 K。
这是一个精心设计的数学解决方案,背后的统计原理清晰明确。
从 0 理解梯度消失与梯度爆炸
以下内容由AI辅助生成
一、训练神经网络到底在做什么
训练神经网络,本质只有一件事:
不断微调参数,使模型输出更接近真实目标。
参数该往哪个方向调、调多大力度,完全由梯度决定。
如果梯度能够稳定传播,模型就能学习;
如果梯度在传播过程中衰减或失控,训练就会失败。
二、什么是梯度(不涉及神经网络)
1. 变化率的直觉理解
考虑函数:
当
- 在
附近, 增加 0.01, 约增加 0.02 - 在
附近,同样增加 0.01, 却增加约 0.2
这说明:
同样的输入变化,在不同位置,对输出的影响不同。
2. 导数的定义
这种“对变化的敏感程度”,就是导数。
数学上,导数的定义为:
对
注: 在单变量函数中称为导数,在多变量函数中,所有偏导数组成的向量称为梯度。
三、梯度在训练中的作用
1. 参数是如何被更新的
设一个最简单的模型:
定义损失函数:
训练的目标是让损失
2. 梯度下降规则
参数更新公式为:
其含义是:
- 梯度大 → 参数调整幅度大
- 梯度小 → 参数调整幅度小
- 梯度为 0 → 参数不再更新
梯度决定了模型是否还能继续学习。
四、神经网络中的梯度从哪里来
1. 神经网络是复合函数
多层神经网络可以表示为函数嵌套:
损失函数是
2. 反向传播的本质
反向传播使用链式法则计算梯度:
也就是说:
梯度是多个导数的连乘结果。
五、梯度消失:为什么“传不到前面”
1. 连乘导致的数值衰减
假设每一层反向传播的导数约为 0.5:
10 层:
50 层:
梯度几乎为 0。
2. 对训练的影响
- 输出层附近仍能更新
- 输入层附近梯度趋近于 0
- 参数几乎不发生变化
这称为梯度消失(Vanishing Gradient)。
六、梯度爆炸:同一机制的反面
1. 连乘导致的数值放大
若每一层导数约为 1.5:
- 10 层:
- 50 层:
2. 对训练的影响
- 参数更新幅度极大
- 损失函数变为 NaN 或 inf
- 数值溢出,模型发散
这称为梯度爆炸(Exploding Gradient)。
七、激活函数为什么会深刻影响梯度
1. 激活函数的作用
如果每一层只有线性变换:
多层叠加后仍等价于一次线性变换,模型表达能力有限。
因此神经网络必须引入非线性激活函数。
2. 激活函数在反向传播中的角色
在反向传播过程中,每一层梯度都会乘上激活函数的导数:
激活函数的导数直接决定梯度是被缩小,还是能够稳定传播。
3. Sigmoid:典型的饱和型激活函数
函数形态:
1 | y |
形态特征:
- 输出值域在 (0, 1) 之间
- 两端逐渐变平,存在明显饱和区
- 当输入绝对值较大时(如
或 ),函数几乎不变化 - 在饱和区内,导数接近 0
- 最大导数出现在
处,值为 0.25
多层连乘后,即使在最佳位置,导数也只有 0.25,梯度迅速衰减,极易出现梯度消失。
4. ReLU:非饱和激活函数
函数形态:
1 | y |
形态特征:
- 负区间输出恒为 0(
时 ) - 正区间保持线性增长(
时 ) - 正区间内导数恒为 1
- 负区间内导数恒为 0
优点: 梯度在正区间不会被缩小,更适合深层网络。
缺点: 负区间梯度为 0,可能导致“神经元死亡”问题(Dead ReLU),即某些神经元永远不会被激活。
5. GELU:平滑的非饱和激活函数
函数形态:
1 | y |
形态特征:
- 整体趋势类似 ReLU
- 负区间平滑过渡,而非硬截断(允许小的负值通过)
- 在
附近是光滑可导的 - 同时保持梯度稳定与函数连续性
- 避免了 ReLU 的“神经元死亡”问题
因此在 Transformer 等现代深层模型中被广泛采用。
6. 激活函数对梯度的整体影响
- Sigmoid / Tanh: 饱和型激活函数,导数最大值为 0.25(Sigmoid)或 1(Tanh),在饱和区导数接近 0,易导致梯度消失
- ReLU: 非饱和激活函数,正区间导数恒为 1,但负区间导数为 0,可能导致神经元死亡
- GELU / Swish: 平滑的非饱和激活函数,结合了 ReLU 的优点并避免了硬截断,在深层网络中表现更好
八、梯度消失与爆炸的本质
梯度问题并非偶然,而是反向传播机制的必然结果:
- 小于 1 的数反复相乘 → 梯度消失
- 大于 1 的数反复相乘 → 梯度爆炸
问题与网络深度、激活函数和结构设计强相关。
九、常见解决思路
针对梯度消失:
- 使用非饱和激活函数(如 ReLU、GELU)代替 Sigmoid、Tanh
- 引入残差连接(ResNet),为梯度提供直接的反向传播路径
- 使用批归一化(Batch Normalization)或层归一化(Layer Normalization)稳定数值尺度
- 适当的权重初始化(如 Xavier、He 初始化)使初始梯度保持在合理范围
针对梯度爆炸:
- 梯度裁剪(Gradient Clipping),限制梯度的最大范数
- 降低学习率
- 使用权重正则化(如 L2 正则化)
- 批归一化同样有助于防止梯度爆炸
十、总结
梯度消失是信号衰减问题,
梯度爆炸是信号放大失控问题。
深度学习模型结构的演进,本质上是在解决同一个问题:
如何让梯度稳定、完整地传回去。
感知机与神经网络如何学习并逼近复杂函数
以下内容由AI辅助生成
——从函数形式到分段线性逼近的机制说明
一、感知机与神经网络的基本函数形式
在深度学习中,感知机及其扩展的神经网络,并不是在使用人为指定的多项式函数形式,例如:
其基本计算结构为:
其中:
:输入特征 :可学习参数 :激活函数(形式固定,由模型结构决定)
神经网络的非线性能力并非来自显式写入平方、立方项,而是来自激活函数与多层组合。
二、模型结构与参数学习的区分
神经网络需要在两个层面上理解:
结构层面:
层数、连接方式、激活函数类型(人为设计)参数层面:
权重、偏置 (通过数据训练得到)
网络不会“选择一个解析公式”,而是在固定结构下,通过参数不断调整,形成某种函数形状。
三、单层感知机的表达能力边界
当模型只有一层(无隐藏层)时:
虽然激活函数引入了非线性,但其表达能力仍然受限:
- 决策边界是线性的(对于分类任务)
- 无法表示真正复杂的非线性决策区域
例如 XOR、圆形边界等问题,无法由单层感知机解决。
复杂函数的表达能力来自隐藏层。
四、复杂函数是如何被“学出来”的
神经网络学习复杂函数的过程,本质是连续的数值优化:
- 参数随机初始化,函数形状与目标无关
- 前向传播,计算当前模型对应的输出函数
- 计算损失函数,仅反映预测误差
- 反向传播,计算参数对损失的梯度
- 梯度下降,微小更新参数
- 多次迭代,函数形状逐步调整
模型并不“理解函数形式”,只是不断在函数空间中朝误差更小的方向移动。
五、非线性激活的作用(以 ReLU 为说明示例)
为便于几何化理解,引入 ReLU 激活函数作为示例:
对一维输入:
其几何特征为:
- 当
,输出为 0 - 当
,输出为一条直线
一个 ReLU 神经元在一维输入下,只做一件事:
在某个位置之后,开始贡献一段线性函数。
六、折点的定义与来源
ReLU 的“折点”定义为:
需要明确:
- 网络中不存在名为
的独立参数 - 折点是权重
与偏置 的比值结果 - 训练过程中仅对
做梯度下降 - 折点位置是参数学习的自然副产物
七、多 ReLU 网络的函数性质
对一维输入、单隐藏层 ReLU 网络:
该函数族具有严格性质:
- 在任意区间内是线性的
- 在折点处一阶导数发生跳变
- 整体函数为分段线性函数
复杂性来自多个折点及其线性部分的叠加。
八、三 ReLU 拼接示例(严格区分“折点”与“输出折线”)
考虑如下网络:
1. 折点(竖直分界线)
该网络包含三个 ReLU,因此理论上只有三个折点:
它们对应三条竖直分界线,用于划分输入区间,本身不是函数图像的一部分:
1 | │ │ │ |
2. 区间划分
折点将输入轴划分为四个区间:
3. 各区间内的函数来源(这是关键)
区间 A:
- ReLU(x+1) = 0
- ReLU(x) = 0
- ReLU(x−1) = 0
输出为:
这是一个常数函数,因此图像是一条横线。
这条横线并不对应任何单个 ReLU
而是“三个 ReLU 全部未激活”的叠加结果
区间 B:
- ReLU(x+1) = x+1
- 其余两个 ReLU = 0
输出为:
这一段直线由 ReLU₁ 单独贡献
区间 C:
- ReLU(x+1) = x+1
- ReLU(x) = x
输出为:
这一段直线是 ReLU₁ 与 ReLU₂ 的线性叠加
区间 D:
- 三个 ReLU 全部激活
输出为:
这一段直线是 三个 ReLU 的线性部分之和
4. 输出函数的折线示意(结果)
1 | y |
需要严格理解:
- 竖线(t):表示 ReLU 的激活边界
- 折线:表示当前所有“已激活 ReLU”的线性部分之和
- 折线不是某个 ReLU 单独“画出来的”
九、为什么这种结构可以逼近抛物线
抛物线
- 斜率随
连续增大
ReLU 网络无法产生连续曲率,但可以通过:
- 足够多折点
- 足够密的斜率跳变
在有限区间内逼近这种行为。
十、有限 ReLU 的表达极限
在一维情况下:
- 有限 ReLU 网络 ⇒ 分段线性函数
⇒ 处处光滑、二阶导数非零
因此:
- ❌ 有限 ReLU 无法在整个实数轴上精确等于
- ✅ 在任意有限区间内,可以逼近到任意精度
十一、需要多少个 ReLU(量级结论)
在区间
若最大误差为
含义为:
- 区间越大 → 折点越多
- 精度要求越高 → 折点越多
十二、整体总结
- 神经网络不显式构造高次多项式
- 表达能力来自线性变换与非线性激活的组合
- ReLU 在一维下本质生成分段线性函数
- 折点是参数学习的自然结果,而非人为设定
- 折线是多个 ReLU 线性部分的叠加结果
- 光滑函数只能被有限 ReLU 逼近,不能被精确等同
交叉熵损失与最大似然估计:完全理解指南
以下内容由AI辅助生成
一、从最基本的问题开始
1.1 模型如何表达预测?
假设你在训练一个图像分类模型:
任务:判断这张图是「猫」还是「狗」?
模型不会直接给出“猫”或“狗”这样的硬答案,而是输出概率分布:
- “我认为是猫的概率是 0.8,是狗的概率是 0.2”
👉 核心理解:模型输出的是“置信度(概率)”,而不是确定的答案。
1.2 如何评价模型预测的好坏?
假设真实答案是「猫」,我们看不同预测的质量:
| 模型给猫的概率 p | 评价 | 期望的损失 |
|---|---|---|
| 0.99 | 非常准确 | 应该很小 |
| 0.8 | 比较好 | 适中 |
| 0.51 | 勉强对 | 较大 |
| 0.1 | 完全错误 | 应该很大 |
我们需要设计一个损失函数,满足:
- 正确答案的概率越大 → 损失越小
- 正确答案的概率越小 → 损失越大
1.3 为什么选择对数函数?
观察函数 loss = -log(p) 的行为:
| 正确类概率 p | -log(p) | 含义 |
|---|---|---|
| 0.99 | 0.01 | 几乎完美 |
| 0.9 | 0.10 | 很好 |
| 0.5 | 0.69 | 随机猜测水平 |
| 0.1 | 2.30 | 很差 |
| 0.01 | 4.60 | 完全错误 |
关键特性:
- p 接近 1 → 损失接近 0(奖励正确预测)
- p 接近 0 → 损失趋向无穷(严厉惩罚错误)
- 非线性增长:从 p=0.9 到 p=0.1,损失增加了 20 倍以上
为什么对数函数如此合适?这来自最大似然估计的数学原理(第四章详解)。
1.4 交叉熵的最简形式
对于单次预测:
- 真实答案是类别 A
- 模型给 A 的概率是 p
损失函数:
这就是交叉熵的核心。
二、为什么叫“交叉熵”?
2.1 先理解“熵”
熵(Entropy)是信息论中的核心概念,衡量不确定性。
两个例子
例子 1:完全确定
- 明天 100% 会下雨
- 熵 = 0(无不确定性)
例子 2:完全随机
- 抛硬币,正反各 50%
- 熵最大(最大不确定性)
数学定义
对于概率分布 P:
含义:平均每次需要多少信息量(比特)来描述发生的事情。
2.2 什么是“交叉”?
现实中经常出现这种情况:
- 真实世界:按分布 P 在运行
- 你的认知:却认为它是分布 Q
当你用错误的分布 Q 去理解真实分布 P 时,会产生额外的“信息代价”。
交叉熵的定义
2.3 为什么叫“交叉”?
看公式的结构:
| 公式部分 | 来源 | 含义 |
|---|---|---|
| P(x) | 真实分布 P | 事件实际发生的频率(权重) |
| log Q(x) | 模型分布 Q | 用模型的方式编码 |
“交叉”的含义:两个不同分布的交叉使用
- 权重来自 P
- 编码来自 Q
对比:
- **熵 H(P)**:用自己编码自己
- **交叉熵 H(P,Q)**:用别人编码自己
2.4 在机器学习中的应用
真实标签(one-hot):P = [0, 0, 1, 0] — 第3类是正确答案
模型输出(Softmax):Q = [0.1, 0.2, 0.6, 0.1]
计算交叉熵:
2.5 为什么简化成了 -log(p)?
在分类任务中,真实标签是 one-hot:只有正确类是1,其他是0
代入交叉熵公式,求和后只剩下正确类别那一项:
这就是为什么实际代码中:
1 | loss = -log(Q[y_true]) |
三、二分类和多分类的具体形式
3.1 二分类交叉熵(Binary Cross Entropy)
设定:
- 模型输出:p = P(y=1|x),通过 Sigmoid 得到
- 真实标签:y ∈ {0, 1}
损失函数:
理解:这是分段函数的简洁写法
| 真实标签 y | 实际计算 |
|---|---|
| y = 1 | -log(p) |
| y = 0 | -log(1-p) |
具体例子:
1 | 真实标签 y = 1, 模型预测 p = 0.9 |
3.2 多分类交叉熵(Categorical Cross Entropy)
完整流程:
步骤1:模型输出 logits
1 | z = [2.0, 1.0, 0.1] |
步骤2:Softmax 归一化
计算结果:p₁ ≈ 0.659, p₂ ≈ 0.242, p₃ ≈ 0.099
步骤3:计算交叉熵
真实标签 y = [0, 1, 0](第2类是正确答案)
简化形式(利用 one-hot):
四、从最大似然估计理解交叉熵
4.1 一个侦探问题
你发现了一枚硬币和抛掷记录:
1 | 结果:正、正、反、正、正 |
任务:判断硬币正面的概率是多少?
思考过程:
| 假设的概率 θ | 出现这串结果的概率 |
|---|---|
| θ = 0.5 | 0.5⁴ × 0.5¹ = 0.03125 |
| θ = 0.8 | 0.8⁴ × 0.2¹ ≈ 0.0819 |
| θ = 0.9 | 0.9⁴ × 0.1¹ ≈ 0.0656 |
结论:θ = 0.8 最能解释观测数据!
这就是最大似然估计(MLE)的核心思想。
4.2 概率 vs 似然:关键区别
概率(Probability)
- 已知:参数 θ
- 求:数据出现的概率
- 方向:从原因推结果
1 | P(data|θ) = “给定硬币特性,某个结果出现的概率” |
似然(Likelihood)
- 已知:数据(已经发生了)
- 求:哪个参数最可能
- 方向:从结果推原因
1 | L(θ|data) = “给定观测结果,哪个参数最合理” |
数学关系:L(θ|data) = P(data|θ)
数值相同,但含义完全相反。
4.3 硬币问题的形式化
Step 1: 建立概率模型
1 | P(x=1|θ) = θ # 正面 |
Step 2: 计算联合概率
观测:正、正、反、正、正
假设独立:
Step 3: 似然函数
问题:θ 取什么值时,L(θ) 最大?
4.4 为什么要取对数?
这是连接 MLE 和交叉熵的关键步骤。
原因1:连乘变连加
对于 N 个样本:L(θ) = ∏ P(xᵢ|θ)
当 N 很大时:
- 数值下溢:太多小于1的数相乘,结果趋近0
- 计算困难:浮点数精度问题
取对数后:
连乘变连加,数值稳定!
原因2:不改变最优解
log 是严格单调递增函数:
原因3:求导更简单
- 原函数:L(θ) = θ⁴(1-θ)
- 对数函数:ℓ(θ) = 4log θ + log(1-θ)
求导:dℓ/dθ = 4/θ - 1/(1-θ) = 0
解得:θ = 0.8
4.5 MLE 的通用形式
给定:
- 数据:x₁, x₂, …, xₙ
- 参数:θ
- 模型:P(x|θ)
三步曲:
- 似然函数:
L(θ) = ∏ᵢ P(xᵢ|θ) - 对数似然:
ℓ(θ) = ∑ᵢ log P(xᵢ|θ) - 最大化:
θ̂ = argmax ∑ᵢ log P(xᵢ|θ)
核心思想:
找一个参数 θ,使得“已发生的数据”在该模型下出现的概率最大。
4.6 从 MLE 到机器学习
监督学习中:
- 数据:(x₁,y₁), (x₂,y₂), …, (xₙ,yₙ)
- 模型:P_θ(y|x)
MLE 目标:
从最大化到最小化:
深度学习框架做最小化(梯度下降):
右边就是负对数似然(NLL)
每个样本的损失:
这正是交叉熵损失!
五、MLE = NLL = 交叉熵
5.1 完整的等价链
1 | 最大似然估计(MLE) |
5.2 逐步推导
Step 1: MLE 原始形式
Step 2: 取对数
这是对数似然(Log-Likelihood)
Step 3: 变号
这是负对数似然(NLL)
Step 4: 用分布语言重写
真实分布 P(one-hot):P(y|x) = 1 当 y=y_true,否则 = 0
模型分布:Q_θ(y|x) = P_θ(y|x)
交叉熵定义:
代入 one-hot:
与 NLL 完全一致!
5.3 核心等价关系
因此:
5.4 为什么有不同的名字?
| 视角 | 术语 | 来源 | 强调什么 |
|---|---|---|---|
| 统计学 | 最大似然/对数似然 | 统计学 | 参数估计 |
| 信息论 | 交叉熵 | 信息论 | 分布差异 |
| 工程 | NLL/CrossEntropyLoss | 深度学习 | 损失函数 |
本质相同,只是不同学科的不同表述。
5.5 数值例子:三者的一致性
3分类问题,3个样本:
数据:
- 样本1: y₁=0, 预测 P_θ(0|x₁) = 0.7
- 样本2: y₂=1, 预测 P_θ(1|x₂) = 0.8
- 样本3: y₃=2, 预测 P_θ(2|x₃) = 0.5
方法1:MLE(最大化似然)
1 | L(θ) = 0.7 × 0.8 × 0.5 = 0.28 |
方法2:NLL(最小化负对数似然)
1 | NLL = -log L(θ) = 1.273 |
方法3:交叉熵
1 | L₁ = -log(0.7) ≈ 0.357 |
三种方法,完全相同的结果!
六、为什么这样设计?
6.1 理论基础:来自统计学
分类模型在建模条件概率 P(y|x)
统计学告诉我们:
- 最自然的参数估计方法是 MLE
- MLE 具有一致性、渐近正态性等优良性质
- MLE 等价于最小化交叉熵
结论:
交叉熵不是人为设计的,而是从统计学基本原理推导出来的
6.2 工程优势:梯度简洁
Softmax + Cross Entropy 的梯度:
特点:
- 形式极简:就是预测值和真实值的差
- 没有复杂的链式法则
- 数值稳定:不会梯度消失或爆炸
- 计算高效
这就是为什么深度学习框架直接提供 CrossEntropyLoss。
6.3 信息论视角:最小化分布差异
交叉熵可以分解为:
其中:
- H(P):真实分布的熵(常数)
- KL(P‖Q):KL散度(分布差异)
因此:最小化交叉熵 ⟺ 最小化 KL 散度 ⟺ 让模型分布逼近真实分布
七、总结
7.1 核心理解
交叉熵损失 = -log(正确答案的概率)
- = 负对数似然
- = 最大似然估计的优化目标
7.2 从三个角度理解
直觉:
“你给正确答案分配的概率有多低,我就罚你多狠”
统计学:
“让已发生的数据在当前模型下概率最大”
信息论:
“用模型的分布去理解真实分布所付出的代价”
7.3 关键等价关系
7.4 理解路径
1 | 1. 问题:如何评价模型预测? |
7.5 最小记忆单元
如果只记一件事:
交叉熵 = -log(正确类的概率)
它来自最大似然估计:让模型给真实答案的概率最大
八、结语
交叉熵损失看似简单的 **-log(p)**,实际上:
- 来自统计学:最大似然估计的自然结果
- 来自信息论:分布差异的度量
- 工程优良:梯度简洁、数值稳定
理解交叉熵和最大似然的联系,你就真正理解了:
- 为什么这样设计损失函数
- 为什么深度学习能够工作
- 如何从原理出发思考问题
Softmax:从直觉到本质
以下内容由AI辅助生成
Softmax 是多分类任务中最常见的输出层函数。它的任务表面上是“把 logits 变成概率”,但本质是:将一组可加的分数转换为可比较、可优化的相对强度,并与极大似然/交叉熵无缝对接,同时保证数值稳定和梯度友好。
1. 问题设定:从 logits 到概率
1.1 什么是 logits?
神经网络最后一层通常输出一组实数:
这组
1.2 我们需要什么?
我们需要一个函数,将任意实数向量映射到“概率单纯形”:
其中概率单纯形定义为:
1.3 硬约束(缺一不可)
非负性:输出必须 > 0
归一化:总和为 1
全域定义:对所有实数输入都有定义
保序性:
例子:如果 logits 是
,那么 Softmax 后 的顺序不变 可微性:平滑可导,梯度稳定(用于反向传播)
2. Softmax 的定义
2.1 标准形式
其中:
:类别数 :第 类的 logit - 分母:对所有类别的指数求和,用于归一化
2.2 向量形式
2.3 数值稳定版(工程实践)
为什么要减
当
- 最大的 logit 变为 0:
- 其他 logit 都是负数:
最多下溢到 0,不会 NaN - 数学上结果完全相同(分子分母同时除以
)
例子:
- 原始:
→ 溢出! - 稳定版:
→ ✓
3. 为什么输出在 (0,1) 且和为 1?
这是纯代数结论,无需“概率直觉”。
令
3.1 为什么 ?
- 对任意实数
,都有 - 分母是正数之和,必然 > 0
- 因此
3.2 为什么 ?
分母包含分子本身:
(除非
3.3 为什么 ?
3.4 本质
Softmax = 对一组正数做 L1 归一化
指数的作用是将“任意实数”转为“严格正权重”。
4. 为什么必须用指数?
4.1 方案一:直接归一化 ❌
问题:
可能为负 → “概率”为负 - 分母可能为 0
- 符号变化时语义被破坏
结论:不满足基本约束
4.2 方案二:ReLU 后归一化 ❌
问题:
- 0 处不可导,训练困难
- 大量类可能变为 0,梯度长期为 0(神经元“死亡”)
- 相对差异被扭曲
4.3 方案三:平方归一化 ❌
问题:
与 得到相同权重 - logits 的“偏好方向”丢失
- 分类语义崩塌
5. 指数为什么“刚刚好”?
指数函数
严格正性:
(无零点、无负值、无断点) 严格单调:保持顺序
差异放大:线性差转为倍率差
例子:
- 如果
,则 倍 - 如果
,则 倍 - logit 差距越大,概率比越悬殊
- 如果
加法→乘法同态:
第 4 点是关键的“桥梁”性质,后文将深入阐述。
6. e 是什么?
6.1 连续复利的极限
背景:假设你存 1 元钱,年利率 100%。
- 一年计息 1 次:
元 - 半年计息 1 次:
元 - 每天计息:
元 - 每秒计息:
元
当计息频率趋于无限(连续复利),极限就是
6.2 级数定义(实际计算常用)
算到
6.3 最关键性质:自导数
这是 Softmax + 交叉熵梯度简洁的根本原因。
7. 为什么用 e 而非其他底数?
7.1 其他底数可行吗?
假设用底数
导数为:
7.2 梯度尺度污染
配合交叉熵时,梯度变为:
而使用
7.3 为什么这很重要?
- 学习率本应直接控制步长
- 换底数会引入无意义的常数
- 多层网络中尺度难以控制
- 表达能力没有提升,纯属干扰
结论:用
8. Softmax + 交叉熵的“奇迹”
8.1 什么是交叉熵?
在分类任务中,我们用 one-hot 编码 表示真实标签:
- 如果样本属于第 2 类(共 3 类):
- 只有正确类别为 1,其他为 0
交叉熵损失衡量预测分布
因为
意义:
- 如果
(预测完全正确)→ - 如果
(预测很不确定)→ - 如果
(预测错误)→
目标:最小化交叉熵 = 最大化正确类别的预测概率。
8.2 交叉熵损失的完整形式
使用 one-hot 标签
8.3 代入 Softmax
8.4 梯度极简
这个“干净到难以置信”的形式,根源于:
若用其他正函数
9. “加法 → 乘法”:唯一的自然桥梁
这不是比喻,而是结构必然性。
9.1 Logits 的加法世界
最后一层的典型形式:
语义是“证据累加”:
- 支持特征 →
增加 - 反对证据 →
减少 - 多条证据 → 分数相加
例子(图像分类):
- 检测到“毛发” → 猫的分数 +2
- 检测到“尖耳朵” → 猫的分数 +1.5
- 检测到“圆脸” → 猫的分数 +1
- 最终:
比较两类时,自然量是差值:
表示“
9.2 概率的乘法世界
分类中真正关心的是“相对可能性”,即比值:
例子:
- 如果
- 比值:
,表示“猫的可能性是狗的 3.5 倍” - 这是倍率/赔率,本质是乘法结构(比例、连乘)
9.3 核心需求:差值控制比值
希望存在单调函数
左边:概率的比例结构(乘法世界)
右边:logit 的差分结构(加法世界)
我们需要一座桥,将“差”转为“比”。
9.4 一致性约束逼出指数
希望满足传递性:
- 若
比 强 , 比 强 - 则
比 应强
即:
对应概率比值的链式相乘:
结合两式,得函数方程:
在“正、连续、单调”等合理条件下,唯一解是指数族:
因此:
归一化后:
(
结论:“加法→乘法”不是比喻,而是结构要求的必然结果。
9.5 对训练的友好性
训练使用对数似然,对数将乘法拉回加法:
- 指数:加法 → 乘法
- 对数:乘法 → 加法
整个系统形成闭环:logits 的差是线性的,log 概率比也是线性的,梯度才简洁稳定。
10. 信息论视角:最大熵推导
10.1 问题设定
在约束条件下:
最大化熵:
10.2 拉格朗日方法
用拉格朗日乘子法求解,得到:
归一化后即为 Softmax。
10.3 深层意义
Softmax 不是约定俗成,而是在“仅知期望分数”约束下,熵最大的唯一形式。
这从信息论角度证明了 Softmax 的必然性。
11. 总结:Softmax 的必然性
Softmax 不是随便设计的,而是唯一同时满足以下要求的函数:
基础要求:
- 任意实数输入 → 正数输出 → 和为 1
- 大的 logit → 大的概率(保序)
- 处处可导,梯度稳定
核心机制:
- 用指数把“证据累加”(加法)转成“可能性倍率”(乘法)
- logit 差 2 → 概率比
倍;差 5 → 比 倍
训练完美:
- 配合交叉熵,梯度就是
(干净到极致) - 用
而非其他底数,避免梯度尺度污染
数值稳定:
- 减
防溢出,下溢到 0 也符合语义
理论支撑:
- 最大熵原理下的唯一解
- 指数族分布的自然形式
一句话:Softmax 是“把加法世界的分数转成乘法世界的概率”的唯一自然方式。
激活函数的本质原理与作用
以下内容由AI辅助生成
——从 XOR 出发理解非线性、表达能力与训练
一、从一个最小反例开始:XOR 与线性模型的根本局限
在讨论激活函数之前,有必要从一个最简单、却最具代表性的例子入手。
XOR(异或)问题以极低的维度,清晰地揭示了线性模型与深度神经网络在本质上的差异。
1. XOR 问题的定义
XOR 的规则如下:
| x₁ | x₂ | XOR |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
在二维平面中表示为:
1 | x₂ ↑ |
正类与负类分布在对角位置。
2. 线性模型为何无法解决 XOR
任何不包含非线性激活的神经网络,无论堆叠多少层,其整体形式都可以合并为一次线性变换:
在二维空间中,这意味着其决策边界只能是一条直线:
1 | x₂ ↑ |
无论如何调整这条直线,都无法将 XOR 的正负样本完全分开。
这是一个严格的数学事实:
线性函数在复合运算下是封闭的,多层线性网络在表达能力上等价于单层线性模型。
二、引入 ReLU 后发生了什么:XOR 被分开的全过程
XOR 的关键意义在于:
只要引入非线性,问题的几何结构就会发生根本变化。
1. 一个最小的两层 ReLU 网络
1 | 输入: x₁, x₂ |
其中:
2. 逐点计算
- (0,0): h₁ = 0, h₂ = 0 → y = 0
- (1,1): h₁ = 0, h₂ = 0 → y = 0
- (1,0): h₁ = 1, h₂ = 0 → y = 1
- (0,1): h₁ = 0, h₂ = 1 → y = 1
XOR 被完全正确地区分。
3. 几何解释:空间是如何被切分并重组的
- (x₁ - x₂ = 0)、(x₂ - x₁ = 0) 是两条对角线
- ReLU 在每条直线处将空间一分为二
- 一侧被整体压缩为 0,另一侧保持线性结构
叠加后,空间被划分为四个区域:
1 | x₂ ↑ |
最终形成的是 X 形的分段线性决策边界,而不是一条直线。
三、从 XOR 抽象出的第一性原理:激活函数究竟在做什么
1. 激活函数并不是“画曲线”
一个常见但不准确的说法是:
激活函数把线性模型变成了曲线模型。
事实上,以 ReLU 为代表的现代激活函数并不会直接生成光滑曲线。
它们真正做的是:
- 用线性超平面切分空间
- 对部分区域进行门控(压缩、屏蔽)
- 将多个线性区域以条件方式组合
因此,ReLU 网络本质上是分段线性模型。
非线性并不来自单次变换,而来自多次空间切分与重组的叠加效果。
2. 非线性存在的根本原因
非线性激活的首要作用不是增强模型能力,而是:
打破线性函数在复合运算下的封闭性,防止深度网络在数学上退化为线性模型。
这是激活函数存在的第一性原因。
四、表达能力与表达准确性:两个必须区分的层面
在理解激活函数的作用时,一个至关重要、却常被忽略的问题是:
表达能力与表达准确性并不是同一个概念。
- 表达能力:模型是否具备表示复杂函数的可能性
- 表达准确性:模型是否通过训练学到了合适的函数
激活函数解决的是前者的问题。
它并不直接提高预测准确率,而是为后续训练提供必要的表达前提。
五、不同激活函数的本质角色、形态与使用场景
虽然所有激活函数都引入了非线性,但它们的设计目标和承担的角色并不相同。
1. ReLU:结构型非线性(隐藏层主力)
函数形态:
1 | y |
ReLU 的核心特性是:
- 分段线性:将复杂函数拆解为可组合的局部线性结构
- 局部结构偏好:适合刻画分块、层级关系
- 稀疏激活:部分神经元在给定输入下完全关闭
- 梯度稳定:正区间不饱和,使深层网络可训练
因此,ReLU 及其变体成为现代深度网络隐藏层的默认选择。
2. sigmoid:概率型非线性(输出语义)
函数形态:
1 | y |
sigmoid 的核心作用在于:
- 将实数映射到 (0,1)
- 自然对应概率含义
其局限在于两端饱和、梯度易消失,因此:
- 不适合深层隐藏层
- 主要用于 二分类输出层 或 门控结构(如 LSTM 的门)
3. tanh:对称信号非线性(历史与特定场景)
函数形态:
1 | y |
tanh 可以视为 sigmoid 的零中心版本:
- 输出对称,值域为 (-1, 1)
- 梯度分布更均衡
但它仍然存在饱和问题。
在现代深度网络中,tanh 多出现在:
- 早期 RNN
- 少数需要对称连续状态建模的场景
4. softmax:归一化与竞争机制(非表达型非线性)
以三分类为例,输入向量到概率分布的映射:
1 | 输入 z = [z₁, z₂, z₃] → 输出 p = [p₁, p₂, p₃] |
softmax 作用在向量上,其本质是:
- 将一组分数映射为概率分布
- 强制类别之间产生竞争关系
典型使用场景包括:
- 多分类输出层
- 注意力权重归一化
softmax 并不用于构建复杂表示,而属于输出语义与选择机制。
六、激活函数的本质总结与选择逻辑
综合前文讨论,可以将激活函数的作用概括为:
在不破坏梯度传播的前提下,引入必要的非线性,
防止深度网络退化为线性模型,
为模型提供足够但可控的函数表达空间。
在此基础上:
- 通过数据、损失函数与优化算法
- 训练参数以逼近目标函数
- 从而提高最终预测准确性与泛化能力
进一步概括为:
激活函数必须是非线性的,
不是为了无限增强表达能力,
而是为了防止深度网络退化为线性模型,
并在可训练的前提下,引入与任务结构匹配的非线性归纳偏置。
至于选哪种激活函数、使用多少层,本质上是:
- 对数据分布的假设
- 对优化可行性的权衡
- 在大量经验与失败中逐步形成的工程共识
七、结语
通过 XOR 这一最小反例,可以清晰地看到:
- 非线性是深度神经网络成立的必要条件
- 激活函数并不是装饰,而是结构性组件
- 不同激活函数承担着不同角色,而非优劣竞争
激活函数的意义,不在于“让模型更强”,
而在于让深度模型在数学上成立、在优化上可行、在表达上有效。
延伸思考方向:
- ReLU 网络线性区域数量随层数增长的直观解释
- 激活函数如何塑造优化景观(loss landscape)
- 现代激活函数变体(Leaky ReLU、GELU、Swish 等)的设计动机
- 激活函数与归纳偏置的关系
AI 数学精要速览
一、人工智能的本质:数学建模 + 优化,而非算力魔法
人工智能并非神秘技术,其本质是:
- 数学:描述问题、刻画规律、定义目标
- 算法:在数学模型上进行搜索与优化
- 计算机:负责实现与加速计算
可以用一句话概括:
人工智能 = 数学模型 + 优化算法 + 工程实现
因此,真正决定 AI 能力上限的,不是算力本身,而是建模方式与优化思想。
二、机器学习的本质:函数估计与函数逼近
1. 从数据到映射关系
在机器学习中:
- 数据最终都会被表示为数值向量
- 模型的作用是学习一个映射关系:
这本质上就是在学习一个函数:
其中
2. 函数逼近视角(核心)
真实世界的规律函数通常未知,只能通过有限样本观察。
机器学习做的事情是:
- 定义损失函数
- 选定模型形式(线性、神经网络等)
- 通过数据训练参数
最终得到:
一个对真实函数的近似
因此可以准确地说:
机器学习问题,本质是函数估计/函数逼近问题
三、损失函数与目标函数:从单点误差到整体准则
这是整个体系中最容易混淆、但也最关键的一层。
1. 损失函数(Loss Function)
损失函数衡量的是:
模型在单个样本上的预测误差
例如平方误差:
它回答的问题是:
这一次预测错得有多严重?
2. 目标函数(Objective Function)
训练时真正被优化的,是一个全局函数:
其中:
- 第一项:平均损失(经验风险),用于拟合数据
- 第二项:正则项,用于限制模型复杂度
结论(非常重要):
损失函数是局部误差,目标函数是训练时真正被最小化的整体准则
在最简单的情况下,目标函数可以等于平均损失;在真实问题中,目标函数几乎总是平均损失加上正则约束。
四、统一视角:人工智能 = 优化问题
无论是机器学习还是深度学习,核心任务都可以统一为:
在参数空间中,最小化(或最大化)一个目标函数
1. 全局最优 vs 局部最优
- 全局最小值:整个空间中最小
- 局部极小值:某个邻域内最小
在高维参数空间中:
- 全局搜索不可行
- 实用算法通常只能找到足够好的解
工程上接受的标准是:
目标函数足够小 + 泛化性能可接受
五、微积分:优化算法的数学基础
1. 导数与梯度
- 导数:函数变化率
- 梯度:多变量函数的一阶导数向量
梯度方向表示:
函数上升最快的方向
因此,负梯度方向就是下降最快的方向。
2. 核心优化算法
所有主流训练算法,底层都依赖导数和矩阵运算:
- 梯度下降(GD)
- 随机梯度下降(SGD)
- 牛顿法、拟牛顿法(BFGS/L-BFGS)
六、凸函数:为什么理论上好解,工程上难找
1. 凸性的决定性作用
如果目标函数是凸的:
- 任意局部最小值 = 全局最小值
- 优化是干净的
这在传统机器学习中非常常见:
| 模型 | 损失 | 目标函数 |
|---|---|---|
| 线性回归 | 平方误差 | 凸 |
| 逻辑回归 | 对数损失 | 凸 |
| SVM | Hinge loss | 凸 |
2. 深度学习为什么是非凸的
在神经网络中:
- 模型是高度非线性的
- 参数强耦合
- 多层激活叠加
结果是:
即使损失函数形式是凸的,目标函数关于参数仍然是非凸的
七、为什么深度学习还能工作?
关键不在理论保证,而在工程现实:
不追求全局最优
只要性能足够好即可高维空间的性质
坏的局部极小值很少,更多是鞍点SGD 的随机性
噪声反而有助于跳出鞍点工程手段
初始化、正则化、BatchNorm、残差结构等
一句话总结:
非凸优化在理论上困难,在工程上可控
八、线性代数:深度学习的骨架系统
现代深度学习几乎完全建立在线性代数之上:
- 向量表示与嵌入
- 神经网络前向传播
- CNN、Attention、Transformer
可以直接断言:
没有线性代数,就没有现代深度学习
九、感知机、激活函数与偏置项
1. 感知机模型
:权重,决定方向与敏感度 :偏置,决定阈值/平移
2. 偏置项的本质
偏置项的作用是:
让决策边界不被强制经过原点
几何上:
- 权重决定方向与斜率
- 偏置决定起始位置
没有偏置项,模型表达能力会严重受限。
3. 激活函数的意义
早期阶跃函数不可导,无法优化;现代网络使用可导函数(Sigmoid、ReLU、Tanh),以支持梯度下降。
十、训练机制:参数不是写出来的,而是学出来的
程序员负责:
- 模型结构
- 损失函数
- 数据准备
参数的具体数值:
完全由训练过程自动学习得到
即使模型结构相同,只要数据不同,学到的模型也会不同。
十一、过拟合:模型记住了题目,但没学会规律
典型特征:
- 训练集表现很好
- 测试集表现很差
本质原因:
模型复杂度 > 数据所能支撑的复杂度
解决思路:
- 正则化
- 数据增强
- 控制模型规模
- Dropout、早停等技术
十二、神经网络与深度学习
- 神经网络:多层可导感知机的组合
- 深度学习:更深的神经网络
加深的效果是:
在参数规模相近的情况下,逼近更复杂的函数
理论解释仍在研究中,但工程效果已被反复验证。
十三、强化学习:从监督学习到交互学习
强化学习的目标不是最小化预测误差,而是:
最大化长期累积回报
特点:
- 没有标准答案
- 通过试错学习
- 奖励信号驱动参数更新
总纲(高度压缩版)
人工智能是在用数学定义目标,用优化寻找参数,用数据逼近未知函数;理论上关心凸性与最优性,工程上关心效果、稳定性与泛化能力。