常用机器学习库和深度学习库整理
这一年多以来的科研工作中,调研了不少机器学习库的相关知识,临近年底,事情不多,感觉正好可以整理一下。由于笔者主要使用python的缘故,这里介绍的函数库以python库居多,但也顺带介绍了一些其他编程语言的机器学习库。
python库
scikit-learn
学过统计学和机器学习的同学们对这个库应该不陌生。这个库提供了许多统计学习算法的API,几乎涵盖了机器学习的绝大多数方面(如下图),包括线性回归、逻辑回归、PCA、KNN、决策树等,甚至还支持搭建比较简单的神经网络。
Pytorch
这个库的前身是torch,一个使用Lua语言实现的深度学习库,其在2010年前后比较热门。后来,Facebook母公司Meta基于这个库,使用C++等编程语言重写了核心代码,并基于 Python 生态开发了 PyTorch,使其更适合研究和工业应用。目前PyTorch是最流行的深度学习库之一。几年前其排名已经超过了TensorFlow。Pytorch相比于TensorFlow的一个优点在于其对动态图计算(Dynamic Computational Graph)的支持。
一个图 (Graph)代表一个计算任务,且在 模型 运行时,需要把图放入会话 (session)里被启动。 一旦模型开始运行,图就无法修改了。 TensorFlow 把这种图一般称为静态图。 动态图 是指在Python中代码被调用后,其操作立即被执行的计算。 它与静态图最大的区别是不需要使用session来建立会话。 即在静态图中,需要在会话中调用run方法才可以获得某个张量、常量或变量的具体值,而在动态图里,在创建动态图的过程中,默认已经建立了一个session。 所有的代码都在该session中进行,而且该session具有进程相同的 生命周期。
TensorFlow
官网: https://www.tensorflow.org/
谷歌旗下的一个深度学习库。
曾经是最流行的深度学习库之一,但是在pytorch出现以后日渐式微,因为缺乏对动态图的支持(TF v1仅支持静态图计算)。
最新版的TensorFlow(TF v2)倒是支持了动态图,但是并没有能挽回多少用户的流失,据说是因为TF 1到TF 2的许多API有变动(参考知乎问题《TensorFlow 真的要被 PyTorch 比下去了吗?》 ),导致存在大量兼容性问题,迁移成本很高。
目前应该只有一些工业界的应用在使用TensorFlow的框架,而在学术界几乎一边倒的用起了Pytorch。
Keras
Keras 最初是一个独立的高级神经网络 API,支持多个后端(Theano、TensorFlow、CNTK)。
到了2017年,Keras 被集到TensorFlow中,成为其官方高级 API,成为 tf.keras
,不再支持其他后端。
但是2023年keras又宣布从TensorFlow中重新独立。现在TensorFlow只是keras支持的后端之一(keras目前主要支持jax torch TensorFlow numpy)
Keras这个框架目前用的人应该是比较多的。
Theano
It is being continued as PyTensor: www.github.com/pymc-devs/pytensor
是一个很古早的深度学习库(大约10多年前)。
目前其原本的开发者已经停止开发,由PyMC团队接手后改名为pyTensor继续开发。Theano曾是 Keras 的后端,但已停止维护,被 JAX 和 TensorFlow 取代。
Theano的知名度不如Pytorch和TensorFlow,但是在早些年的深度学习项目里还能看见它的身影(尤其记得去年清明节假期,我花了整整一个下午的时间编译安装Theano,就是因为那个项目用到的python太老了,需要整个重装……说多了都是泪)。
Paddle Paddle飞桨平台
官网: https://www.paddlepaddle.org.cn/
国货之星,来自百度的深度学习框架。其API与Pytorch高度兼容,甚至有人调侃只需要 import paddle as torch
就可以实现代码从torch到paddle的迁移。
关于paddle paddle本身的性能,看网上的评论应该还行,和TF、pytorch打得有来有回,特别是在图片文字识别(OCR)方面性能领先。
Paddle Paddle飞桨平台的另一个优点在于,百度提供了基于这一框架的AI在线算力平台 PP飞桨AI Studio ,可以通过签到和完成任务免费领取GPU算力(感觉有点对标Google colab,不过看起来比colab好用一些)。
R库
某种意义上,R语言自身就支持一些机器学习算法,例如线性回归、主成分分析(prcomp()
函数)等。然而,相比于Python语言,针对R语言开发的通用机器学习框架相对较少。下面列举一些相对比较有名的:
- mboost : 一个比较老的库,实现了boosting这一类集成学习算法,其底层的基学习器依然是
传统的回归模型(线性回归、逻辑回归、广义加性模型等)。在一些用到boosting算法的软件或程序包中会引用这个库,例如evolBoosting(一个在基因组上检测正选择信号的软件)。 - mlr3 : 相对比较新的一个机器学习库,
mlr3
采用模块化的设计理念,使得用户可以根据需要选择不同 的组件来构建机器学习工作流;另外,其使用 R6 类实现对象,以提高计算效率和内存管理。mlr3
提供了一致的接口来处理不同的机器学习任务,如分类、 回归、聚类等,这种一致性的接口设计大大提高了开发过程的灵活性。
如上图所示是mlr3的官网页面。 mlr3的官网上提供了非常详细的使用说明和API参考手册,以便于开发人员的查找阅读,这也是mlr3的优势之一。
Java库
针对Java编程语言也有一些机器学习的库,不过这些库在Java程序员群体之外的知名度可能不算特别高。
- Weka : Weka 是 Waikato Environment for Knowledge Analysis(Waikato 智能分析环境)的缩写,是新西兰 Waikato 大学开发的机器学习库。Weka 是一个通用的库,能够解决各种机器学习任务,如分类、回归和聚类。它具有丰富的图形用户界面、命令行界面和 Java API。
- DeepLearning4j :一个用 Java 编写的深度学习库。它具有分布式和单机深度学习框架,包括并支持各种神经网络结构,如前馈神经网络、RBM(Restricted Boltzmann Machine,受限玻尔兹曼机)、卷积神经网络、深度信念网络、自动编码器等。DL4J 可以解决不同的问题,比如识别面孔、声音、垃圾邮件和电子商务欺诈。
- H2O : 这是一个开源的、内存中的、分布式的、快速的、可扩展的机器学习和预测分析平台。其核心代码均由Java编写,并提供REST API ,允许通过 HTTP 上的 JSON 从外部程序或脚本访问 H2O-3 的所有功能。因此H2O与其说是一个机器学习框架,不如说是一个分析软件,并且这个分析软件允许外部程序通过REST API进行外部调用,因此其支持的编程语言不止Java,还包括python、R等等。