神经网络的“引擎”:基于梯度的优化

训练循环(training loop)

1、抽取训练样本 x 和对应的目标 y 组成的数据批量;
2、在 x 上运行网络[这一步叫前向传播(forward pass)],得到预测值 y_pred;
3、计算网络在这批数据上的损失,用于衡量 y_pred 和 y 之间的距离;
4、更新网络所有权重,使网络在这批数据上的损失略微下降。

导数

导数完全描述了改变 x 后 f(x) 如何变化,如果想要减小 f(x) 的值,只需将 x 沿着导数的反方向移动一小步。

张量运算的导数:梯度(gradient)

单变量函数 f(x) 的导数可以看作函数 f 曲线的斜率。同样,gradient(f)(w0) 是函数 f(w) = loss_value 在 w0 的导数,可以看做 f(w) 在 w0 附近曲率(curvature)的张量。也可以通过将 w 向梯度的反方向移动来减小 f(w)。如:w1 = w0 - step * gradient(f)(w0)。

随机梯度下降

1、抽取训练样本 x 和对应目标 y 组成的数据批量;
2、在 x 上运行网络,得到预测值 y_pred;
3、计算网络在这批数据上的损失,用于衡量 y_pred 和 y之间的距离;
4、计算损失相对于网络参数的梯度[ 一次反向传播(backward pass) ];
5、将参数沿着梯度的反方向移动一点,比如 w -= step * gradient,从而使这批数据上的损失减小一点。

这种方法叫小批量随机梯度下降(mini-batch stochastic gradient descent),又称小批量 SGD。小批量 SGD 的一个变体是每次迭代只抽取一个样本和目标(而不是抽取一批数据),这叫真 SGD;另一种极端是,没次迭代都在所有数据上运行,叫作批量 SGD ,批量 SGD 会使更新更准确,但计算代价也会高很多。正确的做法是两个极端之间有效的折中,选择合适批量大小。
此外,SGD 还有多种变体,这些变体不仅考虑当前的梯度值,还要考虑上一次的权重更新。如带动量的 SGD、Adagrad、RMSProp 等。其中,动量解决了 SGD 收敛速度和局部极小点的问题。

链式求导:反向传播算法(backpropagation)

反向传播从最终损失值开始,从最顶层反向作用至最底层,利用链式法则计算每个参数对损失值的贡献大小。

你可能感兴趣的:(神经网络的“引擎”:基于梯度的优化)