深度学习教程之源码实现

上页

   现在我们已经介绍了最常见的神经网络变体,这里一些关于这些深度学习的挑战中的实现架构。

   开源神经网络深度学习库是一个建立神经网络的框架,满足以下标准:

  • 这是一个常见的架构,能够表达不同的模型(前面多篇介绍的各种神经网络)。
  • 能够使用不同的训练算法(反向传播,对比差异,等等)。
  • 不错的性能。

源码结构

   让我们从基本开始:

  • NeuralNetworkImpl 是所有神经网络模型的基类。
  • 每个网络包含一组 层 
  • 每一层有一个 连接列表 ,连接是连接两层之间的链接,这样网络是一个有向无环图。

   这种结构用于典型的前馈网络是足够敏捷的,包括 RBM 和更复杂的架构ImageNet 

   它还允许一层是一个以上的网络的一部分。比如 Deep Belief Network 中的层也是它们相应的RBM层。

   此外,这种架构允许DBN被视为预训练阶段的一系列stacked RBMs和微调阶段的一系列前馈网络在微调阶段,这既直观,编程又方便。

数据传播

   下一个模块负责通过网络传播数据,两步:

  1. 确定层的顺序。 例如,从一个多层感知器获得结果,数据送入输入层(因此,这是第一层计算),然后传播到输出层。 为了在反向传播中更新权重,输出错误从输出层以宽度优先顺序传播通过每一层。 这是通过使用LayerOrderStrategy 的不同实现,利用网络结构图,采用不同的图遍历方法。 一些例子包括 广度优先策略 和 针对特定的层 。 订单实际上是由层之间的连接决定,因此,这些策略返回的是连接的有序列表。

  2. 计算激活值。 每一层都有一个关联的 ConnectionCalculator, 获取连接列表(从上一步)和输入值(来自其他层),然后计算生成的激活结果。 例如,在一个简单的sigmoidal的前馈网络,隐层的 ConnectionCalculator 获取输入值,而偏置层(分别是输入数据和 1s数组 )和单元之间的权重(完全连接层,权重实际上是存储在一个 FullyConnected 连接作为一个 矩阵Matrix ),计算权重和,将结果喂给sigmoid函数。 连接计算器实现各种转移(如加权和卷积)和激活(如 多层感知器的logistic和双曲正切,RBM的二进制)功能。 他们中的大多数可以在GPU上使用 Aparapi 执行,可用mini-batch训练。

使用Aparapi GPU计算

  如前所述,,神经网络近年来复兴原因之一是他们的训练方法非常适合并行计算,能使用GPGPU加快训练速度。 在本例中,选择使用 Aparapi库作为GPU支持。

  Aparapi强加一些重要限制在连接计算器上:

  • 只有原始数据类型一维数组和变量是允许的。
  • 只有Aparapi内核 类的成员方法可以被GPU的可执行代码调用。

  因此,大部分的数据(权重、输入和输出数组)存储在 矩阵 实例中,内部使用的是一维浮点数组。 所有Aparapi连接计算器既使用 AparapiWeightedSum (完全连接层和加权和输入功能), AparapiSubsampling2D (二次抽样层),或AparapiConv2D (卷积层)。 这些限制中一部分可以通过 异构系统架构克服 。 Aparapi还允许在两个CPU和GPU运行相同的代码。

训练

  训练 模块实现了各种训练算法。 它依赖于前两个模块。 例如,BackPropagationTrainer (所有使用 教练 基类的教练)使用前馈阶段的前馈层计算器和一个特殊的广度优先层计算器,用于传播错误和更新权重。

返回教程首页

机器学习流行算法一览