机器学习中的优化算法很多,比如SGD、Adam、AdaGrad、AdaDelta等,光是它们的迭代公式就够让人头疼的了.幸运的是,这些优化工具都集成在TensorFlow、Keras和PyTorch中,但你真的知道它们是如何在一步步迭代中“滑”到最小值的吗?现在有一个机器学习优化算法的demo,可以帮助大家从图像上直观的感受调优参数对算法结果的影响,以及各自的优缺点。缩小了!它的开发者不仅提供了demo,还为程序员封装了一个C++数据库,大家先来试试吧。Demodemo方法很简单,你甚至不需要安装任何软件,进入ensmallen网站,选择Demo选项卡,就可以看到一组优化算法的3D示意图。页面默认使用普通的Adam算法。我们会看到参数沿着红色的路线最终落入了损失函数的第一个点:左边是参数初始值的位置,也就是图中的红色点。您可以使用鼠标随意拖动。中间和右边的图都是损失函数的“轮廓”。中间用不同的颜色标出了不同的高度,右边直接给出了损失函数的梯度场。箭头指向表示梯度方向,长度表示梯度大小。可以看出,轮廓线越密,梯度越大。如果觉得上面的损失函数图不够清晰直观,还有一张高清3D大图:随着迭代步数的增加,损失函数的值不断减小:可以将超参数Adam算法调整的有:stepsize,迭代次数,allowedError,β1,β2,fuzzyfactorε,BatchSize。拖动滑块调整超参数,“红线”的形状和终点也会随之变化。让我们调整步长,看看这个参数如何影响结果。增加步长将使学习曲线更加振荡。步长太小,损失函数收敛太慢:△步长为0.3、0.03、0.003这三种情况是最简单的情况。Demo界面还提供了其他奇形损失函数:以及几乎所有常见的优化算法:在不同形状的损失函数中,这些优化算法各有优缺点。如果损失函数的“等高线”是椭圆的话,Adam收敛得非常快,大约只迭代了100次就收敛了,而AdaGrad迭代了将近300次就收敛了。但是亚当并没有绝对的优势。在多鞍点和局部极小值的图中,虽然Adam的下降速度在初始阶段很快,但在最后阶段震荡更为剧烈,收敛速度不如AdaGrad。以上“玩法”只是一小部分demo,如果你想尝试更多,请参考文末链接地址。C++程序员的好消息。不要认为ensmalen只是一个有趣的演示。事实上,它是一个高效的C++优化库。对于使用C++进行AI编程的程序员来说,它可以对任意函数进行数学优化,解决了C++机器学习工具匮乏的痛点。除了在ensmallen中封装基本的优化算法外,用户还可以使用简单的API轻松添加新的优化器。实现一个新的优化器只需要一个方法和一个新的目标函数,通常是一个或两个C++函数。安装ensmallen需要满足以下要求:支持C++11的编译器C++线性代数和科学计算库Armadillo数学函数库OpenBLASorIntelMKLorLAPACKensmalen中的所有东西都在ens命名空间中,所以在代码中放置using指令通常非常有用:usingnamespaceens;以Adam为例,代码如下:RosenbrockFunctionf;arma::matcoordinates=f.GetInitialPoint();Adamoptimizer(0.001,32,0.9,0.999,1e-8,100000,1e-5,true);优化器。优化(f,坐标);其中,Adam优化器中的参数顺序为:步长、BatchSize、β1、β2、ε、最大迭代次数、允许误差、是否访问各个函数。至于其他的优化算法,可以去官网查看详细的文档。***附上所有资源:enmallen压缩包下载地址:https://ensmallen.org/files/ensmallen-1.14.2.tar.gzDemo地址:https://vis.ensmallen.org/
