深度学习之常见损失函数(详细讲解定义、数学公式、实现代码)

您所在的位置:网站首页 函数的概念与基本性质知识框架 深度学习之常见损失函数(详细讲解定义、数学公式、实现代码)

深度学习之常见损失函数(详细讲解定义、数学公式、实现代码)

2024-07-09 17:55| 来源: 网络整理| 查看: 265

 目录

前言

博主介绍:✌专注于前后端、机器学习、人工智能应用领域开发的优质创作者、秉着互联网精神开源贡献精神,答疑解惑、坚持优质作品共享。本人是掘金/腾讯云/阿里云等平台优质作者、擅长前后端项目开发和毕业项目实战,深受全网粉丝喜爱与支持✌有需要可以联系作者我哦!

🍅文末三连哦🍅

👇🏻 精彩专栏推荐订阅👇🏻 不然下次找不到哟

前言

损失函数在机器学习和深度学习的领域中占据着核心地位,它是连接模型预测与实际结果之间的桥梁,为模型的优化提供了明确的方向。损失函数是一个量化模型预测错误的数学工具。

在模型训练的过程中,损失函数用于计算模型预测的输出与实际标签之间的差异。这个差异值,即损失值,能够直观地反映出模型在当前参数下的性能。通过最小化这个损失值,我们可以驱使模型不断学习和改进,直至达到满意的预测精度。

损失函数的选择取决于具体的任务和数据类型。对于回归问题,常用的损失函数有均方误差(MSE)和平均绝对误差(MAE)。这些函数能够很好地衡量预测值与实际值之间的偏差。而对于分类问题,交叉熵损失则是更为常见的选择。它能够有效地处理概率分布之间的差异,特别是在处理多分类问题时表现出色。

损失函数的设计也需要考虑到一些实际因素。例如,对于噪声数据或异常值,某些损失函数可能过于敏感,导致模型过度拟合这些异常点。在这种情况下,我们可以选择更为鲁棒的损失函数,如Huber损失或平滑L1损失,它们能够在一定程度上减轻异常值对模型训练的影响。

此外,损失函数还可以与正则化项相结合,以控制模型的复杂度并防止过拟合。正则化项通常包括L1正则化和L2正则化,它们通过向损失函数中添加与模型参数相关的惩罚项来实现对模型复杂度的控制。通过合理选择和应用损失函数,我们可以构建出更加准确、鲁棒和高效的机器学习模型。在后续中,我们将进一步探讨不同类型的损失函数及其在实际问题中的应用。那我们在深度学习中有哪些常见的损失函数呢?

一、基于距离度量的损失函数 1、欧氏距离损失(Euclidean Distance Loss): 概念:衡量模型输出值与真实值之间的欧氏距离。数学公式:

EucLoss = \sqrt{\sum_{i=1}^{n} (\hat{y}_i - y_i)^2}

代码实现:

import numpy as np def euclidean_distance_loss(y_true, y_pred): return np.sqrt(np.sum(np.square(y_pred - y_true))) # 示例 y_true = np.array([1, 2, 3]) y_pred = np.array([2, 3, 4]) print(euclidean_distance_loss(y_true, y_pred)) 2、曼哈顿距离损失(Manhattan Distance Loss): 概念:衡量模型输出值与真实值之间的曼哈顿距离,也称为 L_{1}范数距离。数学公式:

ManhLoss = \sum_{i=1}^{n} |\hat{y}_i - y_i|

代码实现:

import numpy as np def manhattan_distance_loss(y_true, y_pred): return np.sum(np.abs(y_pred - y_true)) # 示例 y_true = np.array([1, 2, 3]) y_pred = np.array([2, 3, 4]) print(manhattan_distance_loss(y_true, y_pred)) 3、切比雪夫距离损失(Chebyshev Distance Loss): 概念:衡量模型输出值与真实值之间的切比雪夫距离,即两个向量各维度差的最大值。数学公式:

ChebyshevLoss = \max_i |\hat{y}_i - y_i|

代码实现:

import numpy as np def chebyshev_distance_loss(y_true, y_pred): return np.max(np.abs(y_pred - y_true)) # 示例 y_true = np.array([1, 2, 3]) y_pred = np.array([2, 3, 4]) print(chebyshev_distance_loss(y_true, y_pred)) 4、马氏距离损失(Mahalanobis Distance Loss): 概念:考虑特征之间的协方差,衡量样本之间的马氏距离,适用于高维空间中的聚类或分类问题。数学公式:

MahalanobisLoss = \sqrt{(\hat{y} - y)^T \cdot S^{-1} \cdot (\hat{y} - y)}

代码实现:

import numpy as np def mahalanobis_distance_loss(y_true, y_pred): return np.sqrt(np.sum(np.square(y_pred - y_true))) # 示例 y_true = np.array([1, 2, 3]) y_pred = np.array([2, 3, 4]) print(mahalanobis_distance_loss(y_true, y_pred)) 5、哈林顿距离损失(Hamming Loss): 概念:用于度量两个向量之间的相似性,通常用于多标签分类任务,衡量两个向量对应元素不相等的比率。数学公式:

HammingLoss = \frac{1}{n} \sum_{i=1}^{n} (\hat{y}_i \neq y_i)

代码实现: 

import numpy as np def hamming_loss(y_true, y_pred): return np.mean(y_true != y_pred) # 示例 y_true = np.array([1, 0, 1]) y_pred = np.array([0, 1, 1]) print(hamming_loss(y_true, y_pred)) 6、余弦相似度损失(Cosine Similarity Loss): 概念:衡量模型输出值与真实值之间的余弦相似度。数学公式:

CosLoss = 1 - \frac{\sum_{i=1}^{n} \hat{y}_i \cdot y_i}{\sqrt{\sum_{i=1}^{n} \hat{y}_i^2} \cdot \sqrt{\sum_{i=1}^{n} y_i^2}}

代码实现:

import numpy as np def cosine_similarity_loss(y_true, y_pred): dot_product = np.dot(y_pred, y_true) norm_pred = np.linalg.norm(y_pred) norm_true = np.linalg.norm(y_true) return 1 - (dot_product / (norm_pred * norm_true)) # 示例 y_true = np.array([1, 2, 3]) y_pred = np.array([2, 3, 4]) print(cosine_similarity_loss(y_true, y_pred)) 7、Jaccard 距离损失(Jaccard Distance Loss): 概念:用于度量集合之间的相似性,通常用于聚类或分类问题。数学公式:

JaccardLoss = 1 - \frac{|A \cap B|}{|A \cup B|}

代码实现:

import numpy as np def jaccard_distance_loss(y_true, y_pred): intersection = np.sum(np.minimum(y_true, y_pred)) union = np.sum(np.maximum(y_true, y_pred)) return 1 - intersection / union # 示例 A = np.array([1, 0, 1, 0]) B = np.array([1, 1, 1, 0]) print(jaccard_distance_loss(A, B)) 8、Wasserstein 距离损失(Wasserstein Distance Loss): 概念:用于度量两个概率分布之间的差异,尤其在生成对抗网络(GAN)中应用广泛。数学公式:

WassersteinLoss = \min_{\gamma \in \Gamma} \sum_{i,j} \gamma_{ij} \cdot c_{ij}

Wasserstein 距离损失是用于度量两个概率分布之间的差异的一种损失函数。它通常用于衡量生成对抗网络(GAN)中生成器产生的假样本与真实样本之间的差异。

其中:

\gamma表示两个分布之间的联合分布;\Gamma是所有可能的联合分布的集合;c_{ij}表示两个样本之间的成本(或距离);\sum_{i,j} \gamma_{ij} \cdot c_{ij}表示在联合分布\gamma下的总成本。

Wasserstein 距离损失实际上是求解两个分布之间最小成本的问题,通常使用线性规划或其他数值方法进行求解。

代码实现:

import numpy as np from scipy.optimize import linear_sum_assignment def wasserstein_distance_loss(y_true, y_pred): # 构建 cost matrix cost_matrix = np.abs(np.subtract.outer(y_true, y_pred)) # 使用线性求解器进行最小化 row_ind, col_ind = linear_sum_assignment(cost_matrix) return cost_matrix[row_ind, col_ind].sum() # 示例 y_true = np.array([1, 2, 3]) y_pred = np.array([2, 3, 4]) print(wasserstein_distance_loss(y_true, y_pred)) 9、Huber损失函数 概念:Huber损失函数是一种针对回归问题的损失函数,它在数据点靠近预测值时的表现类似于平方损失函数,而在远离预测值时的表现类似于绝对损失函数,因此在某种程度上结合了两者的优点。数学公式:

L_{\delta}(y, f(x)) = \begin{cases} \frac{1}{2}(y - f(x))^2, & \text{if } |y - f(x)| \leq \delta \\ \delta(|y - f(x)| - \frac{1}{2}\delta), & \text{otherwise} \end{cases}

其中,y是实际观测值,f(x)是模型的预测值,\delta是一个超参数,通常是一个非负数。当实际值和预测值的绝对差小于等于\delta时,采用平方损失函数,否则采用绝对损失函数。

Huber损失函数的优点在于它在靠近预测值时兼具平方损失函数的光滑性和绝对损失函数的鲁棒性,因此对于异常值的影响相对较小,使得模型更加稳健。在实际应用中,Huber损失函数常用于拟合异常值较多的数据或者对异常值较为敏感的回归任务中。

代码实现:

import numpy as np def huber_loss(y_true, y_pred, delta): residual = np.abs(y_true - y_pred) huber_loss = np.where(residual


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3