课程的第二节讲的是线性回归中使用梯度下降时需要注意的点。
Tip 1: Tuning your learning rates
从上图也可以看出来,学习率对于在gradient descent时的影响还是蛮大的,所以在迭代过程中最理想的学习率可以在距离global minima远的地方大一些距离近的时候小一些,遇到local minima的时候可以有动量去跳过去……
Adgrad
课程中首先介绍了Adgrad,引入Adgrad后公式变为:
w
t
+
1
←
w
t
−
η
∑
i
=
0
t
(
g
i
)
2
g
t
w^{t+1} \leftarrow w^t - \frac{\eta}{\sqrt{\sum_{i=0}^t (g^i)^2}} g^t
wt+1←wt−∑i=0t(gi)2ηgt
为什么要在学习率中引入均方根和呢?
引入想要解决的问题是不同参数上梯度的“陡峭程度”是不同的,如果使用相同的learning rate可能会使得不同参数迭代快慢不同,这会使得整体迭代效率变低(红色路径为现在,黑色为理想):
然后如何解决呢?首先想到的解决方法便是使迭代速度快的稍慢些,实现这一方法最简单的便是除以表示迭代速度快慢的二阶导数来控制,如下图:
但是随之而来的问题是,上图中可以求解二阶导数然后作为分母,但是在实际中很多模型是十分复杂的,很难去求解二阶导数,这时候该怎么办呢?
Adgrad想到利用一阶导数的平方之和开根号,为什么呢?
从上面PPT可以看出来平方和的大小也是可以间接的反应一阶导数的“陡峭程度”。
Adam
Adgrad有两个问题:
- 因为分母使用累加,梯度变化明显的点对于之后的迭代影响会一直很大,但我们知道这是不合理的,一个一阶导比较大的点和距离他比较远的点之间的关联并不大;
- 因为存在local minima,理想的迭代算法是可以近可能地跨过local minima。
针对这两个问题,Adam算法进行了相应的优化,伪代码见下:
其中针对第一个问题的优化是:
m
t
←
β
1
⋅
m
t
−
1
+
(
1
−
β
1
)
⋅
g
t
m_t \leftarrow \beta_1 \cdot m_{t-1} + (1-\beta_1)\cdot g_t
mt←β1⋅mt−1+(1−β1)⋅gt ,乘以一个小于1的系数后才进行累加,这样保证了其对于后续运算的影响是逐渐递减的。
针对第二个问题的优化是:
v
t
←
β
2
⋅
v
t
−
1
+
(
1
−
β
2
)
⋅
g
t
v_t \leftarrow \beta_2\cdot v_{t-1}+(1-\beta_2)\cdot g_t
vt←β2⋅vt−1+(1−β2)⋅gt,这里其实是引入了动量概念,使得在到达local minima时分子并不会迅速降为零,有了跳出local minima的可能。
Adam算法比较成熟,在大多数场合也是很有效的,所以课程中李老师推荐训练模型时优先考虑使用Adam算法进行迭代。
Tip2: Stochastic Gradient Descent
在之前的训练过程中,是使用所有的样本集进行训练,这个过程比较慢,所以李老师在课程中建议使用Stochastic Gradient Descent来进行训练:
简单说这就是对每一个样本求得Loss Function后直接进行参数更新,而不是传统的计算全部Loss Function之后累加求解,我记得现在使用更多的是将样本集分割为几份,然后每一份计算Loss Function后更新参数。
Tip3: Feature Scaling
归一化(?)主要是对样本集中不同特征的尺度进行规范,这样做的目的和Adgrad是类似的。
实际操作也是比较简单的,就是减去均值后除以方差: