神经网络 05(损失函数)

一、损失函数

在深度学习中, 损失函数是用来衡量模型参数的质量的函数, 衡量的方式是比较网络输出和真实输出的差异,损失函数在不同的文献中名称是不一样的,主要有以下几种命名方式:

损失函数 (loss function)

代价函数(cost function)

目标函数(objective function)

误差函数(error function)

二、分类任务

在深度学习的分类任务中使用最多的是 交叉熵损失函数

2.1 多分类任务

在多分类任务通常使用softmax将logits转换为概率的形式,所以多分类的交叉熵损失也叫做softmax损失,它的计算方法是:

其中,y 是样本 x 属于某一个类别的真实概率(onehot编码,0或者1),而 f(x) 是样本属于某一类别的预测分数,S 是 softmax 函数,L 用来衡量 p,q 之间差异性的损失结果。

举例:

从概率角度理解,我们的目的是最小化正确类别所对应的预测概率的对数的负值,如下图所示:

在tf.keras中使用CategoricalCrossentropy实现,如下所示:

python 复制代码
# 导入相应的包
import tensorflow as tf
# 设置真实值和预测值
y_true = [[0, 1, 0], [0, 0, 1]]
y_pred = [[0.05, 0.95, 0], [0.1, 0.8, 0.1]]# 两个交叉熵求平均值
# 实例化交叉熵损失
cce = tf.keras.losses.CategoricalCrossentropy()
# 计算损失结果
print(cce(y_true, y_pred).numpy()) # 1.176939

2.2 二分类任务

在处理二分类任务时,我们不再使用 softmax 激活函数 ,而是使用 sigmoid 激活函数,那损失函数也相应的进行调整,使用二分类的交叉熵损失函数

跟逻辑回归的损失函数是一样的

其中,y是样本x属于某一个类别的真实概率,而y^是样本属于某一类别的预测概率,L用来衡量真实值与预测值之间差异性的损失结果。

在 tf.keras 中实现时使用 BinaryCrossentropy(),如下所示:

python 复制代码
# 导入相应的包
import tensorflow as tf
# 设置真实值和预测值
y_true = [[0], [1]]
y_pred = [[0.4], [0.6]]
# 实例化二分类交叉熵损失
bce = tf.keras.losses.BinaryCrossentropy() # 两个交叉熵求平均值

# 计算损失结果
print(bce(y_true, y_pred).numpy()) # 0.5108254

三、回归任务

3.1 MAE损失

Mean absolute loss(MAE)也被称为 L1 Loss,是以绝对误差作为距离:

特点是:

由于 L1 loss 具有稀疏性,为了惩罚较大的值,因此常常 将其作为正则项添加到其他 loss中作为约束

L1 loss 的最大问题是梯度在零点不平滑(不可导),导致会跳过极小值。

在 tf.keras 中使用MeanAbsoluteError 实现,如下所示:

python 复制代码
# 导入相应的包
import tensorflow as tf
# 设置真实值和预测值
y_true = [[0.], [0.]]
y_pred = [[1.], [1.]]
# 实例化MAE损失
mae = tf.keras.losses.MeanAbsoluteError()
# 计算损失结果
print(mae(y_true, y_pred).numpy()) # 1.0

3.2 MSE损失

Mean Squared Loss/ Quadratic Loss(MSE loss) 也被称为 L2 loss,或欧氏距离,它以误差的平方和作为距离

特点是:L2 loss 也常常作为正则项 。当预测值与目标值相差很大时, 梯度容易爆炸

在 tf.keras 中通过 MeanSquaredError 实现:

python 复制代码
# 导入相应的包
import tensorflow as tf
# 设置真实值和预测值
y_true = [[0.], [1.]]
y_pred = [[1.], [1.]]
# 实例化MSE损失
mse = tf.keras.losses.MeanSquaredError()
# 计算损失结果
print(mse(y_true, y_pred).numpy()) # 0.5

3.3 smooth L1 损失

其中:𝑥=f(x)−y 为真实值和预测值的差值

从上图中可以看出,该函数实际上就是一个分段函数,在[-1,1]之间实际上就是L2损失,这样解决了L1的不光滑问题,在[-1,1]区间外,实际上就是L1损失,这样就解决了离群点梯度爆炸的问题。通常在目标检测中使用该损失函数。

在 tf.keras 中使用 Huber 计算该损失,如下所示:

python 复制代码
# 导入相应的包
import tensorflow as tf
# 设置真实值和预测值
y_true = [[0], [1]]
y_pred = [[0.6], [0.4]]
# 实例化smooth L1损失
h = tf.keras.losses.Huber()
# 计算损失结果
h(y_true, y_pred).numpy() # 0.18
相关推荐
小程故事多_801 小时前
OpenClaw工具引擎架构全解析,AI Agent的“双手”如何落地实操
人工智能·架构·aigc·ai编程·openclaw
qq_452396231 小时前
【AI 架构师】第十篇:Agent 工业化部署 —— 从 FastAPI 到云端全链路监控
网络·人工智能·ai·fastapi
前端摸鱼匠2 小时前
【AI大模型春招面试题11】什么是模型的“涌现能力”(Emergent Ability)?出现条件是什么?
人工智能·算法·ai·自然语言处理·面试·职场和发展
新缸中之脑2 小时前
如何合法地逆向SynthID
人工智能
剑穗挂着新流苏3122 小时前
115_PyTorch 实战:从零搭建 CIFAR-10 完整训练与测试流水线
人工智能·pytorch·深度学习·神经网络
Veggie262 小时前
【Java深度学习】PyTorch On Java 系列课程 第八章 17 :模型评估【AI Infra 3.0】[PyTorch Java 硕士研一课程]
java·人工智能·深度学习
链上杯子3 小时前
《2026 LangChain零基础入门:用AI应用框架快速搭建智能助手》第8课(完结篇):小项目实战 + 部署 —— 构建网页版个人知识库 AI 助手
人工智能·langchain
东方不败之鸭梨的测试笔记3 小时前
AI生成测试用例方案
人工智能·测试用例
笨手笨脚の4 小时前
AI 基础概念
人工智能·大模型·prompt·agent·tool
飞睿科技4 小时前
解析 ESP-AirPuff 泡芙一号的 ESP32-P4 大模型 AI 智能体方案
人工智能