本文总结分类和回归使命的常用丢失函数,比如要点解析了穿插熵丢失函数的由来,并给出具体核算公式和、案例分析、代码,一同也描述了
MAE
和MSE
丢失函数,给出了具体的核算公式、曲线图及优缺点。
一,丢失函数概述
大多数深度学习算法都会触及某种方式的优化,所谓优化指的是改动 xx 以最小化或最大化某个函数 f(x)f(x) 的使命,咱们一般以最小化 f(x)f(x) 指代大多数最优化问题。
在机器学习中,丢失函数是价值函数的一部分,而价值函数是方针函数的一种类型。
-
丢失函数(
loss function
): 用于界说单个练习样本猜测值与实在值之间的差错 -
价值函数(
cost function
): 用于界说单个批次/整个练习集样本猜测值与实在值之间的累计差错。 -
方针函数(
objective function
): 泛指任意能够被优化的函数。
丢失函数界说:丢失函数是深度学习模型练习进程中关键的一个组成部分,其经过前言的内容,咱们知道深度学习算法优化的第一步首先是确定方针函数方式。
丢失函数大致可分为两种:回归丢失(针对接连型变量)和分类丢失(针对离散型变量)。
常用的减少丢失函数的优化算法是“梯度下降法”(Gradient Descent)。
二,穿插熵函数-分类丢失
穿插熵丢失(Cross-Entropy Loss
) 又称为对数似然丢失(Log-likelihood Loss)、对数丢失,二分类时还可称之为逻辑斯谛回归丢失(Logistic Loss)。
2.1,穿插熵(Cross-Entropy)的由来
穿插熵丢失的由来参阅文档 AI-EDU: 穿插熵丢失函数。
1,信息量
信息论中,信息量的表明方式:
《深度学习》(花书)中称为自信息(self-information) 。 在本文中,咱们总是用 log\text{log} 来表明自然对数,其底数为 ee。
- xjx_j:表明一个事情
- p(xj)p(x_j):表明事情 xjx_j 产生的概率
- I(xj)I(x_j):信息量,xjx_j 越不或许产生时,它一旦产生后的信息量就越大
2,熵
信息量只处理单个的输出。咱们能够用熵(也称香农熵 Shannon entropy
)来对整个概率散布中的不确定性总量进行量化:
则上面的问题的熵是:
3,相对熵(KL散度)
相对熵又称 KL
散度,假如关于同一个随机变量 xx 有两个单独的概率散布 P(x)P(x) 和 Q(x)Q(x),则能够运用 KL 散度(Kullback-Leibler (KL) divergence)来衡量这两个散布的差异,这个相当于信息论领域的均方差。
KL散度的核算公式:
mm 为事情的所有或许性(分类使命中对应类别数目)。DD 的值越小,表明 qq 散布和 pp 散布越挨近。
4,穿插熵
把上述穿插熵公式变形:
等式的前一部分恰巧便是 pp 的熵,等式的后一部分,便是穿插熵(机器学习中 pp 表明实在散布(方针散布),qq 表明猜测散布):
在机器学习中,咱们需求评价标签值 yy 和猜测值 aa 之间的间隔熵(即两个概率散布之间的相似性),运用 KL 散度 DKL(y∣∣a)D_{KL}(y||a) 即可,但因为样本标签值的散布一般是固定的,即 H(a)H(a) 不变。因而,为了核算方便,在优化进程中,只需求关注穿插熵就能够了。所以,在机器学习中一般直接用穿插熵做丢失函数来评价模型。
上式是单个样本的状况,mm 并不是样本个数,而是分类个数。所以,关于批量样本的穿插熵丢失核算公式(很重要!)是:
其中,nn 是样本数,mm 是分类数。
公式参阅文章-AI-EDU: 穿插熵丢失函数,可是将样本数改为 nn,类别数改为 mm。
有一类特殊问题,便是事情只要两种状况产生的或许,比如“是狗”和“不是狗”,称为 0/10/1 分类或二分类。关于这类问题,因为 m=2,y1=1−y2,a1=1−a2m=2,y_1=1-y_2,a_1=1-a_2,所以二分类问题的单个样本的穿插熵能够简化为:
二分类关于批量样本的穿插熵核算公式是:
为什么穿插熵的价值函数是求均值而不是求和? Cross entropy loss is defined as the “expectation” of the probability distribution of a random variable , and that’s why we use mean instead of sum. 参见这里。
2.1.1,熵、相对熵以及穿插熵总结
穿插熵 H(p,q)H(p, q) 也记作 CE(p,q)CE(p, q)、H(P,Q)H(P, Q),其另一种表达公式(公式表达方式尽管不一样,可是意义相同): H(P,Q)=−Ex∼plog(q(x))H(P, Q) = -\mathbb{E}_{\textrm{x}\sim p}log(q(x))
穿插熵函数常用于逻辑回归(logistic regression
),也便是分类(classification
)。
依据信息论中熵的性质,将熵、相对熵(KL 散度)以及穿插熵的公式放到一同总结如下:
2.2,二分类问题的穿插熵
把二分类的穿插熵公式 4 分解开两种状况:
- 当 y=1y=1 时,即标签值是 11 ,是个正例,加号后边的项为: loss=−log(a)loss = -\log(a)
- 当 y=0y=0 时,即标签值是 00,是个反例,加号前面的项为 00: loss=−log(1−a)loss = -\log (1-a)
横坐标是猜测输出,纵坐标是丢失函数值。y=1y=1 意味着当时样本标签值是1,当猜测输出越挨近1时,丢失函数值越小,练习成果越精确。当猜测输出越挨近0时,丢失函数值越大,练习成果越糟糕。此时,丢失函数值如下图所示。
2.3,多分类问题的穿插熵
当标签值不对错0即1的状况时,便是多分类了。
假定希望依据图片动物的概括、颜色等特征,来猜测动物的类别,有三种可猜测类别:猫、狗、猪。假定咱们练习了两个分类模型,其猜测成果如下:
模型1:
猜测值 | 标签值 | 是否正确 |
---|---|---|
0.3 0.3 0.4 | 0 0 1(猪) | 正确 |
0.3 0.4 0.4 | 0 1 0(狗) | 正确 |
0.1 0.2 0.7 | 1 0 0(猫) | 过错 |
每行表明不同样本的猜测状况,公共 3 个样本。能够看出,模型 1 关于样本 1 和样本 2 以十分弱小的优势判别正确,关于样本 3 的判别则彻底过错。
模型2:
猜测值 | 标签值 | 是否正确 |
---|---|---|
0.1 0.2 0.7 | 0 0 1(猪) | 正确 |
0.1 0.7 0.2 | 0 1 0(狗) | 正确 |
0.3 0.4 0.4 | 1 0 0(猫) | 过错 |
能够看出,模型 2 关于样本 1 和样本 2 判别十分精确(猜测概率值更趋近于 1),关于样本 3 尽管判别过错,可是相对来说没有错得太离谱(猜测概率值远小于 1)。
结合多分类的穿插熵丢失函数公式可得,模型 1 的穿插熵为:
对所有样本的 loss
求均匀:
模型 2 的穿插熵为:
对所有样本的 loss
求均匀:
能够看到,0.63 比 1.37 的丢失值小很多,这说明猜测值越挨近实在标签值,即穿插熵丢失函数能够较好的捕捉到模型 1 和模型 2 猜测效果的差异。穿插熵丢失函数值越小,反向传达的力度越小。
多分类问题核算穿插熵的实例来源于知乎文章-丢失函数|穿插熵丢失函数。
2.4,PyTorch 中的 Cross Entropy
PyTorch 中常用的穿插熵丢失函数为 torch.nn.CrossEntropyLoss
class torch.nn.CrossEntropyLoss(weight=None, size_average=None,
ignore_index=-100, reduce=None,
reduction='elementwise_mean')
1,函数功用:
将输入经过 softmax
激活函数之后,再核算其与 target
的穿插熵丢失。即该办法将 nn.LogSoftmax()
和 nn.NLLLoss()
进行了结合。严厉意义上的穿插熵丢失函数应该是 nn.NLLLoss()
。
2,参数解释:
-
weight
(Tensor)- 为每个类别的 loss 设置权值,常用于类别不均衡问题。weight 必须是 float 类型的 tensor,其长度要于类别C
一致,即每一个类别都要设置有 weight。 -
size_average
(bool)- 当 reduce=True 时有用。为 True 时,回来的 loss 为均匀值;为 False 时,回来的各样本的 loss 之和。 -
reduce
(bool)- 回来值是否为标量,默以为 True。 -
ignore_index
(int)- 疏忽某一类别,不核算其loss
,其 loss 会为 0,而且,在采用 size_average 时,不会核算那一类的 loss,除的时分的分母也不会统计那一类的样本。
2.4.1,Softmax 多分类函数
注意: Softmax 用作模型最终一层的函数一般和穿插熵作丢失函数配套搭配运用,应用于多分类使命。
关于二分类问题,咱们运用 Logistic
函数核算样本的概率值,从而把样本分红了正负两类。关于多分类问题,则运用 Softmax
作为模型最终一层的激活函数来将多分类的输出值转换为范围在 [0, 1] 和为 1 的概率散布。
Softmax 从字面上来说,能够分红 soft 和 max 两个部分。max 故名思议便是最大值的意思。Softmax 的核心在于 soft,而 soft 有软的意义,与之相对的是 hard 硬,即 herdmax。下面散布演示将模型输出值取 max 值和引进 Softmax 的比照状况。
取max值(hardmax)
假定模型输出成果 zz 值是 [3,1,−3][3,1,-3],假如取 max 操作会变成 [1,0,0][1, 0, 0],这符合咱们的分类需求,即三者相加为1,而且以为该样本归于第一类。可是有两个不足:
- 分类成果是 [1,0,0][1,0,0],只保留非 0 即 1 的信息,即非黑即白,没有各元素之间相差多少的信息,能够了解是“Hard Max”;
- max 操作自身不行导,无法用在反向传达中。
引进Softmax
Softmax
加了个”soft”来模拟 max 的行为,但一同又保留了相对巨细的信息。
上式中:
- zjz_j 是对第 jj 项的分类原始值,即矩阵运算的成果
- ziz_i 是参与分类核算的每个类别的原始值
- mm 是总分类数
- aja_j 是对第 jj 项的核算成果
和 hardmax 比较,Softmax 的意义就在于不再唯一的确定某一个最大值,而是为每个输出分类的成果都赋予一个概率值(置信度),表明归于每个类别的或许性。
下图能够形象地说明 Softmax 的核算进程。
当输入的数据 [z1,z2,z3][z_1,z_2,z_3] 是 [3,1,−3][3, 1, -3] 时,按照图示进程进行核算,能够得出输出的概率散布是 [0.879,0.119,0.002][0.879,0.119,0.002]。比照 max 运算和 Softmax 的不同,如下表所示。
输入原始值 | MAX核算 | Softmax核算 |
---|---|---|
[3,1,−3][3, 1, -3] | [1,0,0][1, 0, 0] | [0.879,0.119,0.002][0.879, 0.119, 0.002] |
能够看出 Softmax 运算成果两个特点:
- 三个类别的概率相加为 1
- 每个类别的概率都大于 0
下面我再给出 hardmax 和 softmax 核算的代码实现。
# example of the argmax of a list of numbers
from numpy import argmax
from numpy import exp
# define data
data = [3, 1, -3]
def hardmax(data):
"""# calculate the argmax of the list"""
result = argmax(data)
return result
def softmax(vector):
"""# calculate the softmax of a vector"""
e = exp(vector)
return e / e.sum()
hardmax_result = hardmax(data)
# 运转该示例回来列表索引值“0”,该值指向包括列表“3”中最大值的数组索引 [1]。
print(hardmax(data)) # 0
# convert list of numbers to a list of probabilities
softmax_result = softmax(data)
print(softmax_result) # report the probabilities
print(sum(softmax_result)) # report the sum of the probabilitie
运转以上代码后,输出成果如下:
0
[0.87887824 0.11894324 0.00217852]
1.0
很明显程序的输出成果和咱们手动核算的成果是一样的。
Pytorch 中的 Softmax 函数界说如下:
def softmax(x):
return torch.exp(x)/torch.sum(torch.exp(x), dim=1).view(-1,1)
dim=1
用于 torch.sum()
对所有列的每一行求和,.view(-1,1)
用于避免广播。
2.5,为什么不能运用均方差做为分类问题的丢失函数?
回归问题一般用均方差丢失函数,能够保证丢失函数是个凸函数,即能够得到最优解。而分类问题假如用均方差的话,丢失函数的体现不是凸函数,就很难得到最优解。而穿插熵函数能够保证区间内单调。
分类问题的最终一层网络,需求分类函数,Sigmoid
或许 Softmax
,假如再接均方差函数的话,其求导成果杂乱,运算量比较大。用穿插熵函数的话,能够得到比较简单的核算成果,一个简单的减法就能够得到反向差错。
三,回归丢失
与分类问题不同,回归问题处理的是对具体数值的猜测。处理回归问题的神经网络一般只要只要一个输出节点,这个节点的输出值便是猜测值。
回归问题的一个基本概念是残差或称为猜测差错,用于衡量模型猜测值与实在符号的挨近程度。假定回归问题中对应于第 ii 个输入特征 xix_i 的标签为 yi=(y1,y2,…,yM)⊤y^i = (y_1,y_2,…,y_M)^{\top},MM 为符号向量总维度,则 ltil_{t}^{i} 即表明样本 ii 上神经网络的回归猜测值 (yiy^i) 与其样本标签值在第 tt 维的猜测差错(亦称残差):
常用的两种丢失函数为 MAE\text{MAE}(也叫 L1
丢失) 和 MSE\text{MSE} 丢失函数(也叫 L2
丢失)。
3.1,MAE 丢失
均匀绝对差错(Mean Absolute Error,MAE
)是用于回归模型的最简单但最强大的丢失函数之一。
因为存在离群值(与其余数据差异很大的值),所以回归问题或许具有本质上不是严厉高斯散布的变量。 在这种状况下,均匀绝对差错将是一个理想的选择,因为它没有考虑异常值的方向(不切实际的高正值或负值)。
望文生义,MAE 是方针值和猜测值之差的绝对值之和。nn 是数据集中数据点的总数,其公式如下:
3.2,MSE 丢失
均方差错(Mean Square Error, MSE
)几乎是每个数据科学家在回归丢失函数方面的偏好,这是因为大多数变量都能够建模为高斯散布。
均方差错核算办法是求猜测值与实在值之间间隔的平方和。猜测值和实在值越挨近,两者的均方差就越小。公式如下:
3.3,Huber
丢失
MAE 和 MSE 丢失之间的比较产生以下成果:
-
MAE 丢失比 MSE 丢失更稳健。细心检查公式,能够观察到假如猜测值和实际值之间的差异很大,与 MAE 比较,MSE 丢失会放大效果。 因为 MSE 会屈服于异常值,因而 MAE 丢失函数是更稳健的丢失函数。
-
MAE 丢失不如 MSE 丢失稳定。因为 MAE 丢失处理的是间隔差异,因而一个小的水平改变都或许导致回归线波动很大。在多次迭代中产生的影响将导致迭代之间的斜率产生显著改变。总结便是,MSE 能够保证回归线轻微移动以对数据点进行小幅调整。
-
MAE 丢失更新的梯度一直相同。即使关于很小的丢失值,梯度也很大。这样不利于模型的学习。为了处理这个缺陷,咱们能够运用改变的学习率,在丢失挨近最小值时下降学习率。
-
MSE 丢失的梯度随丢失增大而增大,而丢失趋于0时则会减小。其运用固定的学习率也能够有用收敛。
Huber Loss 结合了 MAE 的稳健性和 MSE 的稳定性,本质上是 MAE 和 MSE 丢失中最好的。关于大差错,它是线性的,关于小差错,它本质上是二次的。
Huber Loss 的特征在于参数 \delta。当 ∣y−y∣|y − \hat{y}| 小于一个事先指定的值 \delta 时,变为平方丢失,大于 \delta 时,则变成类似于绝对值丢失,因而其是比较robust 的丢失函数。其界说如下:
三种回归丢失函数的曲线图比较如下:
代码来源 Loss Function Plot.ipynb。
三种回归丢失函数的其他方式界说如下:
3.4,代码实现
下面是三种回归丢失函数的 python 代码实现,以及对应的 sklearn
库的内置函数。
# true: Array of true target variable
# pred: Array of predictions
def mse(true, pred):
return np.sum((true - pred)**2)
def mae(true, pred):
return np.sum(np.abs(true - pred))
def huber(true, pred, delta):
loss = np.where(np.abs(true-pred) < delta , 0.5*((true-pred)**2),delta*np.abs(true - pred) - 0.5*(delta**2))
return np.sum(loss)
# also available in sklearn
from sklearn.metrics import mean_squared_error
from sklearn.metrics import mean_absolute_error
参阅资料
- 《着手学深度学习-22.11. Information Theory》
- 丢失函数|穿插熵丢失函数
- AI-EDU: 穿插熵丢失函数
- 常见回归和分类丢失函数比较
- 《PyTorch_tutorial_0.0.5_余霆嵩》
- pytorch.org/docs/stable…
- 一文详解Softmax函数
- AI-EDU: 多分类函数