@atry
2017-05-13T01:19:39.000000Z
字数 3579
阅读 2035
DeepLearning.scala一共只有一个功能:把程序本身当成神经网络
这一个功能可以从两个角度理解
if
、else
、for
等动态控制流的神经网络。目前,动态神经网络被认为是下一代深度学习框架必备的功能。(此处希望佟达补充一下大佬原文出处)
是否具备动态神经网络的区别可以看成代差,今后几个月我希望能有机会和晓雷一起实现一些TensorFlow实现不出来的算法,体现这种代差。
对于程序员来说,他还是和以前一样写程序,可以使用Scala和Java里的一切普通函数、一切普通控制结构和一切第三方库。只不过他写的程序中,可以额外使用三种具有学习能力的类型,differentiable.Float
、differentiable.Double
和differentiable.INDArray
。使用这三种类型的代码和其他代码都完全一样,没有什么特殊之处,可以和其他代码混在一起写。
differentiable.Float
和differentiable.Double
类似普通的Float
和Double
,唯一的区别是在运行过程中,differentiable.Float
类型的值会根据训练数据得到反馈、自动修改内部的参数。differentiable.INDArray
类似nd4j里的INDArray
,表示多维数组,唯一的区别是在运行过程中,differentiable.INDArray
类型的值会根据训练数据得到反馈、自动修改内部的参数。虽然DeepLearning.scala只有“把程序本身当成神经网络”一个功能,不过可以给DeepLearning.scala创建的神经网络加一些定语。
Chainer是新出的支持动态神经网络的Python深度学习框架。最近比较火。
Deeplearning4j和DeepLearning.scala类似,都是JVM上的深度学习框架。
Deeplearning4j的公司开发了一个多维数组库 nd4j 。DeepLearning.scala 2.0也使用nd4j。
Deeplearning4j根本不具备任何定制算法的能力,只能调用作者内置的几个网络层。
DeepLearning.scala 1.0的目标也是把程序本身当成神经网络。但DeepLearning.scala 1.0并不能支持所有的编程语言特性。
if
和switch
两种控制语句Float
、Double
、INDArray
、Int
、Boolean
五种可以在神经网络中使用的基本数据结构for
和while
控制语句DeepLearning.scala 2.0支持所有Scala/Java语言特性。
DeepLearning.scala眼下的燃眉之急在于nd4j太弱,既难用又缺功能,导致 DeepLearning.scala 2.0 支持的算法比 TensorFlow 少。
我们正在开发的 DeepLearning.scala 2.1 中将使用我们自己的多维数组库来代替 nd4j。
我们自己的多维数组库使用一个JIT的编译器,能把MapReduce风格的代码编译为GPU上的神经网络。这种MapReduce风格的API用起来很像Spark,但有两个区别:a)运行在GPU上; b)具有学习能力。
届时 DeepLearning.scala 将由两个层次组成:
在 DeepLearning.scala 2.1 发布以后,我们会暂停主要功能的开发,而把重点放在算法应用和生态环境建设上。
目前DeepLearning.scala 2.0已经支持了异步多线程计算,DeepLearning.scala 3.0以后将在异步多线程计算的基础上支持集群上的分布式模型。
DeepLearning.scala可以很方便的调用Java库,Java代码也可以很方便的调用DeepLearning.scala创建的神经网络。但是目前算法开发者必须用Scala语言来编写神经网络。
我们将在DeepLearning.scala 3.0以后,开发一个Java到定制版Scala的编译器,让算法开发者可以直接使用Java语言编写神经网络,然后我们的编译器把Java代码编译成DeepLearning.scala。
DeepLearning.scala本身只是一门特定领域的语言(DSL),可以和任何JVM库交互。然而,用户可能更期待傻瓜式的整合,如果我们能提供一些以Spark Stream、HDFS、Kafka为数据源调用DeepLearning.scala的工具库,用户会更方便些。虽然社区很可能可以帮我们完成这部分工作,但我们至少需要在早期提供整合到第三方框架的样板程序。