分享

DeepLearning.scala 2.0.0发布:新特性介绍及创建复杂神经网络

desehawk 2017-7-26 20:18:17 发表于 常识型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 1 7419

问题导读

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]
插件名称插件描述
Builtins所有的内置插件
FixedLearningRateSetup fixed learning rate when training INDArray weights.
AdagradAn adaptive gradient algorithm with per-parameter learning rate for INDArray weights.
L1RegularizationL1 Regularization.
L2RegularizationL2 Regularization.
MomentumThe Momentum and NesterovMomentum optimizer for SGD.
RMSpropThe RMSprop optimizer for SGD.
AdamThe Adam optimizer for SGD.
INDArrayDumpingA plugin to dump weight matrices during training.
CNNA standalone CNN implementation.



文章链接

已有(1)人评论

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条