损失函数:MSE、交叉熵、Focal Loss
一句话概述
损失函数(Loss Function)是深度学习训练的"指挥棒"——它量化模型预测值与真实标签之间的差距,为优化算法提供方向指引。从回归任务中最基础的均方误差(MSE),到分类任务中几乎标配的交叉熵损失(Cross Entropy),再到解决类别不平衡问题的Focal Loss,不同损失函数背后的数学原理决定了模型学习的侧重点和最终效果。
💡 核心要点:①损失函数是模型优化的目标函数,梯度下降通过最小化损失来更新参数 ②MSE用于回归任务,对异常值敏感,其最优预测是条件均值 ③交叉熵用于分类任务,与Sigmoid/Softmax搭配使用,导数形式简洁 ④Focal Loss在交叉熵基础上增加调节因子,让模型更关注难分类样本,解决类别不平衡
教学与演示
一、损失函数的作用与设计原则
是什么(定义):损失函数 L(ŷ, y) 是一个标量函数,接受模型预测 ŷ 和真实标签 y 作为输入,输出一个非负实数来表示预测的"代价"或"误差"。训练的目标是找到使得所有训练样本的平均损失最小的模型参数。
大白话 损失函数是模型的"成绩单"——它用数学方式告诉我们模型错得有多离谱。训练模型就像是老师拿着成绩单不断纠正学生,直到考到满分。
为什么(原理):损失函数的设计决定了模型学习的方向。不同的损失函数对应不同的统计最优解:MSE的最优解是条件均值E[y|x],MAE的最优解是条件中位数,交叉熵的最优解是真实的条件概率分布。因此,选择损失函数就是在选择"什么叫做预测得好"。
大白话 不同科考试给分标准不同:数学看"答案和标准答案差多少"(MSE),语文看"作文有没有踩中得分点"(交叉熵)。选对评分标准,学生才知道该往哪个方向努力。
什么用(AI关联):损失函数是连接模型输出和优化的桥梁。所有深度学习框架(PyTorch、TensorFlow)都内置了丰富的损失函数。选择合适的损失函数是模型能否收敛的关键决策之一。
哪些坑(缺点):没有通用的损失函数。MSE和MAE对异常值的灵敏度截然不同;交叉熵要求输出为概率形式,需要配合适当的激活函数;某些损失函数可能导致训练不稳定或收敛到次优解。
二、均方误差(MSE):回归任务的标配
是什么(定义):均方误差(Mean Squared Error, MSE)定义为预测值与真实值之差的平方的平均值:L_MSE = (1/n) · Σ(y_i - ŷ_i)²。它是回归任务中最常用的损失函数,也是统计学中最小二乘法的核心。
大白话 MSE就是"预测值和真实值距离的平方求平均"——猜得越离谱,扣分越狠(平方惩罚),小错轻罚,大错重罚。
怎么做(实现):
import numpy as np
# ========================================
# 均方误差(MSE)—— 回归任务的默认损失函数
# 衡量预测值与真实值的平方距离
# ========================================
def mse_loss(y_pred, y_true):
"""
均方误差损失函数
公式: L = (1/n) * Σ(y_true - y_pred)²
参数:
y_pred: 模型预测值,shape (n,)
y_true: 真实标签值,shape (n,)
返回:
标量损失值
性质:
- 对异常值非常敏感(平方会放大大误差)
- 处处可导,便于梯度下降
- 最优预测是 y_true 的条件均值
"""
n = len(y_true) # 样本数量
squared_errors = (y_true - y_pred) ** 2 # 逐元素计算平方误差
loss = np.mean(squared_errors) # 求平均
return loss
def mse_gradient(y_pred, y_true):
"""
MSE 对 y_pred 的梯度
∂L/∂ŷ = (2/n) * (ŷ - y) = -(2/n) * (y - ŷ)
梯度方向指向预测值偏离真实值的方向,大小正比于误差
参数:
y_pred: 模型预测值
y_true: 真实标签值
返回:
梯度向量,shape 与输入相同
"""
n = len(y_true)
grad = 2.0 * (y_pred - y_true) / n # 导数:2*(ŷ-y)/n
return grad
# --- 演示 MSE 的基本计算 ---
print("MSE 损失计算演示:")
y_true = np.array([3.0, -0.5, 2.0, 7.0]) # 真实值
y_pred_good = np.array([3.1, -0.3, 1.8, 6.5]) # 接近真实的预测
y_pred_bad = np.array([1.0, 2.0, 5.0, 10.0]) # 偏离真实的预测
print(f" 真实值: {y_true}")
print(f" 好预测: {y_pred_good}")
print(f" 坏预测: {y_pred_bad}")
print(f" MSE(好预测) = {mse_loss(y_pred_good, y_true):.4f}")
print(f" MSE(坏预测) = {mse_loss(y_pred_bad, y_true):.4f}")
# --- 演示 MSE 对异常值的敏感性 ---
print("\nMSE 对异常值的敏感性(离群点效应):")
y_clean = np.array([2.0, 3.0, 2.5, 3.5, 2.8]) # 干净数据
y_pred = np.array([2.2, 2.8, 2.7, 3.3, 3.0]) # 预测值
mse_clean = mse_loss(y_pred, y_clean)
print(f" 干净数据 MSE: {mse_clean:.4f}")
# 添加一个异常值
y_with_outlier = np.array([2.0, 3.0, 2.5, 3.5, 100.0]) # 最后一个值异常
y_pred_outlier = np.array([2.2, 2.8, 2.7, 3.3, 3.0]) # 相同的预测
mse_outlier = mse_loss(y_pred_outlier, y_with_outlier)
print(f" 含异常值 MSE: {mse_outlier:.4f} ← 一个异常值就让MSE飙升!")
# --- 对比 MAE(平均绝对误差)---
def mae_loss(y_pred, y_true):
"""平均绝对误差:L = (1/n) * Σ|y_true - y_pred|"""
return np.mean(np.abs(y_true - y_pred))
print(f"\nMSE vs MAE 对比:")
print(f" 干净数据: MSE={mse_loss(y_pred, y_clean):.4f}, MAE={mae_loss(y_pred, y_clean):.4f}")
print(f" 含异常值: MSE={mse_loss(y_pred_outlier, y_with_outlier):.4f}, MAE={mae_loss(y_pred_outlier, y_with_outlier):.4f}")
print(f" → MAE对异常值的敏感度远低于MSE")
大白话 MSE的公式:把所有样本的"猜错距离"平方后求平均。平方有两个效果:一是保证结果非负(正负误差不会抵消),二是放大大的错误——差1扣1分,差10扣100分。这就是它对异常值敏感的原因。
什么用(AI关联):MSE是回归任务(房价预测、股价预测、气温预测等)的默认损失函数。在概率视角下,最小化MSE等价于假设数据服从高斯分布下的最大似然估计。在深度学习中,MSE也常用于VAE(变分自动编码器)的重建损失。
哪些坑(缺点):①对异常值极其敏感——一个离群点就能主导整个损失,使模型偏向拟合异常值。②假设误差服从高斯分布,但实际数据往往不满足。③梯度大小与误差成正比,训练初期可能梯度爆炸。
三、交叉熵损失:分类任务的黄金标准
是什么(定义):交叉熵(Cross Entropy)衡量两个概率分布之间的差异。对于二分类:L_CE = -[y·log(ŷ) + (1-y)·log(1-ŷ)];对于多分类:L_CE = -Σ y_i · log(ŷ_i)。当真实标签和预测概率完全一致时,交叉熵达到最小值。
大白话 交叉熵就是"你有多大把握猜对了正确答案"的度量——你对正确答案越有把握(概率越接近1),损失越小;明明正确答案是A你却觉得是B,那就罚得很重。
为什么(原理):交叉熵源自信息论。当我们用分布q(模型预测)去编码来自分布p(真实标签)的数据时,所需的平均编码长度就是交叉熵H(p,q) = -Σ p(x)·log q(x)。通过最小化交叉熵,我们实际上是在让模型预测的分布尽可能接近真实分布。数学上,当搭配Sigmoid/Softmax输出层时,交叉熵梯度中会完美消掉激活函数的导数因子,得到简洁的ŷ - y形式。
怎么做(实现):
import numpy as np
# ========================================
# 交叉熵损失 —— 分类任务的黄金标准
# 衡量预测概率分布与真实分布的差异
# ========================================
def binary_cross_entropy(y_pred, y_true):
"""
二分类交叉熵损失
公式: L = -[y * log(ŷ) + (1-y) * log(1-ŷ)]
参数:
y_pred: 预测为正类的概率,取值 (0, 1),shape (n,)
y_true: 真实标签,取值为 0 或 1,shape (n,)
返回:
标量损失值
注意:
预测概率不能恰好为 0 或 1,否则 log(0) = -∞
实际中会加一个极小值 ε 防止数值溢出
"""
n = len(y_true)
# 裁剪预测值到 [ε, 1-ε] 防止 log(0) 溢出
epsilon = 1e-15 # 极小值,防止数值问题
y_pred = np.clip(y_pred, epsilon, 1.0 - epsilon)
# 计算二分类交叉熵
loss = -(y_true * np.log(y_pred) + (1.0 - y_true) * np.log(1.0 - y_pred))
return np.mean(loss)
def categorical_cross_entropy(y_pred, y_true):
"""
多分类交叉熵损失
公式: L = -Σ_i Σ_k y_{i,k} * log(ŷ_{i,k})
其中 y_true 是 one-hot 编码或类别索引
参数:
y_pred: 预测概率矩阵,shape (n, n_classes),每行之和为1(经过softmax)
y_true: 真实标签,shape (n, n_classes) one-hot 或 shape (n,) 类别索引
返回:
标量损失值
"""
n = y_pred.shape[0]
epsilon = 1e-15
y_pred = np.clip(y_pred, epsilon, 1.0 - epsilon)
# 如果 y_true 是类别索引(shape (n,)),转为 one-hot
if y_true.ndim == 1:
n_classes = y_pred.shape[1]
y_true_onehot = np.zeros((n, n_classes))
y_true_onehot[np.arange(n), y_true.astype(int)] = 1.0
y_true = y_true_onehot
# 交叉熵:-Σ y_true * log(y_pred),然后按样本取平均
loss = -np.sum(y_true * np.log(y_pred), axis=1) # 每个样本的损失
return np.mean(loss)
# --- 二分类交叉熵演示 ---
print("二分类交叉熵演示:")
test_cases = [
(0.99, 1, "非常确信且正确"), # ŷ=0.99, y=1
(0.01, 1, "非常确信但错误"), # ŷ=0.01, y=1
(0.50, 1, "完全不确信"), # ŷ=0.5, y=1
(0.90, 1, "比较确信且正确"), # ŷ=0.9, y=1
]
for y_pred, y_true, desc in test_cases:
loss = binary_cross_entropy(np.array([y_pred]), np.array([y_true]))
print(f" {desc}: ŷ={y_pred}, y={y_true} → Loss = {loss:.4f}")
# --- 多分类交叉熵演示 ---
print("\n多分类交叉熵演示(3类):")
y_pred_multi = np.array([
[0.7, 0.2, 0.1], # 样本1:模型认为70%概率是第0类
[0.1, 0.8, 0.1], # 样本2:模型认为80%概率是第1类
[0.3, 0.3, 0.4], # 样本3:模型不确定
])
y_true_multi = np.array([0, 1, 2]) # 真实类别:0, 1, 2
loss_multi = categorical_cross_entropy(y_pred_multi, y_true_multi)
print(f" 样本1: 预测[0.7,0.2,0.1] 真实类别0 → 损失 = {-np.log(0.7):.4f}")
print(f" 样本2: 预测[0.1,0.8,0.1] 真实类别1 → 损失 = {-np.log(0.8):.4f}")
print(f" 样本3: 预测[0.3,0.3,0.4] 真实类别2 → 损失 = {-np.log(0.4):.4f}")
print(f" 平均损失 = {loss_multi:.4f}")
# --- 交叉熵梯度分析 ---
print("\n交叉熵 + Sigmoid 的梯度优势:")
# 证明:d(BCE)/dz = ŷ - y(简洁!)
z = 2.0 # 线性输出(Softmax前的logit)
y_pred = 1.0 / (1.0 + np.exp(-z)) # Sigmoid
y_true = 1.0
# 直接计算交叉熵对 z 的梯度
grad = y_pred - y_true # 这就是梯度!简洁无比
print(f" z={z}, sigmoid(z)={y_pred:.4f}, 真实标签={y_true}")
print(f" 交叉熵对z的梯度 = ŷ - y = {grad:.4f}")
print(f" 含义: 预测值ŷ越接近真实y,梯度越小,训练越稳定")
大白话 二分类交叉熵有两项:当真实标签是1(正类),只看 -log(ŷ) 这一项——ŷ越接近1损失越小;当真实标签是0(负类),只看 -log(1-ŷ) 这一项——ŷ越接近0损失越小。这样设计保证了对正确方向的学习。
什么用(AI关联):交叉熵是分类任务的标准损失函数。二分类用BCE(Binary Cross Entropy),多分类用CCE(Categorical Cross Entropy)。语言模型(如GPT)的训练目标本质上也是交叉熵——每次预测下一个token本质上是一个超大规模的多分类问题。
哪些坑(缺点):①要求输出为概率形式(经过Sigmoid或Softmax),不能直接对原始logit使用。②标签必须正确标注——交叉熵对错误标签非常敏感。③在类别极度不平衡时,容易被多数类主导。
四、Focal Loss:解决类别不平衡的利器
是什么(定义):Focal Loss由何恺明等人在2017年提出,专门用于解决目标检测中正负样本极度不平衡的问题。它在标准交叉熵的基础上添加了一个调节因子(1 - p_t)^γ,其中p_t是模型对正确类别的预测概率,γ是可调参数。当样本容易被正确分类时(p_t接近1),调节因子趋近于0,大大降低其损失权重。
大白话 Focal Loss就是"少关心学霸,多关心差生"的损失函数——对已经能正确分类的样本降低权重,让模型把精力集中在还搞不定的困难样本上。
怎么做(实现):
import numpy as np
# ========================================
# Focal Loss —— 解决类别不平衡问题
# 降低易分类样本的权重,聚焦困难样本
# ========================================
def focal_loss_binary(y_pred, y_true, gamma=2.0, alpha=0.25):
"""
二分类 Focal Loss
公式: FL = -α * (1 - p_t)^γ * log(p_t)
其中 p_t = ŷ if y=1 else (1-ŷ)
参数:
y_pred: 预测为正类的概率,取值 (0, 1),shape (n,)
y_true: 真实标签,取值为 0 或 1,shape (n,)
gamma: 聚焦参数,默认 2.0,越大对易样本的压制越强
alpha: 平衡因子,默认 0.25,用于平衡正负样本
返回:
标量损失值
原理:
- 当样本易分类(p_t→1)时,(1-p_t)^γ→0,损失几乎为0
- 当样本难分类(p_t→0)时,(1-p_t)^γ→1,损失接近标准交叉熵
"""
epsilon = 1e-15
y_pred = np.clip(y_pred, epsilon, 1.0 - epsilon)
# 计算 p_t:模型对真实类别的预测概率
# 当 y_true=1: p_t = y_pred(预测为正类的概率)
# 当 y_true=0: p_t = 1 - y_pred(预测为负类的概率)
p_t = np.where(y_true == 1, y_pred, 1.0 - y_pred)
# 计算 alpha_t:类别平衡因子
# 当 y_true=1: alpha_t = alpha(正类权重)
# 当 y_true=0: alpha_t = 1 - alpha(负类权重)
alpha_t = np.where(y_true == 1, alpha, 1.0 - alpha)
# Focal Loss 核心公式
focal_weight = (1.0 - p_t) ** gamma # 调节因子:易分类样本权重趋近于0
loss = -alpha_t * focal_weight * np.log(p_t)
return np.mean(loss)
# --- Focal Loss vs 交叉熵对比 ---
print("Focal Loss 与标准交叉熵对比(γ=2):")
print("=" * 65)
print(f"{'情况':<25} {'p_t':>6} {'交叉熵':>10} {'Focal Loss':>12}")
print("-" * 65)
test_cases = [
("极易分类(学霸)", 0.99),
("容易分类", 0.9),
("中等难度", 0.7),
("较难分类", 0.5),
("很难分类", 0.3),
("极难分类(差生)", 0.1),
]
for desc, pt in test_cases:
ce = -np.log(pt) # 标准交叉熵
fl = -(1.0 - pt) ** 2 * np.log(pt) # Focal Loss (γ=2)
print(f" {desc:<20} {pt:>6.2f} {ce:>10.4f} {fl:>12.4f}")
# --- γ 参数的影响 ---
print(f"\nγ 参数对损失权重的调节效果:")
print(f"{'p_t':>6} {'CE':>10} {'FL(γ=1)':>10} {'FL(γ=2)':>10} {'FL(γ=5)':>10}")
print("-" * 50)
for pt in [0.99, 0.9, 0.7, 0.5, 0.3, 0.1]:
ce = -np.log(pt)
fl1 = -(1.0 - pt) ** 1 * np.log(pt)
fl2 = -(1.0 - pt) ** 2 * np.log(pt)
fl5 = -(1.0 - pt) ** 5 * np.log(pt)
print(f" {pt:>4.2f} {ce:>10.4f} {fl1:>10.4f} {fl2:>10.4f} {fl5:>10.4f}")
# --- 类别不平衡模拟 ---
print(f"\n类别不平衡场景模拟(正:负 = 1:99):")
# 模拟:100个样本中只有1个正样本
y_true_imb = np.array([1] + [0]*99) # 1个正样本,99个负样本
# 假设模型对所有样本的预测概率都是一样的
y_pred_imb = np.array([0.9]*100) # 模型较有信心
ce_loss = binary_cross_entropy(y_pred_imb, y_true_imb) # 标准交叉熵
fl_loss = focal_loss_binary(y_pred_imb, y_true_imb, gamma=2.0, alpha=0.25)
print(f" 标准交叉熵: {ce_loss:.6f}")
print(f" Focal Loss: {fl_loss:.6f}")
print(f" → Focal Loss 有效降低了大量易分负样本的干扰")
大白话 Focal Loss = 交叉熵 × (1-正确概率)^γ。当模型已经99%确定答案时,(1-0.99)² = 0.0001,损失几乎为零——"你已经会了,我不再罚你"。当模型只有30%确定时,(1-0.3)² = 0.49,损失被保留了大约一半——"你还不太会,我继续罚你"。
什么用(AI关联):Focal Loss最初用于目标检测(RetinaNet),解决图像中背景(负样本)远多于目标(正样本)的问题。它也广泛应用于其他类别不平衡场景:医学图像分析(病灶vs正常组织)、罕见事件检测、长尾分布分类等。
哪些坑(缺点):①引入了两个超参数α和γ,需要根据具体任务调优。②γ过大可能导致训练不稳定,因为困难样本(可能包含噪声标签)的损失被过度放大。③计算复杂度比标准交叉熵高。
五、其他常用损失函数概览
是什么(定义):除了MSE、交叉熵和Focal Loss,深度学习中还有多种针对特定场景设计的损失函数:MAE(平均绝对误差)对异常值更鲁棒;Huber Loss结合了MSE和MAE的优点;Hinge Loss用于支持向量机(SVM);KL散度用于分布匹配(如VAE);Contrastive Loss和Triplet Loss用于度量学习(人脸识别等)。
大白话 损失函数的选择就像选运动项目——短跑(MSE)比速度,跳远(MAE)比距离,体操(Focal Loss)比难度系数。不同任务和场景,需要不同的评判标准。
| 损失函数 | 适用任务 | 核心公式 | 主要特点 |
|---|---|---|---|
| MAE | 回归 | L = (1/n)Σ|y-ŷ| | 对异常值鲁棒,但x=0处不可导 |
| Huber Loss | 回归 | L = {0.5(y-ŷ)² if |y-ŷ|≤δ; δ(|y-ŷ|-0.5δ) otherwise} | 结合MSE和MAE,小误差用MSE大误差用MAE |
| Hinge Loss | 二分类(SVM) | L = max(0, 1-y·ŷ) | 追求最大间隔,稀疏支持向量 |
| KL散度 | 分布匹配 | L = Σ p(x)·log(p(x)/q(x)) | 衡量两个概率分布的差异,非对称 |
| Triplet Loss | 度量学习 | L = max(0, d(a,p)-d(a,n)+m) | 拉近同类、推远异类,用于人脸识别 |
概念关系图谱
| 概念 | 核心含义 | 与AI的关系 | 关联概念 |
|---|---|---|---|
| 均方误差MSE | 预测与真实差的平方均值 | 回归任务默认损失 | 高斯分布、最小二乘法、MAE |
| 交叉熵CE | 两个概率分布的距离度量 | 分类任务标准损失 | 信息论、KL散度、Softmax |
| Focal Loss | 带聚焦机制的交叉熵 | 解决正负样本不平衡 | 目标检测、类别平衡、RetinaNet |
| 对数似然 | 最大化观测数据出现的概率 | MLE估计与损失函数的桥梁 | 最大似然估计、概率建模 |
| 调节因子 | (1-p_t)^γ降低易样本权重 | Focal Loss核心创新 | 困难样本挖掘、类别平衡 |
| KL散度 | Kullback-Leibler散度 | 分布匹配、VAE正则项 | 交叉熵、信息熵、ELBO |
重点答疑
Q1: 为什么分类任务不用MSE,回归任务不用交叉熵?
这是由数学性质和统计意义决定的。①分类任务用MSE:MSE对预测概率做平方惩罚,当预测概率在(0,1)之间时梯度很小,且MSE的最优预测是条件均值,不是真实概率分布。此外MSE + Sigmoid在输出层会导致梯度消失(Sigmoid梯度中的σ(1-σ)没有被抵消)。②回归任务用交叉熵:交叉熵要求输入为概率分布,回归任务的输出是连续实数值,不是概率。强行用交叉熵需要将输出值转化为概率(没有意义),而且交叉熵的最优解是真实概率分布,而不是具体的数值。
大白话 鱼不能爬树,鸟不能游泳——MSE和交叉熵各司其职。MSE问"数字差多少",交叉熵问"概率猜对没"。把回归问题硬套交叉熵,就像用温度计量身高,单位就不对。
Q2: Focal Loss中的γ参数如何选择?
γ控制对易分类样本的压制强度。γ=0时退化为标准交叉熵;γ越大,易分类样本的损失被压制得越狠。论文中推荐的默认值γ=2在实践中表现最好。选择策略:①如果正负样本极度不平衡(如1:1000),使用较大γ(3-5)让模型更关注少数类。②如果数据标签有噪声,应减小γ——否则Focal Loss可能将噪声样本当作"困难样本"过度关注。③可以通过验证集上少数类的召回率来指导γ的选择。
Q3: 训练时损失函数不下降怎么办?
损失不下降可能有多种原因:①学习率过高——损失振荡甚至发散,尝试降低学习率。②学习率过低——损失下降极其缓慢,看起来像平的。③损失函数和激活函数搭配不当——检查是否MSE+Sigmoid输出层,应改为BCE+Sigmoid。④梯度消失/爆炸——检查网络深度和初始化方案。⑤数据问题——标签错误、归一化不足等。⑥模型容量不足——网络太浅或太窄,无法拟合数据。
大白话 损失不下降就像车不动——先检查油门踩没踩(学习率),再看油路通不通(梯度),最后确认方向盘有没有歪(损失函数选择)。
章节单词汇总
| 英文 | 音标 | 术语/释义 |
|---|---|---|
| Loss Function | /lɔːs ˈfʌŋkʃən/ | 损失函数,衡量预测误差的函数 |
| Mean Squared Error | /miːn skweərd ˈerər/ | 均方误差,预测与真实值差的平方均值 |
| Cross Entropy | /krɔːs ˈentrəpi/ | 交叉熵,两个概率分布的差异性度量 |
| Focal Loss | /ˈfoʊkəl lɔːs/ | 聚焦损失,带调节因子的交叉熵 |
| Mean Absolute Error | /miːn ˈæbsəluːt ˈerər/ | 平均绝对误差,绝对偏差的均值 |
| Huber Loss | /ˈhjuːbər lɔːs/ | Huber损失,MSE和MAE的平滑结合 |
| Hinge Loss | /hɪndʒ lɔːs/ | 铰链损失,SVM使用的损失函数 |
| KL Divergence | /keɪ ɛl daɪˈvɜːrdʒəns/ | KL散度,分布间的非对称差异度量 |
| Log Likelihood | /lɔːɡ ˈlaɪklihʊd/ | 对数似然,MLE的核心概念 |
| Class Imbalance | /klæs ɪmˈbæləns/ | 类别不平衡,某些类别样本数远多于其他 |
面试练习
Q1 [单选] 均方误差MSE的最优预测在统计上等价于什么?
- A. 条件均值 E[y|x]
- B. 条件中位数 Median(y|x)
- C. 条件众数 Mode(y|x)
- D. 条件方差 Var(y|x)
解答:最小化MSE等价于预测条件均值,这是MSE与高斯分布最大似然估计的数学联系。
Q2 [单选] 二分类交叉熵损失搭配Sigmoid输出层时,损失对logit z的梯度是什么?
- A. y - ŷ (真实减预测)
- B. ŷ - y (预测减真实)
- C. ŷ(1 - ŷ)
- D. log(ŷ)
解答:∂BCE/∂z = ŷ - y。这正是交叉熵的妙处——Sigmoid的导数因子σ(1-σ)被完美抵消,梯度简洁且避免了饱和问题。
Q3 [单选] 以下哪种损失函数最适合处理类别极度不平衡的分类任务?
- A. 均方误差MSE
- B. 标准交叉熵
- C. Focal Loss
- D. Huber Loss
解答:Focal Loss通过(1-p_t)^γ调节因子降低易分类样本的权重,聚焦困难样本,专为解决类别不平衡问题而设计。
Q4 [多选] 以下关于MSE的说法,哪些是正确的?
- A. MSE对异常值非常敏感
- B. MSE的最优解是条件均值
- C. MSE处处可导,便于优化
- D. MSE适合处理分类任务
解答:MSE主要适用于回归任务,不适合分类(尤其是搭配Sigmoid时容易梯度消失)。A、B、C均为正确特性。
Q5 [单选] Focal Loss中调节因子(1-p_t)^γ的作用是什么?
- A. 降低易分类样本的损失权重
- B. 增加所有样本的损失
- C. 使损失函数变为凸函数
- D. 加速模型训练
解答:当样本容易被正确分类时p_t→1,(1-p_t)^γ→0,损失被大幅降低,从而使模型聚焦于困难样本。
Q6 [多选] 以下哪些是交叉熵损失的优点?
- A. 与Softmax/Sigmoid搭配时梯度形式简洁
- B. 有明确的信息论解释
- C. 对异常值不敏感
- D. 是分类任务的事实标准
解答:交叉熵有坚实的信息论基础,搭配适当激活函数时梯度简洁,是分类任务的标准选择。但交叉熵本身不涉及异常值问题(那是回归损失的特性)。
Q7 [单选] 当预测概率ŷ=0.9、真实标签y=1时,二分类交叉熵的损失值是多少?
- A. 0.9
- B. -log(0.9) ≈ 0.105
- C. 0.1
- D. log(0.9) ≈ -0.105
解答:y=1时BCE = -log(ŷ) = -log(0.9) ≈ 0.105。模型有90%的信心是对的,损失很小。
Q8 [多选] 关于损失函数选择,以下哪些组合是合理的?
- A. 房价预测 → MSE
- B. 图像分类 → 交叉熵
- C. 目标检测(正负样本不平衡) → Focal Loss
- D. 回归任务 → 交叉熵
解答:A、B、C都是标准搭配。交叉熵用于分类而非回归,因为回归输出是连续值而非概率。
Q9 [单选] 在二分类中,如果模型预测ŷ=0.5且真实y=1,交叉熵损失是多少?
- A. 0
- B. -log(0.5) ≈ 0.693
- C. 0.5
- D. 1.0
解答:y=1时损失为-log(0.5)=ln(2)≈0.693(以e为底)。ŷ=0.5表示模型完全不确定(等同于随机猜测),损失最大。
Q10 [单选] Focal Loss中γ=0时的表达式等价于什么?
- A. 标准交叉熵(不含类别平衡因子α)
- B. 均方误差
- C. Huber Loss
- D. Hinge Loss
解答:FL = -α(1-p_t)^γ·log(p_t),当γ=0时(1-p_t)^0=1,退化为-α·log(p_t),即带类别权重的标准交叉熵。如α也取1则为纯交叉熵。