激活函数和损失函数

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

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

需要注意的是,对于传统机器学习,损失函数一般仅指单个数据点的损失,而上述均方误差和交叉商家均属于代价函数(cost function)。但,因numpy,PyTorch,TenserFlow这些矩阵化机器学习工具的流行,名为Loss的函数都接受矩阵、向量化输入,所以慢慢损失(loss)函数这个名字就取代了代价(cost)函数,这与强化学习中 reward 和 value 的混用类似(最大化 value / return 用 reward 替代,虽然这个混用危险很多)。

本文直接用损失函数代指代价函数。

激活函数

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

\[\text{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}\]

其中 \(\alpha\) 通常是 0.01 或 0.1。或者在PReLU中\(\alpha\)可以看做成一个可学习的参数。

在现代CNN网络中,BN层通过正则化的方法变相的规避了”过大偏置/权重“引发的神经元死亡问题。

损失函数

不同的任务需要选择不同的损失函数来最小化我们期望的目标。

回归Regression

在回归任务,我们一般希望模型输出和真输出越接近越好,那就是,预测和真实值的欧氏距离(L2)越小越好。这种情况我们用均方误差MSE作为损失函数来调整模型。

\[\text{MSE}=\frac1N\sum_{i=1}^N(y_i-\hat{y}_i)^2.\]

MSE的梯度和\(y_i-\hat{y_i}\)成正比,这意味着预测误差越大,模型更新越明显,提高收敛了速度。

在回归任务,我们的目标是最小化预测值\(\hat{y}\)和真实值(ground truth)\(y\)之间的欧氏距离

如果我们不希望损失函数被异常值影响到(更加鲁棒),可以使用变种MAE(平均绝对误差)和Hyber Loss(平滑的MAE)。

分类Classification

对于分类任务,我们先引入信息论中的KL散度(Kullback-Leibler Divergence)概念:

KL散度 \(D_{KL}(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\) 个可能的取值 \(x_1, x_2, \ldots, x_N\)

\[H(P, Q) = - \sum_{i=1}^{N} P(x_i) \log Q(x_i)\]

其中:

  • \(P(x_i)\) 是真实分布(通常是真实标签的独热编码概率)。
  • \(Q(x_i)\) 是近似分布(通常是模型预测的概率)。
  • 求和符号 \(\sum\) 遍历所有可能的事件或类别。

更具体的,在机器学习我们定义交叉熵:

\[\text{CE}=-\frac1N\sum_{i=1}^N\sum_{k=1}^Ky_k^{(i)}\log\hat{y_k}^{(i)},\]

其中\(N\)是样本数量,\(K\)是类别数量,\(y_k^{(i)}\)是存储真实类别的one-hot向量,\(\hat{y}_k^{(i)}\)是模型最终激活函数(比如Softmax)得到的预测概率,这里\(\hat{y}_k^{(i)}\)必须满足一个概率分布,所以ReLU不能作为损失函数的输入,那就是,ReLU不能作为CE损失函数MLP的最终层激活函数。对于Sigmoid / Logistic可以使用二元交叉熵(Binary Cross-Entropy):

\[L(y, \hat{y}) = - \left[ y \log(\hat{y}) + (1 - y) \log(1 - \hat{y}) \right].\]

从交叉熵的定义可以看到(每一个数据\(x^{(i)}\))的交叉熵(Cross-Entropy)\(H(P, Q)\) 与 KL散度有密切关系:

\[D_{KL}(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 距离。

评论

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

加载中,最新评论有1分钟缓存...