交叉熵损失的导数是什么
时间: 2025-01-08 11:07:54 浏览: 3
### 交叉熵损失函数及其导数公式的数学推导
在深度学习中,当采用sigmoid作为激活函数时,在|Z|较大情况下其导数值较小,导致模型容易进入饱和区,从而减缓了学习速度[^1]。为了克服这一问题并简化梯度计算过程,引入了交叉熵损失函数。
对于二分类问题中的单个样本而言,假设预测概率为 \( a \),真实标签为 \( y \in {0, 1} \),那么对应的交叉熵损失函数定义如下:
\[ L(a,y) = -y\log(a)-(1-y)\log(1-a) \]
接着考虑权重参数 \( w \) 对于该损失的影响程度,即求解关于 \( w \) 的偏导数。由于输出层的线性组合形式通常写作 \( z=w^Tx+b \),而经过Sigmoid变换后的结果记作 \( a=\sigma(z) \),因此有:
\[ \frac{\partial L}{\partial w_j}=-(y/a+(1-y)/(1-a))\cdot\frac{\partial a}{\partial z}\cdot x_j=-(y/(a)+(1-y)/(1-a))\cdot a(1-a)x_j=(a-y)x_j \]
这里利用到了 Sigmoid 函数自身的性质:\( \sigma'(z)=\sigma(z)(1-\sigma(z)) \)。最终得出的结果正是所希望的形式——去除了激活函数导数部分的影响,仅保留了误差项与输入特征之间的简单乘法关系。
```python
import numpy as np
def sigmoid(z):
return 1 / (1 + np.exp(-z))
def cross_entropy_derivative(a, y, x):
"""
计算交叉熵损失相对于权值w的导数
参数:
a : float or array-like of shape (n_samples,)
预测的概率值
y : int or array-like of shape (n_samples,)
实际类别标签(取值范围应为{0, 1})
x : array-like of shape (n_features,) 或者 (n_samples, n_features)
输入数据
返回:
dL_dw : ndarray of same shape as `x`
权重更新方向向量
"""
error_term = a - y
if isinstance(error_term, (int, float)):
return error_term * x
elif len(x.shape)==1 and len(y.shape)==1: # 单一样本情况下的处理
return error_term.reshape((-1, 1)).dot(x.reshape((1,-1))).flatten()
else: # 批次训练的情况
return np.dot(error_term.T, x).T
```
通过上述分析可以看出,使用交叉熵损失不仅能够有效缓解因激活函数带来的梯度消失现象,而且还能让反向传播过程中涉及的微分运算更加简洁高效。
阅读全文