人工智能概念之三:常见的损失函数(交叉熵损失、Hinge损失、0-1损失、MSE、MAE、RMSE、最小二乘法、焦点损失、Dice损失、三元组损失)

【李宏毅机器学习笔记】 17、迁移学习(Transfer Learning) 【李宏毅机器学习笔记】1、回归问题(Regression) 【李宏毅机器学习笔记】2、error产生自哪里? 【李宏毅机器学习笔记】3、gradient descent 【李宏毅机器学习笔记】4、Classification 【李宏毅机器学习笔记】5、Logistic Regression 【李宏毅机器学习笔记】6、简短介绍Deep Learning 【李宏毅机器学习笔记】7、反向传播... 阅读详情

损失函数是模型训练和优化的核心度量,其本质是为梯度下降算法提供明确的优化目标 —— 通过计算预测值与真实值的差异,损失函数的梯度(导数)为模型参数更新指明方向(梯度反方向为损失下降最快路径)。不同损失函数的数学形态(如交叉熵的平滑曲线、MSE 的抛物线、MAE 的 V 型结构)决定了梯度特性,进而影响优化效率:线性梯度推动快速收敛,常数梯度导致后期优化放缓,而动态权重设计(如焦点损失)则能自适应调整优化重点,这些特性共同塑造了模型学习的行为模式。

梯度下降介绍:网页连接

一、分类任务的损失函数

1.1 交叉熵损失(Cross-Entropy Loss)

数学公式:

  • 基础公式:
    L = − ∑ k = 1 K y k ⋅ log ⁡ y ^ L = -\sum_{k=1}^K y_k \cdot \log\hat{y} L=−k=1∑K​yk​⋅logy^​
    其中 y k y_k yk​ 是真实标签(one-hot 编码), y ^ \hat{y} y^​ 是模型预测的概率。

  • 二分类:
    L = − [ y ⋅ log ⁡ p ^ + ( 1 − y ) ⋅ log ⁡ ( 1 − p ^ ) ] L = -[y \cdot \log\hat{p} + (1-y) \cdot \log(1-\hat{p})] L=−[y⋅logp^​+(1−y)⋅log(1−p^​)]
    其中 y y y 是真实标签(0 或 1), p ^ \hat{p} p^​ 是模型预测为正类的概率。

  • 多分类(Softmax交叉熵):
    L = − ∑ k = 1 K y k ⋅ log ⁡ ( e z k ∑ i = 1 K e z i ) L = -\sum_{k=1}^K y_k \cdot \log\left(\frac{e^{z_k}}{\sum_{i=1}^K e^{z_i}}\right) L=−k=1∑K​yk​⋅log(∑i=1K​ezi​ezk​​)
    其中 z k z_k zk​为模型对第 k k k类的原始输出, y k y_k yk​为one-hot标签。

数学原理:

  • 信息论基础:交叉熵 H ( p , q ) = − ∑ p ( x ) log ⁡ q ( x ) H(p,q) = -\sum p(x)\log q(x) H(p,q)=−∑p(x)logq(x)衡量两个概率分布 p p p(真实)与 q q q(预测)的差异,当 p = q p=q p=q时交叉熵等于信息熵 H ( p ) H(p) H(p),差异越大交叉熵越大。
  • 最大似然等价性:假设样本服从伯努利分布(二分类)或多项分布(多分类),最大化似然函数等价于最小化交叉熵。以二分类为例,似然函数为:
    L ( θ ) = ∏ p ^ y ( 1 − p ^ ) 1 − y L(\theta) = \prod \hat{p}^y(1-\hat{p})^{1-y} L(θ)=∏p^​y(1−p^​)1−y
    取对数后:
    log ⁡ L ( θ ) = ∑ [ y log ⁡ p ^ + ( 1 − y ) log ⁡ ( 1 − p ^ ) ] = − n ⋅ L C E \log L(\theta) = \sum [y\log\hat{p} + (1-y)\log(1-\hat{p})] = -n \cdot L_{CE} logL(θ)=∑[ylogp^​+(1−y)log(1−p^​)]=−n⋅LCE​
    因此最小化交叉熵等价于最大化对数似然。

数学图像:
二分类损失函数图像
在这里插入图片描述
绘图代码:

import numpy as np  # 导入 NumPy 库,用于数值计算(如数组、矩阵运算等)
import matplotlib.pyplot as plt  # 导入 Matplotlib 的 pyplot 模块,用于绘图
from matplotlib.ticker import FormatStrFormatter  # 导入格式化坐标轴刻度的工具

# 设置中文字体
plt.rcParams["font.family"] = ["SimHei"]  # 设置默认字体为黑体,以支持中文显示
plt.rcParams["axes.unicode_minus"] = False  # 禁用 Unicode 负号显示,使用正常减号 '-' 显示负数

# 定义二分类交叉熵损失函数
def cross_entropy_loss(p_hat, y):
    """
    计算二分类交叉熵损失值。

    参数:
        p_hat (float): 模型预测的概率值,范围在 [0,1]
        y (int): 真实标签,取值为 0 或 1

    返回:
        float: 交叉熵损失值
    """
    epsilon = 1e-10  # 防止对数输入为 0
    p_hat = np.clip(p_hat, epsilon, 1 - epsilon)  # 将概率限制在 [epsilon, 1 - epsilon] 范围内
    return - (y * np.log(p_hat) + (1 - y) * np.log(1 - p_hat))  # 二分类交叉熵公式

# 计算交叉熵损失的导数
def cross_entropy_derivative(p_hat, y):
    """
    计算二分类交叉熵损失对预测概率 p_hat 的导数。

    参数:
        p_hat (float): 模型预测的概率值
        y (int): 真实标签,0 或 1

    返回:
        float: 损失对 p_hat 的导数值
    """
    return p_hat - y  # 二分类交叉熵的导数形式

# Softmax 函数
def softmax(z):
    """
    计算 Softmax 函数值,将 logits 转换为概率分布。

    参数:
        z (np.ndarray): 输入的一维数组,表示各类别的 logit 值

    返回:
        np.ndarray: 各类别对应的概率分布
    """
    exp_z = np.exp(z - np.max(z))  # 减去最大值避免指数爆炸
    return exp_z / exp_z.sum()  # 归一化得到概率分布

# 多分类交叉熵损失函数
def categorical_cross_entropy(y_true, y_pred):
    """
    计算多分类交叉熵损失值。

    参数:
        y_true (np.ndarray): one-hot 编码的真实标签向量
        y_pred (np.ndarray): 模型预测的概率向量(Softmax 输出)

    返回:
        float: 多分类交叉熵损失值
    """
    epsilon = 1e-10
    y_pred = np.clip(y_pred, epsilon, 1 - epsilon)  # 防止 log(0)
    return -np.sum(y_true * np.log(y_pred))  # 多分类交叉熵公式

# 多分类交叉熵损失的导数
def categorical_cross_entropy_derivative(y_true, y_pred):
    """
    计算多分类交叉熵损失对模型输出(logits)的导数。

    参数:
        y_true (np.ndarray): one-hot 编码的真实标签向量
        y_pred (np.ndarray): 模型预测的概率向量(Softmax 输出)

    返回:
        np.ndarray: 损失对 logits 的导数(梯度)
    """
    return y_pred - y_true  # 多分类交叉熵导数形式

# 生成预测概率数据
p_hat = np.linspace(0.01, 0.99, 1000)  # 生成从 0.01 到 0.99 的 1000 个预测概率值

# 计算二分类损失和导数
loss_y0 = cross_entropy_loss(p_hat, y=0)  # y=0 时的损失值
loss_y1 = cross_entropy_loss(p_hat, y=1)  # y=1 时的损失值
derivative_y0 = cross_entropy_derivative(p_hat, y=0)  # y=0 时的导数值
derivative_y1 = cross_entropy_derivative(p_hat, y=1)  # y=1 时的导数值

# 多分类损失和导数计算(固定真实标签为 [1, 0, 0])
z_values = np.linspace(-5, 5, 1000)  # 生成从 -5 到 5 的 1000 个 logit 值
cce_losses = []  # 存储每个 logit 对应的多分类交叉熵损失
cce_derivatives = []  # 存储每个 logit 对应的导数值

for z in z_values:
    logits = np.array([z, 0.0, 0.0])  # 固定其他两个类别的 logit 为 0
    probs = softmax(logits)  # 使用 Softmax 转换为概率分布
    loss = categorical_cross_entropy(y_true=np.array([1, 0, 0]), y_pred=probs)  # 计算损失
    grad = categorical_cross_entropy_derivative(y_true=np.array([1, 0, 0]), y_pred=probs)  # 计算导数
    cce_losses.append(loss)  # 添加到损失列表
    cce_derivatives.append(grad[0])  # 只取第一个 logit 对应的梯度值添加到导数列表

# 创建图像(新增一列用于绘制多分类导数)
fig1, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))  # 创建第一个图形窗口,包含两个子图

# 绘制二分类损失图像
ax1.plot(p_hat, loss_y0, label='y=0时的损失', color='#5DA5DA', linewidth=2)  # 绘制 y=0 的损失曲线
ax1.plot(p_hat, loss_y1, label='y=1时的损失', color='#FAA43A', linewidth=2)  # 绘制 y=1 的损失曲线
ax1.set_xlabel(r'预测概率 $\hat{p}$', fontsize=12)  # 设置 x 轴标签
ax1.set_ylabel('损失值 L', fontsize=12)  # 设置 y 轴标签
ax1.set_title('二分类交叉熵损失函数图像', fontsize=14)  # 设置图像标题
ax1.legend(fontsize=12)  # 添加图例
ax1.grid(True, linestyle='--', alpha=0.7)  # 添加网格线
ax1.xaxis.set_major_formatter(FormatStrFormatter('%.1f'))  # 格式化 x 轴刻度为一位小数

# 绘制二分类导数图像
ax2.plot(p_hat, derivative_y0, label='y=0时的导数', color='#5DA5DA', linewidth=2)  # 绘制 y=0 的导数曲线
ax2.plot(p_hat, derivative_y1, label='y=1时的导数', color='#FAA43A', linewidth=2)  # 绘制 y=1 的导数曲线
ax2.axhline(y=0, color='k', linestyle='--', alpha=0.5)  # 绘制 y=0 的参考线
ax2.set_xlabel(r'预测概率 $\hat{p}$', fontsize=12)  # 设置 x 轴标签
ax2.set_ylabel(r'导数 $\partial L/\partial\hat{p}$', fontsize=12)  # 设置 y 轴标签
ax2.set_title('二分类交叉熵损失函数的导数图像', fontsize=14)  # 设置图像标题
ax2.legend(fontsize=12)  # 添加图例
ax2.grid(True, linestyle='--', alpha=0.7)  # 添加网格线
ax2.xaxis.set_major_formatter(FormatStrFormatter('%.1f'))  # 格式化 x 轴刻度为一位小数

# 创建第二个图形窗口,包含两个子图
fig2, (ax3, ax4) = plt.subplots(1, 2, figsize=(14, 6))

# 绘制多分类交叉熵损失图像
ax3.plot(z_values, cce_losses, label='多分类交叉熵损失', color='#60BD68', linewidth=2)  # 绘制损失曲线
ax3.set_xlabel(r'logit $z_1$', fontsize=12)  # 设置 x 轴标签
ax3.set_ylabel('损失值 L', fontsize=12)  # 设置 y 轴标签
ax3.set_title('多分类交叉熵损失函数图像', fontsize=14)  # 设置图像标题
ax3.legend(fontsize=12)  # 添加图例
ax3.grid(True, linestyle='--', alpha=0.7)  # 添加网格线
ax3.xaxis.set_major_formatter(FormatStrFormatter('%.1f'))  # 格式化 x 轴刻度为一位小数

# 绘制多分类交叉熵损失的导数图像
ax4.plot(z_values, cce_derivatives, label='多分类损失导数', color='#F15854', linewidth=2)  # 绘制导数曲线
ax4.axhline(y=0, color='k', linestyle='--', alpha=0.5)  # 绘制 y=0 的参考线
ax4.set_xlabel(r'logit $z_1$', fontsize=12)  # 设置 x 轴标签
ax4.set_ylabel(r'导数 $\partial L/\partial z_1$', fontsize=12)  # 设置 y 轴标签
ax4.set_title('多分类交叉熵损失函数的导数图像', fontsize=14)  # 设置图像标题
ax4.legend(fontsize=12)  # 添加图例
ax4.grid(True, linestyle='--', alpha=0.7)  # 添加网格线
ax4.xaxis.set_major_formatter(FormatStrFormatter('%.1f'))  # 格式化 x 轴刻度为一位小数

# 调整布局
plt.tight_layout()  # 自动调整子图参数,防止重叠
plt.show()  # 显示所有图形

1.2 Hinge损失(Hinge Loss)

数学公式:

  • 二分类:
    L = max ⁡ ( 0 , 1 − y ⋅ y ^ ) L = \max(0, 1 - y \cdot \hat{y}) L=max(0,1−y⋅y^​)
    其中 y ∈ { − 1 , 1 } y \in \{-1, 1\} y∈{ −1,1}, y ^ \hat{y} y^​为模型输出分数。

  • 多分类扩展(One-vs-Rest):
    L = max ⁡ ( 0 , 1 + max ⁡ k ≠ y y ^ k − y ^ y ) L = \max(0, 1 + \max_{k\neq y}\hat{y}_k - \hat{y}_y) L=max(0,1+k=ymax​y^​k​−y^​y​)

数学原理:

  • 几何解释:Hinge损失追求"分类间隔"最大化,当样本分类正确且间隔 y ⋅ y ^ ≥ 1 y \cdot \hat{y} \geq 1 y⋅y^​≥1时损失为0,否则惩罚大小为 1 − y ⋅ y ^ 1 - y \cdot \hat{y} 1−y⋅y^​。
  • 优化目标:对应SVM的优化问题:
    min ⁡ w , b 1 2 ∥ w ∥ 2 + C ∑ max ⁡ ( 0 , 1 − y i ( w T x i + b ) ) \min_{w,b} \frac{1}{2}\|w\|^2 + C\sum \max(0, 1 - y_i(w^Tx_i + b)) w,bmin​21​∥w∥2+C∑max(0,1−yi​(wTxi​+b))
    其中第一项为L2正则化,第二项为Hinge损失, C C C
人工智能/机器学习基础知识——损失函数 阅读详情

相关推荐

铰链损失函数hinge loss VS 交叉熵损失函数

1.铰链损失函数hinge loss 铰链损失函数(hinge loss)的思想就是让那些未能正确分类的和正确分类的之间的距离要足够的远,如果相差达到一个阈值Δ\DeltaΔ时,此时这个未正确分类的误差就可以认为是0,否则就要累积计算误差。 具体介绍一下: 假设对某一个输入xix_{i}xi​进行分类,他的标签是yiy_{i}yi​,通过一个函数f(xi,W)f\left(x_{i}, W\rig...

羊藤枝的博客 9271

【AI知识点】损失函数(Loss Function)

损失函数(Loss Function) 是机器学习和深度学习中的一个核心概念,它衡量模型的预测值与真实值之间的差异。通过最小化损失函数,模型可以逐步调整参数,以使其预测结果更加准确。损失函数通常用来指导模型的训练过程,在模型优化中扮演至关重要的角色。

AI完全体 2025

【深度学习】002-损失函数:MSE、交叉熵、铰链损失函数(Hinge Loss)

本文将主要讨论三种常见的损失函数:均方(MSE)损失、交叉熵损失和铰链损失。这些损失函数是在传统机器学习和深度学习模型中最常用的函数,所以本文清楚地讨论了每一个损失函数模型背后的基本理论,以及何时选择使用它们。

m0_52447591的博客 7386

Hinge损失函数:从SVM的基石到现代机器学习中的间隔思想

本文深入解析了Hinge损失函数,从其作为支持向量机(SVM)基石、最大化分类间隔的核心思想讲起,探讨了它与交叉熵损失的本质区别。文章进一步阐述了间隔思想在现代机器学习中的进化,包括在度量学习(如三元组损失)、结构化预测及对比学习等领域的广泛应用,并提供了PyTorch实战代码与优化技巧。

weixin_29057163的博客 199

人工智能:损失函数(Loss Function)【平方损失(正态分布)、交叉熵损失(二项分布)、合页损失、对比损失】【衡量模型预测值和真实值的差异】【总体样本->值域分布律->似然函数->损失函数】

一、分类模型 1、0-1损失函数(zero-one Loss Function):无法优化 L(y,f(x))={1,y≠f(x)0,y=f(x)L(y, f(x)) = \begin{cases} 1, & {y \neq f(x) } \\ 0, & {y = f(x)} \end{cases}L(y,f(x))={1,0,​y​=f(x)y=f(x)​ 当预测错误时,损失函数为1,当预测正确时,损失函数值为0。 该损失函数不考虑预测值和真实值的误差程度。只要错误,就是1。 该损失

u013250861的博客 2342

Nacos 2.3.2实战:5分钟搞定达梦数据库插件配置(含避坑指南)

本文详细介绍了在Nacos 2.3.2中配置达梦数据库数据源插件的完整实战流程。通过解析SPI插件机制,提供从环境准备、插件编译部署到核心配置的逐步指南,并重点分享了驱动加载、SQL兼容性等高频问题的避坑解决方案,助力开发者高效完成国产化数据库适配。

weixin_29200485的博客 499

写给小白的“具身智能”入门科普

智能”,大家都懂,也就是AI。那么,什么是“具身”?“具身”是一个很小众的名词,通常都出现在哲学、认知科学领域。它的英文叫Embodied,是embody的过去式和过去分词。em-表示“进入,使……”,-body表示“身体”。组合起来,就是“使……进入身体”。Embodied Intelligence(具身智能),顾名思义,就是“使智能进入身体”、“给智能一个身体”的意思。那么,具身智能,是不是就是“AI+身体”呢?这样说并不准确。

欢迎来到我的博客 1819

基于Dify构建银行智能客服:从意图识别到多RAG架构的实战解析

本文深入解析了如何利用Dify平台构建银行智能客服系统。从传统客服痛点出发,详细阐述了基于意图识别精准分类用户需求,并通过多RAG架构解决知识混淆问题,实现高效、准确的业务响应。文章重点介绍了结合工具调用实现业务流程自动化,并强调了数据本地化部署、内容安全过滤等银行级安全合规实践,为金融行业AI应用提供了实战指南。

yog99的博客 926

微信群“智”变:扣子机器人无缝接入实战

本文介绍了如何将扣子(Coze)机器人接入微信群实现智能化管理。文章首先阐述了扣子机器人的自然语言处理、自动分类和多模态交互等功能特点,以及其深度学习模型和持续学习能力的技术优势。随后详细讲解了接入步骤:从微信公众号配置、扣子平台机器人创建,到使用Flask框架实现消息转发功能的关键代码。通过电商客服和技术社群两个实际案例,展示了扣子机器人在提升响应效率、优化社群运营方面的显著效果。最后展望了未来在智能推荐、多模态交互等领域的发展潜力,为微信群智能化管理提供了实用解决方案。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 828

使用Python实现深度学习模型:智能光污染监测与管理

本项目将通过以下几个步骤实现智能光污染监测:收集光污染图像数据数据预处理构建深度学习模型训练模型评估模型部署模型用于实时监测通过本文介绍的步骤,我们实现了一个使用Python和深度学习技术的智能光污染监测与管理系统。该系统能够自动识别光污染源,为相关管理部门提供科学依据,以便更好地规划和管理城市照明。同时,这一方法还可以扩展到其他环境监测领域,为环境保护贡献力量。

Echo_Wish 587

解决微信小程序长页面滚动到底部点击底部的输入框后输入框漂浮且页面滚动到顶部

一、问题描述 项目中有一个长页面上部展示部分信息下部为信息录入,页面长度为三屏幕(不同手机屏幕大小略有差异),当滚动到第二屏或者第三屏去填写信息时点击输入框后输入框漂浮起来了并且页面向上滚动了一段距离,回到了第一屏中展示的内容。效果如图。 滚动到第二屏,证件号输入。 点击输入框 可以看到证件号输入框漂浮了起来并且页面滚动到了第一屏展示的内容。 注意:小程序是2018年上线,在2020年4月份之前该页面从未出现过这种现象。推测:微信的后续更新中对微信小程序基础库进行了重构,导致点击输入框后页

仰望星空的代码 3257

【DaVinci Developer专题】-23-IDT高阶应用:结构体类型的数组

共8页 目录 1 创建一个Record IDT 2 创建一个Array IDT 3 创建一个S/R Port Interface 4 创建一个Constant 5 导入CFG生成代码的总结 6 结尾 <--返回「实战篇」博文-总目录--> <--返回「Autosar从入门到精通-实战篇」专栏主页--> 关键字: 缩略语/术语 含义 DEV DaVinci Developer .

「汽车电子助手」的博客 1667

DeFi核心协议代码解析

本文解析了DeFi两大核心协议Uniswap V2和Compound的智能合约架构与关键代码。Uniswap V2采用恒定乘积公式(x*y=k)实现自动做市,核心合约包括Factory、Pair和Router,具备流动性铸造、代币兑换和TWAP预言机功能。Compound借贷协议通过cToken合约管理存款和借款,采用动态利率模型和抵押率机制,包含资金利用率计算、清算触发等核心算法。两协议均采用模块化设计,通过智能合约实现去中心化金融服务的核心逻辑。

闲人编程的博客 933

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: 人工智能概念之二:人工智能核心概念(三大核心概念、发展三要素、样本、特征、标签、过拟合、欠拟合、泛化、导数、矩阵、正规方程、梯度下降)
下一篇: 线性回归(Linear regression)算法详解
.30-06Springfield
博客等级 码龄7年 321粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值