深度学习六 —— 手撕MSE Loss& CE Loss

本文详细介绍了交叉熵损失(CELoss)和均方误差(MSELoss)在分类和回归任务中的应用。针对二分类和多分类问题,解释了交叉熵的数学公式和直觉理解,同时对比了与MSE的差异。CELoss适用于分类,尤其关注正确分类的概率,而MSE在回归问题中更常见,关注所有预测值的准确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

交叉熵损失 (CE Loss)

含义

用来描述两个分布之间的距离

公式

E = − ∑ i y i l o g ( p i ) E=-\sum_{i}y_ilog(p_i) E=iyilog(pi)

其中,

y y y——真值,one-hot向量标签

p i p_i pi——softmax的结果, ∑ i p i = 1 \sum_{i}p_i=1 ipi=1

二分类交叉熵

公式

E = 1 N ∑ i L i = − 1 N ∑ i − [ y i ⋅ log ⁡ ( p i ) + ( 1 − y i ) ⋅ log ⁡ ( 1 − p i ) ] E=\frac{1}{N}\sum_{i}L_i= -\frac{1}{N}\sum_{i}-[y_i \cdot \log(p_i)+(1-y_i)\cdot \log(1-p_i)] E=N1iLi=N1i[yilog(pi)+(1yi)log(1pi)]

其中,

y i y_i yi——表示样本 i i i的真值,正样本为1,负样本为0,

p i p_i pi——表示样本 i i i预测为正类的概率。

手撕BCE Loss

def softmax(x):
    exps = np.exp(x - np.max(x))
    return exps / np.sum(exps)
 
 
def cross_entropy_error(p, y):
    """
 
    :param p: 预测结果
    :param y: 真值的 one-hot 编码
    :return:
    """
    delta = 1e-7  # 添加一个微小值,防止负无穷(np.log(0))的情况出现
    p = softmax(p)
    return -np.sum(y * np.log(p + delta))

多分类交叉熵

公式

多分类情况就是对二分类情况的扩展,公式如下:

E = 1 N ∑ i L i = − 1 N ∑ i ∑ c = 1 M y i c l o g ( p i c ) E=\frac{1}{N}\sum_{i}L_i= -\frac{1}{N}\sum_{i}\sum_{c=1}^{M}y_{ic}log(p_{ic}) E=N1iLi=N1ic=1Myiclog(pic)

其中,

l o g log log——以 e e e为底的自然对数( l o g e log_e loge),

M M M——类别数量,

y i c y_{ic} yic——符号函数(0或1),如果样本 i i i的真值等于c取1,否则取0

p i c p_{ic} pic——观测样本i属于类别c的预测概率

手撕CE Loss

def sigmoid(x):
    return 1 / (1 + np.exp(x))
 
 
def cross_entropy_error(p, y):
    """
 
    :param p: 预测结果
    :param y: 真值的 one-hot 编码
    :return:
    """
    delta = 1e-7  # 添加一个微小值,防止负无穷(np.log(0))的情况出现
    p = sigmoid(p)
    return -np.sum(y * np.log(p + delta) + (1 - y) * np.log(1 - p + delta))
 

MSE Loss(均方误差损失、L2 Loss)

公式

E = 1 2 ∑ i = 1 n ( y i − t i ) 2 E=\frac{1}{2}\sum_{i=1}^{n}(y_i-t_i)^2 E=21i=1n(yiti)2

其中,

y i y_i yi——网络输出

t i t_i ti——真值

n n n——数据维度。

手撕MSE Loss

def mean_squared_error(y, t):
    """
 
    :param y: numpy array
    :param t: numpy array
    :return:
    """
    return 0.5 * np.sum(y, t)

MSE & CE部分理解分析

回归问题为什么不使用交叉熵?

1. 直观理解

回归问题通常对每一个输出结果都十分关注,比如MSE Loss,但是交叉熵损失只对正常分类的结果看重

例如:对于一个多分类模型,其模型输出为 ( a , b , c ) (a, b, c) (a,b,c),而实际的真值结果为 ( 1 , 0 , 0 ) (1, 0, 0) (1,0,0)。则根据两种损失函数的定义,他们的损失函数可以分别描述为:

L M S E = ( a − 1 ) 2 + ( b − 0 ) 2 + ( c − 1 ) 2 = ( a − 1 ) 2 + b 2 + c 2 L_{MSE}=(a-1)^2+(b-0)^2+(c-1)^2=(a-1)^2+b^2+c^2 LMSE=(a1)2+(b0)2+(c1)2=(a1)2+b2+c2

L C E = − 1 × l o g a − 0 × l o g b − 0 × l o g c = − l o g a L_{CE}=-1\times loga - 0 \times logb - 0 \times logc = -loga LCE=1×loga0×logb0×logc=loga

由上述结果可以看出,交叉熵损失函数只与正确的预测结果有关,而平方误差损失则还与错误的分类有关,该损失除了让正确的结果尽可能变大,还会让错误的结果尽可能变得平均。但是实际在CE Loss中,后面两个调整都失效了,但是对于回归问题,这个调整就很重要,因此回归问题中交叉熵并不适用。

2. 理论分析

平方函数损失函数假设服从高斯分布,而高斯分布实际上是一个连续的变量,并不是一个离散的变量。如果假设结果变量服从均值为 μ \mu μ,方差为 σ \sigma σ,那么利用最大似然估计的方法,就可以优化它的负对数似然,公式最终变为了:

L C E = m a x ∑ i N [ − 1 2 ( 2 π σ 2 ) − ( t i − y ) 2 σ 2 ] L_{CE}=max\sum_i^{N}[-\frac{1}{2}(2\pi\sigma^2)-\frac{(t_i-y)}{2\sigma^2} ] LCE=maxiN[21(2πσ2)2σ2(tiy)]

除去与 y y y无关的项目,最后剩下的就是平方损失函数的形式。

MSE和CE的 优缺点(相同点和不同点)

  • 相同点:当输出值与真值接近的话, CE和MSE的值都会接近0
  • CE具有MSE不具有的优点:避免学习率降低的情况。
    • 均方误差对参数的偏导的结果都 乘了sigmoid的导数 σ ′ ( z ) x \sigma'(z)x σ(z)x,而sigmoid的导数在其变量值很大或很小的情况下,趋近于0,所以导致偏导数很有可能接近0.
    • 由参数更新公式: 参数 = 参数 − 学习率 × 损失函数对参数的偏导 参数=参数-学习率\times损失函数对参数的偏导 参数=参数学习率×损失函数对参数的偏导
    • 可知,偏导很小时,参数的更新速度就会变得很慢,当偏导接近0时,参数几乎就不更新了。
    • 反观交叉熵对参数的偏导就没有sigmoid导数,所以不存在这个问题。 这就是分类问题选择交叉熵而不选择均方差的原因
03-21
<think>嗯,用户想了解交叉熵损失(Cross Entropy Loss)的概念和实现方法。首先,我需要回顾交叉熵损失的基本定义。交叉熵常用于分类问题,衡量模型输出与真实标签之间的差异。记得交叉熵的数学公式是$H(p, q) = -\sum p(x) \log q(x)$,其中p是真实分布,q是预测分布。 接下来,要解释在机器学习深度学习中的应用。比如在分类任务中,通常使用Softmax函数将输出转换为概率分布,然后计算交叉熵损失。需要区分二分类和多分类的情况,二分类可能用Sigmoid激活函数,而多分类用Softmax。 然后,实现方法部分可能需要给出代码示例。比如在PyTorch中,可以使用nn.CrossEntropyLoss,它已经包含了Softmax和交叉熵的计算。而在TensorFlow中,可能是tf.keras.losses.CategoricalCrossentropy。要注意是否需要处理one-hot编码或者直接使用类别标签。 还要注意引用用户提供的参考文献。比如引用[1]提到多层神经网络在TensorFlow中的实现,可能可以联系到交叉熵损失在训练中的应用。引用[2]提到的记忆和泛化,可以提到交叉熵如何帮助模型泛化,通过最小化预测和真实分布的差异。引用[3]中的建议,可能需要提到对于新的建议,如理解反向传播和卷积网络,这与正确实现损失函数相关。 用户可能的问题包括交叉熵的数学推导、与其他损失函数的比较、在实践中的注意事项(如数值稳定性)、在不同框架中的具体实现等。需要确保回答结构清晰,分点解释概念、应用、实现,并附上代码示例。同时检查LaTeX格式是否正确,所有数学表达式用$...$,独立公式用$$...$$,代码块用正确的语法高亮。 最后,生成的相关问题要围绕交叉熵扩展,比如为什么用于分类、如何防止数值下溢、多标签情况下的处理等。确保引用标记自然添加,比如在提到模型训练时引用[^1],在泛化时引用[^2],在实现建议时引用[^3]。</think>### 交叉熵损失(Cross Entropy Loss)详解 #### 1. **基本概念** 交叉熵损失(Cross Entropy Loss)是机器学习深度学习中用于分类任务的核心损失函数,衡量模型预测概率分布与真实概率分布的差异。其数学定义为: $$ H(p, q) = -\sum_{i} p(x_i) \log q(x_i) $$ 其中,$p$为真实分布(如标签的one-hot编码),$q$为模型预测的概率分布。 #### 2. **应用场景** - **分类任务**:如写数字识别(MNIST)、图像分类等。 - **泛化能力**:通过最小化预测与真实分布的差异,帮助模型学习未知特征组合的影响。 #### 3. **实现方法** ##### (1) 二分类任务(使用Sigmoid) ```python import torch import torch.nn as nn # 二分类交叉熵损失(含Sigmoid) loss_fn = nn.BCELoss() predictions = torch.sigmoid(model_outputs) # 模型输出需经过Sigmoid loss = loss_fn(predictions, true_labels) ``` ##### (2) 多分类任务(使用Softmax) ```python # 多分类交叉熵损失(含Softmax,PyTorch自动处理) loss_fn = nn.CrossEntropyLoss() # 输入为未归一化的logits loss = loss_fn(model_outputs, true_label_indices) # 标签为类别索引,非one-hot ``` ##### (3) 数值稳定性 为避免$\log(0)$导致数值下溢,实际实现中会对预测概率做截断: $$ \log q(x_i) \to \log(\max(q(x_i), \epsilon)) $$ 通常$\epsilon=1e-8$。 #### 4. **关键特性** - **梯度性质**:预测误差越大,梯度越大,加速模型收敛。 - **与KL散度的关系**:交叉熵等价于KL散度加上真实分布的熵。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L☆★

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值