1.参数调整
之前提到的SGD-Momentum(动量), NAG等算法,都是针对梯度的方向做相关优化,而且使用的都是一阶动量。而神经网络有许多超参数(Hyper-Parameter),这些超参数的选择也是模型选择调优的一项重要工作,因此很多算法工程师也自己戏谑为"调参工程师"或者"调包侠",就可以看出参数的重要性。
在经典的梯度下降中,不同的变量,采用的是一个全局的学习率。但是实际情况中,不同的变量对于目标函数的依赖不同。举个简单的例子,对于有些参数,因为特征出现次数多属于稠密特征,可能在训练开始不就以后就收敛达到极值。但是对于有些参数来说,可能需要训练很长时间才能达到收敛,因此不同的参数其实需要不同的学习率。
神经网络中的超参数主要有以下几种:
1.学习率(Learning Rate)
2.初始权重(Weight Initialization)
3.网络层数(Layers)
4.神经元数量(Units)
5.正则化参数(Regularizer|Normalization)
SGD-M, NAG等算法,并没有针对上述超参数进行优化。而2010年Duchi et.al 则推出AdaGrad,自适应来调整学习率。
2.算法流程
假定初始参数为 θ \theta θ, 初始全局学习率 ϵ \epsilon ϵ,小常数 δ \delta δ主要为了数值计算稳定,一般可以取 1 0 − 7 10^{-7} 10−7
算法步骤:
初始化梯度历史累积
r
=
0
r=0
r=0
如果不满足终止条件,如下步骤循环:
1.从训练集中采样m个样本
x
(
1
)
x^{(1)}
x(1),
x
(
2
)
x^{(2)}
x(2)…,
x
(
m
)
x^{(m)}
x(m),对应的标签为
y
(
i
)
y^{(i)}
y(i)。
2.计算当前梯度:
g
=
▽
θ
∑
i
L
(
f
(
x
(
i
)
;
θ
)
,
y
(
i
)
)
g = \bigtriangledown_\theta \sum_i L(f(x^{(i)}; \theta), y^{(i)})
g=▽θ∑iL(f(x(i);θ),y(i))
3.累积历史梯度的平方和:
r
=
r
+
g
⊙
g
r = r + g \odot g
r=r+g⊙g
4.计算梯度更新:
Δ
θ
=
ϵ
δ
+
r
⊙
g
\Delta \theta = \frac {\epsilon}{\delta + \sqrt r} \odot g
Δθ=δ+rϵ⊙g
5.更新参数:
θ
=
θ
−
Δ
θ
\theta = \theta - \Delta \theta
θ=θ−Δθ
3.算法特点
算法流程中,核心是第3,4步。第三步是计算梯度的历史累积平方法,第四步是对参数的学习率进行一个自适应的调整。根据上面的公式不难看出AdaGrad有如下特点:
1.刚开始训练阶段,梯度累积量较小,此时学习率比较大,收敛速度较快。
2.训练后期,梯度积累量较大,此时学习率减小,收敛速度较慢。
3.之前我们提到的SGD-Momentum, NAG等算法,都使用的是一阶动量。而 AdaGrad在累积历史梯度时使用了二阶动量。
4.AdaGrad对稀疏特征比较友好,因为稀疏特征出现频率不高,哪怕是在训练后期,针对系数特征也可以保持一个比较大的学习率。
5.累积动量是单调递增的,学习率会逐渐降低到0,有可能会导致训练提前结束,也有可能导致后面的数据无法学习到有用的内容。