随着深度学习在语音、图像、自然语言等领域取得了广泛的成功,越来越多的企业、高校和科研单位开始投入大量的资源研发 AI 项目。同时,为了方便广大研发人员快速开发深度学习应用,专注于算法应用本身,避免重复造轮子的问题,各大科技公司先后开源了各自的深度学习框架,例如:TensorFlow(Google)、Torch/PyTorch(Facebook)、Caffe(BVLC)、CNTK(Microsoft)、PaddlePaddle(百度)等。

以上框架基本都是基于 Python 或者 C/C++ 开发的。而且很多基于 Python 的科学计算库,如 NumPy、Pandas 等都可以直接参与数据的建模,非常快捷高效。

然而,对于很多 IT 企业及政府网站,大量的应用都依赖于 Java 生态圈中的开源项目,如 Spring/Structs/Hibernate、Lucene、Elasticsearch、Neo4j 等。主流的分布式计算框架,如 Hadoop、Spark 都运行在 JVM 之上,很多海量数据的存储也基于 Hive、HDFS、HBase 这些存储介质,这是一个不容忽视的事实。

有鉴于此,如果有可以跑在 JVM 上的深度学习框架,那么不光可以方便更多的 Java/JVM 工程师参与到人工智能的浪潮中,更重要的是可以与企业已有的 Java 技术无缝衔接。无论是 Java EE 系统,还是分布式计算框架,都可以与深度学习技术高度集成。Deeplearning4j 正是具备这些特点的深度学习框架。

Deeplearning4j 是由美国 AI 创业公司 Skymind 开源并维护的一个基于 Java/JVM 的深度学习框架。同时也是在 Apache Spark 平台上为数不多的,可以原生态支持分布式模型训练的框架之一。此外,Deeplearning4j 还支持多 GPU/GPU 集群,可以与高性能异构计算框架无缝衔接,从而进一步提升运算性能。在 2017 年下半年,Deeplearning4j 正式被 Eclipse 社区接收,同 Java EE 一道成为 Eclipse 社区的一员。

另外,就在今年的 4 月 7 号,Deeplearning4j 发布了最新版本 1.0.0-alpha,该版本的正式发布不仅提供了一系列新功能和模型结构,也意味着整个 Deeplearning4j 项目的趋于稳定和完善。

Deeplearning4j 提供了对经典神经网络结构的支持,例如:

多层感知机/全连接网络(MLP)

受限玻尔兹曼机(RBM)

卷积神经网络(CNN)及相关操作,如池化(Pooling)、解卷积(Deconvolution)、空洞卷积(Dilated/Atrous Convolution)等

循环神经网络(RNN)及其变种,如长短时记忆网络(LSTM)、双向 LSTM(Bi-LSTM)等

词/句的分布式表达,如 word2vec/GloVe/doc2vec 等

在最新的 1.0.0-alpha 版本中,Deeplearning4j 在开始支持自动微分机制的同时,也提供了对 TensorFlow 模型的导入,因此在新版本的 Deeplearning4j 中可以支持的网络结构将不再局限于自身框架。

DeepLerning4j 基于数据并行化理论,对分布式建模提供了支持(准确来说是基于参数同步机制的数据并行化,并在 0.9.0 版本后新增了 Gradients Sharing 的机制)。此外,Apache 基金会下另一个分布式计算的顶级项目 Flink 正在积极考虑将 Deeplearning4j 进行集成。

Deeplearning4j 生态圈中除了深度神经网络这个核心框架以外,还包括像 DataVec、ND4J、RL4J 等一些非常实用的子项目。

目前开源的深度学习框架有很多,那么选择一个适合工程师自己、同时也可以达到团队业务要求的框架就非常重要了。在这个部分中,我们将从计算速度、接口设计与学习成本,和其他开源库的兼容性等几个方面,给出 Deeplearning4j 这个开源框架的特点及使用场景。

JVM 的执行速度一直为人所诟病。虽然 Hotspot 机制可以将一些对运行效率有影响的代码编译成 Native Code,从而在一定程度上加速 Java 程序的执行速度,但毕竟无法优化所有的逻辑。另外,Garbage Collector(GC)在帮助程序员管理内存的同时,其实也束缚了程序员的手脚,毕竟是否需要垃圾回收并不是程序员说了算;而在其他语言如 C/C++ 中,我们可以 free 掉内存块。

对于机器学习/深度学习来说,优化迭代的过程往往非常耗时,也非常耗资源,因此尽可能地加速迭代过程十分重要。运算速度也往往成为评价一个开源库质量高低的指标之一。鉴于 JVM 自身的局限性,Deeplearning4j 的张量运算通过 ND4J 在堆外内存(Off-Heap Memory/Direct Memory)上进行。

大量的张量运算可以依赖底层的 BLAS 库(如 OpenBLAS、Intel MKL),由于这些 BLAS 库多数由 Fortran 或 C/C++ 写成,且经过了细致地优化,因此可以大大提高张量运算的速度。对于这些张量对象,在堆上内存(On-Heap Memory)仅存储一个指针/引用对象,这样的处理也大大减少了堆上内存的使用。

总结来说,至少有以下 4 种场景可以考虑使用 Deeplearning4j:

如果你身边的系统多数基于 JVM,那么 Deeplearning4j 是你的一个选择;

如果你需要在 Spark 上进行分布式深度神经网络的训练,那么 Deeplearning4j 可以帮你做到;

如果你需要在多 GPU/GPU 集群上加快建模速度,那么 Deeplearning4j 也同样可以支持;

如果你需要在 Android 移动端加入 AI 技术,那么 Deeplearning4j 可能是你最方便的选择之一。

以上四点,不仅仅是 Deeplearning4j 自身的特性,也是一些 AI 工程师选择它的理由。

虽然 Deeplearning4j 并不是 GitHub 上 Fork 或者 Star 最多的深度学习框架,但这并不妨碍其成为 AI 工程师的一种选择。就 Skymind 官方发布的信息看,在美国有像 IBM、埃森哲、NASA 喷气推进实验室等多家明星企业和实验机构,在使用 Deeplearning4j 或者其生态圈中的项目,如 ND4J。算法团队结合自身的实际情况选择合适的框架,在多数时候可以做到事半功倍。

扫码免费试读

《Deeplearning4j 快速入门》

本课程主要面向深度学习/深度神经网络的企业研发人员、高校以及研究机构的研究人员。同时,对于致力于转型 AI 开发的 Java 工程师也会有很大的帮助。对于那些希望构建基于 JVM 上的 AI 项目的研发人员也有着一定的参考价值。

本课程会围绕 Deeplearning4j 框架,并结合深度学习在图像、语音、自然语言处理等领域的一些经典案例(如图像的分类、压缩、主体检测,文本分类、序列标注等),给出基于 Deeplearning4j 的解决方案。

本课程力求做到对 Deeplearning4j 及其生态圈进行详细的介绍,包括对 Deeplearning4j 现在已经支持的迁移学习(Transfer Learning)和强化学习(Reinforcement Learning)进行实例应用的介绍。同时希望通过本课程帮助真正有需要的研发人员落地 AI 项目或者提供一种可行的解决方案,尽量做到内容覆盖的全面性和语言的通俗易懂。