美文网首页程序员C++实现的
C++程序员福音!用三维Demo看懂各种优化算法

C++程序员福音!用三维Demo看懂各种优化算法

作者: Python编程导师 | 来源:发表于2019-04-10 16:51 被阅读10次

机器学习里的优化算法很多,比如SGD、Adam、AdaGrad、AdaDelta等等,光是它们的迭代公式就已经够让人头疼。
好在TensorFlow、Keras、PyTorch中都集成了这些优化工具,但它们是如何在一步步迭代中“滑落”到最小值的,你真的清楚吗?

现在有一个机器学习优化算法的Demo,能帮你从图像中直观感受到调参对算法结果的影响,以及各自的优缺点。

企业微信截图_1554807819499.png image

它就是ensmallen!它的开发者不仅提供了Demo,还给程序员们打包了一份C++数据库,那我们先来试玩一下吧。

试玩Demo

试玩方法很简单,甚至不需要安装任何软件,进入ensmallen网站,选择Demo标签,就能看到一组优化算法的3D示意图。

页面默认是常见的Adam算法,我们会看到参数沿着红色的路线,最终落入损失函数的最低点:

image

左侧是参数初始值所在位置,也就是图片中的红点,可以用鼠标随意拖动。

中间和右侧的图都是损失函数的“等高线”。中间以不同颜色标记不同高度,右侧直接给出了损失函数的梯度场,以箭头指向表示梯度方向、长度表示梯度大小。可以看出等高线越密集的地方,梯度也越大。

如果觉得上面的损失函数图不够清晰直观,还有高清3D大图:

image

随着迭代步数的增加,损失函数的数值不断减小:

image

Adam算法可以调节的超参数有:步长迭代次数允许误差β1β2模糊因子ϵBatch Size

image

拖动滑动条调节超参数,“红线”的形状和终点也会随之变化。我们不妨调节一下步长,看看这个参数会对结果造成什么样的影响。

增加步长会让学习曲线震荡幅度变大,步长太小会让损失函数收敛过慢:

image

**△ **步长分别是0.3、0.03和0.003的三种情况

以上只是最简单的情况,Demo界面还提供其他奇形怪状的损失函数:

image

以及近乎所有常见的优化算法:

image

在不同形状的损失函数里,这些优化算法各有优缺点。

如果损失函数的“等高线”是椭圆,Adam收敛速度很快,仅迭代100步左右就已经收敛,而AdaGrad迭代了近300步才收敛。

image

但Adam并非就有绝对优势。在有多个鞍点和局部最小值的图形中,Adam虽然在开始阶段下降速度很快,但是在最后阶段震荡较严重,收敛速度反而不及AdaGrad。

image image

上面的“玩法”只是Demo很小的一部分,想尝试更多请参见文末的链接地址。

C++程序员福音

千万不要以为ensmallen只是一个好玩的Demo,实际上它还是一个高效的C++优化库。对于用C++来给AI编程的程序员来说,它能对任意函数进行数学优化,解决了C++机器学习工具匮乏的痛点。

ensmallen除了打包基本优化算法之外,用户还可以使用简单的API轻松添加新的优化器。实现新的优化器只需要有一种方法和一个新的目标函数,通常用一到两个C++函数就能搞定。

安装ensmallen需要满足以下要求:

  • 支持C++ 11的编译器
  • C++线性代数与科学计算库Armadillo
  • 数学函数库OpenBLASIntel MKLLAPACK

ensmallen中的所有内容都在ens命名空间中,因此在代码中放置一个using指令通常很有用 :

using namespace ens;

以使用Adam为例,其代码如下:

RosenbrockFunction f;
arma::mat coordinates = f.GetInitialPoint();
Adam optimizer(0.001, 32, 0.9, 0.999, 1e-8, 100000, 1e-5, true);
optimizer.Optimize(f, coordinates);

其中,Adam优化器中参数的顺序依次是:步长、Batch Size、β1、β2、ϵ、最大迭代次数、允许误差、是否以随机方式访问每个函数。

至于其他优化算法,可以去网站查看详细的说明文档。

相关文章

  • C++程序员福音!用三维Demo看懂各种优化算法

    机器学习里的优化算法很多,比如SGD、Adam、AdaGrad、AdaDelta等等,光是它们的迭代公式就已经够让...

  • 优化算法matlab实现(一)相关matlab基础

    之前实现优化算法用的java、python、c++,matlab使用较少,接下来会用matlab来实现。此处记录了...

  • 各种加密算法编程演示实验

    实验目的 掌握各种对称算法接口的调用方法(C/C++方式) 掌握各种非对称算法接口的调用方法(C/C++方式) 掌...

  • C/C++测时

    1 前言 如果我们用C语言或者C++实现了相同问题的不同算法,要比较各种算法的优劣程度,就需要测定依据某一算法编写...

  • iOS开发·必会的算法操作:字符串数组排序+模型对象数组排序

    传送门:排序算法演示小DEMO 前面的话 为了给字符串数组排序,除了用C/C++的基本办法,iOS开发者更应该学会...

  • 答辩记录

    问题一:算法是用什么实现的,怎样实现的? 算法的编程是用matlab实现的,具体是用优化工具包cvx的解作为优化问...

  • 关于程序代码完成之后的思考

    程序员工作的本质是用思想去解决问题,通过用各种语言(c c++,go)去完成自己的想法。那么当我们代码完成之后只是...

  • 优化算法的实现

    前言 在优化算法的学习中,已经详细了解了各种优化算法的数学原理和相关公式,现在,可以通过python实现这些优化算...

  • 2015-8-1 优化

    【Chainer下各种优化算法(SGD/AdaGrad/RMSprop/ADAM/...)比较】《Chainer ...

  • 优化函数框架

    框架 该总结框架来自知乎文章:一个框架看懂优化算法之异同 SGD/AdaGrad/Adam[https://zhu...

网友评论

    本文标题:C++程序员福音!用三维Demo看懂各种优化算法

    本文链接:https://www.haomeiwen.com/subject/emroiqtx.html