梯度下降伪代码 #
梯度下降可以优化损失函数的值,使其尽量小,即可找到最好(在数据集上拟合效果最好)的模型参数。现在假设模型 $f$ 中只有一个参数 $w$ ,则损失函数为 $L(f) = L(w)$ ,梯度下降算法如下(若模型有多个参数,按相同方法更新各方法)
- 初始化参数:随机选取一个 $w_0$ ($w_0$ 并不一定是随机选取)
- 计算梯度 $\frac{dL(f)}{dw}$ ,如果小于0,此时 $w$ 增大则 $L(f)$ 会减小;如果大于0,此时 $w$ 增大则 $L(w)$ 会减小。如果模型有多个参数,则计算损失函数在各个参数方向上的偏导数。
- 更新模型参数 $w_1=w_0-lr\frac{dL(f)}{dw}$ ,$w$ 的变化量取决于梯度和学习率(Learning Rate)的大小:梯度绝对值或学习率越大,则 $w$ 变化量越大。如果模型有多个参数,则用上一步计算出的偏导数对应更新各参数。
- 重复第2步和第3步。经过多次参数更新/迭代(iteration),可以使损失函数的值达到局部最小(即局部最优,Local Optimal),但不一定是全局最优。
自适应学习率(Adaptive Learning Rate) #
梯度下降的过程中,固定学习率并不合理。学习率太大,可能导致loss不减小反而增大;学习率太小,loss会减小得很慢。基本原则是随着参数迭代更新,学习率应该越来越小,比如 $\eta_t = \frac{\eta}{\sqrt{t+1}}$ 。更好的办法是每个参数都有各自的学习率,比如Adagrad。
Adagrad #
Adaptive Gradient Descent,自适应梯度下降。2011年提出,核心是每个参数(parameter)有不同的学习率。每次迭代中,学习率要除以它对应参数的之前梯度的均方根(RMS),即 $w_{t+1} = w_t-\frac{\eta}{\sqrt{\sum_{i=0}^{t}{(g_t)^2}}}g_t$ ,其中 $t$ 是迭代次数,$w$ 是参数,$g$ 是梯度,$\eta$ 是初始学习率。随着参数迭代,$t$ 越来越大,$\sqrt{\sum_{i=0}^{t}{(g_t)^2}}$ 也越来越大,因此学习率的变化趋势是越来越小。
Adagrad的矛盾(Contradiction) #
一般的梯度下降方法中 $w_{t+1}=w_t-\eta_tg_t$ ,其中 $\eta_t$ 是常数,梯度越大时,则参数更新的步幅越大,这是由 $g_t$ 项决定的。在Adagrad中,$\eta$ 是常量,梯度 $g_t$ 越大时,会使得参数更新的步幅越大,但 $\sqrt{\sum_{i=0}^{t}{(g_t)^2}}$ 越大会使得参数更新的步幅越小,这是一个矛盾吗?
为什么要除以之前的梯度的均方根?
- 一种直观的解释:增强参数更新步幅变化的惯性。与之前梯度相比如果现在的梯度更大,则现在梯度除以之前的梯度会使参数更新的步幅更大;如果现在的梯度更小,则会使步幅更新的步幅更小。这样就相当于增强了参数更新步幅变化的惯性,即如果参数更新的步幅突然变大或变小,就扩大这个趋势。
- 同时考虑一次梯度和二次梯度:在Adagrad中,之前梯度的均方根是用来通过一次梯度估计二次梯度(虽然可以直接使用二次梯度,但其很难计算)
- 只考虑一个参数:当参数只有一个或只考虑一个参数时,梯度越大,离最优点就越远,参数更新的步幅应该越大。
- 考虑多个参数:当参数由多个参数时,上述内容不一定成立。如果参数1的梯度比参数2的梯度大,但如果损失函数关于参数1的曲线比关于参数2的曲线更陡峭(即二次梯度更大),那参数1离最优点的距离可能比参数2更近。所以当参数有多个或者考虑多个参数时,我们既要考虑一次梯度又要考虑二次梯度。结论是一次梯度越大、二次梯度越小,离最优点就越远,参数更新的步幅应该越大。
SGD #
Stochastic Gradient Descent,随机梯度下降,1847年提出,可以让训练过程更快。普通梯度下降中需要计算所有样本的Loss,二SGD只计算一个样本的Loss,然后进行梯度下降。
梯度下降的数学理论 #
- 初始化一组参数后,我们找到领域中另一个使损失函数最小的一组参数并更新参数(然后不断重复这一步骤)。
- 在极小的邻域中,可以利用泰勒级数将损失函数简化,然后求其最小值,损失函数简化后,要使其最小即是让其中两个向量的内积最小,由此可以得出新的一组参数的值(具体过程略),这就是梯度下降算法。
- 学习率的作用是限制邻域大小,学习率太大可能使邻域太大,导致损失函数展开程泰勒级数时的误差较大。
- 当然也可以将损失函数展开成2次(比如牛顿迭代式),但这并不实用,因为要计算二次微分,甚至可能要求除海森矩阵(Hessian Matrix)逆矩阵等等,这些在做深度学习时是不实用的。
梯度下降的局限性 #
梯度下降过程中,每次参数更新不一定都会使损失函数的值更小。求出的知识局部最小值(Local Minima)甚至是鞍点(Saddle Point),不一定是全局最优解。