一、Adagrad简介
Adagrad (Adaptive Gradient) 是一种优化算法,它在梯度下降 (Gradient Descent) 优化算法的基础上进行了改进。与传统的梯度下降算法对所有参数使用相同的学习率相比,Adagrad 算法根据参数的历史梯度信息为每个参数分配不同的学习率。
Adagrad 算法都是针对每个维度分别进行的学习率和参数更新。在梯度 $g$ 非常稀疏时,Adagrad 可能会过分放大稀疏维度的学习率,产生不好的更新。为了解决这个问题,可以尝试使用RMSprop或Adam算法。
二、Adagrad的工作原理
Adagrad算法的思路是为了让这些被更新的参数,其生成的梯度加权和方差更接近于1,即是让学习率为可自适应的。Adagrad算法的公式如下:
cache += gradient ** 2
theta -= learning_rate * gradient / (np.sqrt(cache) + epsilon)
在上述算法中,$cache$ 数组是一个累加参数梯度平方的历史记录。在每个时间步长 $t$,参数向量 $f$ 的 $i$ 个维度上的梯度是 $g_{t, i}$。然后将 $g_{t, i}$ 平方并将其添加到 $cache_{t,i}$ 中。
既然掌握了$cache$ , 那么接下来,我们需要计算在每一个轮次下t时刻得到的$gradient$(梯度)的调整值,以输入到参数theta。这里引用一个公式, 参数theta的调整值就等于使用学习率除以参数梯度平方与一个负数偏移量的平方根的乘积,也就是:
theta -= learning_rate * gradient / (np.sqrt(cache) + epsilon)
学习率是一个常数,在这里,我们将其保留为变量$learning rate$。缩放参数是由平方根项给出的,它反映了过去梯度值变化的历史。这个数学方程可以让我们创建一个学习率,它可根据已经计算的梯度的平均值进行自适应。为了避免除以零的错误,公式中使用了一个 $\epsilon$ 方差的绝对值偏移量,通常将其设置为 $1e-8$。
三、Adagrad的实现
实现Adagrad算法,我们需要拥有许多项目依赖项,诸如NumPy、Matplotlib,还有其他一些用于绘制 loss 和被训练的model的包。下面是一份可用于训练神经网络的Adagrad优化器的完整代码,该代码使用 Python 和的MXNet库:
import mxnet as mx
# 运行Adagrad优化器
def adagrad(d, g, theta, learning_rate = 0.01, epsilon = 1e-8):
# 梯度平方和历史的累加和,
# 每一个维度上更新步伐随着时间变化
# 标量值epsilon是为了处理亏数
cache = 0
cache += g**2 %>%
# 更新权重
theta -= learning_rate * g / (mx.nd.sqrt(cache) + epsilon)
return theta
四、Adagrad的优缺点
优点:
1. 在小批量和遭遇非常稀疏的数据集的情况下, Adagrad 很有用。在这些情况下, Adagrad 可以分配不同的权重来模型的一部分输入特征
2. Adagrad 非常易于使用,唯一需要调整的参数是 $learning rate$,可以通过交叉验证获得最佳参数。
缺点:
1. AdaGrad 算法的学习率在训练过程中会不断减小,因此可能会导致算法提前收敛。在某些情况下,学习率会减小到如此小的程度,以至于模型不再学习。这通常被称为“过早停止”(early stopping)问题。
2. 当循环次数增加时,更新很慢,因为 $epsilon$ 会使所有学习率变得很小
五、总结
Adagrad 优化算法是优化神经网络的重要工具。借助Adagrad算法可以更好地使用神经网络来进行预测,而且特别适用于稀疏数据。Adagrad 具有良好的收敛速度,易于使用,但缺点是需要掌控好参数设置,防止出现过早停止的问题。
通过学习并掌握Adagrad算法的工作原理和代码实现方法,应该可以为更好地使用Adagrad优化算法的神经网络带来更多的便利。