【常见的损失函数总结】

损失函数的定义

损失函数,又叫目标函数,是编译一个神经网络模型必须的两个要素之一。另一个必不可少的要素是优化器。

损失函数用来评价模型的预测值和真实值不一样的程度,损失函数越好,通常模型的性能越好。不同的模型用的损失函数一般也不一样。

损失函数分为经验风险损失函数结构风险损失函数。经验风险损失函数指预测结果和实际结果的差别,结构风险损失函数是指经验风险损失函数加上正则项

损失Loss必须是标量,因为向量无法比较大小(向量本身需要通过范数等标量来比较)。

损失函数一般分为4种:

  1. HingeLoss 0-1 损失函数:感知机就是用的这种损失函数;
  2. 对数损失函数:逻辑回归的损失函数就是log对数损失函数;
  3. MSE平方损失函数:线性回归的损失函数就是MSE;
  4. Hinge 损失函数:SVM就是使用这个损失函数;
  5. 交叉熵损失函数 :逻辑回归的损失函数,用sigmoid作为激活函数,常用于二分类和多分类问题中。

在这里插入图片描述

我们先定义两个二维数组,然后用不同的损失函数计算其损失值。

import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F
y_pred = Variable(torch.ones(2,2))
a = torch.Tensor(2,2)
a[0,0]=0
a[0,1]=1
a[1,0]=2
a[1,1]=3
y = Variable (a)

y_pred 的值为:[[1,1],[1,1]]。
y 的值为:[[0,1],[2,3]]。

神经网络的学习为何要设定损失函数?

神经网络中的“学习”是指从训练数据中自动获取最优权重参数的过程。学习的目的就是以该损失函数为基准,找出能使它的值达到最小的权重参数。

常见的损失函数

1. 0-1损失函数(zero-one loss)

0-1损失是指预测值和目标值不相等为1, 否则为0:
在这里插入图片描述
特点:

(1)0-1损失函数直接对应分类判断错误的个数,但是它是一个非凸函数,不太适用。

(2)感知机就是用的这种损失函数。但是相等这个条件太过严格,因此可以放宽条件,即满足
[公式]
时认为相等。

2. 对数损失函数

log对数损失函数的标准形式如下:
在这里插入图片描述
特点:

(1) log对数损失函数能非常好的表征概率分布,在很多场景尤其是多分类,如果需要知道结果属于每个类别的置信度,那它非常适合。
(2)健壮性不强,相比于hinge loss对噪声更敏感。
(3)逻辑回归的损失函数就是log对数损失函数。

3. 平方损失函数MSE(均值平方差)

数理统计中演化而来,均方误差是指参数估计值和参数真实值之差平方的期望值。在此处其主要是对每个预测值与真实值作差求平方的平均值,具体公式如下所示:
在这里插入图片描述
MSE越小代表模型越好,类似的算法还包括RMSE和MAD。
线性回归就是使用MSE作为损失函数。

方式1:Pytorch

criterion = nn.MSELoss()
loss = criterion(y_pred, y)
print(loss)

最后结果是:1.5。

方式2:tensorflow
tensorflow没有单独的MSE函数,不过可由开发者自己组合即可,如下所示:

# y为真实值,y_pred为预测值
1. MSE = tf.reduce_mean(tf.square(y - y_pred)))
2. RMSE = tf.sqrt(tf.reduce_mean(tf.square(y - y_pred)))
3. MAD =  tf.reduce_mean(tf.complex_abs(y - y_pred))
 

4. Hinge 损失函数

Hinge损失函数标准形式如下:
在这里插入图片描述
y为目标值,f(x)为预测值。

特点:

(1)hinge损失函数表示如果被分类正确,损失为0,否则损失就为 1 − y f ( x ) 1-yf(x) 1yf(x)SVM就是使用这个损失函数。
(2)一般的 f ( x ) f(x) f(x) 是预测值,在-1到1之间, y y y 是目标值(-1或1)。其含义是, f ( x ) f(x) f(x) 的值在-1和+1之间就可以了,并不鼓励 ∣ f ( x ) ∣ > 1 |f(x)| > 1 f(x)>1 ,即并不鼓励分类器过度自信,让某个正确分类的样本距离分割线超过1并不会有任何奖励,从而使分类器可以更专注于整体的误差
(3) 健壮性相对较高,对异常点、噪声不敏感,但它没太好的概率解释。

5. 交叉熵损失函数 (Cross-entropy loss function)

交叉熵(cross-entropy)刻画了两个概率分布之间的距离,更适合用在分类问题上,因为交叉熵表达预测输入样本属于某一类的概率。
交叉熵损失函数的标准形式如下:
在这里插入图片描述
注意公式中 x x x 表示样本, y y y 表示实际的标签, a a a 表示预测的输出, n n n 表示样本总数量。

也就相当于:
在这里插入图片描述
特点:

  1. 本质上也是一种对数似然函数,可用于二分类多分类任务中。
  • 二分类问题中的loss函数(输入数据是softmax或者sigmoid函数的输出):
    在这里插入图片描述
  • 多分类问题中的loss函数(输入数据是softmax或者sigmoid函数的输出):
    在这里插入图片描述
  1. 当使用sigmoid作为激活函数的时候,常用交叉熵损失函数而不用均方误差损失函数,因为它可以完美解决平方损失函数权重更新过慢的问题,具有“误差大的时候,权重更新快;误差小的时候,权重更新慢”的良好性质。

Pytorch实现交叉熵函数:

def cross_entropy(Y, P):
    """Cross-Entropy loss function.
    以向量化的方式实现交叉熵函数
    Y and P are lists of labels and estimations
    returns the float corresponding to their cross-entropy.
    """
    Y = np.float_(Y)
    P = np.float_(P)
    return -np.sum(Y * np.log(P) + (1 - Y) * np.log(1 - P)) / len(Y)

tensorflow具有多种常见的交叉熵函数:

#Sigmoid交叉熵
tf.nn.simoid_cross_entropy_with_logits(y_pred, y, name=None)
#softmax交叉熵
tf.nn.softmax_cross_entropy_with_logits(y_pred, y, name=None)
#Sparse交叉熵
tf.nn.sparse_cross_entropy_with_logits(y_pred, y, name=None)
#加权Sigmoid交叉熵
tf.nn.weighter_cross_entropy_with_logits(y_pred, y, pos_weight,name=None)

三、总结
loss函数的选取取决于输入标签数据的类型:若输入的是实数、无界的值,损失函数使用平方差;若输入标签是位矢量(分类标志),使用交叉熵更适合。此外预测值与真实值要采用同样的数据分布,以便于loss函数取得更佳的效果。

参考链接:
深度学习基础(三)loss函数:https://blog.youkuaiyun.com/u010554381/article/details/88351920
常见的损失函数(loss function)总结:https://zhuanlan.zhihu.com/p/58883095

### 常见损失函数介绍及应用 #### 1. 均方误差 (Mean Squared Error, MSE) 均方误差是最常用的回归问题中的损失函数之一。该方法通过计算预测值与真实值之间差异平方的平均数来衡量模型的好坏。 \[ \text{MSE} = \frac{1}{n}\sum_{i=1}^{n}(y_i-\hat y_i)^2 \] 这种损失函数适用于连续数值型目标变量的情况,在线性回归等问题中有广泛应用[^1]。 #### 2. 交叉熵损失 (Cross Entropy Loss) 对于分类任务来说,二元或多元逻辑斯蒂回归常采用交叉熵作为评价标准: - **二类交叉熵** 当面对的是两个类别时, \[ L(y,\hat y)=-\left[y\log(\hat y)+(1-y)\log(1-\hat y)\right] \] 这里 \(y\) 表示样本的真实标签(0 或者 1),而 \(\hat y\) 则代表对应的概率估计值。 - **多类交叉熵** 如果涉及多个互斥类别,则可以使用softmax层配合下面这个公式: \[ C = -\frac{1}{n}\sum_x{\sum_j {y_j \ln a^L_j}} \] 其中\(a^L_j\)表示第j个神经元输出激活后的结果;\(y_j\)为one-hot编码形式下的期望输出向量。 #### 3. 铰链损失 (Hinge Loss) 主要用于支持向量机(SVM),特别是针对最大间隔分类器而言非常有效果的一个度量方式: \[ l(y)=max(0,1−t⋅y) \] 这里的\(t∈{-1,+1}\), 而\(y=f(x)=w·x+b\) 是由权重参数决定的支持超平面位置得分【注意此处不是指Sigmoid/Swish等激活函数】. 铰链损失有助于构建具有较大边界的决策边界,并且能够很好地处理不可分的数据集情况. #### 4. BPR 损失函数 BPR(Bayesian Personalized Ranking)损失函数专为解决推荐系统的个性化排名问题设计而成。此算法旨在最大化正反馈项相对于负反馈项的概率优势,从而实现更精准的商品/内容推送服务[^2]: \[ \ell(u,i,j)=(\sigma(\hat{x}_{ui}-\hat{x}_{uj})-1)^2 \] 在这个表达式里:\(\hat{x}_{ui},\hat{x}_{uj}\)分别对应用户u对物品i和j的兴趣程度评分; σ()则是sigmoid函数用来压缩实数值到区间[0,1]内以便于解释成可能性大小. 选择恰当类型的损失函数不仅影响着机器学习项目的成败与否,同时也决定了后续调参工作的难易程度。因此理解不同种类之间的区别并掌握它们各自适用范围显得尤为重要. ```python import numpy as np def mse_loss(true_values, predicted_values): """Calculate Mean Squared Error between true and predicted values.""" return ((true_values - predicted_values)**2).mean() def binary_crossentropy_loss(true_labels, pred_probs): """Compute Binary Crossentropy loss given actual labels and prediction probabilities""" epsilon = 1e-7 # To prevent log(0) clipped_pred_probs = np.clip(pred_probs, epsilon, 1.-epsilon) losses = -(true_labels * np.log(clipped_pred_probs) + (1-true_labels)*np.log(1-clipped_pred_probs)) return losses.mean() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值