激活函数和损失函数
激活函数:ReLU,Sigmoid / Logistic(和输出层用到的输出概率分布的推广Softmax)
损失函数:Euclidean Loss(均方误差),Cross-Entropy Loss(交叉熵),其他任务的常见损失函数
激活函数
Sigmoid
Sigmoid代之一类S形的函数,其中包括Logistic函数(还有比如Tanh函数):
$$\sigma(x)=\frac1{1+e^{-x}}$$
优点
- 输出单调递增,属于一个区间,如Logistic的(0,1),这个区间可以近似看成一个概率输出,增加了某种可解释性。
- 输出永远属于(0,1),可以看作是一种正则化。
- 函数处处可导,BP可以丝滑运行。
缺点
- Sigmoid函数很容易造成梯度消失的问题。具体来讲,当输入x特别大或者特别小的时候梯度几乎为0,更新十分缓慢。
- MLP中多层Sigmoid激活函数叠加会导致数值和梯度都变得极小,难以计算和训练。
- Logistic所有输出都为正,这导致了梯度在所有维度要么都是正要么都是负,收敛便慢。
Softmax
$$\text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}} \quad \text{for } i = 1, \dots, K$$
Sigmoid每一个输入对应的输出彼此都是互相独立的,而Softmax的每一维输出依赖于所有输入。
Softmax的输出向量构成了一个概率分布,结合one-hot的ground truth可以用于CE损失函数的计算。
ReLU
ReLU(x) = max (0, x)
现在主流激活函数都是ReLU。
优点
- 没有梯度消失问题,x > 0时梯度为常数1。
- 梯度在BP过程可以无衰减的通过神经元(当x > 0),变相的增加了模型可能的深度。
- 计算效率极快,无复杂的计算。
- 保证了MLP的稀疏性,那就是,当输入x < 0时,ReLU输出为0。0的增加减少了MLP神经元之间的依赖关系,缓解过拟合,并且进一步的减少了计算量。
缺点
- x = 0时不可导(没有梯度),这种情况可以通过次梯度subgradient解决(这里x = 0的次梯度集合是区间[0, 1])。在工程上可以直接定义x = 0处的梯度为0解决。x = 0的情况十分罕见所以具体梯度是多少不重要。
- 所有输出都为正,也有类似Sigmoid的问题
- (神经元死亡问题Dying ReLU)如果一个神经元的输入在训练过程中恒为负数(例如,由于一个过大的负偏置项,或者在前向传播中遇到了一个较大的负权重,或者学习率设置不当导致权重更新过猛),那么这个神经元将始终输出 0,不再参与任何更新。
可以使用ReLU的推广,如Leaky ReLU,来解决神经元死亡问题:
$$\text{LReLU}(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha x & \text{if } x \le 0 \end{cases}$$
其中 α 通常是 0.01 或 0.1。或者在PReLU中α可以看做成一个可学习的参数。
在现代CNN网络中,BN层通过正则化的方法变相的规避了”过大偏置/权重“引发的神经元死亡问题。
损失函数
不同的目标需要选择不同的损失函数来最小化我们期望的目标。
回归Regression
在回归任务,我们一般希望模型输出和真输出越接近越好,那就是,预测和真实值的欧氏距离(L2)越小越好。这种情况我们用均方误差MSE作为损失函数来调整模型。
$$\text{MSE}=\frac1N\sum_{i=1}^N(y_i-\hat{y}_i)^2.$$
MSE的梯度和$y_i-\hat{y_i}$成正比,这意味着预测误差越大,模型更新越明显,提高收敛了速度。
在回归任务,我们的目标是最小化预测值ŷ和真实值(ground truth)y之间的欧氏距离。
如果我们不希望损失函数被异常值影响到(更加鲁棒),可以使用变种MAE(平均绝对误差)和Hyber Loss(平滑的MAE)。
分类Classification
对于分类任务,我们先引入信息论中的KL散度(Kullback-Leibler Divergence)概念:
KL散度 DKL(P||Q) 定义为真实分布 P 和近似分布 Q 之间对数概率比值的期望值,这个期望是根据真实分布 P 计算的。
对于离散型随机变量
$$D_{KL}(P || Q) = \sum_{x} P(x) \log \left( \frac{P(x)}{Q(x)} \right)$$
其中:
- P(x) 和 Q(x) 分别是随机变量 X 取值 x 时在分布 P 和 Q 中的概率。
- log 的底数决定了信息的单位(底数为 e 时单位是 nats,底数为 2 时单位是 bits)。
对于连续型随机变量
$$D_{KL}(P || Q) = \int_{-\infty}^{\infty} p(x) \log \left( \frac{p(x)}{q(x)} \right) dx$$
其中 p(x) 和 q(x) 分别是分布 P 和 Q 的概率密度函数。
然后,我们解释为什么交叉熵(Cross-Entropy)用在分类上比均方误差好。
交叉熵 H(P, Q)(Cross-Entropy)衡量的是使用分布 Q 进行编码时,对服从真实分布 P 的事件所需的平均比特数(或信息量)。
其公式根据随机变量的类型(离散或连续)而定:
离散型随机变量(分类任务常用)
假设随机变量 X 有 N 个可能的取值 x1, x2, …, xN:
$$H(P, Q) = - \sum_{i=1}^{N} P(x_i) \log Q(x_i)$$
其中:
- P(xi) 是真实分布(通常是真实标签的独热编码概率)。
- Q(xi) 是近似分布(通常是模型预测的概率)。
- 求和符号 ∑ 遍历所有可能的事件或类别。
$$\text{CE}=-\frac1N\sum_{i=1}^N\sum_{k=1}^Ky_k^{(i)}\log\hat{y_k}^{(i)},$$
其中N是样本数量,K是类别数量,yk(i)是存储真实类别的one-hot向量,ŷk(i)是模型最终激活函数(比如Softmax)得到的预测概率,这里ŷk(i)必须满足一个概率分布,所以ReLU不能作为损失函数的输入,那就是,ReLU不能作为CE损失函数MLP的最终层激活函数。对于Sigmoid / Logistic可以使用二元交叉熵(Binary Cross-Entropy)。
可以看到(每一个数据x(i)的交叉熵(Cross-Entropy)H(P, Q) 与 KL散度有密切关系:
DKL(P||Q) = H(P, Q) − H(P, P)
这里H(P, P)代表了真实分布P的信息熵,在机器学习中属于一个常数。所以,最小化KL散度等同于最小化交叉熵H(P, Q),也就是CE了。
其他任务
| 任务类型 | 损失函数/名称 | 核心用途和特点 |
|---|---|---|
| 序列生成 / 机器翻译 / 文本生成 | Perplexity (困惑度) | 实际上是负对数似然(CE)的指数形式。用于评估语言模型生成文本的流畅度和概率。 |
| 目标检测 / 语义分割 | Dice Loss / Jaccard Loss | 用于衡量预测掩码和真实掩码之间的重叠程度。特别适用于类别不平衡的医学图像分割。 |
| 度量学习 / 人脸识别 | Triplet Loss (三元组损失) | 学习一个嵌入空间,使得锚点(Anchor)与正样本(Positive)的距离小于与负样本(Negative)的距离,并保留一定的边际。 |
| 强化学习 (RL) | A2C / PPO Loss (策略梯度) | 用于优化智能体的行为策略,通常基于优势函数(Advantage Function)或新旧策略的比率。 |
| 一类分类 / 异常检测 | One-Class SVM Loss | 学习一个边界,将正常数据点圈起来,用于识别不属于该集合的新数据点。 |
| 生成对抗网络 (GANs) | Adversarial Loss (对抗损失) | 判别器(Discriminator)使用二元交叉熵,生成器(Generator)使用反转的二元交叉熵或 Wasserstein 距离。 |