在机器学习中,我们会遇到一个词,叫Optimizer,中文翻译为最优化。
最优化的意思为,在特定情况下最大化或者最小化某一特定函数或者变量。
机器学习的Optimizer也一样,它的任务就是最小化loss。
假设我们的机器学习学习的是一个一元二次方程,去解里面的系数。
我们的loss描绘的就是每次机器学习用初始的系数,猜出来的结果和真实结果的关系。
y(predict) = W1 * x + B1
loss = y(真实) - y(predict) (举例,也可能不是这样的loss,比如平方差等)
我们不断地去拆W1, B1,然后也许不小心某次就蒙对了。可以怎么猜?猜多少?
这些问题就交由Optimizer去解决。
Optimizer的任务就是说,给定下一次的猜想,测试loss,不断循环往复这个过程,让loss最小。
有两个比喻描述这个过程:
1. 碗:Optimizer就像一个弹珠掉进了碗里,然后滚啊滚,滚到了最底下。
2. 爬山:Optimizer就像一个人蒙眼下山,不断尝试往下,最终最好能成功到达山底。
所以 Optimizer是一个数学问题。问题在于如何能够最快地到达山底,并避免掉进局部的“山底”(局部最优解)。
最简单的就是梯度下降法,每次小步迭代,下山就继续下山,上山则反方向去走。
存在问题:小步的步子多大?太大了扯到蛋,太小了,可太累了,不知道走到何年何月。
机器学习在训练过程中常常需要设置一个learning rate,最后变成了一个调参的过程,需要开发者自行调试合适的learning rate,俗称炼丹,鬼知道放进去一个learning rate,会发生什么。也许不小心放入一颗断肠草,就练出来了呢?
(另外的问题:如何避免走入局部最优解?)
为了解决learning 太快或者太慢的问题,我们引入了Momentum这个方案。
即,假设我们开始就是慢的,但是如果方向是对的,我们就会加快这个速度。
就像滚雪球下山,只要滚的方向对,我们的雪球就会越滚越大,累积的动能(Momentum)也越来越大。
用公式表示就是Vt = r Vt-1 + xxxJ(0),r = 0.9
当我们发现Momentum越滚越大的时候,有个问题就是我们会冲过头。
为了解决这个问题,Adam优化器引入了“摩擦力”,避免冲过头。
研究表明,Adam可以比其他优化器更快找到最优解或者收敛。
直接选Adam吧。当然没有现成的,就直接实现一个SGD也可以。
不过一般来说Adative learning rate会好很多。
https://ruder.io/optimizing-gradient-descent/index.html#momentum
https://algorithmia.com/blog/introduction-to-optimizers
原文:https://www.cnblogs.com/simpleminds/p/14139536.html