我有一个只有一个神经元的最大简单神经网络,我不明白
derivative
变量的定义从何而来。我知道它是导数,给了我函数的“斜率”,但为什么是input * clear_error
?我们找到了哪个原始函数的导数,为什么是那个?
weight = 10
goal = 12.9
input = 9
alpha = 0.01
for i in range(20):
prediction = weight * input
clear_error = prediction - goal
sq_error = (prediction - goal) ** 2
derivative = input * clear_error
weight = weight - (derivative * alpha)
print(f"Error: {sq_error}; Prediction: {prediction}")
写权重为
w
,输入为x
,目标为g
,损失函数(即代码中的sq_error
)为l
.
然后:
l = (wx - g) ** 2
反向传播我们需要的是损失函数相对于权重的梯度,即
dl / dw = 2x(w-x)
...相当于
2 * input * clear_error
.
所以代码中的导数实际上是实际梯度的一半,但是被常数因子超出并不重要(无论如何你正在按 alpha 缩放梯度)。
如果你想进一步分解导数的计算:
写
u = wx - g
使得l = u**2
所以
du / dw = x
和dl / du = 2u
然后
dl / dw = (dl / du) (du / dw)
(链式规则)
即
dl / dw = 2ux = 2x(wx - g)
dl / dw = 2 * input * clear_error
就代码中的变量而言。
所以
derivative
等同于(dl / dw) / 2
.