机器学习平台的优化器 (优化篇)

前言

在 " 机器学习平台的优化器 (平台篇)"里面, 我们简介了平台们,和什么是优化器。 这里我们开始介绍不同平台的优化。 我们把相同编程语言的优化器放在一起, 因为语言相同, 可以相互借鉴的情况下, 这些平台到底是怎么选择的。 先给出部分我们考察的结论:

我们列出 八大特征 , 方便我们大体了解这些平台们的算法们。

1. 核心的Adam算法已经是所有平台的必备, 并且作为Adam变种算法的Adamax和Nadam, 也基本普及了,Lasagne, Keras, BigDL, D4J, Torch, MXNet 对它们都有支持。

2. 作为出彩的TensorFlow, MXNet, Caffe2 都对在线优化算法 FTRL 进行了实现。

3. Spark 的底层平台 Breeze不愧为最早期的平台, 对二阶算法(LBFGS, OWLQN)的支持相当的全面。 另外, 二阶算法都以LBFGS为主流。

4. 对于非线性非凸的重视越来越多了。 TensorFlow的Proximal, D4J的Proximal 和 Torch的CMAES 都是这个考量。 这方面MXNet还没有重视。

5. 只有Scikit-Learn实现了SAG和SAGA这种Variance Reduction的算法。

6. 只有Stanford的凸优化小组CVXLab实现了基于TensorFlow的ADMM分布式算法。 应该是为了算法研究,而不是实用性的考量。

7. 以深度学习为主平台里面, 只有D4J 和 Torch对LBFGS 二阶算法进行了实现。 所以深度学习的世界里面, 几乎没有二阶优化器。

8. 最为霸气的是MXNet,支持4,5种语言, 每个语言都独立实现了多种优化器!!!

更多细节, 请大家慢慢看来 。。。

Python 平台优化器

Python的Scikit-Learn

举个Scikit-Learn的例子, 在Scikit-Learn里面, 对于SRM损失类算法的优化器叫Solver, 解算器。

常用的有:

1)牛顿法的LBFGS,

2)共轭梯度Congugate Gradient, cg,

3)和SVM优化的liblinear,

4)然后居然也加入了最新的SAG 和SAGA算法。

在最新版的, Scikit-Learn里面, 对于

但是对于神经网络,BP算法类, 除了可以使用LBGFS外, 还可以使用手动配置的SGD优化器和Adam优化器。

这样,我们大概知道Scikit-Learn这个平台里面优化器,有哪些,是怎么用的了。 也可以看出还是蛮时髦的, 但是却没有分布式算法。

Python的TensorFlow (Google)

对于TensorFlow的优化器,也是非常全的, 我们简单对比Scikit-Learn,可以有几个现象:

  1. TF从2015一开始就支持最新最好的算法, 包括 一阶Adaptive的算法 Adam, Adaptive Dual Averaging, 和在线学习的 'Follow the Regularized Leader' (FTRL) 。
  2. TF没有发力二阶算法, 因为TF面向深度学习的, 在深度学习里面, 非线性,尤其类似RELU这样二阶不可导的激活函数的广泛使用。 但是对Proximal类的算法还提供了Adaptive版本的。

Python的CXVGRP(Stanford)

另外,基于tensorflow的其他优化算法, 斯坦福的凸优化小组(https://github.com/cvxgrp)有两个补充实现:

1. 基于TF的CG算法实现

2. 基于TF的分布式算法ADMM实现,

Python的Theano(Univ. Montreal), Lasagne

Theano 强在模型的可扩展性, 和结构的独立性。 方便研究随意扩展。 Theano项目本身找不到太多对优化器的集成, 只有一两个框架性的Optimizer类方便扩展。 不是这里的菜!

但是我们发现Lasagne还是蛮有点意思的。 它在一个文件里面实现了大部分主流的adaptive算法,包括adam和adamax。 Theano不愧为做研究的平台, Lasagne也受到他的影响。 如果说非要自己手写下下所有的adaptive的算法的话, 那么我觉得Lasagne的这个文件是你必读的(lasagne/updates.py)。

Python的Keras

Meta平台的Keras的优化器也不含糊, 最新的adamax和Nadam都有。 可见, 作为Meta平台的确很多优势。

Java & Scala 平台优化器

Scala的Spark MLlib (Berkeley)

Spark的优化器实现很直观,就两大类, 如果正则化带L1的那么就是SGD优化器, 如果带L2正则化,二次可导的, 那么就是LBFGS优化器。

由于Scala核心模块MLlib的实现的限制, 导致接口,譬如Pyspark的实现也就这两个选择。

并且官方介绍 (https://spark.apache.org/docs/latest/mllib-optimization.html#implementation-in-mllib)也不出彩。是不是有点失望?

我们可以看到SVM在Spark里面就是直接利用SGD来优化的。

并且Spark的LBFGS是直接封装了Breeze微风项目的LBFGS。

Scala的Breeze (ScalaNLP)

而Breeze项目是ScalaNLP组织的三大拳头产品之一, 他们分别是Scala版本的矩阵数值计算和优化的Breeze, NLP Parser的Epic, 和支持GPU的Puck。 主创David Hall(http://dlwh.org/), 同样来自Berkeley,是BerkeleyNLP组的学生, 在2012年, 也是读博士期间,就发布了Breeze项目。 并且他本人也是积极参与Spark社区的。

我相信Matei Zaharia在2013年开发Spark的时候已经熟知Breeze项目了。看起来, Breeze作为Spark的底层,是相当成熟了的。 我们直接跳过Spark关注Breeze里面的优化器, 毕竟Spark封装一下就直接用的。 我们看到除了分布式的算法, 绝大部分优化算法也是相当的全了。

其实还是没有看到Adam的实现, 毕竟AdaDelta效果比Adam还是要差蛮多的。 你不要担心, Intel在他发布的BigDL平台里面,极大的扩展了Spark的优化算法。 简直应有尽有。

Scala的BigDL (Intel)

Intel基于Spark对深度学习进行了扩展, 因此必须要升级优化器, 于是乎最新的adaptive的优化器全有了。 连Adamax也实现了。 真是相当给力。

所以从优化器的角度来看, 你把ScalaNLP 的 Breeze和Intel的BigDL融合在Spark一起, 应该来说很全面了。

题外话,对于Spark平台的同异步的分布式算法的实现:

1)对于Spark平台的ADMM算法, Yahoo有一个SparkADMM但是全是Python实现的 https://github.com/yahoo/SparkADMM。 并且也没有持续更新。

2)对于Spark平台的Downpour算法实现, Fecebook工程师Dirk Neumann, Deepdist有个实现 http://deepdist.com/,也是直接Python实现的, 一直在维护, 关注度也可以。

Java的DeepLearning4J (Skymind)

要说代码结构清晰, 我还是非常推崇D4J的Java代码组织的, 但是里面的优化器的确简陋。 就SGD, LBFGS, CG和LinearSearch。

看了是不是有点失落, 其实你不要伤心。 记得我们在上一部分里面说D4J是相当面向工业界的东西。不可能就这样完事了。 对的! 只是和Spark 和Breeze组合一样。 D4J和ND4J也是一个这样的组合。 大部分核心的优化器是在ND4J,这个矩阵计算的平台里面实现了。

除了包括了Adam和Adamax,还包括了最新的Nadam, 就差YellowFin了。 这下子是不是很给力了。 不过,你依然可以看到, 和TensorFlow类似, 几乎全是一阶的优化器。

C & Lua 平台优化器

Lua的Torch (Facebook)

我们知道Torch也是比较偏向研究的一个平台, Torch对它平台的优化器, 有最详细的配置文档说明。 这里的大部分Adaptive算法和CG算法。 只有一个算法, 我们在其他平台里面没有见过, 叫CMAES算法(Covariance Matrix Adaptation Evolution Strategy)。 这个算法是比较少的, 效果不错的进化算法,比较适合非线性非凸情况下的收敛。 也只有这个算法Torch是直接从别人的实现那里搬过来的。

另外, 大家注意下下Torch里面对Adam的默认参数的初始化非常清晰。 Lua是一个非常好的语言。 大家如果想知道上面各种算法最佳的默认参数是什么。 Torch是一个很好的学习平台。

C的MXNet (DMLC)

MXNet 的确不是盖的, 它的每个语言的优化器都是相对独立写的。 不完全一致, 可以看到相当厉害。 但是adam,adagrad, rmsprop 和 adadelta是全部都有的。 不过Python 的接口最为厉害了, 和TensorFlow看齐了, Adamax 和 Nadam, Ftrl也都有。

如果要从R语言来学习自己写优化器, R-package/R/optimizer.R 的确是一个相当好的实现。

由此看到, MXNet虽然以C++为根基, 但是还是忍不住Python在深度学习里面的大潮, 接口更为丰富。

C的Cognitive Toolkit (CNTK, Microsoft)

CNTK的优化器,没有太多意外, 但是能够感觉得到,CNTK的代码是很漂亮的, 各种泛型用的是相当的漂亮。 是学习泛型编程很好的例子。

C的Caffe2 (Facebook)

Caffe2的优化器实现是我认为比较实用主义的。 首先adaptive的都有, 其次也有FTRL在线学习的。 如果我们去看Berkeley 的 Caffe, 其中并没有FTRL的实现。 因此, 相比较Berkeley 的 Caffe来说, 继承了所有使用的adaptive算法, 也再添加了FTRL算法。

优化器实践的"为什么?"

1. 为什么分布式算法在主流平台几乎没有实现?

个人觉得跟参数服务器PS的兴起有很大关系。 本来在分布式架构下面, 大家觉得分布式算法是未来, 开启大力研发算法的模式。 可是在PS架构下面, 让分布式算法的意义变小。 考虑到实现复杂度, 运算速度, 分布式算法的意义变得小了。 个人认识有限, 或许回答不对。

2. 为什么深度学习为主的平台几乎没有二阶优化器实现?

因为深度学习里面,由于梯度消失的问题等等, 非线性非凸的激活函数称为主力军, 使得二阶优化器变得没有了意义。

3. 如果非要学习优化算法实现, 从哪里入手?

推荐Lasagne(Python)的一个实现文件updates.py, 前面说过这个文件几乎集成了大部分adaptive算法的实现。 https://github.com/Lasagne/Lasagne/blob/master/lasagne/updates.py

你可以改写测试,对比你自己写的结果和人家写的结果。

再推荐了个Torch的接口文档 algos.md。 在这个接口文档里面, Torch详细的描述了算法的各种配置。 https://github.com/torch/optim/blob/master/doc/algos.md。 同时,大家可以通过Torch源码去了解各种算法的默认初始化参数设置。

最后推荐了MXNet(R)的一个实现文件, R-package/R/optimizer.R, 里面的实现也是非常清晰。

4. Adam算法这么火,一般来说好在哪里?

  1. 实现简单直观, 一个简单直观的实现, 避免了很多潜在的BUG, 稳定可用。
  2. 计算高效,动量算法和自适应, 收敛速度大大提高。
  3. 内存消耗小。 更新完就丢, 几乎没有太多存储。
  4. 对于极具变化,带噪声,甚至稀疏的梯度能够较好的适应。
  5. 不太需要人工干预, 初始化和调参不需要高级技巧 。

5. Adam优化, 默认参数一般为多少?

默认参数如下:

是不是各大平台对Adam的默认参数极为一直, 全是千分之一的学习率。为什么这么一致呢? 因为论文里面就这么给出了他们认可的一组默认值。 所以读原始论文还是很有必要的。

原文发布于微信公众号 - AI2ML人工智能to机器学习(mloptimization)

原文发表时间:2017-07-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据小魔方

一点儿建议、一枚彩蛋~~~

这段时间写了太多的教程,感觉自己都写烦了,不知道大家看的烦不烦,今天没有教程,写一点儿心得总结下这段时间以来的经验和体会,顺便介绍一款图表插件,也将是小魔方下一...

4045
来自专栏机器之心

教程 | 用脑电波控制智能假肢:如何利用深度学习技术进行EGG数据分类

神经系统是一个极其复杂的结构。人体内有超过十万公里的神经与脊髓和大脑相连。这种「网格」传输控制每一个运动的电脉冲。每一个指令都从大脑发出,大脑是一个更加神奇的神...

1433
来自专栏Hadoop数据仓库

HAWQ取代传统数仓实践(十二)——维度表技术之分段维度

一、分段维度简介         在客户维度中,最具有分析价值的属性就是各种分类,这些属性的变化范围比较大。对某个个体客户来说,可能的分类属性包括:性别、年龄、...

24010
来自专栏AI科技大本营的专栏

移动应用AI化成新战场?详解苹果最新Core ML模型构建基于机器学习的智能应用

Google刚刚息鼓,苹果又燃战火!这一战,来自移动应用的AI化之争。 近日,苹果发布专为移动端优化的Core ML后,移动开发者对此的需求到底有多强烈?去年大...

3637
来自专栏企鹅号快讯

2017年度30大最惊艳的开源机器学习项目

在过去的一年里,Mybridge AI 比较了近 8,800个开源机器学习项目,选择了前30名(概率只有0.3%)。 这是一个竞争激烈的名单,精挑细选了2017...

2838
来自专栏PaddlePaddle

GITCHAT系列2:个性化推荐

大家好,我是来自PaddlePaddle开源社区的李钊(@livc),目前是一名大三学生。我曾经在手机百度实习,参与推荐算法和反作弊的研发工作,目前是IDL的一...

4128
来自专栏新智元

【珍藏】CMU大师对软件工程师的系统建议(附书和论文下载)

【新智元导读】软件工程师想学机器学习,有什么好建议?机器学习专家、卡耐基梅隆大学教授、1-Page公司首席科学家 Alex Smola 在 Quora 上给出了...

3827
来自专栏机器人网

六轴机械手臂有哪些奇异点?

六轴机械手臂由六组不同位置的马达驱动,每个马达都能提供绕一轴向的旋转运动,其位置可参照下图。从自由度(Degree of Freedom)的概念来看,六轴机械手...

3909
来自专栏智能计算时代

机器学习与文本分析

image.png 原文作者:微软研究院杰出科学家Ashok Chandra博士,项目经理Dhyanesh Narayanan 译者:张鑫 ? 上个世纪七十年代...

4036
来自专栏AI科技评论

干货 | Siri 语音识别的小心机:你在哪里,就能更准确地识别那附近的地址

AI 科技评论按:这篇文章来自苹果机器学习日记(Apple Machine Learning Journal)。与其他科技巨头人工智能实验室博客的论文解读、技术...

1332

扫码关注云+社区

领取腾讯云代金券