0
回答
如何简单地创建复杂神经网络?—— DeepLearning.scala 2.0.0发布了
华为云实践训练营,热门技术免费实践!>>>   

今天,DeepLearning.scala 2.0.0发布了。

DeepLearning.scala是个简单的框架,能以面向对象和函数式编程范式创建复杂的神经网络。

  • DeepLearning.scala运行在JVM上。既可以用于单独的JVM应用和服务,也能运行在Jupyter Notebook里。
  • DeepLearning.scala建模能力强。各种类型的神经网络都可以通过mapreduce等lambda表达式组装出来。
  • DeepLearning.scala支持插件。任何算法、子网络、超参数都可以做成插件发布到Github Gist上,复用到各种模型中。
  • 以上所有功能都支持静态类型检查。

DeepLearning.scala 2.0的特性

相比1.x版本,DeepLearning.scala 2.0移除了对可微分(differentiable)的ADT类型和Boolean类型提供的特殊支持。现在可微分计算图只是普通的Scala代码,包括ADT和Boolean在内的一切类型都能直接使用。

动态神经网络

与其他一些深度学习框架不同,DeepLearning.scala中的神经网络结构会在运行时才动态确定。我们的神经网络都是程序。一切Scala特性,包括函数、表达式和流程控制语句,都能直接在神经网络中使用。

比如:

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
  }
})

以上神经网络会根据ordinaryScalaFunction的返回值进入不同的子网络,而ordinaryScalaFunction只是个普通的Scala函数。

有了动态创建神经网络的能力,一名普通的程序员,就能够用很简单的代码构建复杂神经网络。你还是像以前一样编写程序,唯一的区别是,DeepLearning.scala里写的程序有学习能力,能够持续根据反馈修改自身参数。

函数式编程

DeepLearning.scala 2.0基于Monads,所以可以任意组合。即使是很复杂的网络也可以从基本操作组合出来。除了Monad以外,我们还提供了Applicative类型类(type class),能并行执行多处耗时计算。

比如,先前的例子可以用高阶函数风格写成这样:

def myDynamicNeuralNetwork(input: INDArray) = INDArrayLayer {
  layer1(input).forward.flatMap { outputOfLayer1 =>
    if (ordinaryScalaFunction(outputOfLayer1.data)) {
      dynamicallySelectedLayer2(outputOfLayer1).forward
    } else {
      dynamicallySelectedLayer3(outputOfLayer1).forward
    }
  }
}

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相关的函数。只要插件用户同时启用了AdagradFixedLearningRate两个插件,那么最终的Adagrad执行优化时就会自动调用FixedLearningRate中的计算。

DeepLearning.scala 2.0的插件

插件名称 插件描述
Builtins 所有的内置插件
FixedLearningRate Setup fixed learning rate when training INDArray weights.
Adagrad An adaptive gradient algorithm with per-parameter learning rate for INDArray weights.
L1Regularization L1 Regularization.
L2Regularization L2 Regularization.
Momentum The Momentum and NesterovMomentum optimizer for SGD.
RMSprop The RMSprop optimizer for SGD.
Adam The Adam optimizer for SGD.
INDArrayDumping A plugin to dump weight matrices during training.
CNN A standalone CNN implementation.
贡献你自己的算法、模型或者任何炫酷的功能

相关链接

举报
jobthoughtw...
发帖于4个月前 0回/110阅
顶部