损失函数/指标:算法工程师必备的损失函数/指标知识点
损失函数(指标)知识点整理
损失函数(指标)的设计、选择与评估
损失函数的设计与选择需要结合实际问题进行。
分析角度
以回归问题为例,需要以下角度对损失函数进行分析,假设预测值与真实值分别为 和 :
对称性
,即 loss 的值是否能较好地区分满足 值相同(交换 和 的值)的两种情况(如 和 );相对区分性
,即 loss 的值能否较好地区分 相同的多种情况(如 和 );绝对区分性
,即 loss 的值能否较好地区分 相同的多种情况(如 和 );输入输出值域
,即 loss 所能处理的输入值域以及对于大部分样本所输出的值域,需留意是否包含 0 和负值,如 MSLE 就不支持小于 的输入;异常值敏感性
,即对于一个 batch 中可能存在的极少数异常值,loss 能否反映出这种情况(如所有 , 大部分 ,极少数 )。
选择与使用
在实际的任务场景中,可能难以找到完美的损失函数,因此会对以上不同的性质有不同的容忍程度。如:
- 在房价预测任务中,能允许 loss 拥有较差的
绝对区分性
但要求其相对区分性
较强,因为相比房价在不同数量级上的差异,人们或许更能接受房价在同数量级内的差异;
同时可以搭配使用多个常用的损失函数, 互相取长补短进行 trade off。考虑 batch size 为 的如下案例:
# Case | MSE | MSLE | ||
---|---|---|---|---|
Case 1 | 30 | 20 | 100 | 0.02861 |
Case 2 | 30000 | 20000 | 100 000 000 | 0.03100 |
Case 3 | 20 | 10 | 100 | 0.07886 |
Case 4 | 20 | 30 | 100 | 0.02861 |
- Case 1、3、4 中,仅使用 MSE 均无法区分,此时引入 MSLE 能帮助区分误差(引入时可对 MSLE 进行缩放,如 );
- Case 1、2 中,仅使用 MSLE 的区分度很小,可引入 MSE 来进一步帮助区分(引入时可对 MSE 进行缩放,如 );
References
分类
分类模型的输出一般有多种形式:
- Logits:预测分数,一般是对模型最终学习到的 Embeddings 使用 MLP 输出得到,未经过 Softmax 的归一化。
- Probabilities:分类概率,一般是对 Logits 进行 Softmax 归一化得到。
交叉熵 Cross Entropy
基础计算
对于 K 个类别的
对每一个样本,其输入的 和 均为一个长度为类别数的向量, 为 one-hot 向量表示该样本是否属于某一类别, 为概率向量表示模型判断该样本属于各类别的概率分数大小。
如对一个包含 个类别的分类任务,其交叉熵的输入可能为:, 。
细分变体
根据不同的任务,交叉熵可以进一步被细分为:
二元交叉熵(Binary Cross Entropy,BCE),可以被认为是一种用于二分类任务的简化版本,对于单个样本而言,其 和 都能简化为单个数表示其属于二分类中单个类别的概率(另一个类别的概率则为 )和标签( 表示属于该类, 表示属于另一类)。
在
PyTorch
中,有专门的BCELoss
实现,用于处理更为精简的输入,并优化 log 函数的输出值为 以确保其 loss 不为inf
以及反向传播可正常进行。文档相关描述 [4]
Our solution is that BCELoss clamps its log function outputs to be greater than or equal to -100. This way, we can always have a finite loss value and a linear backward method.
优化改进
Label Smoothing
在每次计算交叉熵时,针对模型输出的分类概率使用 进行平滑。
在共包含 个类别的场景下,某个样本在第 个类别的概率 被平滑为 。
作用:相当于缩紧了所有类别的概率上下界 ,同时防止了单一类别的概率分数过高而其他类别的被忽略导致计算得到的交叉熵过大。
原论文相关描述 [3]
Note that LSR (label-smoothing regularization) achieves the desired goal of preventing the largest logit from becoming much larger than all others. Indeed, if this were to happen, then a single would approach while all others would approach . This would result in a large cross-entropy with because, unlike , all have a positive lower bound.
Label Weight
可以手动对每一个类别指定一个专门的权重,在样本标签不均匀的情况下可能能派上用场。
细节
交叉熵一般会搭配 Softmax 使用,
PyTorch
中CrossEntropyLoss
的输入是 Logits,而不是 Softmax 后的 Probabilities,其内部会进行LogSoftmax
和NLLLoss
^[5]^。为什么不能使用 MSE 作为分类问题的损失:
物理意义上,MSE 衡量的是几何空间的欧氏距离,而分类问题中每个类别的标签是离散的 和 ,本身不具备几何空间的意义;
信息学中,交叉熵衡量的是两个分布之间的差异,可用于衡量模型预测的概率分布和真实标签的类别分布是否相似。
计算上,分类模型输出的概率一般会经过 softmax 归一化,归一化后的值使用 MSE 会导致不符合预期的梯度,而使用交叉熵则无此问题。
如三分类问题中,标签为 ,模型输出为 ,此时的损失值为:
可以看到,MSE 会考虑各个类别的概率,其最小化的目标除了让正确类别的概率最大化外,还会让错误类别的概率平均(这一步是不必要的,可能会导致梯度不符合预期),这也是反向传播时优化函数不是凸函数难以优化的表现;
而交叉熵则只针对正确的类别进行计算,就没存在 MSE 中的问题。
References:
Precision、Recall
Precision 查准率,Recall 查全率,数值越高表示模型的准确度越高。
查准率与查全率是矛盾的,大部分情况下一个高了另一个就会低。
P-R Curve
以 Recall 、Precision 为横纵坐标轴的曲线图,其面积越大表示模型的学习能力越强,如果某一个分类器的 PR 曲线被另一个分类器包住则说明后者的性能优于前者。
绘制过程:按照模型输出的分类概率,从高至低依次将每一个样本视为正例计算 P、 R 并绘制。
对于 PR 曲线,亦可以使用平衡点(Break-Even Point)作为度量,为 P=R 时的值。
Fα Score
一种能结合具体场景调整 P、R 相对重要性的评估指标。
基础计算
- 时,即为 F1-Score: ;
- 时,查全率 R 有着更大的影响;
- 时,查准率 P 有着更大的影响。
ROC
将横、纵轴的计算替换成:
类似 PR 曲线的绘制方法:给定 个正例、 个负例,依照模型输出值依次将每一个样本视为正例,对于前一个点的坐标 ,若当前样本为真正例则坐标为 ,否则为 ,即可绘制出 ROC 曲线。
AUC
Area Under the Curve,表示的是 ROC 曲线下的面积,由于通过点连接得到的 ROC 曲线是非光滑的,因此 AUC 的计算为:
AUC 亦可以通过 1 减去曲线上方的面积计算得到:
回归
均方误差 MSE、均方对数误差 MSLE
MSE 和 MSLE 用于简单的比较和衡量预测值与真实值之间的差距。
基础计算
细节
- MSE 有着几何学上的意义:欧几里得距离;
- 相比于 MSE, MSLE 有着更小的输出值域且对输入值域有限制(不小于 ),其他比较可见 损失函数(指标)的设计、选择与评估-选择与使用 。
References
R-squared
又称 R2、R 平方、R 方、判定系数(Coefficient Of Determination),用于衡量回归模型的表现。
基础计算
细节
- R-squared 通过残差平方和(residual sum of squares)和总平方和(total sum of squares)对数据进行评估,当回归模型能完美地拟合数据的分布时有 。
References
其他问题
聚类
聚类是比较经典的一类无监督任务,旨在将样本集划分为若干个不相交的子集合(簇),使得每个子集合内部样本的相似度(簇内相似度)尽可能高、不同子集合的样本相似度(簇间相似度)尽可能低。
References
- 机器学习 周志华著
其他模型
BERT
BERT 中使用了两种无监督的训练任务用于预训练模型。
Masked Language Model,MLM
在输入的所有 token 中每次随机遮住(mask)一个 token 并通过未遮住的部分去预测被遮住的 token。
MLM 是一个多分类问题。
原论文相关描述 [1]
we simply mask some percentage of the input tokens at random, and then predict those masked tokens.
Next Sentence Prediction,NSP
每次在语料库中选择两个句子 A 和 B,B 有 50% 的概率为 A 的下一个句子,50% 的概率为从语料库中随机选择的一个句子。
NSP 是一个二分类问题。
两个预训练的任务均为无监督的分类任务,使用的 Loss 是交叉熵。
References
GraphSAGE
GraphSAGE 中使用了一种无监督的 Loss 用于:最小化相邻节点的特征差异、最大化非相邻节点的特征差异,其计算公式如下:
其中:
表示是模型通过邻近节点生成的节点特征(不是直接 Transductive 学习得到的,可应用于图中有新增节点的场景);
原论文相关表述 [1]
the representations that we feed into this loss function are generated from the features contained within a node’s local neighborhood, rather than training a unique embedding for each node (via an embedding look-up).
是被采样到的 的邻近节点, 是负样本数量, 是负采样的概率分布。
References
总结
- 对于最经典的两类问题(分类和回归),其损失函数往往不能通用,一般需要针对性地进行适配或优化才能跨问题领域使用;
- 除了某一类问题通用的损失函数外,部分模型还会基于模型特性或问题特性设计一些新的有监督或无监督任务(如 GraphSAGE 或 BERT),在这些任务中可能会使用一些特殊的 Loss 。
从0开始的算法工程师,力求严谨、细节、全面。 除基础的模型和知识点外,会尽可能包含更多的应用方向,也是自己学习过程的记录。 抛瓦!(垃圾箱探头.jpg)