神经网络基础部件-损失函数详解

news2024/11/19 17:51:10

一,损失函数概述

大多数深度学习算法都会涉及某种形式的优化,所谓优化指的是改变 x x x 以最小化或最大化某个函数 f ( x ) f(x) 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} log 来表示自然对数,其底数 e e e

I ( x j ) = − log ⁡ ( p ( x j ) ) I(x_j) = -\log (p(x_j)) I(xj)=log(p(xj))

  • x j x_j xj:表示一个事件
  • p ( x j ) p(x_j) p(xj):表示事件 x j x_j xj 发生的概率
  • I ( x j ) I(x_j) I(xj):信息量, x j x_j xj 越不可能发生时,它一旦发生后的信息量就越大

2,熵

信息量只处理单个的输出。我们可以用熵(也称香农熵 Shannon entropy)来对整个概率分布中的不确定性总量进行量化:

H ( p ) = − ∑ j n p ( x j ) log ⁡ ( p ( x j ) ) H(p) = - \sum_j^n p(x_j) \log (p(x_j)) H(p)=jnp(xj)log(p(xj))

则上面的问题的熵是:

H ( p ) = − [ p ( x 1 ) ln ⁡ p ( x 1 ) + p ( x 2 ) ln ⁡ p ( x 2 ) + p ( x 3 ) ln ⁡ p ( x 3 ) ]   = 0.7 × 0.36 + 0.2 × 1.61 + 0.1 × 2.30   = 0.804 \begin{aligned} H(p)&=-[p(x_1) \ln p(x_1) + p(x_2) \ln p(x_2) + p(x_3) \ln p(x_3)] \\\ &=0.7 \times 0.36 + 0.2 \times 1.61 + 0.1 \times 2.30 \\\ &=0.804 \end{aligned} H(p)  =[p(x1)lnp(x1)+p(x2)lnp(x2)+p(x3)lnp(x3)]=0.7×0.36+0.2×1.61+0.1×2.30=0.804

3,相对熵(KL散度)

相对熵又称 KL 散度,如果对于同一个随机变量 x x x 有两个单独的概率分布 P ( x ) P(x) P(x) Q ( x ) Q(x) Q(x),则可以使用 KL 散度(Kullback-Leibler (KL) divergence)来衡量这两个分布的差异,这个相当于信息论范畴的均方差。

KL散度的计算公式:

D K L ( p ∣ ∣ q ) = ∑ j = 1 m p ( x j ) log ⁡ p ( x j ) q ( x j ) D_{KL}(p||q)=\sum_{j=1}^m p(x_j) \log {p(x_j) \over q(x_j)} DKL(p∣∣q)=j=1mp(xj)logq(xj)p(xj)

m m m 为事件的所有可能性(分类任务中对应类别数目)。 D D D 的值越小,表示 q q q 分布和 p p p 分布越接近

4,交叉熵

把上述交叉熵公式变形:

D K L ( p ∣ ∣ q ) = ∑ j = 1 m p ( x j ) log ⁡ p ( x j ) − ∑ j = 1 m p ( x j ) log ⁡ q ( x j )   = − H ( p ( x ) ) + H ( p , q ) \begin{aligned} D_{KL}(p||q)&=\sum_{j=1}^m p(x_j) \log {p(x_j)} - \sum_{j=1}^m p(x_j) \log q(x_j) \\\ &=- H(p(x)) + H(p,q) \end{aligned} DKL(p∣∣q) =j=1mp(xj)logp(xj)j=1mp(xj)logq(xj)=H(p(x))+H(p,q)

等式的前一部分恰巧就是 p p p 的熵,等式的后一部分,就是交叉熵(机器学习中 p p p 表示真实分布(目标分布), q q q 表示预测分布):

H ( p , q ) = − ∑ j = 1 m p ( x j ) log ⁡ q ( x j ) H(p,q) =- \sum_{j=1}^m p(x_j) \log q(x_j) H(p,q)=j=1mp(xj)logq(xj)

在机器学习中,我们需要评估标签值 y y y 和预测值 a a a 之间的差距熵(即两个概率分布之间的相似性),使用 KL 散度 D K L ( y ∣ ∣ a ) D_{KL}(y||a) DKL(y∣∣a) 即可,但因为样本标签值的分布通常是固定的,即 H ( a ) H(a) H(a) 不变。因此,为了计算方便,在优化过程中,只需要关注交叉熵就可以了。所以,在机器学习中一般直接用交叉熵做损失函数来评估模型

l o s s = ∑ j = 1 m y j log ( a j ) loss = \sum_{j = 1}^{m}y_{j}\text{log}(a_{j}) loss=j=1myjlog(aj)

上式是单个样本的情况, m m m 并不是样本个数,而是分类个数。所以,对于批量样本的交叉熵损失计算公式(很重要!)是:

J = − 1 n ∑ i = 1 n ∑ j = 1 m y i j log ⁡ a i j J = -\frac{1}{n}\sum_{i=1}^n \sum_{j=1}^{m} y_{ij} \log a_{ij} J=n1i=1nj=1myijlogaij

其中, n n n 是样本数, m m m 是分类数。

公式参考文章-AI-EDU: 交叉熵损失函数,但是将样本数改为 n n n,类别数改为 m m m

有一类特殊问题,就是事件只有两种情况发生的可能,比如“是狗”和“不是狗”,称为 0 / 1 0/1 0/1 分类或二分类。对于这类问题,由于 m = 2 , y 1 = 1 − y 2 , a 1 = 1 − a 2 m=2,y_1=1-y_2,a_1=1-a_2 m=2y1=1y2a1=1a2,所以二分类问题的单个样本的交叉熵可以简化为:

l o s s = − [ y log ⁡ a + ( 1 − y ) log ⁡ ( 1 − a ) ] loss =-[y \log a + (1-y) \log (1-a)] loss=[yloga+(1y)log(1a)]

二分类对于批量样本的交叉熵计算公式是:

J = − 1 n ∑ i = 1 n [ y i log ⁡ a i + ( 1 − y i ) log ⁡ ( 1 − a i ) ] J= -\frac{1}{n} \sum_{i=1}^n [y_i \log a_i + (1-y_i) \log (1-a_i)] J=n1i=1n[yilogai+(1yi)log(1ai)]

为什么交叉熵的代价函数是求均值而不是求和?
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) H(p,q) 也记作 C E ( p , q ) CE(p, q) CE(p,q) H ( P , Q ) H(P, Q) H(P,Q),其另一种表达公式(公式表达形式虽然不一样,但是意义相同):
H ( P , Q ) = − E x ∼ p l o g ( q ( x ) ) H(P, Q) = -\mathbb{E}_{\textrm{x}\sim p}log(q(x)) H(P,Q)=Explog(q(x))

交叉熵函数常用于逻辑回归(logistic regression),也就是分类(classification)。

根据信息论中熵的性质,将熵、相对熵(KL 散度)以及交叉熵的公式放到一起总结如下:

H ( p ) = − ∑ j p ( x j ) log ⁡ p ( x j ) D K L ( p ∥ q ) = ∑ j p ( x j ) log ⁡ p ( x j ) q ( x j ) = ∑ j ( p ( x j ) log ⁡ p ( x j ) − p ( x j ) log ⁡ q ( x j ) ) H ( p , q ) = − ∑ j p ( x j ) log ⁡ q ( x j ) \begin{aligned} H(p) &= -\sum_{j}p(x_j) \log p(x_j) \\ D_{KL}(p \parallel q) &= \sum_{j}p(x_j)\log \frac{p(x_j)}{q(x_j)} = \sum_j (p(x_j)\log p(x_j) - p(x_j) \log q(x_j)) \\ H(p,q) &= -\sum_j p(x_j)\log q(x_j) \\ \end{aligned} H(p)DKL(pq)H(p,q)=jp(xj)logp(xj)=jp(xj)logq(xj)p(xj)=j(p(xj)logp(xj)p(xj)logq(xj))=jp(xj)logq(xj)

2.2,二分类问题的交叉熵

把二分类的交叉熵公式 4 分解开两种情况:

  • y = 1 y=1 y=1 时,即标签值是 1 1 1 ,是个正例,加号后面的项为: l o s s = − log ⁡ ( a ) loss = -\log(a) loss=log(a)
  • y = 0 y=0 y=0 时,即标签值是 0 0 0,是个反例,加号前面的项为 0 0 0: l o s s = − log ⁡ ( 1 − a ) loss = -\log (1-a) loss=log(1a)

横坐标是预测输出,纵坐标是损失函数值。 y = 1 y=1 y=1 意味着当前样本标签值是1,当预测输出越接近1时,损失函数值越小,训练结果越准确。当预测输出越接近0时,损失函数值越大,训练结果越糟糕。此时,损失函数值如下图所示。

二分类交叉熵损失函数图

2.3,多分类问题的交叉熵

当标签值不是非0即1的情况时,就是多分类了。

假设希望根据图片动物的轮廓、颜色等特征,来预测动物的类别,有三种可预测类别:猫、狗、猪。假设我们训练了两个分类模型,其预测结果如下:

模型1:

预测值标签值是否正确
0.3 0.3 0.40 0 1(猪)正确
0.3 0.4 0.40 1 0(狗)正确
0.1 0.2 0.71 0 0(猫)错误

每行表示不同样本的预测情况,公共 3 个样本。可以看出,模型 1 对于样本 1 和样本 2 以非常微弱的优势判断正确,对于样本 3 的判断则彻底错误。

模型2:

预测值标签值是否正确
0.1 0.2 0.70 0 1(猪)正确
0.1 0.7 0.20 1 0(狗)正确
0.3 0.4 0.41 0 0(猫)错误

可以看出,模型 2 对于样本 1 和样本 2 判断非常准确(预测概率值更趋近于 1),对于样本 3 虽然判断错误,但是相对来说没有错得太离谱(预测概率值远小于 1)。

结合多分类的交叉熵损失函数公式可得,模型 1 的交叉熵为:

sample  1  loss = − ( 0 × l o g ( 0.3 ) + 0 × l o g ( 0.3 ) + 1 × l o g ( 0.4 ) = 0.91 sample  1  loss = − ( 0 × l o g ( 0.3 ) + 1 × l o g ( 0.4 ) + 0 × l o g ( 0.4 ) = 0.91 sample  1  loss = − ( 1 × l o g ( 0.1 ) + 0 × l o g ( 0.2 ) + 0 × l o g ( 0.7 ) = 2.30 \begin{aligned} \text{sample}\ 1\ \text{loss} = -(0\times log(0.3) + 0\times log(0.3) + 1\times log(0.4) = 0.91 \\ \text{sample}\ 1\ \text{loss} = -(0\times log(0.3) + 1\times log(0.4) + 0\times log(0.4) = 0.91 \\ \text{sample}\ 1\ \text{loss} = -(1\times log(0.1) + 0\times log(0.2) + 0\times log(0.7) = 2.30 \end{aligned} sample 1 loss=(0×log(0.3)+0×log(0.3)+1×log(0.4)=0.91sample 1 loss=(0×log(0.3)+1×log(0.4)+0×log(0.4)=0.91sample 1 loss=(1×log(0.1)+0×log(0.2)+0×log(0.7)=2.30

对所有样本的 loss 求平均:

L = 0.91 + 0.91 + 2.3 3 = 1.37 L = \frac{0.91 + 0.91 + 2.3}{3} = 1.37 L=30.91+0.91+2.3=1.37

模型 2 的交叉熵为:

sample  1  loss = − ( 0 × l o g ( 0.1 ) + 0 × l o g ( 0.2 ) + 1 × l o g ( 0.7 ) = 0.35 sample  1  loss = − ( 0 × l o g ( 0.1 ) + 1 × l o g ( 0.7 ) + 0 × l o g ( 0.2 ) = 0.35 sample  1  loss = − ( 1 × l o g ( 0.3 ) + 0 × l o g ( 0.4 ) + 0 × l o g ( 0.4 ) = 1.20 \begin{aligned} \text{sample}\ 1\ \text{loss} = -(0\times log(0.1) + 0\times log(0.2) + 1\times log(0.7) = 0.35 \\ \text{sample}\ 1\ \text{loss} = -(0\times log(0.1) + 1\times log(0.7) + 0\times log(0.2) = 0.35 \\ \text{sample}\ 1\ \text{loss} = -(1\times log(0.3) + 0\times log(0.4) + 0\times log(0.4) = 1.20 \end{aligned} sample 1 loss=(0×log(0.1)+0×log(0.2)+1×log(0.7)=0.35sample 1 loss=(0×log(0.1)+1×log(0.7)+0×log(0.2)=0.35sample 1 loss=(1×log(0.3)+0×log(0.4)+0×log(0.4)=1.20

对所有样本的 loss 求平均:

L = 0.35 + 0.35 + 1.2 3 = 0.63 L = \frac{0.35 + 0.35 + 1.2}{3} = 0.63 L=30.35+0.35+1.2=0.63

可以看到,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)

假设模型输出结果 z z z 值是 [ 3 , 1 , − 3 ] [3,1,-3] [3,1,3],如果取 max 操作会变成 [ 1 , 0 , 0 ] [1, 0, 0] [1,0,0],这符合我们的分类需要,即三者相加为1,并且认为该样本属于第一类。但是有两个不足:

  1. 分类结果是 [ 1 , 0 , 0 ] [1,0,0] [1,0,0],只保留非 0 即 1 的信息,即非黑即白,没有各元素之间相差多少的信息,可以理解是“Hard Max”;
  2. max 操作本身不可导,无法用在反向传播中。

引入Softmax

Softmax 加了个"soft"来模拟 max 的行为,但同时又保留了相对大小的信息。

a j = Softmax ( z j ) = e z j ∑ i = 1 m e z i = e z j e z 1 + e z 2 + ⋯ + e z m a_j = \text{Softmax}(z_j) = \frac{e^{z_j}}{\sum\limits_{i=1}^m e^{z_i}}=\frac{e^{z_j}}{e^{z_1}+e^{z_2}+\dots+e^{z_m}} aj=Softmax(zj)=i=1meziezj=ez1+ez2++ezmezj

上式中:

  • z j z_j zj 是对第 j j j 项的分类原始值,即矩阵运算的结果
  • z i z_i zi 是参与分类计算的每个类别的原始值
  • m m m 是总分类数
  • a j a_j aj 是对第 j j j 项的计算结果

和 hardmax 相比,Softmax 的含义就在于不再唯一的确定某一个最大值,而是为每个输出分类的结果都赋予一个概率值(置信度),表示属于每个类别的可能性。

下图可以形象地说明 Softmax 的计算过程。

Softmax工作过程

当输入的数据 [ z 1 , z 2 , z 3 ] [z_1,z_2,z_3] [z1,z2,z3] [ 3 , 1 , − 3 ] [3, 1, -3] [3,1,3] 时,按照图示过程进行计算,可以得出输出的概率分布是 [ 0.879 , 0.119 , 0.002 ] [0.879,0.119,0.002] [0.879,0.119,0.002]。对比 max 运算和 Softmax 的不同,如下表所示。

输入原始值MAX计算Softmax计算
[ 3 , 1 , − 3 ] [3, 1, -3] [3,1,3] [ 1 , 0 , 0 ] [1, 0, 0] [1,0,0] [ 0.879 , 0.119 , 0.002 ] [0.879, 0.119, 0.002] [0.879,0.119,0.002]

可以看出 Softmax 运算结果两个特点:

  1. 三个类别的概率相加为 1
  2. 每个类别的概率都大于 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,如果再接均方差函数的话,其求导结果复杂,运算量比较大。用交叉熵函数的话,可以得到比较简单的计算结果,一个简单的减法就可以得到反向误差。

三,回归损失

与分类问题不同,回归问题解决的是对具体数值的预测。解决回归问题的神经网络一般只有只有一个输出节点,这个节点的输出值就是预测值。

回归问题的一个基本概念是残差或称为预测误差,用于衡量模型预测值与真实标记的靠近程度。假设回归问题中对应于第 i i i 个输入特征 x i x_i xi标签 y i = ( y 1 , y 2 , . . . , y M ) ⊤ y^i = (y_1,y_2,...,y_M)^{\top} yi=(y1,y2,...,yM) M M M 为标记向量总维度,则 l t i l_{t}^{i} lti 即表示样本 i i i 上神经网络的回归预测值 ( y i y^i yi) 与其样本标签值在第 t t t 维的预测误差(亦称残差):

l t i = y t i − y ^ t i l_{t}^{i} = y_{t}^{i} - \hat{y}_{t}^{i} lti=ytiy^ti

常用的两种损失函数为 MAE \text{MAE} MAE(也叫 L1 损失) 和 MSE \text{MSE} MSE 损失函数(也叫 L2 损失)。

3.1,MAE 损失

平均绝对误差(Mean Absolute Error,MAE)是用于回归模型的最简单但最强大的损失函数之一。

因为存在离群值(与其余数据差异很大的值),所以回归问题可能具有本质上不是严格高斯分布的变量。 在这种情况下,平均绝对误差将是一个理想的选择,因为它没有考虑异常值的方向(不切实际的高正值或负值)。

顾名思义,MAE 是目标值和预测值之差的绝对值之和 n n n 是数据集中数据点的总数,其公式如下:
MAE loss = 1 n ∑ i = 1 N ∑ t = 1 M ∣ y t i − y ^ t i ∣ \text{MAE loss} = \frac{1}{n}\sum_{i=1}^{N}\sum_{t=1}^{M} |y_{t}^{i} - \hat{y}_{t}^{i}| MAE loss=n1i=1Nt=1Mytiy^ti

3.2,MSE 损失

均方误差(Mean Square Error, MSE)几乎是每个数据科学家在回归损失函数方面的偏好,这是因为大多数变量都可以建模为高斯分布

均方误差计算方法是求预测值与真实值之间距离的平方和。预测值和真实值越接近,两者的均方差就越小。公式如下:

MSE loss = 1 n ∑ i = 1 N ∑ t = 1 M ( y t i − y ^ t i ) 2 \text{MSE loss} = \frac{1}{n}\sum_{i=1}^{N}\sum_{t=1}^{M} (y_{t}^{i} - \hat{y}_{t}^{i})^2 MSE loss=n1i=1Nt=1M(ytiy^ti)2

3.3,Huber 损失

MAE 和 MSE 损失之间的比较产生以下结果:

  1. MAE 损失比 MSE 损失更稳健。仔细查看公式,可以观察到如果预测值和实际值之间的差异很大,与 MAE 相比,MSE 损失会放大效果。 由于 MSE 会屈服于异常值,因此 MAE 损失函数是更稳健的损失函数。

  2. MAE 损失不如 MSE 损失稳定。由于 MAE 损失处理的是距离差异,因此一个小的水平变化都可能导致回归线波动很大。在多次迭代中发生的影响将导致迭代之间的斜率发生显著变化。总结就是,MSE 可以确保回归线轻微移动以对数据点进行小幅调整。

  3. MAE 损失更新的梯度始终相同。即使对于很小的损失值,梯度也很大。这样不利于模型的学习。为了解决这个缺陷,我们可以使用变化的学习率,在损失接近最小值时降低学习率。

  4. MSE 损失的梯度随损失增大而增大,而损失趋于0时则会减小。其使用固定的学习率也可以有效收敛。

Huber Loss 结合了 MAE 的稳健性和 MSE 的稳定性,本质上是 MAE 和 MSE 损失中最好的。对于大误差,它是线性的,对于小误差,它本质上是二次的

Huber Loss 的特征在于参数 δ \delta δ。当 ∣ y − y ^ ∣ |y − \hat{y}| yy^ 小于一个事先指定的值 $\delta $ 时,变为平方损失,大于 $\delta $ 时,则变成类似于绝对值损失,因此其是比较robust 的损失函数。其定义如下:

Huber loss = { 1 2 [ y t i − y ^ t i ] 2 ∣ y t i − y ^ t i ∣ ≤ δ δ ∣ y t i − y ^ t i ∣ − 1 2 δ 2 ∣ y t i − y ^ t i ) ∣ > δ \text{Huber loss} = \left \lbrace \begin{matrix} \frac12[y_{t}^{i} - \hat{y}_{t}^{i}]^2 & |y_{t}^{i} - \hat{y}_{t}^{i}| \leq \delta \\ \delta|y_{t}^{i} - \hat{y}_{t}^{i}| - \frac12\delta^2 & |y_{t}^{i} - \hat{y}_{t}^{i})| > \delta \end{matrix}\right. Huber loss={21[ytiy^ti]2δytiy^ti21δ2ytiy^tiδytiy^ti)>δ

三种回归损失函数的曲线图比较如下:

loss_for_regression

代码来源 Loss Function Plot.ipynb。

三种回归损失函数的其他形式定义如下:

three_regression_loss

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

参考资料

  1. 《动手学深度学习-22.11. Information Theory》
  2. 损失函数|交叉熵损失函数
  3. AI-EDU: 交叉熵损失函数
  4. 常见回归和分类损失函数比较
  5. 《PyTorch_tutorial_0.0.5_余霆嵩》
  6. https://pytorch.org/docs/stable/generated/torch.nn.CrossEntropyLoss.html
  7. 一文详解Softmax函数
  8. AI-EDU: 多分类函数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/163294.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Security 多过滤链的使用

一、背景 在我们实际的开发过程中&#xff0c;有些时候可能存在这么一些情况&#xff0c;某些api 比如&#xff1a; /api/** 这些是给App端使用的&#xff0c;数据的返回都是以JSON的格式返回&#xff0c;且这些API的认证方式都是使用的TOKEN进行认证。而除了 /api/** 这些API…

Qt扫盲-QTextEdit理论总结

QTextEdit理论总结一、概述二、用途一&#xff1a;富文本阅读器1. 用法2. 快捷键绑定三、用途二&#xff1a;编辑器1. 用法2. 拖拽3. 快捷键绑定四、常用功能五、信号一、概述 QTextEdit是一个先进的所见即所得的 富文本 查看器/编辑器&#xff0c;支持使用 html 风格的标签或…

【QT】.pro 文件

&#x1f33f;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;QT开发 .pro 文件是什么 .pro就是工程文件(project)&#xff0c;它是qmake自动生成的用于生产makefile的配置文件。类似于VS中的.sln 和vsproj文件 默认情况下&#xff0c;每个 Qt 项目都包含一个后缀名为…

Huffman编码实现文件的压缩和解压缩

一个项目&#xff0c;不过处理起来也比较麻烦&#xff0c;配套可以和文件传输放一起 前提知识&#xff1a; 哈夫曼树和哈夫曼编码的概念和构建 1&#xff1a;n个数构成的哈夫曼树一共有2*n-1个结点>8 -> 15 2&#xff1a;数字越大的数离根节点越近&#xff0c;越小的数离…

无线耳机跑步会不会掉、最适合跑步用的耳机排名

现在&#xff0c;喜欢运动的人越来越多了。大家都有体会&#xff0c;多数运动是相对枯燥的&#xff0c;在运动时听听音乐&#xff0c;那是多么惬意的事情啊。为此&#xff0c;体验过多款耳机&#xff0c;但令我很满意的甚少。相信不少喜欢运动的朋友都有着跟我一样的烦恼吧&…

【Java基础知识3】Java注释:单行、多行、文档注释(如何通过 javadoc 命令生成代码文档、如何在IEDA配置自动为所有的类都添加创建者和创建日期)

本文已收录专栏 &#x1f332;《Java进阶之路》&#x1f332; 目录 本文已收录专栏 &#x1f332;《Java进阶之路》&#x1f332; &#x1f350;01、单行注释 &#x1f350;02、多行注释 &#x1f350;03、文档注释 &#x1f350;04、文档注释的注意事项 &#x1f350;05、注释…

ceres学习笔记(二)

继续关于ceres官方doc里教程的学习&#xff0c;对于powells function的学习。 一、powells function 鲍威尔法&#xff0c;严格来说是鲍威尔共轭方向法&#xff0c;是迈克尔J.D.鲍威尔提出的一种求解函数局部最小值的算法。该函数不能是可微分的&#xff0c;并且不会导出衍生函…

spring用注解读取与获取对象

前言 上一篇博客简单的介绍了spring的功能与使用&#xff0c;可以看到我们创建一个对象&#xff0c;就需要在xml中存储一个bean对象&#xff0c;这种操作非常的繁琐&#xff0c;因此spring发明了使用注解来快捷存储bean对象 配置工作 我们在xml文件中写下面的代码片段 <…

基于风光储能和需求响应的微电网日前经济调度(Python代码实现)【0】

目录 0 引言 1 计及风光储能和需求响应的微电网日前经济调度模型 1.1风光储能需求响应都不参与的模型 1.2风光参与的模型 1.3风光和储能参与模型 1.4 风光和需求响应参与模型 1.5 风光储能和需求响应都参与模型 2 需求侧响应评价 2.1 负载率 2.2 可再生能源消纳率 …

Win10PE_V2.0Nvme网络版.iso 支持Nvme硬盘免费下载无需积分

Win10PE_V2.0Nvme网络版.iso 支持Nvme硬盘免费下载无需积分 V1.0版本发布 2022年1月19日 内置常用PE工具&#xff0c;7-Zip、EasyImageX_x64、XorBoot Uefi修复、NT6修复、Ghost、CGI、Google浏览器、PENetwork、RegWorkshop、迅雷迷你版、、BOOTICEx64、windows安装器、XP安…

路径计数2

路径计数2 题目描述 一个NNN \times NNN的网格&#xff0c;你一开始在(1,1)(1,1)(1,1)&#xff0c;即左上角。每次只能移动到下方相邻的格子或者右方相邻的格子&#xff0c;问到达(N,N)(N,N)(N,N)&#xff0c;即右下角有多少种方法。 但是这个问题太简单了&#xff0c;所以现…

MySQL 数据同步 Elasticsearch 的技术方案选型

文章目录1.同步双写2.异步双写3.定时任务4.数据订阅1.同步双写 优点&#xff1a;实现简单缺点&#xff1a; 业务耦合&#xff0c;商品的管理中耦合大量数据同步代码 影响性能&#xff0c;写入两个存储&#xff0c;响应时间变长 不便扩展&#xff1a;搜索可能有一些个性化需求&…

jvm学习的核心(三)---运行时数据区详解(1)

图片等相关信息来源于&#xff1a;尚硅谷宋红康JVM全套教程 1.程序计数器 程序计数器又叫pc寄存器&#xff0c;中文有两个名字 我们可以反编译字节码文件查看方法中操作指令对应的指令地址 javap -v "对应的class文件"为什么要用pc寄存器&#xff0c;pc寄存器有什…

13、Javaweb_Filter登陆验证动态代理过滤敏感词Listener

Filter&#xff1a;过滤器 1. 概念&#xff1a; * 生活中的过滤器&#xff1a;净水器,空气净化器&#xff0c;土匪、 * web中的过滤器&#xff1a;当访问服务器的资源时&#xff0c;过滤器可以将请求拦截下来&#xff0c;完成一些特殊的功能。 * 过滤器的作用&…

深入理解计算机系统_可执行目标文件和可重定位目标文件的3个区别

这篇笔记对比一下可执行目标文件和可执行目标的3个区别。下图分别是可重定位目标文件和可执行目标文件各段结构。 1.1 可执行目标文件和可重定位目标文件的3个区别 区别1&#xff1a;可执行目标文件的rel.text和.rel.data消失了 链接器将.o中.text和.data节整合到一起时&a…

【ROS2入门】理解 ROS 2 Topics 话题

大家好&#xff0c;我是虎哥&#xff0c;从今天开始&#xff0c;我将花一段时间&#xff0c;开始将自己从ROS1切换到ROS2&#xff0c;在上一篇中&#xff0c;我们一起了解ROS 2中节点的功能以及与之交互的工具&#xff0c; 这一篇&#xff0c;我们主要会围绕ROS中另外一个重要的…

RS232 RS485 TO ETH TCP-Modbus 测试

原来modbus 传感器都是有对应的指令码的&#xff0c;不同功能的指令码也不一样&#xff0c;比如测温度和湿度的指令码也是不一样的&#xff1b; 硬件连接如下图 &#xff08;温湿度传感器&#xff0c;板载SHT20&#xff09; ​ 编辑切换为居中 添加图片注释&#xff0c;不超…

华为VRRP、BFD实验配置

目录 VRRP实验配置 BFD实验配置 配置单跳检测 配置多跳检测 配置单臂回声 BFD与路由协议联动配置 BFD与OSPF联动 BFD与ISIS联动 BFD与BGP联动 VRRP实验配置 VRRP配置 AR1配置&#xff08;VRRP缺省优先级100&#xff09; int g0/0/0 ip add 192.168.10.1 24 vrrp vrid …

织音云站长扶持计划:可免费获得CDN或虚拟主机

活动介绍活动详情页&#xff1a;织音云站长扶持计划网站被恶意攻击时是中小站长最脆弱的时候&#xff0c;90%的站长都会动“关站不干了”的心思&#xff0c;夹在中间真的很难搞!因此织音云决定为中小站长提供免费的全球CDN加速服务和提供免费的虚拟主机,免备案&#xff01;只需…

智改数转水循环在线监测系统,提升企业生产安

江苏省政府印发《江苏省制造业智能化改造和数字化转型三年行动计划&#xff08;2022&#xff0d;2024年&#xff09;》&#xff0c;提出通过三年的努力&#xff0c;全省制造业数字化、网络化、智能化水平显著提升&#xff0c;新业态、新模式、新动能显著壮大&#xff0c;制造业…