激活函数和损失函数

激活函数:ReLU,Sigmoid / Logistic(和输出层用到的输出概率分布的推广Softmax)

损失函数:Euclidean Loss(均方误差),Cross-Entropy Loss(交叉熵),其他任务的常见损失函数

激活函数

Sigmoid

Sigmoid代之一类S形的函数,其中包括Logistic函数(还有比如Tanh函数):

$$\sigma(x)=\frac1{1+e^{-x}}$$

优点

  1. 输出单调递增,属于一个区间,如Logistic的(0,1),这个区间可以近似看成一个概率输出,增加了某种可解释性。
  2. 输出永远属于(0,1),可以看作是一种正则化。
  3. 函数处处可导,BP可以丝滑运行。

缺点

  1. Sigmoid函数很容易造成梯度消失的问题。具体来讲,当输入x特别大或者特别小的时候梯度几乎为0,更新十分缓慢。
  2. MLP中多层Sigmoid激活函数叠加会导致数值和梯度都变得极小,难以计算和训练。
  3. 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。

优点

  1. 没有梯度消失问题,x > 0时梯度为常数1。
  2. 梯度在BP过程可以无衰减的通过神经元(当x > 0),变相的增加了模型可能的深度。
  3. 计算效率极快,无复杂的计算。
  4. 保证了MLP的稀疏性,那就是,当输入x < 0时,ReLU输出为0。0的增加减少了MLP神经元之间的依赖关系,缓解过拟合,并且进一步的减少了计算量。

缺点

  1. x = 0时不可导(没有梯度),这种情况可以通过次梯度subgradient解决(这里x = 0的次梯度集合是区间[0, 1])。在工程上可以直接定义x = 0处的梯度为0解决。x = 0的情况十分罕见所以具体梯度是多少不重要。
  2. 所有输出都为正,也有类似Sigmoid的问题
  3. (神经元死亡问题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 时在分布 PQ 中的概率。
  • 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) 分别是分布 PQ 的概率密度函数。

然后,我们解释为什么交叉熵(Cross-Entropy)用在分类上比均方误差好。

交叉熵 H(P, Q)(Cross-Entropy)衡量的是使用分布 Q 进行编码时,对服从真实分布 P 的事件所需的平均比特数(或信息量)。

其公式根据随机变量的类型(离散或连续)而定:

离散型随机变量(分类任务常用)

假设随机变量 XN 个可能的取值 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 距离。
Comments

:D 一言句子获取中...