问题导读
1.DeepLearning.scala是什么框架?
2.DeepLearning.scala 2.0有哪些特性?
3.动态神经网络如何创建?
今天,我们很荣幸宣布,DeepLearning.scala 2.0.0发布了。 DeepLearning.scala是个简单的框架,能以面向对象和函数式编程范式创建复杂的神经网络。 - DeepLearning.scala运行在JVM上。既可以用于单独的JVM应用和服务,也能运行在Jupyter Notebook里。
- DeepLearning.scala建模能力强。各种类型的神经网络都可以通过map、reduce等lambda表达式组装出来。
- DeepLearning.scala支持插件。任何算法、子网络、超参数都可以做成插件发布到Github Gist上,复用到各种模型中。
- 以上所有功能都支持静态类型检查。
DeepLearning.scala 2.0的特性
相比1.x版本,DeepLearning.scala 2.0移除了对可微分(differentiable)的ADT类型和Boolean类型提供的特殊支持。现在可微分计算图只是普通的Scala代码,包括ADT和Boolean在内的一切类型都能直接使用。
动态神经网络
与其他一些深度学习框架不同,DeepLearning.scala中的神经网络结构会在运行时才动态确定。我们的神经网络都是程序。一切Scala特性,包括函数、表达式和流程控制语句,都能直接在神经网络中使用。
比如:
[mw_shl_code=scala,true]def ordinaryScalaFunction(a: INDArray): Boolean = {
a.signnum.sumT > math.random
}
def myDynamicNeuralNetwork(input: INDArray) = INDArrayLayer(monadic[Do] {
val outputOfLayer1 = layer1(input).forward.each
if (ordinaryScalaFunction(outputOfLayer1.data)) {
dynamicallySelectedLayer2(outputOfLayer1).forward.each
} else {
dynamicallySelectedLayer3(outputOfLayer1).forward.each
}
})[/mw_shl_code]
以上神经网络会根据ordinaryScalaFunction的返回值进入不同的子网络,而ordinaryScalaFunction只是个普通的Scala函数。
有了动态创建神经网络的能力,一名普通的程序员,就能够用很简单的代码构建复杂神经网络。你还是像以前一样编写程序,唯一的区别是,DeepLearning.scala里写的程序有学习能力,能够持续根据反馈修改自身参数。
函数式编程
DeepLearning.scala 2.0基于Monads,所以可以任意组合。即使是很复杂的网络也可以从基本操作组合出来。除了Monad以外,我们还提供了Applicative类型类(type class),能并行执行多处耗时计算。
比如,先前的例子可以用高阶函数风格写成这样:
[mw_shl_code=scala,true]def myDynamicNeuralNetwork(input: INDArray) = INDArrayLayer {
layer1(input).forward.flatMap { outputOfLayer1 =>
if (ordinaryScalaFunction(outputOfLayer1.data)) {
dynamicallySelectedLayer2(outputOfLayer1).forward
} else {
dynamicallySelectedLayer3(outputOfLayer1).forward
}
}
}
[/mw_shl_code]
DeepLearning.scala 2.0的核心概念是DeepLearning依赖类型类(dependent type class),可以见证(witness)可微分表达式。换句话说,对于任何数据类型,包括你定制的类型,只要提供了对应的DeepLearning类型类的实例,就能具备深度学习能力,成为深度神经网络的一部分。
面向对象编程
DeepLearning 2.0的代码结构利用了依赖对象类型演算(Dependent Object Type calculus,DOT),所有特性都通过支持混入(mixin)的插件来实现。插件能修改一切DeepLearning.scala类型的API和行为。
这种架构不光解决了expression problem,还让每个插件都可以“虚依赖”其他插件。
比如,插件作者编写优化器Adagrad插件时,无需显式调用learning rate相关的函数。只要插件用户同时启用了Adagrad和FixedLearningRate两个插件,那么最终的Adagrad执行优化时就会自动调用FixedLearningRate中的计算。
DeepLearning.scala 2.0的插件[td]
文章链接
|