泰国浪琴手表网站,买一台服务器需要多少钱,dw软件怎么制作网页视频,河北建设厅网站怎么搜索文件提示#xff1a;文章写完后#xff0c;目录可以自动生成#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、回归问题1. 均方误差#xff08;MSE#xff09;2. 均方根误差 #xff08;RMSE#xff09;3. 平均绝对误差 #xff08;MAE#xff09; 二、分类问题… 提示文章写完后目录可以自动生成如何生成可参考右边的帮助文档 文章目录 前言一、回归问题1. 均方误差MSE2. 均方根误差 RMSE3. 平均绝对误差 MAE 二、分类问题1. 相关概念2. 交叉熵损失函数3. BCE Loss 前言
机器学习任务大概可以分为两类问题分别是回归问题和分类问题。回归问题预测的是一个连续的数值例如房价气温等。而分类问题是将输入预测为不同的类别例如猫狗分类等。总的来说回归问题输出是一个实数范围可以是任何数值分类问题输出是离散的类别标签通常是整数或特定的类别名称。接下来对回归问题和分类问题常用的损失函数进行介绍。
一、回归问题
1. 均方误差MSE MSE损失(Mean Squared Error)也称为 L 2 L_2 L2 Loss是回归问题中比较常用的损失函数。其公式为 L M S E ( y , y ^ ) 1 n ∑ i 1 n ( y i − y ^ i ) 2 L_{MSE}(y,\hat{y}) \frac{1}{n}\sum_{i1}^n(y_i-\hat{y}_i)^2 LMSE(y,y^)n1∑i1n(yi−y^i)2 其中 y y y为模型的预测值 y ^ \hat{y} y^为标签值。 优点由于平方操作MSE对较大的误差给予更大的惩罚这有助于模型学习减少大的预测偏差。 缺点MSE对异常值或离群点非常敏感这可能会影响模型的泛化能力。 代码实现
import torch
import torch.nn as nny torch.Tensor([1,2,3])
label torch.Tensor([3,5,1])
criterion nn.MSELoss()
loss criterion(y,label)
print(loss)输出为tensor(5.6667)
2. 均方根误差 RMSE RMSE误差Root Mean Squared Error的公式为 L M S E ( y , y ^ ) 1 n ∑ i 1 n ( y i − y ^ i ) 2 L_{MSE}(y,\hat{y}) \sqrt{\frac{1}{n}\sum_{i1}^n(y_i-\hat{y}_i)^2} LMSE(y,y^)n1∑i1n(yi−y^i)2 其相当于在MSE的基础上加了一个根号。 优点与MSE一样RMSE对较大的误差给予更大的惩罚同时因为开根号的缘故它的单位与原始数据的单位相同这使得它在解释预测误差时更加直观。 缺点对异常值或离群点非常敏感计算量较大RMSE比较难优化因为它不是一个严格凸函数。
3. 平均绝对误差 MAE MAEMean Absolute Error又称为 L 1 L_1 L1 Loss计算所有样本预测值与实际值之差的绝对值的平均值。公式为 L M A E ( y , y ^ ) 1 n ∑ i 1 n ∣ ( y i − y ^ i ) ∣ L_{MAE}(y,\hat{y}) \frac{1}{n}\sum_{i1}^n|(y_i-\hat{y}_i)| LMAE(y,y^)n1∑i1n∣(yi−y^i)∣ 其中 y y y为预测值 y ^ \hat{y} y^为标签值。 优点对异常值不敏感单位与原始数据一致易于直观理解计算简单。 缺点可能不利于模型学习减少较大的预测偏差。 代码实现
import torch
import torch.nn as nny torch.Tensor([1,2,3])
label torch.Tensor([3,5,1])
criterion nn.L1Loss()
loss criterion(y,label)
print(loss)输出为tensor(2.3333)
二、分类问题
1. 相关概念 首先我们先介绍一下相关概念。 信息熵用来衡量信息的不确定性或信息的平均信息量。其公式为 H ( x ) − ∑ i 1 n P ( x i ) log P ( x i ) H(x) -\sum_{i1}^nP(x_i)\log P(x_i) H(x)−∑i1nP(xi)logP(xi) 其中 P ( x i ) P(x_i) P(xi)为随机事件 x i x_i xi发生的概率。若事件发生的不确定性越大则其熵越大代表含有更多的信息量。 KL散度是一种衡量一个概率分布P相对于另一个概率分布Q的非对称性差异其公式为 D K L ( p ∣ ∣ q ) ∑ i 1 n p ( x i ) log ( p ( x i ) q ( x i ) ) D_{KL}(p||q) \sum_{i1}^np(x_i)\log (\frac{p(x_i)}{q(x_i)}) DKL(p∣∣q)∑i1np(xi)log(q(xi)p(xi)) 其中 p p p和 q q q是两种不同的分布 p ( x i ) p(x_i) p(xi)和 q ( x i ) q(x_i) q(xi)分别代表随机事件在 p p p和 q q q这两个分布中发生的概率。其具有以下特性 非负性KL散度总是正的 非对称性 D K L ( p ∣ ∣ q ) D_{KL}(p||q) DKL(p∣∣q)不等于 D K L ( q ∣ ∣ p ) D_{KL}(q||p) DKL(q∣∣p)只有当两个分布相等时 D K L ( p ∣ ∣ q ) D K L ( q ∣ ∣ p ) D_{KL}(p||q)D_{KL}(q||p) DKL(p∣∣q)DKL(q∣∣p) 在信息论中KL散度可以被解释为在使用概率分布Q来拟合真实分布P时产生的信息损耗。 交叉熵用于衡量两个概率分布之间的差异是对称的。 H ( P , Q ) − ∑ i 1 n p ( x i ) log q ( x i ) H ( P ) D K L ( p ∣ ∣ q ) H(P,Q) -\sum_{i1}^np(x_i)\log q(x_i) H(P)D_{KL}(p||q) H(P,Q)−∑i1np(xi)logq(xi)H(P)DKL(p∣∣q) H ( P , Q ) H ( Q , P ) H(P,Q)H(Q,P) H(P,Q)H(Q,P) 其中 p p p和 q q q是两个分布。交叉熵经常用作分类问题的损失函数其中,P可以看作是标签的分布Q可以看作是模型预测的分布。
2. 交叉熵损失函数 交叉熵损失函数(Cross-Entropy Loss)是分类问题中常用的损失函数其衡量的是模型预测的概率分布和标签的真实分布之间的差异。前面说过计算两个分布之间的交叉熵公式为 H ( P , Q ) − ∑ i 1 n p ( x i ) log q ( x i ) H(P,Q) -\sum_{i1}^np(x_i)\log q(x_i) H(P,Q)−∑i1np(xi)logq(xi) 其中, P P P为标签的分布 Q Q Q为模型预测的分布。接下来我们举一个例子来说明。 例如我们要做一个三分类[汽车猫飞机]的物体分类假设标签为1我们会将标签1转换为one-hot编码[0,1,0]然后将模型的输出经过softmax操作进行归一化将其转换为概率值然后计算交叉熵。 分类模型预测标签汽车0.050猫0.801飞机0.150
则公式为 L o s s − ( 0 ∗ log 0.05 1 ∗ log 0.80 0 ∗ log 0.15 ) − log 0.80 Loss -(0*\log0.05 1*\log0.80 0*\log0.15)-\log0.80 Loss−(0∗log0.051∗log0.800∗log0.15)−log0.80 因为在分类问题中标签的分布中只有一个1其他都为0。因此在分类问题中交叉熵损失函数可以简化为 L o s s − log p ( x i ) Loss -\log p(x_i) Loss−logp(xi) 其中 p ( x i ) p(x_i) p(xi)为模型预测的分类结果的概率值。例如在上述例子中 p ( x i ) p(x_i) p(xi)的值为0.80。 代码实现
import torch
import torch.nn as nnlogits torch.tensor([[0.68,-0.8,0.75]]) #模型的输出
labels torch.tensor([2]) #标签值为2
criterion nn.CrossEntropyLoss()
loss criterion(logits, labels)
print(loss.item())最终的输出结果为0.8329725861549377。
3. BCE Loss BCE LossBinary Cross-Entropy Loss是在二分类问题中常用的损失函数其公式为 L B C E − ( y ∗ log ( p ) ( 1 − y ) ∗ log ( 1 − p ) ) L_{BCE} -(y*\log(p)(1-y)*\log(1-p)) LBCE−(y∗log(p)(1−y)∗log(1−p)) 其中 y y y为标签值0或者1 p p p为模型预测为正样本标签值为1的概率。在计算Loss之前首先要将模型的输出经过Sigmoid激活函数将概率值 p p p映射到[0,1]之间。 注意与使用交叉熵损失做二分类不同的是如果使用交叉熵损失则最终模型的输出是一个向量这个向量经过softmax操作后变成概率分布代表是正样本的概率和负样本的概率这些概率相加等于1而使用BCE Loss时模型的输出是一个数然后经过sigmoid操作映射到[0,1]之间映射后的值就代表模型预测该物品是正样本的概率。下面举一个例子来说明。 假设使用BCE Loss做一个二分类的问题模型的输出为2.56然后经过sigmoid操作映射成0.80(瞎编的说明模型预测为正样本的概率为0.8。 如果标签是0负样本然后使用公式计算 L o s s − ( 0 ∗ log ( 0.8 ) 1 ∗ log ( 0.2 ) ) − l o g ( 0.2 ) Loss -(0*\log(0.8) 1*\log(0.2)) -log(0.2) Loss−(0∗log(0.8)1∗log(0.2))−log(0.2) 如果标签是1正样本然后使用公式计算 L o s s − ( 1 ∗ log ( 0.8 ) 0 ∗ log ( 0.2 ) ) − l o g ( 0.8 ) Loss -(1*\log(0.8) 0*\log(0.2)) -log(0.8) Loss−(1∗log(0.8)0∗log(0.2))−log(0.8) 如果使用的是交叉熵损失函数做二分类问题标签0代表负样本标签1代表正样本假设经过softmax操作后的概率分布为[0.2(负样本),0.8(正样本)] 如果标签是0转换为one-hot编码[1,0]使用交叉熵损失函数 L o s s − log ( 0.2 ) Loss -\log(0.2) Loss−log(0.2) 如果标签是1转换为one-hot编码[0,1]使用交叉熵损失函数 L o s s − log ( 0.8 ) Loss -\log(0.8) Loss−log(0.8) 通过上述两个例子可以看出当做二分类任务时BCE和交叉熵的Loss最终函数形式是一样的个人认为这两种损失函数主要的不同在于模型最终的输出形式和最终的概率映射方式不同。
代码实现
import torch
import torch.nn as nnpredicted_probabilities torch.tensor([0.8]) # 模型预测的为正样本概率
#1表示正样本0表示负样本
true_labels torch.tensor([1])
# 将布尔值转换为浮点数因为PyTorch的BCELoss期望浮点数标签
true_labels true_labels.float()
criterion nn.BCELoss()
loss criterion(predicted_probabilities, true_labels)
print(loss.item())代码输出为0.2231435328722。