交叉熵导数,第5部分:使用反向传播优化偏置
Source: Dev.to

在上一篇文章中,我们计算了交叉熵损失的导数。
在本文中,我们开始使用反向传播来优化偏置项 (b_3)。
设置初始偏置
我们首先将偏置 (b_3) 固定为初始值:
[ b_3 = -2 ]
为了验证反向传播确实改进了模型,我们首先计算在该 (b_3) 值下训练数据的总交叉熵。
使用的偏置值

我们保持
[ b_3 = -2 ]
前向传播计算
对于单个输入示例,我们按如下方式计算中间值。
上层节点

下层节点

原始输出值

Softmax 概率

每个样本的交叉熵损失
| 花瓣 | 萼片 | 物种 | (p) | 交叉熵 |
|---|---|---|---|---|
| 0.04 | 0.42 | Setosa | 0.15 | 1.89 |
| 1.00 | 0.54 | Virginica | 0.71 | 0.35 |
| 0.50 | 0.37 | Versicolor | 0.65 | 0.43 |
当 (b_3 = -2) 时,总交叉熵为
[ \text{Total CE} = 2.67 ]
可视化损失曲线
我们可以通过在 x 轴上绘制 (b_3),在 y 轴上绘制总交叉熵,来直观地观察总交叉熵随不同 (b_3) 值的变化。对大量 (b_3) 值进行评估会得到一条平滑的粉色曲线,并且有一个明显的最小值。
生成图形的 Python 代码
import numpy as np
import matplotlib.pyplot as plt
def relu(x):
return np.maximum(0, x)
def softmax(raws):
exp_vals = np.exp(raws)
return exp_vals / np.sum(exp_vals)
# 固定的偏置
b1 = 1.6
b2 = 0.7
b4 = 0
b5 = 1
# 示例训练数据: (花瓣长度, 萼片长度, 真实类别)
data = [
(0.04, 0.42, 0), # Setosa
(1.00, 0.54, 2), # Virginica
(0.50, 0.37, 1), # Versicolor
]
def total_cross_entropy(b3):
total_ce = 0.0
for petal, sepal, target in data:
upper = petal * -2.5 + sepal * 0.6 + b1
bottom = petal * -1.5 + sepal * 0.4 + b2
raw_setosa = relu(upper) * -0.1 + relu(bottom) * 1.5 + b3
raw_versi = relu(upper) * 2.4 + relu(bottom) * -5.2 + b4
raw_virg = relu(upper) * -2.2 + relu(bottom) * 3.7 + b5
probs = softmax([raw_setosa, raw_versi, raw_virg])
total_ce += -np.log(probs[target])
return total_ce
b3_values = np.linspace(-6, 4, 200)
losses = [total_cross_entropy(b3) for b3 in b3_values]
plt.plot(b3_values, losses, color="pink")
plt.xlabel("b₃")
plt.ylabel("Total Cross Entropy")
plt.title("Cross Entropy vs b₃")
plt.show()

该图展示了粉色曲线;最低点对应的 (b_3) 值即为使总交叉熵最小的值。
接下来是什么?
在文章的下一部分,我们将使用反向传播将 (b_3) 向该最小值移动,并一步步更新它。
寻找更简便的方式来安装工具、库或整个仓库吗?
尝试 Installerpedia —— 一个社区驱动的结构化安装程序。
安装平台,让您几乎可以安装任何东西,且 操作简便、指导清晰可靠。
只需运行:
ipm install repo-name
… 完成! 🚀
