神经网络的训练过程实质是得到最优化目标函数的过程,常见的目标函数MSE Loss、Cross Entropy Loss、NLL Loss等,网络训练过程就是最小化Loss的过程。Loss可以理解为模型预测值与真实值之间的差距。一般这些Loss函数是凸函数,可以使用最优化的相关算法最小化Loss,具体包括随机梯度下降、共轭梯度下降、牛顿法、拟牛顿法等。归功于神经网络的backward过程,使得梯度相关的搜索算法得以应用。下面简单介绍神经网络训练过程的几种优化方法。
一.基本算法
一阶优化算法
1.梯度下降
假设你的目标函数是f(x,w),其中w是函数的参量。当前你的优化目标是最小化目标函数,求的函数最小时的模型参数w。求最值问题就类似于寻找极值点,通过梯度查找,梯度下降实质是使得沿着目标函数下降最快的方向更新模型参数w,使得算法收敛。一般而言,会在梯度方向加一个学习率(learning Rate),用于设置在梯度方向前进的步长。
2. SGD
随机梯度下降与梯度下降的区别在于随机选取计算梯度的样本,并且可以支持mini-batch进行模型参数的更新。但是,SGD的学习率是固定的,容易收敛到局部最优。
3. Momentum
Momentum是模拟物理里动量的概念,积累之前的动量来替代真正的梯度,Momentum项能够在相关方向加速SGD,抑制振荡,从而加快收敛。
4. Adagrad
Adagrad是自适应学习率的算法,通过引入一个平滑因子,不断减小学习率,由于学习率不断减小,收敛过早,效果不太好。
5. Adadelta & RMSprop
二者都是对Adagrad的改进,同样也是自适应学习率的算法。
6. Adam
Adam算法可以看作RMSprop和动量方法的结合。效果很好,现在做深度学习基本默认使用Adam算法。
二阶优化算法
函数通过泰勒公式展开得以表示为零阶、一阶、二阶…等高阶余量的累加。前边的梯度算法都是一阶近似。还有近似二阶余量的算法,类似牛顿法、拟牛顿法、BFGS、LBFGS等。有兴趣的同学可以查看具体原理和实现过程。
二.算法优化
Andrychowicz[1]在2016年提出了对优化器(Optimizer)进行训练,即他们在训练LSTM网络的同时,也对LSTM优化器进行迭代更新。但是,这无疑增加了模型训练的复杂程度。Zoph[2]于2017年提出一种模型结构,便于强化学习的搜索过程,这种模型结构达到了语言模型的最优效果。相同的搜索方法也可以用在深度学习过程。
目前主流的优化算法几乎都很相似,它们都是用了对于过去梯度值的指数移动平均[3]。Bello et al. (2017)[4]借用强化学习的框架,定义梯度更新的策略为一个候选空间,每次进行梯度更新都是从这一空间进行采样得到更新策略,训练模型在测试集合的效果作为reward返回,便于更新策略的挑选。
Reference
[1] Andrychowicz,M., Denil, M., Gomez, S., Hoffman, M. W., Pfau, D., Schaul, T., & deFreitas, N. (2016). Learning to learn by gradient descent In Advances in NeuralInformation Processing Systems.
[2] Zoph, B., &Le, Q. V. (2017). Neural Architecture Search with Reinforcement Learning. InICLR 2017.
[3] Ruder, S. (2016). An overview ofgradient descent optimization algorithms. arXiv Preprint arXiv:1609.04747
[4] Bello, I., Zoph, B., Vasudevan, V.,& Le, Q. V. (2017). Neural Optimizer Search with Reinforcement Learning. InProceedings of the 34th International Conference on Machine Learning