机器学习入门(二):工具与框架的选择

2,593 阅读8分钟

专栏系列文章

机器学习:新手入门概览(一): juejin.cn/post/684490…
[译]什么是蒙特卡洛树搜索: juejin.cn/post/684490…
论深度学习的局限性
juejin.cn/post/684490…

所需工具

根据具体场景的需要(科研/工程),以及团队规模大小,开发人员能力等问题,选择合适的语言及框架和辅助工具来进行开发是十分必要的。这不但降低了开发难度,同时也提升了开发效率。
由于框架的快速发展,很多的标准及特性都在不断地变化,而又很少有人能够同时使用过多种框架进行开发,因此经过了大量资料收集之后,笔者对各类框架当前的特性进行了简洁的概况与比较。若想获得更加具体的描述,可以点击文章末尾的应用资料。

语言工具选择

区别与优劣:
1.python:

  1. 完全开源免费
  2. 基于 python 的框架很多: TensorFlow(Google), PyTorch(Facebook), Caffe2(Facebook/UC Barkely), PaddlePaddle(Badiu), Keras, CNTK(Microsoft), Theano, MXNet(Amazon)
  3. 框架开源免费,样例较多,易于部署,社区较为活跃
  4. 语言应用面广泛,上手快
  5. 其它类型库很多,易于一起使用

2.MATLAB:

  1. 商业软件,收费较贵(永久MATLAB+NN工具包:¥22,500)
  2. 工具箱封装的功能强大,功能较多
  3. 个别时候需要深入理解函数作用,学习时间可能更长
  4. 相对 python 的框架,使用者相对较少
  5. 可移植性相对 python 较弱
  6. 算法、仿真研究上优势较大,易于使用

3.Jupyter Notebook(IPython):

  1. 支持多语言:python, Julia, R, Scala
  2. 易于分享
  3. 交互式编程,可即时获得结果

图片引用来源: Jupyter Notebook 官网

4.C++:

  1. 计算速度高
  2. 维护及开发代价相对较高,属于底层语言
  3. 在需要开发新的算法等模块时,为必会语言

另外还有用于科学计算的语言 Julia, 用于大数据处理的 Scala,脚本语言 lua 等其他用于数据处理,分析的语言及工具

框架优劣及比较

图片引用来源:知乎/斯坦福cs231n课件

0.scikit-learn

开发团队: GitHub 开源社区的贡献者

简介: 基于 python 的第三方库,用于数据挖掘与数据分析,简单易用,以统计机器学习为主(深度学习相关框架参考之后的各个框架)。基于 NumPy, SciPy, matplotlib, 免费开源。

开源协议: BSD 2.0

1.Tensorflow

开发团队: Google

简介: 是 Google 的第二代人工智能学习系统,基于 Theano 框架进行了更多的优化与改进

开源协议: Apache 2.0

优势:

  1. Tensorflow 社区活跃,易于找到相关的模型及问题,整体框架的各类配套工具较为成熟
  2. Tensorflow 生产部署的方案成熟,从手机终端到服务器都比其他框架更加易于部署
  3. Tensorflow 主要向 python 提供 API 开发,同时也向 Java, Go, C++, Haskell, Rust 提供。
  4. Tensorflow 本身之上也有 Keras 等高层框架,可以高效开发,以及之后 Tensorflow 带来的部署优势
  5. 根据 cs231n 中的总结, Tensorflow 在处理 RNN 及大规模并行深度学习时的能力非常强大
  6. 有 Tensorflow Serving 可以直接加载模型来提供 RPC 接口服务
  7. 在完成了定义流程图后,可以进行自动推导,节省了很多的工作

劣势:

  1. Tensorflow 上手难度较大,实际上是一门新的语言,很多开发者反映写起来很麻烦
  2. 不适合做快速的想法验证
  3. 各论文目前所使用的框架中 Tensorflow 比例仍相对较低
  4. 有很多地方属于黑箱操作,难以理解处理的原理,调试较难
  5. 功能扩张速度过快,导致现在实际的训练速度很不理想, arxiv 中的一篇论文显示(引用资料[2])性能表现在各个框架中最差

2.PyTorch

开发团队: Facebook 等企业与高校

开源协议: BSD 2.0

优势:

  1. 相对 Tensorflow 更加易于上手,代码为 python 风格,而非自己创立的语言,开发效率较高
  2. 中间过程更加透明,易于 debug 调试及学习
  3. 对大部分人来说(除专家级),由于能力问题,写出的代码在训练时要比 Tensorflow 的快
  4. 更适合小型团队的使用与开发
  5. 框架本身的源代码相对清晰,可读性强,比 Tensorflow 要更加易懂

劣势:

  1. 大部分情况下,速度能力是不如 TensorFlow 的,如 AlexNet 等经典的神经网络,详情见引用资料[2] 的论文中关于各种模式下,各个框架的表现能力。
  2. 仍在 Beta 测试阶段,底层及框架出现 bug 的概率比 TensorFlow 更高
  3. 社区用户除了从原 Torch 迁移过来的人以外,不如 TensorFlow 的用户多

3. Caffe2

开发团队: Facebook

开源协议: Apache 2.0

简介: Facebook 开发 Caffe2 的目的在于产品应用,而 PyTorch 一般用于研究与想法的实现。同时,Caffe2 的思路更接近于 TensorFlow,与 PyTorch 不同,使用的是静态图,而 Torch 使用的是动态图,因此灵活性上不如 Torch,更加专注于速度表现。

优势:

  1. 速度
  2. 相比 Caffe 只支持C++, 支持 C++ 与 python API
  3. 在移动端部署做的很好,可能优于 TensorFlow,但暂无数据证明。不过在工业应用以及分布式训练中强于 PyTorch,更专注于移动端的表现。
  4. 可以将原 Caffe 的模型转换至 Caffe2
  5. 与 PyTorch 同属于 Facebook,之间正在建立沟通协议,共享后端
  6. 可以简单地调用预先训练好的 Model Zoo 模型

劣势:

  1. 社区不如 TensorFlow 成熟
  2. 训练的灵活程度不如 PyTorch

4. MXNet

开发团队: 陈天奇等人, 现获 Amazon 投资及支持

优势:

  1. 支持语言多:python, R, MATLAB, Julia, Go, Scala, Javascript
  2. 专注于深度学习核心,优化好,训练速度快。由于 MXNet 一直专注于性能的优化,而非如 TensorFlow 一样做功能上的扩展,因此在表现上是占优势的。
  3. 亚马逊的云服务支持,如今亚马逊的 AWS 云计算服务已经默认 MXNet 作为学习框架
  4. MXNet 的执行步骤相对 TensorFlow 更加地灵活

劣势:

  1. 社区活跃度较低
  2. 对新手友好程度一般,文档完善程度不够(但在获得亚马逊支持后在改善)

5. PaddlePaddle

开发团队: Baidu

开源协议: Apache 2.0

优势:

  1. 简单易用,尤其是对于已有的模型,只需改变参数和数据即可
  2. 中文文档非常友好
  3. 主程序源码使用 C++ 编写,相对易于阅读
  4. 似乎尤其适合处理 NLP(自然语言处理) 相关的问题

劣势:

  1. 文档数量较少
  2. 不适合开发新的算法或功能,因为二次开发需要从底层 C++ 写起

6. Keras

开发团队: GitHub/Keras 团队

开源协议: MIT

优势:

  1. 上手快,新手友好,简单模型开发效率高
  2. 可以灵活选择底层框架:目前支持 TensorFlow, CNTK, Theano
  3. 同时具有扩展性与易用性,可以自己增加所需的算法等模块
  4. 以层(layer)作为概念进行封装,易懂

劣势:

  1. 性能表现不差,但并非优势
  2. 灵活性的前提是需要熟悉 TensorFlow 或其它的一门底层语言,同时需要阅读一定量的 Keras 源码,因此 灵活性的实现有前置代价
  3. 仅支持 python

7. CNTK

开发团队: Microsoft

开源协议: C++ 部分采用 Boost Software License,数据集部分另有其它协议

简介: 仅从 GitHub 的 Star 和 PR 上来看,此项目的活跃程度并不低,只不过国内的知名程度与使用率相比于其它框架要小很多

优势:

  1. 各类比较的性能中,处于中等偏上位置,往往仅次于 MXNet

劣势:

  1. 国内的使用人数少,相关资料少
  2. 新手不友好,不易于安装,建议使用 Docker 进行隔离安装

8. deeplearning4j

开发团队: Eclipse

开源协议: Apache 2.0

优势:

  1. 以 Java 为开发语言,享受Java 虚拟机带来的跨平台优势
  2. 有一些不错的例子以供学习
  3. 使用 cuDnn 时速度与其他框架
  4. 支持 Scala

劣势:

  1. 在训练时内存的垃圾回收(GC)导致性能会出现下降,作者正在改进中
  2. 国内使用人数较少
  3. 文档相对简单

引用资料

  1. 2017年1月18日Facebook发行的PyTorch相比TensorFlow、MXNet有何优势? https://www.zhihu.com/question/54914188
  2. S.Shi et al., Benchmarking State-of-the-Art Deep Learning Software Tools, https://arxiv.org/pdf/1608.07249v7.pdf
  3. Stanford University, cs231n :Convolutional Neural Networks for Visual Recognition, http://cs231n.stanford.edu/
  4. 杜客等, cs231n 笔记中文译稿, https://zhuanlan.zhihu.com/p/21930884
  5. 雷锋网, 框架对比,https://www.leiphone.com/news/201709/3T4pwc5UBLtRuKvx.html
  6. 知乎, Keras,Theano,pytorch,caffe2 哪个更好一些,应该怎么尝试学习?, https://www.zhihu.com/question/59274399
  7. 知乎, 如何评价TensorFlow和其它深度学习系统,https://weibo.com/p/1001603907610737775666
  8. 知乎, 如何评价Caffe2,https://www.zhihu.com/question/58698158/answer/158139047
  9. GitHub, chenrudan, TensorFlow、MXNet、PaddlePaddle三个开源库对比, http://chenrudan.github.io/blog/2017/02/25/comparetfmxpd.html
  10. CSDN, mxnet 使用体验, http://blog.csdn.net/u013713010/article/details/71635814
  11. 机器之心, 深度 | 亚马逊挑中MXNet后,机器之心和他们聊了聊, http://tech.huanqiu.com/news/2016-11/9726439.html
  12. 知乎,Deeplearning4j运行效率怎么样?Mnist案例运行时间大约多少?,https://www.zhihu.com/question/49509850
  13. 简书, 鱼心DrFish, 左手程序员,右手作家:你必须会的Jupyter Notebook,https://www.jianshu.com/p/86117613b7a6