我想在最简单的函数示例中了解 SGD 和 GD 之间的区别:y=x**2
GD的功能在这里:
def gradient_descent(
gradient, start, learn_rate, n_iter=50, tolerance=1e-06
):
vector = start
for _ in range(n_iter):
diff = -learn_rate * gradient(vector)
if np.all(np.abs(diff) <= tolerance):
break
vector += diff
return vector
为了找到 x**2 函数的最小值,我们接下来应该做(答案几乎是 0,这是正确的):
gradient_descent(gradient=lambda v: 2 * x, start=10.0, learn_rate=0.2)
我的理解是,在经典 GD 中,梯度是从所有数据点精确计算出来的。我上面展示的实现中的“所有数据点”是什么?
更进一步,我们应该如何对这个函数进行现代化改造,以便将其称为 SGD(SGD 使用单个数据点来计算梯度。gradient_descent
函数中的“单个点”在哪里?)