MSE分类时梯度消失的问题详解和交叉熵损失的梯度推导
下面是MSE不适合分类任务的解释,包含梯度推导。以及交叉熵的梯度推导。
前文请移步笔者的另一篇博客:大模型训练为什么选择交叉熵损失(Cross-Entropy Loss):均方误差(MSE)和交叉熵损失的深入对比
MSE分类时梯度消失的问题详解
我们深入探讨 MSE(均方误差)的梯度特性,结合公式推导和分析,解释为什么在预测值接近 0 或 1 时梯度趋于 0,以及这背后的含义。我会尽量保持清晰且严谨,适合高理论水平的深度学习研究者。
MSE 的梯度推导与特性
均方误差(Mean Squared Error, MSE)在分类任务中的定义通常是针对模型输出 ( y ^ \hat{y} y^ )(预测值)和真实标签 ( y y y ) 之间的平方差。对于单个样本,MSE 损失函数可以写为:
L M S E = 1 2 ( y − y ^ ) 2 L_{MSE} = \frac{1}{2} (y - \hat{y})^2 LMSE=21(y−y^)2
这里的 ( 1 2 \frac{1}{2} 21 ) 是为了简化梯度计算的常数项(在求导时会消掉),在实际实现中可能省略,但不影响分析。为了与交叉熵的场景保持一致,我们假设 ( y y y ) 是分类任务中的真实标签(例如二分类中 ( y ∈ { 0 , 1 } y \in \{0, 1\} y∈{0,1} )),而 ( y ^ \hat{y} y^ ) 是模型的输出,通常经过 sigmoid 或 softmax 处理,范围在 ( [ 0 , 1 ] [0, 1] [0,1] ) 内,表示概率。
1. MSE 梯度的计算
为了计算梯度,我们需要对 ( L M S E L_{MSE} LMSE ) 关于模型输出 ( y ^ \hat{y} y^ ) 求偏导数:
∂ L M S E ∂ y ^ = ∂ ∂ y ^ [ 1 2 ( y − y ^ ) 2 ] \frac{\partial L_{MSE}}{\partial \hat{y}} = \frac{\partial}{\partial \hat{y}} \left[ \frac{1}{2} (y - \hat{y})^2 \right] ∂y^∂LMSE=∂y^∂[21(y−y^)2]
根据链式法则,求导过程如下:
∂ L M S E ∂ y ^ = 1 2 ⋅ 2 ( y − y ^ ) ⋅ ( − 1 ) = − ( y − y ^ ) \frac{\partial L_{MSE}}{\partial \hat{y}} = \frac{1}{2} \cdot 2 (y - \hat{y}) \cdot (-1) = -(y - \hat{y}) ∂y^∂LMSE=21⋅2(y−y^)⋅(−1)=−(y−y^)
所以,MSE 的梯度为:
∂ L M S E ∂ y ^ = y ^ − y \frac{\partial L_{MSE}}{\partial \hat{y}} = \hat{y} - y ∂y^∂LMSE=y^−y
这表明 MSE 的梯度与预测值 ( y ^ \hat{y} y^ ) 和真实值 ( y y y ) 之间的误差 ( y ^ − y \hat{y} - y y^−y ) 成正比,是一个线性关系。
2. 考虑激活函数(如 sigmoid)
在实际分类任务中,模型的原始输出(称为 logits,记为 ( z z z ))通常会通过激活函数(如 sigmoid)转化为概率 ( y ^ \hat{y} y^ )。对于二分类,sigmoid 函数定义为:
y ^ = σ ( z ) = 1 1 + e − z \hat{y} = \sigma(z) = \frac{1}{1 + e^{-z}} y^=σ(z)=1+e−z1
因此,损失函数变为关于 ( z z z ) 的函数:
L M S E = 1 2 ( y − σ ( z ) ) 2 L_{MSE} = \frac{1}{2} (y - \sigma(z))^2 LMSE=21(y−σ(z))2
我们需要计算梯度 ( ∂ L M S E ∂ z \frac{\partial L_{MSE}}{\partial z} ∂z∂LMSE ),使用链式法则:
∂ L M S E ∂ z = ∂ L M S E ∂ y ^ ⋅ ∂ y ^ ∂ z \frac{\partial L_{MSE}}{\partial z} = \frac{\partial L_{MSE}}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z} ∂z∂LMSE=∂y^∂LMSE⋅∂z∂y^
-
第一部分:
∂ L M S E ∂ y ^ = y ^ − y \frac{\partial L_{MSE}}{\partial \hat{y}} = \hat{y} - y ∂y^∂LMSE=y^−y -
第二部分(sigmoid 的导数):
∂ y ^ ∂ z = ∂ ∂ z ( 1 1 + e − z ) = σ ( z ) ( 1 − σ ( z ) ) = y ^ ( 1 − y ^ ) \frac{\partial \hat{y}}{\partial z} = \frac{\partial}{\partial z} \left( \frac{1}{1 + e^{-z}} \right) = \sigma(z) (1 - \sigma(z)) = \hat{y} (1 - \hat{y}) ∂z∂y^=∂z∂(1+e−z1)=σ(z)(1−σ(z))=y^(1−y^)
所以,完整的梯度为:
∂ L M S E ∂ z = ( y ^ − y ) ⋅ y ^ ( 1 − y ^ ) \frac{\partial L_{MSE}}{\partial z} = (\hat{y} - y) \cdot \hat{y} (1 - \hat{y}) ∂z∂LMSE=(y^−y)⋅y^(1−y^)
这个梯度会通过反向传播进一步影响网络参数的更新。
为什么梯度趋于 0?
现在我们分析为什么 MSE 的梯度在 ( y ^ \hat{y} y^ ) 接近 0 或 1 时会趋于 0,以及这对分类任务意味着什么。
1. 梯度公式中的关键项:( y ^ ( 1 − y ^ ) \hat{y} (1 - \hat{y}) y^(1−y^) )
sigmoid 的导数 ( y ^ ( 1 − y ^ ) \hat{y} (1 - \hat{y}) y^(1−y^) ) 是一个二次函数:
- 当 ( y ^ = 0 \hat{y} = 0 y^=0 ) 时,( y ^ ( 1 − y ^ ) = 0 ⋅ ( 1 − 0 ) = 0 \hat{y} (1 - \hat{y}) = 0 \cdot (1 - 0) = 0 y^(1−y^)=0⋅(1−0)=0 );
- 当 ( y ^ = 1 \hat{y} = 1 y^=1 ) 时,( y ^ ( 1 − y ^ ) = 1 ⋅ ( 1 − 1 ) = 0 \hat{y} (1 - \hat{y}) = 1 \cdot (1 - 1) = 0 y^(1−y^)=1⋅(1−1)=0 );
- 当 ( y ^ = 0.5 \hat{y} = 0.5 y^=0.5 ) 时,( y ^ ( 1 − y ^ ) = 0.5 ⋅ 0.5 = 0.25 \hat{y} (1 - \hat{y}) = 0.5 \cdot 0.5 = 0.25 y^(1−y^)=0.5⋅0.5=0.25 )(最大值)。
这意味着,当模型的预测 ( y ^ \hat{y} y^ ) 趋向于边界(0 或 1)时,梯度中的 ( y ^ ( 1 − y ^ ) \hat{y} (1 - \hat{y}) y^(1−y^) ) 项会迅速减小到 0。
2. 具体场景分析
-
情况 1:预测错误且置信度高
假设 ( y = 1 y = 1 y=1 ),但 ( y ^ → 0 \hat{y} \to 0 y^→0 )(模型错误且非常确信):
∂ L M S E ∂ z = ( y ^ − y ) ⋅ y ^ ( 1 − y ^ ) ≈ ( 0 − 1 ) ⋅ 0 ⋅ ( 1 − 0 ) = 0 \frac{\partial L_{MSE}}{\partial z} = (\hat{y} - y) \cdot \hat{y} (1 - \hat{y}) \approx (0 - 1) \cdot 0 \cdot (1 - 0) = 0 ∂z∂LMSE=(y^−y)⋅y^(1−y^)≈(0−1)⋅0⋅(1−0)=0
梯度趋于 0,尽管误差 ( y ^ − y = − 1 \hat{y} - y = -1 y^−y=−1 ) 很大。 -
情况 2:预测正确且置信度高
假设 ( y = 1 y = 1 y=1 ),且 ( y ^ → 1 \hat{y} \to 1 y^→1 )(模型正确且确信):
∂ L M S E ∂ z = ( y ^ − y ) ⋅ y ^ ( 1 − y ^ ) ≈ ( 1 − 1 ) ⋅ 1 ⋅ ( 1 − 1 ) = 0 \frac{\partial L_{MSE}}{\partial z} = (\hat{y} - y) \cdot \hat{y} (1 - \hat{y}) \approx (1 - 1) \cdot 1 \cdot (1 - 1) = 0 ∂z∂LMSE=(y^−y)⋅y^(1−y^)≈(1−1)⋅1⋅(1−1)=0
梯度同样趋于 0,这次是因为误差 ( y ^ − y = 0 \hat{y} - y = 0 y^−y=0 )。
在第一种情况下,模型需要快速修正错误,但梯度接近 0,导致更新几乎停止,这就是所谓的“梯度消失”问题。
3. 与交叉熵对比
交叉熵(以二元交叉熵为例)的损失为:
L B C E = − [ y log ( y ^ ) + ( 1 − y ) log ( 1 − y ^ ) ] L_{BCE} = -[y \log(\hat{y}) + (1 - y) \log(1 - \hat{y})] LBCE=−[ylog(y^)+(1−y)log(1−y^)]
梯度为:
∂ L B C E ∂ z = y ^ − y \frac{\partial L_{BCE}}{\partial z} = \hat{y} - y ∂z∂LBCE=y^−y
注意,这里没有 ( y ^ ( 1 − y ^ ) \hat{y} (1 - \hat{y}) y^(1−y^) ) 这样的乘积项。当 ( y = 1 y = 1 y=1 ) 且 ( y ^ → 0 \hat{y} \to 0 y^→0 ) 时,梯度 ( y ^ − y ≈ 0 − 1 = − 1 \hat{y} - y \approx 0 - 1 = -1 y^−y≈0−1=−1 ),大小显著且方向明确,推动模型快速修正。
梯度为 0 的含义
-
学习停滞
当 ( y ^ \hat{y} y^ ) 接近 0 或 1 时,MSE 的梯度趋于 0,意味着模型参数的更新量极小。即使预测完全错误,模型也无法有效学习。这在分类任务中尤为致命,因为分类需要明确的决策边界,而非模糊的中间状态。 -
饱和效应
sigmoid 的“饱和”特性(输出接近边界时导数趋于 0)与 MSE 的线性误差项结合,加剧了梯度消失。这种效应在深层网络中会被放大,导致早期层几乎无法更新。 -
不适合分类的根本原因
分类任务需要模型对错误预测(尤其是高置信度错误)产生强反馈,而 MSE 在这种情况下“麻木”,无法提供足够的梯度信号。相比之下,交叉熵通过对数形式放大了错误预测的惩罚,确保梯度始终有效。
总结
MSE 的梯度公式 ( ∂ L M S E ∂ z = ( y ^ − y ) ⋅ y ^ ( 1 − y ^ ) \frac{\partial L_{MSE}}{\partial z} = (\hat{y} - y) \cdot \hat{y} (1 - \hat{y}) ∂z∂LMSE=(y^−y)⋅y^(1−y^) ) 显示,其大小受 ( y ^ ( 1 − y ^ ) \hat{y} (1 - \hat{y}) y^(1−y^) ) 控制。当预测值 ( y ^ \hat{y} y^ ) 接近 0 或 1 时,这一项趋于 0,导致梯度消失。无论是正确的高置信预测还是错误的极端预测,MSE 都无法提供足够的优化动力。这解释了为什么 MSE 在分类任务中表现不佳,而交叉熵凭借其非线性惩罚和稳定梯度成为更优选择。
多分类场景:Softmax + MSE 梯度推导
我们将深入探讨多分类场景下,使用 softmax 激活函数结合 MSE(均方误差)损失的梯度推导。这部分内容会非常详细,包含完整的数学推导,并分析梯度特性,尤其是在预测值接近边界时的行为。我们假设读者具备较高的理论水平,能够理解矩阵运算和链式法则的复杂应用。
多分类场景:Softmax + MSE 的定义
在多分类任务中,假设有 ( C C C ) 个类别,模型的原始输出(logits)为向量 ( z = [ z 1 , z 2 , … , z C ] \mathbf{z} = [z_1, z_2, \dots, z_C] z=[z1,z2,…,zC] )。通过 softmax 函数,logits 被转化为概率分布 ( y ^ = [ y ^ 1 , y ^ 2 , … , y ^ C ] \hat{\mathbf{y}} = [\hat{y}_1, \hat{y}_2, \dots, \hat{y}_C] y^=[y^1,y^2,…,y^C] ):
y ^ i = softmax ( z i ) = e z i ∑ j = 1 C e z j \hat{y}_i = \text{softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^C e^{z_j}} y^i=softmax(zi)=∑j=1Cezjezi
真实标签 ( y = [ y 1 , y 2 , … , y C ] \mathbf{y} = [y_1, y_2, \dots, y_C] y=[y1,y2,…,yC] ) 通常采用 one-hot 编码,例如对于第 ( k k k ) 类,( y k = 1 y_k = 1 yk=1 ),其他 ( y i = 0 ( i ≠ k ) y_i = 0 (i \neq k) yi=0(i=k) )。
MSE 损失函数定义为预测概率 ( y ^ \hat{\mathbf{y}} y^ ) 与真实标签 ( y \mathbf{y} y ) 之间的平方差平均值(为简化推导,我们省略常数因子 ( 1 C \frac{1}{C} C1 ) 的影响,加入 ( 1 2 \frac{1}{2} 21 ) 方便求导):
L M S E = 1 2 ∑ i = 1 C ( y i − y ^ i ) 2 L_{MSE} = \frac{1}{2} \sum_{i=1}^C (y_i - \hat{y}_i)^2 LMSE=21i=1∑C(yi−y^i)2
目标是计算梯度 ( ∂ L M S E ∂ z j \frac{\partial L_{MSE}}{\partial z_j} ∂zj∂LMSE )(对每个 logit ( z j z_j zj ) 的偏导),以理解其在多分类中的行为。
梯度推导
由于 ( y ^ i \hat{y}_i y^i ) 是 ( z \mathbf{z} z ) 的函数,我们需要使用链式法则分两步计算:
∂ L M S E ∂ z j = ∑ i = 1 C ∂ L M S E ∂ y ^ i ⋅ ∂ y ^ i ∂ z j \frac{\partial L_{MSE}}{\partial z_j} = \sum_{i=1}^C \frac{\partial L_{MSE}}{\partial \hat{y}_i} \cdot \frac{\partial \hat{y}_i}{\partial z_j} ∂zj∂LMSE=i=1∑C∂y^i∂LMSE⋅∂zj∂y^i
1. 计算 ( ∂ L M S E ∂ y ^ i \frac{\partial L_{MSE}}{\partial \hat{y}_i} ∂y^i∂LMSE )
首先,对 ( y ^ i \hat{y}_i y^i ) 求偏导:
∂ L M S E ∂ y ^ i = ∂ ∂ y ^ i [ 1 2 ∑ k = 1 C ( y k − y ^ k ) 2 ] \frac{\partial L_{MSE}}{\partial \hat{y}_i} = \frac{\partial}{\partial \hat{y}_i} \left[ \frac{1}{2} \sum_{k=1}^C (y_k - \hat{y}_k)^2 \right] ∂y^i∂LMSE=∂y^i∂[21k=1∑C(yk−y^k)2]
由于平方和中只有 ( k = i k = i k=i ) 的项与 ( y ^ i \hat{y}_i y^i ) 有关,其他项的导数为 0,因此:
∂ L M S E ∂ y ^ i = 1 2 ⋅ 2 ( y i − y ^ i ) ⋅ ( − 1 ) = − ( y i − y ^ i ) \frac{\partial L_{MSE}}{\partial \hat{y}_i} = \frac{1}{2} \cdot 2 (y_i - \hat{y}_i) \cdot (-1) = -(y_i - \hat{y}_i) ∂y^i∂LMSE=21⋅2(yi−y^i)⋅(−1)=−(yi−y^i)
即:
∂ L M S E ∂ y ^ i = y ^ i − y i \frac{\partial L_{MSE}}{\partial \hat{y}_i} = \hat{y}_i - y_i ∂y^i∂LMSE=y^i−yi
这与二分类的 MSE 梯度形式一致,表明误差方向取决于预测值与真实值的偏差。
2. 计算 ( ∂ y ^ i ∂ z j \frac{\partial \hat{y}_i}{\partial z_j} ∂zj∂y^i )(Softmax 的导数)
Softmax 的导数稍微复杂,因为 ( y ^ i \hat{y}_i y^i ) 不仅依赖于 ( z i z_i zi ),还通过归一化分母依赖于所有 ( z j z_j zj)。我们需要分情况讨论:
-
当 ( i = j i = j i=j ) 时(对自己的偏导):
y ^ i = e z i ∑ k = 1 C e z k \hat{y}_i = \frac{e^{z_i}}{\sum_{k=1}^C e^{z_k}} y^i=∑k=1Cezkezi
使用商法则求导:
∂ y ^ i ∂ z i = e z i ⋅ ∑ k = 1 C e z k − e z i ⋅ e z i ( ∑ k = 1 C e z k ) 2 = e z i ( ∑ k = 1 C e z k − e z i ) ( ∑ k = 1 C e z k ) 2 \frac{\partial \hat{y}_i}{\partial z_i} = \frac{e^{z_i} \cdot \sum_{k=1}^C e^{z_k} - e^{z_i} \cdot e^{z_i}}{(\sum_{k=1}^C e^{z_k})^2} = \frac{e^{z_i} (\sum_{k=1}^C e^{z_k} - e^{z_i})}{(\sum_{k=1}^C e^{z_k})^2} ∂zi∂y^i=(∑k=1Cezk)2ezi⋅∑k=1Cezk−ezi⋅ezi=(∑k=1Cezk)2ezi(∑k=1Cezk−ezi)
代入 ( y ^ i = e z i ∑ k = 1 C e z k \hat{y}_i = \frac{e^{z_i}}{\sum_{k=1}^C e^{z_k}} y^i=∑k=1Cezkezi ):
∂ y ^ i ∂ z i = y ^ i ⋅ ∑ k = 1 C e z k − e z i ∑ k = 1 C e z k = y ^ i ( 1 − y ^ i ) \frac{\partial \hat{y}_i}{\partial z_i} = \hat{y}_i \cdot \frac{\sum_{k=1}^C e^{z_k} - e^{z_i}}{\sum_{k=1}^C e^{z_k}} = \hat{y}_i (1 - \hat{y}_i) ∂zi∂y^i=y^i⋅∑k=1Cezk∑k=1Cezk−ezi=y^i(1−y^i) -
当 ( i ≠ j i \neq j i=j ) 时(交叉项):
∂ y ^ i ∂ z j = 0 ⋅ ∑ k = 1 C e z k − e z i ⋅ e z j ( ∑ k = 1 C e z k ) 2 = − e z i e z j ( ∑ k = 1 C e z k ) 2 = − y ^ i y ^ j \frac{\partial \hat{y}_i}{\partial z_j} = \frac{0 \cdot \sum_{k=1}^C e^{z_k} - e^{z_i} \cdot e^{z_j}}{(\sum_{k=1}^C e^{z_k})^2} = -\frac{e^{z_i} e^{z_j}}{(\sum_{k=1}^C e^{z_k})^2} = -\hat{y}_i \hat{y}_j ∂zj∂y^i=(∑k=1Cezk)20⋅∑k=1Cezk−ezi⋅ezj=−(∑k=1Cezk)2eziezj=−y^iy^j
总结 Softmax 的导数:
∂ y ^ i ∂ z j = { y ^ i ( 1 − y ^ i ) , if i = j − y ^ i y ^ j , if i ≠ j \frac{\partial \hat{y}_i}{\partial z_j} = \begin{cases} \hat{y}_i (1 - \hat{y}_i), & \text{if } i = j \\ -\hat{y}_i \hat{y}_j, & \text{if } i \neq j \end{cases} ∂zj∂y^i={y^i(1−y^i),−y^iy^j,if i=jif i=j
这表明 Softmax 的输出是相互耦合的,改变一个 ( z j z_j zj ) 会影响所有 ( y ^ i \hat{y}_i y^i )。
3. 合并计算完整梯度
将两部分合并:
∂ L M S E ∂ z j = ∑ i = 1 C ( y ^ i − y i ) ⋅ ∂ y ^ i ∂ z j \frac{\partial L_{MSE}}{\partial z_j} = \sum_{i=1}^C (\hat{y}_i - y_i) \cdot \frac{\partial \hat{y}_i}{\partial z_j} ∂zj∂LMSE=i=1∑C(y^i−yi)⋅∂zj∂y^i
代入 Softmax 导数,分开 ( i = j i = j i=j ) 和 ( i ≠ j i \neq j i=j ) 的项:
∂ L M S E ∂ z j = ( y ^ j − y j ) ⋅ ∂ y ^ j ∂ z j + ∑ i ≠ j ( y ^ i − y i ) ⋅ ∂ y ^ i ∂ z j \frac{\partial L_{MSE}}{\partial z_j} = (\hat{y}_j - y_j) \cdot \frac{\partial \hat{y}_j}{\partial z_j} + \sum_{i \neq j} (\hat{y}_i - y_i) \cdot \frac{\partial \hat{y}_i}{\partial z_j} ∂zj∂LMSE=(y^j−yj)⋅∂zj∂y^j+i=j∑(y^i−yi)⋅∂zj∂y^i
-
第一项(( i = j i = j i=j )):
( y ^ j − y j ) ⋅ y ^ j ( 1 − y ^ j ) (\hat{y}_j - y_j) \cdot \hat{y}_j (1 - \hat{y}_j) (y^j−yj)⋅y^j(1−y^j) -
第二项(( i ≠ j i \neq j i=j ) 的总和):
∑ i ≠ j ( y ^ i − y i ) ⋅ ( − y ^ i y ^ j ) = − y ^ j ∑ i ≠ j ( y ^ i − y i ) y ^ i \sum_{i \neq j} (\hat{y}_i - y_i) \cdot (-\hat{y}_i \hat{y}_j) = -\hat{y}_j \sum_{i \neq j} (\hat{y}_i - y_i) \hat{y}_i i=j∑(y^i−yi)⋅(−y^iy^j)=−y^ji=j∑(y^i−yi)y^i
完整梯度为:
∂ L M S E ∂ z j = ( y ^ j − y j ) y ^ j ( 1 − y ^ j ) − y ^ j ∑ i ≠ j ( y ^ i − y i ) y ^ i \frac{\partial L_{MSE}}{\partial z_j} = (\hat{y}_j - y_j) \hat{y}_j (1 - \hat{y}_j) - \hat{y}_j \sum_{i \neq j} (\hat{y}_i - y_i) \hat{y}_i ∂zj∂LMSE=(y^j−yj)y^j(1−y^j)−y^ji=j∑(y^i−yi)y^i
为了更直观,我们可以进一步整理。注意到 ( ∑ i = 1 C y i = 1 \sum_{i=1}^C y_i = 1 ∑i=1Cyi=1 )(one-hot 标签),( ∑ i = 1 C y ^ i = 1 \sum_{i=1}^C \hat{y}_i = 1 ∑i=1Cy^i=1 )(softmax 性质),我们可以分析特定情况。
4. 简化(以 one-hot 标签为例)
假设真实标签 ( y k = 1 y_k = 1 yk=1 ),其他 ( y i = 0 ( i ≠ k ) y_i = 0 (i \neq k) yi=0(i=k) )。梯度为:
∂ L M S E ∂ z j = ( y ^ j − y j ) y ^ j ( 1 − y ^ j ) − y ^ j ∑ i ≠ j ( y ^ i − y i ) y ^ i \frac{\partial L_{MSE}}{\partial z_j} = (\hat{y}_j - y_j) \hat{y}_j (1 - \hat{y}_j) - \hat{y}_j \sum_{i \neq j} (\hat{y}_i - y_i) \hat{y}_i ∂zj∂LMSE=(y^j−yj)y^j(1−y^j)−y^ji=j∑(y^i−yi)y^i
-
若 ( j = k j = k j=k )(正确类别):
( y j = 1 y_j = 1 yj=1 ),( y i = 0 ( i ≠ j ) y_i = 0 (i \neq j) yi=0(i=j) )
第一项:( ( y ^ j − 1 ) y ^ j ( 1 − y ^ j ) (\hat{y}_j - 1) \hat{y}_j (1 - \hat{y}_j) (y^j−1)y^j(1−y^j) )
第二项:( − y ^ j ∑ i ≠ j ( y ^ i − 0 ) y ^ i = − y ^ j ∑ i ≠ j y ^ i 2 -\hat{y}_j \sum_{i \neq j} (\hat{y}_i - 0) \hat{y}_i = -\hat{y}_j \sum_{i \neq j} \hat{y}_i^2 −y^j∑i=j(y^i−0)y^i=−y^j∑i=jy^i2 )
总梯度:
∂ L M S E ∂ z k = ( y ^ k − 1 ) y ^ k ( 1 − y ^ k ) − y ^ k ∑ i ≠ k y ^ i 2 \frac{\partial L_{MSE}}{\partial z_k} = (\hat{y}_k - 1) \hat{y}_k (1 - \hat{y}_k) - \hat{y}_k \sum_{i \neq k} \hat{y}_i^2 ∂zk∂LMSE=(y^k−1)y^k(1−y^k)−y^ki=k∑y^i2 -
若 ( j ≠ k j \neq k j=k )(错误类别):
( y j = 0 y_j = 0 yj=0 ),第一项:( y ^ j y ^ j ( 1 − y ^ j ) = y ^ j 2 ( 1 − y ^ j ) \hat{y}_j \hat{y}_j (1 - \hat{y}_j) = \hat{y}_j^2 (1 - \hat{y}_j) y^jy^j(1−y^j)=y^j2(1−y^j) )
第二项:( − y ^ j [ ( y ^ k − 1 ) y ^ k + ∑ i ≠ j , i ≠ k y ^ i 2 ] -\hat{y}_j [(\hat{y}_k - 1) \hat{y}_k + \sum_{i \neq j, i \neq k} \hat{y}_i^2] −y^j[(y^k−1)y^k+∑i=j,i=ky^i2] )
总梯度更复杂,但核心依赖于 ( y ^ j \hat{y}_j y^j ) 的值。
梯度趋于 0 的分析
现在分析当 ( y ^ j \hat{y}_j y^j ) 接近边界(0 或 1)时的行为:
-
正确类别 ( j = k j = k j=k ),( y ^ k → 1 \hat{y}_k \to 1 y^k→1 )
- ( y ^ k − 1 → 0 \hat{y}_k - 1 \to 0 y^k−1→0 )
- ( 1 − y ^ k → 0 1 - \hat{y}_k \to 0 1−y^k→0 )
- ( ∑ i ≠ k y ^ i 2 → 0 \sum_{i \neq k} \hat{y}_i^2 \to 0 ∑i=ky^i2→0 )(因为 ( ∑ i = 1 C y ^ i = 1 \sum_{i=1}^C \hat{y}_i = 1 ∑i=1Cy^i=1 ))
∂ L M S E ∂ z k ≈ 0 ⋅ y ^ k ⋅ 0 − y ^ k ⋅ 0 = 0 \frac{\partial L_{MSE}}{\partial z_k} \approx 0 \cdot \hat{y}_k \cdot 0 - \hat{y}_k \cdot 0 = 0 ∂zk∂LMSE≈0⋅y^k⋅0−y^k⋅0=0
梯度趋于 0,这在正确预测时是合理的。
-
错误类别 ( j ≠ k j \neq k j=k ),( y ^ j → 1 \hat{y}_j \to 1 y^j→1 ),( y ^ k → 0 \hat{y}_k \to 0 y^k→0 )
- 第一项:( y ^ j 2 ( 1 − y ^ j ) → 1 ⋅ ( 1 − 1 ) = 0 \hat{y}_j^2 (1 - \hat{y}_j) \to 1 \cdot (1 - 1) = 0 y^j2(1−y^j)→1⋅(1−1)=0 )
- 第二项:( − y ^ j ( y ^ k − 1 ) y ^ k ≈ − 1 ⋅ ( 0 − 1 ) ⋅ 0 = 0 -\hat{y}_j (\hat{y}_k - 1) \hat{y}_k \approx -1 \cdot (0 - 1) \cdot 0 = 0 −y^j(y^k−1)y^k≈−1⋅(0−1)⋅0=0 )
梯度仍趋于 0,尽管预测完全错误。
这表明,当 softmax 输出“饱和”(某类概率接近 1,其他接近 0)时,MSE 的梯度会消失,模型无法有效纠正错误。
与交叉熵对比
交叉熵加 softmax 的梯度为:
∂ L C E ∂ z j = y ^ j − y j \frac{\partial L_{CE}}{\partial z_j} = \hat{y}_j - y_j ∂zj∂LCE=y^j−yj
当 ( y ^ k → 0 \hat{y}_k \to 0 y^k→0 )(正确类别概率很低)时,( ∂ L C E ∂ z k = 0 − 1 = − 1 \frac{\partial L_{CE}}{\partial z_k} = 0 - 1 = -1 ∂zk∂LCE=0−1=−1 ),梯度显著,推动修正。
总结
Softmax + MSE 的梯度推导揭示了其复杂性与局限性。梯度中的 ( y ^ j ( 1 − y ^ j ) \hat{y}_j (1 - \hat{y}_j) y^j(1−y^j) ) 和交叉项导致在预测极端时(接近 0 或 1)梯度趋于 0,限制了模型对错误的高效修正。这进一步验证了 MSE 在多分类任务中的不足,而交叉熵的简洁性和动态性使其更优。
交叉熵损失的梯度推导
我们将深入探讨交叉熵损失(包括二元交叉熵和通用多分类交叉熵)的梯度推导,并分析其梯度特性,特别是为什么在预测错误时(如 ( y ^ → 0 \hat{y} \to 0 y^→0 ) 而 ( y = 1 y = 1 y=1 ))梯度较大,以及这对模型优化的意义。我们会保持数学严谨,适合高理论水平的深度学习研究者。
一、二元交叉熵(Binary Cross-Entropy)的梯度推导
定义
二元交叉熵损失用于二分类任务,假设真实标签 ( y ∈ { 0 , 1 } y \in \{0, 1\} y∈{0,1} ),模型预测概率 ( y ^ ∈ [ 0 , 1 ] \hat{y} \in [0, 1] y^∈[0,1] )(通常通过 sigmoid 函数从 logit ( z z z ) 得到)。损失函数为:
L B C E = − [ y log ( y ^ ) + ( 1 − y ) log ( 1 − y ^ ) ] L_{BCE} = -[y \log(\hat{y}) + (1 - y) \log(1 - \hat{y})] LBCE=−[ylog(y^)+(1−y)log(1−y^)]
其中,( y ^ = σ ( z ) = 1 1 + e − z \hat{y} = \sigma(z) = \frac{1}{1 + e^{-z}} y^=σ(z)=1+e−z1 )。
梯度推导
我们需要计算损失对 logit ( z z z ) 的梯度 ( ∂ L B C E ∂ z \frac{\partial L_{BCE}}{\partial z} ∂z∂LBCE ),使用链式法则:
∂ L B C E ∂ z = ∂ L B C E ∂ y ^ ⋅ ∂ y ^ ∂ z \frac{\partial L_{BCE}}{\partial z} = \frac{\partial L_{BCE}}{\partial \hat{y}} \cdot \frac{\partial \hat{y}}{\partial z} ∂z∂LBCE=∂y^∂LBCE⋅∂z∂y^
-
计算 ( ∂ L B C E ∂ y ^ \frac{\partial L_{BCE}}{\partial \hat{y}} ∂y^∂LBCE )
对 ( y ^ \hat{y} y^ ) 求偏导:
∂ L B C E ∂ y ^ = ∂ ∂ y ^ [ − y log ( y ^ ) − ( 1 − y ) log ( 1 − y ^ ) ] \frac{\partial L_{BCE}}{\partial \hat{y}} = \frac{\partial}{\partial \hat{y}} \left[ -y \log(\hat{y}) - (1 - y) \log(1 - \hat{y}) \right] ∂y^∂LBCE=∂y^∂[−ylog(y^)−(1−y)log(1−y^)]- 第一项:( ∂ ∂ y ^ [ − y log ( y ^ ) ] = − y ⋅ 1 y ^ \frac{\partial}{\partial \hat{y}} [-y \log(\hat{y})] = -y \cdot \frac{1}{\hat{y}} ∂y^∂[−ylog(y^)]=−y⋅y^1 )
- 第二项:( ∂ ∂ y ^ [ − ( 1 − y ) log ( 1 − y ^ ) ] = − ( 1 − y ) ⋅ − 1 1 − y ^ = 1 − y 1 − y ^ \frac{\partial}{\partial \hat{y}} [-(1 - y) \log(1 - \hat{y})] = -(1 - y) \cdot \frac{-1}{1 - \hat{y}} = \frac{1 - y}{1 - \hat{y}} ∂y^∂[−(1−y)log(1−y^)]=−(1−y)⋅1−y^−1=1−y^1−y )
合并:
∂ L B C E ∂ y ^ = − y y ^ + 1 − y 1 − y ^ \frac{\partial L_{BCE}}{\partial \hat{y}} = -\frac{y}{\hat{y}} + \frac{1 - y}{1 - \hat{y}} ∂y^∂LBCE=−y^y+1−y^1−y
-
计算 ( ∂ y ^ ∂ z \frac{\partial \hat{y}}{\partial z} ∂z∂y^ )(sigmoid 导数)
y ^ = σ ( z ) = 1 1 + e − z \hat{y} = \sigma(z) = \frac{1}{1 + e^{-z}} y^=σ(z)=1+e−z1
∂ y ^ ∂ z = e − z ( 1 + e − z ) 2 = 1 1 + e − z ⋅ e − z 1 + e − z = y ^ ( 1 − y ^ ) \frac{\partial \hat{y}}{\partial z} = \frac{e^{-z}}{(1 + e^{-z})^2} = \frac{1}{1 + e^{-z}} \cdot \frac{e^{-z}}{1 + e^{-z}} = \hat{y} (1 - \hat{y}) ∂z∂y^=(1+e−z)2e−z=1+e−z1⋅1+e−ze−z=y^(1−y^) -
合并计算完整梯度
∂ L B C E ∂ z = ( − y y ^ + 1 − y 1 − y ^ ) ⋅ y ^ ( 1 − y ^ ) \frac{\partial L_{BCE}}{\partial z} = \left( -\frac{y}{\hat{y}} + \frac{1 - y}{1 - \hat{y}} \right) \cdot \hat{y} (1 - \hat{y}) ∂z∂LBCE=(−y^y+1−y^1−y)⋅y^(1−y^)
化简:- 第一项:( − y y ^ ⋅ y ^ ( 1 − y ^ ) = − y ( 1 − y ^ ) -\frac{y}{\hat{y}} \cdot \hat{y} (1 - \hat{y}) = -y (1 - \hat{y}) −y^y⋅y^(1−y^)=−y(1−y^) )
- 第二项:( 1 − y 1 − y ^ ⋅ y ^ ( 1 − y ^ ) = ( 1 − y ) y ^ \frac{1 - y}{1 - \hat{y}} \cdot \hat{y} (1 - \hat{y}) = (1 - y) \hat{y} 1−y^1−y⋅y^(1−y^)=(1−y)y^ )
总和:
∂ L B C E ∂ z = − y ( 1 − y ^ ) + ( 1 − y ) y ^ \frac{\partial L_{BCE}}{\partial z} = -y (1 - \hat{y}) + (1 - y) \hat{y} ∂z∂LBCE=−y(1−y^)+(1−y)y^
= − y + y y ^ + y ^ − y y ^ = y ^ − y = -y + y \hat{y} + \hat{y} - y \hat{y} = \hat{y} - y =−y+yy^+y^−yy^=y^−y
最终,二元交叉熵的梯度为:
∂ L B C E ∂ z = y ^ − y \frac{\partial L_{BCE}}{\partial z} = \hat{y} - y ∂z∂LBCE=y^−y
梯度特性分析
- 与误差成正比:梯度 ( y ^ − y \hat{y} - y y^−y ) 直接反映了预测值与真实值之间的偏差,形式简洁且线性。
- 预测错误时的行为:
- 当 ( y = 1 y = 1 y=1 ),( y ^ → 0 \hat{y} \to 0 y^→0 )(严重错误):
∂ L B C E ∂ z = 0 − 1 = − 1 \frac{\partial L_{BCE}}{\partial z} = 0 - 1 = -1 ∂z∂LBCE=0−1=−1
梯度为 -1,大小显著且方向明确,推动 ( z z z ) 增加,使 ( y ^ \hat{y} y^ ) 向 1 靠拢。 - 当 ( y = 0 y = 0 y=0 ),( y ^ → 1 \hat{y} \to 1 y^→1 )(严重错误):
∂ L B C E ∂ z = 1 − 0 = 1 \frac{\partial L_{BCE}}{\partial z} = 1 - 0 = 1 ∂z∂LBCE=1−0=1
梯度为 1,推动 ( z z z ) 减小,使 ( y ^ \hat{y} y^ ) 向 0 靠拢。
- 当 ( y = 1 y = 1 y=1 ),( y ^ → 0 \hat{y} \to 0 y^→0 )(严重错误):
- 无饱和问题:与 MSE 不同,这里没有 ( y ^ ( 1 − y ^ ) \hat{y} (1 - \hat{y}) y^(1−y^) ) 这样的乘积项,梯度不会因 ( y ^ \hat{y} y^ ) 接近 0 或 1 而趋于 0,确保错误预测时有强反馈。
二、通用交叉熵(多分类 Cross-Entropy)的梯度推导
定义
在多分类任务中,假设有 ( C C C ) 个类别,真实标签 ( y = [ y 1 , y 2 , … , y C ] \mathbf{y} = [y_1, y_2, \dots, y_C] y=[y1,y2,…,yC] )(one-hot 编码,例如 ( y k = 1 y_k = 1 yk=1 ),其他为 0),预测概率 ( y ^ = [ y ^ 1 , y ^ 2 , … , y ^ C ] \hat{\mathbf{y}} = [\hat{y}_1, \hat{y}_2, \dots, \hat{y}_C] y^=[y^1,y^2,…,y^C] ) 通过 softmax 从 logits ( z = [ z 1 , z 2 , … , z C ] \mathbf{z} = [z_1, z_2, \dots, z_C] z=[z1,z2,…,zC] ) 得到:
y ^ i = softmax ( z i ) = e z i ∑ j = 1 C e z j \hat{y}_i = \text{softmax}(z_i) = \frac{e^{z_i}}{\sum_{j=1}^C e^{z_j}} y^i=softmax(zi)=∑j=1Cezjezi
交叉熵损失为:
L C E = − ∑ i = 1 C y i log ( y ^ i ) L_{CE} = -\sum_{i=1}^C y_i \log(\hat{y}_i) LCE=−i=1∑Cyilog(y^i)
梯度推导
计算 ( ∂ L C E ∂ z j \frac{\partial L_{CE}}{\partial z_j} ∂zj∂LCE ):
∂ L C E ∂ z j = ∑ i = 1 C ∂ L C E ∂ y ^ i ⋅ ∂ y ^ i ∂ z j \frac{\partial L_{CE}}{\partial z_j} = \sum_{i=1}^C \frac{\partial L_{CE}}{\partial \hat{y}_i} \cdot \frac{\partial \hat{y}_i}{\partial z_j} ∂zj∂LCE=i=1∑C∂y^i∂LCE⋅∂zj∂y^i
-
计算 ( ∂ L C E ∂ y ^ i \frac{\partial L_{CE}}{\partial \hat{y}_i} ∂y^i∂LCE )
∂ L C E ∂ y ^ i = ∂ ∂ y ^ i [ − ∑ k = 1 C y k log ( y ^ k ) ] = − y i ⋅ 1 y ^ i = − y i y ^ i \frac{\partial L_{CE}}{\partial \hat{y}_i} = \frac{\partial}{\partial \hat{y}_i} \left[ -\sum_{k=1}^C y_k \log(\hat{y}_k) \right] = -y_i \cdot \frac{1}{\hat{y}_i} = -\frac{y_i}{\hat{y}_i} ∂y^i∂LCE=∂y^i∂[−k=1∑Cyklog(y^k)]=−yi⋅y^i1=−y^iyi -
计算 ( ∂ y ^ i ∂ z j \frac{\partial \hat{y}_i}{\partial z_j} ∂zj∂y^i )(Softmax 导数)
- 当 ( i = j i = j i=j ):
∂ y ^ i ∂ z i = y ^ i ( 1 − y ^ i ) \frac{\partial \hat{y}_i}{\partial z_i} = \hat{y}_i (1 - \hat{y}_i) ∂zi∂y^i=y^i(1−y^i) - 当 ( i ≠ j i \neq j i=j ):
∂ y ^ i ∂ z j = − y ^ i y ^ j \frac{\partial \hat{y}_i}{\partial z_j} = -\hat{y}_i \hat{y}_j ∂zj∂y^i=−y^iy^j
- 当 ( i = j i = j i=j ):
-
合并计算完整梯度
∂ L C E ∂ z j = ∑ i = 1 C ( − y i y ^ i ) ⋅ ∂ y ^ i ∂ z j \frac{\partial L_{CE}}{\partial z_j} = \sum_{i=1}^C \left( -\frac{y_i}{\hat{y}_i} \right) \cdot \frac{\partial \hat{y}_i}{\partial z_j} ∂zj∂LCE=i=1∑C(−y^iyi)⋅∂zj∂y^i
分开 ( i = j i = j i=j ) 和 ( i ≠ j i \neq j i=j ):
∂ L C E ∂ z j = − y j y ^ j ⋅ y ^ j ( 1 − y ^ j ) + ∑ i ≠ j ( − y i y ^ i ) ( − y ^ i y ^ j ) \frac{\partial L_{CE}}{\partial z_j} = -\frac{y_j}{\hat{y}_j} \cdot \hat{y}_j (1 - \hat{y}_j) + \sum_{i \neq j} \left( -\frac{y_i}{\hat{y}_i} \right) (-\hat{y}_i \hat{y}_j) ∂zj∂LCE=−y^jyj⋅y^j(1−y^j)+i=j∑(−y^iyi)(−y^iy^j)- 第一项:( − y j ( 1 − y ^ j ) -y_j (1 - \hat{y}_j) −yj(1−y^j) )
- 第二项:( ∑ i ≠ j y i y ^ j = y ^ j ∑ i ≠ j y i \sum_{i \neq j} y_i \hat{y}_j = \hat{y}_j \sum_{i \neq j} y_i ∑i=jyiy^j=y^j∑i=jyi )
由于 ( y \mathbf{y} y ) 是 one-hot,假设 ( y k = 1 y_k = 1 yk=1 ),其他为 0: - 若 ( j = k j = k j=k ):( ∑ i ≠ j y i = 0 \sum_{i \neq j} y_i = 0 ∑i=jyi=0 )
∂ L C E ∂ z k = − 1 ⋅ ( 1 − y ^ k ) + 0 = y ^ k − 1 \frac{\partial L_{CE}}{\partial z_k} = -1 \cdot (1 - \hat{y}_k) + 0 = \hat{y}_k - 1 ∂zk∂LCE=−1⋅(1−y^k)+0=y^k−1 - 若 ( j ≠ k j \neq k j=k ):( y j = 0 y_j = 0 yj=0 )
∂ L C E ∂ z j = 0 ⋅ ( 1 − y ^ j ) + y ^ j ⋅ 1 = y ^ j \frac{\partial L_{CE}}{\partial z_j} = 0 \cdot (1 - \hat{y}_j) + \hat{y}_j \cdot 1 = \hat{y}_j ∂zj∂LCE=0⋅(1−y^j)+y^j⋅1=y^j
最终,多分类交叉熵的梯度为:
∂ L C E ∂ z j = y ^ j − y j \frac{\partial L_{CE}}{\partial z_j} = \hat{y}_j - y_j ∂zj∂LCE=y^j−yj
惊人地,这与二元交叉熵一致,表明 softmax + 交叉熵的梯度形式非常优雅。
梯度特性分析
- 与误差成正比:( y ^ j − y j \hat{y}_j - y_j y^j−yj ) 直接衡量预测概率与真实标签的偏差。
- 预测错误时的行为:
- 假设 ( y k = 1 y_k = 1 yk=1 ),( y ^ k → 0 \hat{y}_k \to 0 y^k→0 )(正确类别概率很低):
∂ L C E ∂ z k = 0 − 1 = − 1 \frac{\partial L_{CE}}{\partial z_k} = 0 - 1 = -1 ∂zk∂LCE=0−1=−1
梯度为 -1,推动 ( z k z_k zk ) 增加。 - 对于 ( j ≠ k j \neq k j=k ),若 ( y ^ j → 1 \hat{y}_j \to 1 y^j→1 )(错误类别概率很高):
∂ L C E ∂ z j = 1 − 0 = 1 \frac{\partial L_{CE}}{\partial z_j} = 1 - 0 = 1 ∂zj∂LCE=1−0=1
梯度为 1,推动 ( z j z_j zj ) 减小。
- 假设 ( y k = 1 y_k = 1 yk=1 ),( y ^ k → 0 \hat{y}_k \to 0 y^k→0 )(正确类别概率很低):
- 全局一致性:梯度对所有类别的调整是协同的,确保 ( ∑ j y ^ j = 1 \sum_{j} \hat{y}_j = 1 ∑jy^j=1 ) 的约束下,正确类别的概率上升,其他下降。
三、梯度特性比较与洞见
-
梯度大小与误差的直接关系
- 二元和多分类交叉熵的梯度均为 ( y ^ − y \hat{y} - y y^−y ) 或 ( y ^ j − y j \hat{y}_j - y_j y^j−yj ),与误差成正比,且不受 ( y ^ \hat{y} y^ ) 边界值的影响。这与 MSE 的 ( ( y ^ − y ) y ^ ( 1 − y ^ ) (\hat{y} - y) \hat{y} (1 - \hat{y}) (y^−y)y^(1−y^) ) 形成对比,后者在 ( y ^ → 0 \hat{y} \to 0 y^→0 ) 或 ( 1 1 1 ) 时梯度趋于 0。
-
错误预测时的强反馈
- 当预测严重错误时(如 ( y ^ → 0 \hat{y} \to 0 y^→0 ) 而 ( y = 1 y = 1 y=1 )),交叉熵梯度保持恒定(例如 -1),提供稳定的优化信号。这种特性源自对数损失的非线性惩罚,放大错误时的代价。
-
避免饱和
- 交叉熵的梯度推导中,sigmoid 或 softmax 的导数被巧妙抵消,使得梯度不依赖于 ( y ^ ( 1 − y ^ ) \hat{y} (1 - \hat{y}) y^(1−y^)) 这样的项。这避免了激活函数饱和时的梯度消失问题。
-
优化效率
- 梯度的简单形式(( y ^ − y \hat{y} - y y^−y ))计算成本低,且在深层网络中易于反向传播,确保快速收敛。
总结
二元交叉熵和多分类交叉熵的梯度推导均得出 ( ∂ L ∂ z = y ^ − y \frac{\partial L}{\partial z} = \hat{y} - y ∂z∂L=y^−y ),其特性在于与误差直接相关、在错误预测时提供大梯度、无饱和问题。这些特点使交叉熵非常适合分类任务,能够快速修正错误并推动模型收敛,而不像 MSE 那样因梯度消失而停滞。
后记
2025年3月21日21点18分于上海,在grok 3大模型辅助下完成。
相关文章:
MSE分类时梯度消失的问题详解和交叉熵损失的梯度推导
下面是MSE不适合分类任务的解释,包含梯度推导。以及交叉熵的梯度推导。 前文请移步笔者的另一篇博客:大模型训练为什么选择交叉熵损失(Cross-Entropy Loss):均方误差(MSE)和交叉熵损失的深入对比…...
docker 安装部署 canal
1 mysql 安装 1.1 拉取镜像 docker pull mysql:8.4.41.2 创建挂载目录 mkdir -p /user/lzl/tool/docker/mysql/mysql_8.4.4/home/confmkdir -p /user/lzl/tool/docker/mysql/mysql_8.4.4/home/datamkdir -p /user/lzl/tool/docker/mysql/mysql_8.4.4/home/log1.3 编辑配置文…...
flowable适配达梦7 (2.1)
经过第一版的问题解决,后端项目可以启动,前端页面也集成进去。 前端在流程设计页面报错 之后发现主要是组件中modelerStore这个值没有 解决方法:在data增加对象 给component/process/designer.vue 中涉及到的每个子组件传入 :modelerStore“modeler…...
优化 Docker 镜像 技巧
优化 Docker 镜像可以提高构建速度、减少镜像大小、提高安全性和效率。以下是一些优化 Docker 镜像的方法: 使用适当的基础镜像 选择合适的基础镜像可以减小镜像大小,并确保基础镜像的安全性和更新性。Alpine、Ubuntu Minimal 等轻量级基础镜像是常用选…...
Spring Boot框架中常用注解
以下是Spring Boot框架中常用注解的详细说明,包括名称、用途、用法、使用位置及扩展示例,按功能模块分类整理: 一、核心启动与配置注解 1. SpringBootApplication 用途:主启动类注解,整合了 Configuration、EnableAu…...
Linux笔记之Ubuntu22.04安装IBus中文输入法教程
Linux笔记之Ubuntu22.04安装IBus中文输入法教程 code review! 文章目录 Linux笔记之Ubuntu22.04安装IBus中文输入法教程安装 IBus 并配置中文输入法步骤 1: 安装 IBus 和拼音插件步骤 2: 设置 IBus 为默认输入法框架步骤 3: 重启会话步骤 4: 添加中文输入法步骤 5: …...
(UI自动化测试web端)第二篇:元素定位的方法_xpath属性定位
看代码里的【driver.find_element_by_xpath( )】()里的路径怎么写? xpath元素定位有多种写法,那我们现在说的就是在元素定位时,根据网页的实际情况来选择适合的xpath元素定位的写法。 文章主要介绍了xpath属性定位的方法和属性扩展使用的方法…...
Linux中执行 ifconfig 命令时提示 “未找到命令”
在 Linux 系统里,若执行 ifconfig 命令时提示 “未找到命令” 通常是由于系统没有安装 net-tools 包,或者该命令不在系统的 PATH 环境变量所包含的路径中 安装 net-tools 包 # Ubuntu/Debian sudo apt update sudo apt install net-tools# CentOS 7 及以…...
UE4学习笔记 FPS游戏制作15修正可以换枪中可以继续换枪和开火的Bug
现在存在的问题是换枪动作没完成时,可以继续换枪或者开枪 因为换枪这个动作是由玩家进行的,所以应该修改FppShooter脚本 我们添加两个参数 最后一次换枪的时间和换枪动画的长度 EquipmentLength 设置默认值0.6秒 添加一个新函数IsInEquip,返…...
SSL/TLS 和 SSH 介绍以及他们的区别
目录 SSL/TLS SSL/TLS工作原理的核心步骤握手阶段(Handshake Protocol)加密通信阶段(Encrypted Communication Phase)会话恢复(Session Resumption) SSH SSH 加密机制的核心步骤 SSH 和 SSL 区别 SSL/TLS …...
AudioTrack
AudioTrack是Android Audio系统提供给应用开发者(java/C)的API,用于操作音频播放的数据通路。MeidaPlayer在播放音乐时用到的是它,我们可以也可以直接使用AudioTrack进行音频播放。它是最基本的音频数据输出类。 AudioTrack.java…...
Windows安装Rust环境(详细教程)
一、 安装mingw64(C语言环境) Rust默认使用的C语言依赖Visual Studio,但该工具占用空间大安装也较为麻烦,可以选用轻便的mingw64包。 1.1 安装地址 (1) 下载地址1-GitHub:Releases niXman/mingw-builds-binaries GitHub (2) 下载地址2-W…...
监控IP,网站将异常情况通过飞书机器人发至指定群内
界面如下,丑是丑了点,但主打一个实用。 主要就是通过ping,就是一直在ping,当不通的时候,就根据你设置的报警时间,主要是利用飞书机器人来给飞书指定群里发异常信息报警。 直接上代码 import subprocess i…...
JVM 02
今天是2025/03/23 19:07 day 10 总路线请移步主页Java大纲相关文章 今天进行JVM 3,4 个模块的归纳 首先是JVM的相关内容概括的思维导图 3. 类加载机制 加载过程 加载(Loading) 通过类全限定名获取类的二进制字节流(如从JAR包、网络、动态…...
局域网设备访问虚拟机 挂载NFS
目录 引言:网络IP问题配置虚拟机网络有线网络:无线网络: NFS文件挂载服务端配置客户端连接 引言: 需求:局域网下树莓派设备想要访问电脑主机上的虚拟机。这样可以通过nfs挂载网络设备,有利于交叉编译环境调…...
零、ubuntu20.04 安装 anaconda
1.anaconda下载 地址:Index of /anaconda/archive/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 选择:Anaconda3-2023.07-2-Linux-x86_64.sh 2.anaconda安装 选择下载目录,选在在终端中打开,然后在终端输入安装命…...
IntelliJ IDEA 将 Spring Boot 项目远程部署到服务器
使用 IntelliJ IDEA 将 Spring Boot 项目远程部署到服务器的详细步骤,涵盖多种常见方法: 方法一:通过 SSH Maven 插件直接部署 1. 服务器环境准备 确保服务器已安装: Java 运行环境(与项目 JDK 版本一致࿰…...
利用dify打造命令行助手
利用dify打造命令行助手 前言 我是mac os 的使用者。 如果说macos哪个工具我使用最频繁,最能提高效率的工作工具非zsh莫属(当然,我安装了iterm)。前不久,我要扩容线上的k8s集群。便想统计一下每个node上运行的pod数量。我不知道合适的命令&…...
前端面试整理
一、csshtml 二、js 三、vue 四、react 1.React 类组件与函数式组件核心区别 定义方式的不同,类组件用ES6的class,继承React.Component,而函数式组件用函数声明。 状态管理方面,类组件用this.state和setState,函…...
Perl语言的计算机网络
Perl语言在计算机网络中的应用 引言 在计算机科学的众多领域中,网络编程是一个极具挑战性和广泛应用的领域。在这其中,Perl语言以其强大的文本处理能力和简洁的语法,成为了网络编程的重要工具之一。自从1987年Larry Wall创造Perl以来&#…...
数据结构初阶-二叉树的应用
1.单值二叉树 题目链接:https://leetcode.cn/problems/univalued-binary-tree/description/ 题目思路:我们把根结点与左孩子和右孩子进行比较,只有左右子树都是单值二叉树的时候才为单值二叉树。但是我们需要先返回的是false,最…...
【赵渝强老师】在Docker中运行达梦数据库
Docker是一个客户端服务器(Client-Server)架构。Docker客户端和Docker守护进程交流,而Docker的守护进程是运作Docker的核心,起着非常重要的作用(如构建、运行和分发Docker容器等)。达梦官方提供了DM 8在Doc…...
掌握C#循环:for、while、break与continue详解及游戏案例
Langchain系列文章目录 01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南 02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖 03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南 04-玩转 LangChai…...
备份比赛数据【算法赛】
0备份比赛数据【算法赛】 - 蓝桥云课 问题描述 蓝桥杯大赛的组委会最近遇到了一个棘手的问题。他们有 N 台电脑需要备份比赛数据,每台电脑所需的备份时间分别为 A1,A2,…,AN 分钟。 备份必须按编号顺序依次进行,即先第 1 台,再第 2 …...
【算法笔记】图论基础(二):最短路、判环、二分图
目录 最短路松弛操作Dijkstra朴素Dijkstra时间复杂度算法过程例题 堆优化Dijkstra时间按复杂度算法过程例题 bellman-ford时间复杂度为什么dijkstra不能处理负权边?dijkstra的三个步骤:反例失效的原因 算法过程例题 spfa时间复杂度算法过程例题spfa求最短…...
【性能优化点滴】odygrd/quill 中一个简单的标记位作用--降低 IO 次数
在 StreamSink 类中,成员变量 _write_occurred 的作用是 跟踪自上次刷新(Flush)以来是否有写入操作发生,其核心目的是 优化 I/O 性能。以下是详细解析: _write_occurred 的作用 1. 避免不必要的刷新(Flush…...
Unity2022发布Webgl2微信小游戏部分真机黑屏
复现规律: Unity PlayerSetting中取消勾选ShowSplashScreen 分析: 在Unity中,Splash Screen(启动画面) 不仅是视觉上的加载动画,还承担了关键的引擎初始化、资源预加载和渲染环境准备等底层逻辑。禁用后导…...
TDengine 3.3.2.0 集群报错 Post “http://buildkitsandbox:6041/rest/sql“
原因: 初始化时处于内网环境下,Post “http://buildkitsandbox:6041/rest/sql“ 无法访问 修复: vi /etc/hosts将buildkitsandbox映射为本机节点 外网环境下初始化时没有该问题...
基于yolov11的中空圆柱形缺陷检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面
【背景介绍】 中空圆柱形缺陷检测在多个领域具有深远意义。在石油、天然气及化工行业,缺陷检测可预防泄漏事故,避免火灾、爆炸及环境污染,保障人员与财产安全。建筑、桥梁及航空航天领域则依赖此技术确保中空圆柱形结构的稳定性,…...
Python爬虫-爬取AliExpress商品搜索词排名数据
前言 本文是该专栏的第49篇,后面会持续分享python爬虫干货知识,记得关注。 本文,笔者以AliExpress平台为例。基于Python爬虫,通过某个指定的“搜索关键词”,批量获取该“搜索关键词”的商品排名数据。 具体实现思路和详细逻辑,笔者将在正文结合完整代码进行详细介绍。废…...
20250321在荣品的PRO-RK3566开发板的buildroot系统下使用ll命令【直接编译进IMG】
./buildroot/system/skeleton/etc/profile # some more ls aliases alias llls -alF alias lals -A alias lls -CF 20250321在荣品的PRO-RK3566开发板的buildroot系统下使用ll命令【直接编译进IMG】 2025/3/21 16:53 cd /etc/ echo "" >> # some more ls ali…...
Flink 自定义数据源:从理论到实践的全方位指南
目录 第一章:自定义数据源的基础概念 数据源是什么?它在 Flink 中扮演什么角色? Flink 的内置数据源:开箱即用的 “标配” 为什么需要自定义数据源?它的杀手锏在哪? 第二章:自定义数据源的实现之道 接口选择:从简单到高级,选对工具事半功倍 SourceFunction:入门…...
如何在 Java 中查找 PDF 页面大小(教程)
PDF 文件并未被 Java 直接支持。本教程将向您展示如何使用 JPedal Java PDF 库 以简单的步骤提取 PDF 文件的页面大小(高度和宽度)。页面大小可以以 厘米、英寸或像素 为单位获取。 为什么要使用第三方库处理 PDF 文件? PDF 文件是一种复杂…...
java版嘎嘎快充玉阳软件互联互通中电联云快充协议充电桩铁塔协议汽车单车一体充电系统源码uniapp
演示: 微信小程序:嘎嘎快充 http://server.s34.cn:1888/ 系统管理员 admin/123456 运营管理员 yyadmin/Yyadmin2024 运营商 operator/operator2024 系统特色: 多商户、汽车单车一体、互联互通、移动管理端(开发中) 另…...
使用Mastra.ai构建AI智能体:一次动手实践
Mastra框架提供了一种简洁高效的AI智能体构建方式。 本文将分享我使用Mastra.ai的实践经历。 我们将逐步完成环境搭建、探索框架核心功能,并构建一个能与工具交互的基础智能体。 过程中我会总结成功经验、遇到的问题以及收获的启示。 如果你对AI开发感兴趣,或正在寻找一个…...
Redis之大key问题
BigKey 常见面试题目 你会么? MoreKey 案例 大批量往redis里面插入2000W测试数据key Linux Bash下面执行,批量插入100W for((i1;i<100*10000;i)); do echo "set k$i v$i" >> /tmp/redisTest.txt ;done;生成100W条redis批量设置kv的…...
Excel第41套全国人口普查
2. 导入网页中的表格:数据-现有链接-考生文件夹:网页-找到表格-点击→变为√-导入删除外部链接关系:数据-点击链接-选中连接-删除-确定(套用表格格式-也会是删除外部链接)数值缩小10000倍(除以10000即可&am…...
深度学习驱动的车牌识别:技术演进与未来挑战
一、引言 1.1 研究背景 在当今社会,智能交通系统的发展日益重要,而车牌识别作为其关键组成部分,发挥着至关重要的作用。车牌识别技术广泛应用于交通管理、停车场管理、安防监控等领域。在交通管理中,它可以用于车辆识别、交通违…...
PageHiOffice网页组件(WebOffice文档控件)开发集成技巧专题一
PageHiOffice网页组件作为最新一代的WebOffice文档控件,这是目前市场上唯一能做到在Chrome等最新版浏览器中实现内嵌网页运行的商用文档控件,是OA及ERP等系统处理各种文档的福音。从发布到完善已经超过3年,不管是功能性还是稳定性都已经有了长…...
A2 最佳学习方法
记录自己想法的最好理由是发现自己的想法,并将其组织成可传播的形式 (The best reason for recording what one thinks is to discover what one thinks and to organize it in transmittable form.) Prof Ackoff 经验之谈: 做培训或者写文章ÿ…...
从JVM底层揭开Java方法重载与重写的面纱:原理、区别与高频面试题突破
🌟引言:一场由方法调用引发的"血案" 2018年,某电商平台在"双十一"大促期间遭遇严重系统故障。 技术团队排查发现,问题根源竟是一个继承体系中的方法重写未被正确处理,导致订单金额计算出现指数级…...
线程控制与线程操作
目录 线程的创建 tid pthread_self() 线程的退出 pthread_join 传参问题和返回值问题 pthread_exit 线程取消 线程分离 我们来学习线程的控制与线程操作 线程的创建 我们之前在线程的概念中就讲过了,我们可以通过pthread_create来创建一个或者多个子线程…...
Spring相关API
1是相对路径 2 是绝对路径 3 在注解时使用...
【GoLang】调用llm时提示词prompt的介绍以及使用方式
介绍 提示词是一种与大模型交互的对话格式,它以 JSON 格式定义了一个消息列表(messages),包含了系统消息和用户消息。 我们向AI提问时,其实发给AI的都是提示词,别看我们只是简单输入了一句话,…...
[杂学笔记]锁为什么影响效率、I/O多路复用、三种I/O多路复用模型的区别、atomic原子操作类、MySQL的持久性是如何实现的
目录 1.锁为什么影响效率 2.I./O多路复用 3.三种I/O多路复用模型的区别 4.atomic原子操作类 介绍 常用函数 内存顺序含义 5.MySQL持久性的实现 1.锁为什么影响效率 线程阻塞与上下文切换:在多线程并发访问的场景下,只有一个线程能够进入临界区…...
AI Agent开发大全第八课-Stable Diffusion 3的本地安装全步骤
前言 就像我们前面几课所述,本系列是一门体系化的教学,它不像网上很多个别存在的单篇博客走“吃快餐”模式,而是从扎实的基础来带领大家一步步迈向AI开发高手。所以我们的AI课程设置是相当全面的,除了有牢固的基础知识外还有外面互联网上也搜不到的生产级实战。 前面讲过…...
Leetcode 刷题笔记 图论part05
卡码网 107 寻找存在的路径 初识并查集 并查集功能: 寻找根节点,函数: find(int u),也就是判断这个节点的祖先节点是哪个将两个节点接入到同一个集合,函数: join(int u, int v),将两个节点连在同一个根节点上判断两…...
NSSRound(持续更新)
了解过PHP特性吗 这个题相当于是php特性大杂烩 先看源代码 <?php error_reporting(0); highlight_file(__FILE__); include("rce.php"); $checker_1 FALSE; $checker_2 FALSE; $checker_3 FALSE; $checker_4 FALSE; $num $_GET[num]; if (preg_match(&qu…...
Python虚拟环境:从入门到实战指南
目录 一、为什么需要Python虚拟环境? 二、如何创建Python虚拟环境? 1. 使用venv(Python 3.3内置) 2. 使用virtualenv(第三方工具) 3. 使用conda(适合数据科学项目) 三、虚拟环…...
Python实现小红书app版爬虫
简介:由于数据需求的日益增大,小红书网页版已经不能满足我们日常工作的需求,为此,小编特地开发了小红书手机版算法,方便大家获取更多的数据,提升工作效率。 手机版接口主要包括:搜素࿰…...