什么是梯度下降?
在解释随机梯度下降(SGD)之前,让我们首先描述什么是梯度下降。梯度下降是机器学习和深度学习中一种流行的优化技术,它可以与大多数(即使不是全部)学习算法一起使用。梯度是函数的斜率。它测量变量响应于另一个变量的变化的程度。从数学上讲,梯度下降是一个凸函数,其输出是其输入的一组参数的偏导数。梯度越大,斜率越陡。
从初始值开始,迭代运行Gradient Descent,以找到参数的最佳值,以找到给定成本函数的最小可能值。
梯度下降的类型:
通常,有三种类型的梯度下降:
- 批次梯度下降
- 随机梯度下降
- 小批量梯度下降
在本文中,我们将讨论随机梯度下降或SGD。
随机梯度下降(SGD):
“随机”一词是指与随机概率相关的系统或过程。因此,在随机梯度下降中,随机选择一些样本,而不是每次迭代的整个数据集。在“梯度下降”中,有一个称为“批处理”的术语,表示来自数据集的样本总数,该总数用于计算每次迭代的梯度。在典型的“梯度下降”优化中,例如“批次梯度下降”,该批次被视为整个数据集。尽管使用整个数据集对于以较少的噪声和较少的随机性达到极小值确实很有用,但是当我们的数据集变大时就会出现问题。
假设您的数据集中有一百万个样本,因此,如果您使用典型的Gradient Descent优化技术,则必须在执行Gradient Descent时使用全部一百万个样本来完成一次迭代,并且必须为每次迭代,直到达到最小值。因此,执行起来在计算上变得非常昂贵。
通过随机梯度下降解决了这个问题。在SGD中,它仅使用单个样本(即,批大小为1)来执行每次迭代。样本随机混洗并选择用于执行迭代。
SGD算法:
因此,在SGD中,我们在每次迭代中找到单个示例的成本函数的梯度,而不是所有示例的成本函数的梯度之和。
在SGD中,由于每次迭代仅从数据集中随机选择一个样本,因此该算法达到最小值的路径通常比典型的Gradient Descent算法更嘈杂。但这没什么大不了的,因为只要我们达到最小值并且训练时间显着缩短,算法所采用的路径就没有关系。
批次梯度下降所采用的路径–
随机梯度下降所采取的路径–
需要注意的一件事是,由于SGD通常比典型的Gradient Descent噪声更大,因此由于其下降的随机性,通常需要花费更多的迭代次数才能达到最小值。尽管与典型的Gradient Descent相比,它需要更多的迭代次数才能达到最小值,但在计算上仍比典型的Gradient Descent便宜得多。因此,在大多数情况下,SGD优先于批次梯度下降,以优化学习算法。
PythonSGD的伪代码:
def SGD(f, theta0, alpha, num_iters):
"""
Arguments:
f -- the function to optimize, it takes a single argument
and yield two outputs, a cost and the gradient
with respect to the arguments
theta0 -- the initial point to start SGD from
num_iters -- total iterations to run SGD for
Return:
theta -- the parameter value after SGD finishes
"""
start_iter = 0
theta = theta0
for iter in xrange(start_iter + 1, num_iters + 1):
_, grad = f(theta)
# there is NO dot product ! return theta
theta = theta - (alpha * grad)
取值并根据不同的参数进行调整以减少损失函数的这种循环称为反向传播。