Auto Byte

专注未来出行及智能汽车科技

微信扫一扫获取更多资讯

Science AI

关注人工智能与其他前沿技术、基础学科的交叉研究与融合发展

微信扫一扫获取更多资讯

DLL:一个炙手可热的快速深度神经网络库

DLL 是一个旨在提供由 C++实现的受限玻尔兹曼机(RBM)和深度信念网络(DBN)及其卷积版本的软件库,由瑞士 University of Applied Science of Western Switzerland、弗里堡大学的研究者共同提出。与常用的深度学习框架类似,它还支持更多标准的神经网络。目前,该工具已开发至 1.1 版本。

项目链接:https://github.com/wichtounet/dll

引言

近年来,神经网络深度学习之名重获青睐。所谓的深度即是运用更大更深的网络,通常 z 指的是使用更大的输入维度来融合更多的上下文知识,以及增加网络层数来提取不同粒度级别的信息。

深度学习的成功主要归因于三个因素。第一,大数据的出现,意味着有大量的训练数据可用。第二,新的训练策略,例如无监督的预训练,它保证了深度网络会很好的初始化,并且还可以学习大量未标记数据集的高效特征提取器。

第三,更强劲的硬件有助于加速深度网络的训练过程。深度网络目前正在提高多领域的最新技术。成功的深度学习应用应该在物体识别 [1],图像标注 [2],上色 [3] 或生成高仿真的图像 [4] 等领域取得近乎人类的表现。

此外,免费且易用的框架的可用性以及基于公共数据集的详细实现样例的可用性也促成了深度学习技术的广泛运用。

从实际角度出发,理想的深度学习框架应当易于使用,能够提供高精度的快速训练,并有多种配置选项。满足所有要求十分困难,因为有些要求自相矛盾。鉴于此,我们可能会感受到现有框架之间的巨大差异。

在本文中,我们提出并开发了一个专注于高效计算,针对特定的网络模型和算法配置的深度学习框架。尽管我们意识到这些问题的局限性,但我们相信,我们在框架中实现的不同优化可能会引起研究社区的兴趣。

我们的框架叫做深度学习库(DLL),它是免费且开源的。开发这一框架的最初原因是其他机器学习框架中缺乏对受限玻尔兹曼机(RBM)[5] 和卷积 RBM(CRBM)[6] 的支持。在本论文截稿前,这一问题仍然存在。随着我们的不断开发,该框架扩展了通用的神经网络操作,现在可以用来训练标准人工神经网络(ANNs)和卷积神经网络(CNNs)[7] 等不同种类。

虽然也有 GPU 加速,但是 DLL 已针对中央处理器(CPU)的进行了速度优化。尽管 GPU 开始成为训练训练深层网络的即成标准,但它们并不总是可用,并且一些发布程序仍然针对现有的 CPU 实现。而且,一旦网络训练完成,通常会在 CPU 上执行推理。

因此,我们认为能够在合理的时间内训练神经网络并实现在 CPU 上的快速推理仍然很重要。在本文中,我们也记录了对 GPU 的成功优化,但我们必须注意到 GPU 的高级并行化已经充分利用 [8],[9],尤其是卷积网络 [10]。

除了加速外,本文的特别贡献是对几个最新的热门框架的综合评估。评估是在四个不同的模型和三个数据集上进行的。最终根据 CPU 和 GPU 上的计算时间以及训练模型的最终准确度进行比较。

本文的其余部分如下。第二节详细介绍 DLL 库。第三节介绍实验部分。第四节介绍 MNIST 的实验结果,第五节介绍 CIFAR-10 的实验结果,第六节介绍 ImageNet 的实验结果。最后,第七节给出总结。

DLL:深度学习工具库

深度学习库(DLL)是最初专注于支持 RBM 和 CRBM 的机器学习框架。它是在几项研究工作 [11] - [14] 的背景下开发并使用的。它还支持各种神经网络层和标准反向传播算法。它是用 C ++ 编写的,主接口是 C ++(在论文 II-B 节中有示例)。该框架也可以通过用简单的描述语言来使用,以使研究人员更容易上手。

该框架完全支持 RBM 模型 [5]。还可以使用对比散度(CD)[15] 进行训练。该实现是根据 [16] 中的模型设计的。它还支持深度信念网络(DBN),先逐层预训练,然后使用梯度下降法进行微调。

RBM 支持大范围的可见和隐藏单元类型,如二值函数,高斯函数和整流线性单元(ReLU)[17]。同时也按照 [6] 的模型整合对 CRBM 的支持,同时第二版整合最大池化层为池化层。

该框架还支持常规神经网络。即可以训练人工神经网络和 CNN。CNN 也支持最大池化层和平均池化层。这些网络可以使用小批量梯度下降法进行训练。同时支持动量权重衰减等基本学习选项。

该框架还支持一些高级特性,如 Dropout [18] 和 批归一化 [19]。最后,该框架也整合了 Adagrad [20],Adadelta [21] 和 Adam [22] 等自适应优化器。并支持自动编码器 [23] 和卷积自动编码器 [24]。他们可以接受有噪声的输入数据来训练以增强泛化性能,这种技术被称为去噪自动编码器 [25]。

DLL 库遵从 MIT 开源许可条款,免费使用。该项目的详细信息以及部分教程可参考主页。

实验评估

我们通过一些实验将 DLL 与目前流行的深度学习框架进行了比较。每种模型在每个框架上的训练时间都会进行比较,无论是在 CPU 上还是在 GPU 上。所有实验都计算了在每个框架上测试的准确度。结果表明,所有测试框架在使用相同参数进行训练时都准确率都不相上下。

我们在这里指出,这些实验的目标不是针对测试数据集取得最优性能。事实上,这些模型之所以简单,是为了与大量的框架进行比较。此外,如果我们的目的是取得高准确率,网络不应该总是像实验那样训练多个 epochs。

最后,重要的是:我们不知道所有框架的全部细节。我们尽最大努力保持网络架构和训练参数的同一性,但可能框架本身的一些实现细节导致训练方法,解释执行时间的差异略有不同。

本研究介绍的所有实验都运行在频率为 3.4 GHz Intel R CoreTM i7-2600,12 GB RAM 的 Gentoo Linux 机器上(针对这些测试而禁用 CPU 调频)。机器开启了 SSE 和 AVX 矢量化扩展。BLAS 通过 Intel R Math Kernel Library(MKL)以并行模式执行。基准 GPU 是 NVIDIA Geforce R GTX 960 显卡,配以 CUDA 8.0.4.4 和 CUDNN 5.0.5。为了确保实验可重现,用于这些实验的源代码已开源。

项目地址: https://github.com/wichtounet/frameworks

以下是研究人员选取的对比框架:

1)Caffe [30]:Caffe 是一个高级机器学习框架,专注于速度和表达。它是用 C++ 开发的,可通过文本描述性语言使用。Caffe 1.0 可通过源码安装并支持 GPU 和 MKL。

2)TensorFlow [31]:一个允许构建数据流图来执行数值计算的通用的低级框架。该框架的核心用 C ++ 编写,但这些功能大多可通过 Python 接口调用。Tensorflow 1.3.1 可通过源码安装并支持 CUDA,CUDNN 和 MKL。

3)Keras [32]:一个高级机器学习库,为 Tensorflow 或 Theano 提供前端接口。用 Python 编写。提供了大量的高级模型,简化了机器学习模型的开发。可使用 Tensorflow 1.3.1 的官方软件包来安装 Keras 2.0.8。

4)Torch [33]:Torch 是最早于 2002 年出现的一个低级机器学习框架。通过 Lua 前端接口调用。虽然它是一个低级框架,但包含了用于机器学习的高级模块。它可以通过 Git commit 3e9e141 进行源码安装并支持 CUDA 和 MKL。

5)DeepLearning4J [34]:DeepLearning4J 是用 Java,C 和 C ++ 编写的 Java 深度学习框架。它具有非常多的功能,且专注于分布式计算。可从 Maven 获取 0.9.1 版本。

这些框架是根据它们的流行程度来选择的,也是也为了编程语言的多样性。DLL 可直接从源代码调用,截稿时可用的最新版本是(Git commit 2f3c62c)。

图 2:各框架基于 MNIST 数据集的全连接神经网络实验在 CPU 和 GPU 上的训练时间性能的比较。

图 3:各框架在 CNN,MNIST,CPU 和 GPU 上的训练时间性能比较。

论文:DLL: A Blazing Fast Deep Neural Network Library

链接:https://arxiv.org/pdf/1804.04512.pdf

深度学习库(DLL)是一个全新的机器学习库,它专注于速度。DLL 支持前馈神经网络,如全连接的人工神经网络(ANN)和卷积神经网络(CNN)。它还对受限玻尔兹曼机器(RBM)和卷积 RBM 提供非常全面的支持。

我们这项工作的主要动机是提出与评估有潜力加速训练和推理时间的创新的软件工程策略。这些策略大多独立于深度学习算法。我们在三个数据集和四个不同的神经网络模型上对 DLL 与其它五个流行的深度学习框架进行了比较。实验表明,所提出的框架在 CPU 和 GPU 上均有大幅提升。在分类性能方面,DLL 可获得与其他框架相似的准确度。

工程深度学习框架开源库受限玻尔兹曼机深度信念网络
1
相关数据
英特尔机构

英特尔(NASDAQ: INTC)是全球半导体行业的引领者,以计算和通信技术奠定全球创新基石,塑造以数据为中心的未来。我们通过精尖制造的专长,帮助保护、驱动和连接数十亿设备以及智能互联世界的基础设施 —— 从云、网络到边缘设备以及它们之间的一切,并帮助解决世界上最艰巨的问题和挑战。

http://www.intel.cn/
相关技术
深度学习技术

深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络和深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。

自动编码器技术

自动编码器是用于无监督学习高效编码的人工神经网络。 自动编码器的目的是学习一组数据的表示(编码),通常用于降维。 最近,自动编码器已经越来越广泛地用于生成模型的训练。

池化技术

池化(Pooling)是卷积神经网络中的一个重要的概念,它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效的原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。

权重技术

线性模型中特征的系数,或深度网络中的边。训练线性模型的目标是确定每个特征的理想权重。如果权重为 0,则相应的特征对模型来说没有任何贡献。

机器学习技术

机器学习是人工智能的一个分支,是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、计算复杂性理论等多门学科。机器学习理论主要是设计和分析一些让计算机可以自动“学习”的算法。因为学习算法中涉及了大量的统计学理论,机器学习与推断统计学联系尤为密切,也被称为统计学习理论。算法设计方面,机器学习理论关注可以实现的,行之有效的学习算法。

Dropout技术

神经网络训练中防止过拟合的一种技术

基准技术

一种简单的模型或启发法,用作比较模型效果时的参考点。基准有助于模型开发者针对特定问题量化最低预期效果。

参数技术

在数学和统计学裡,参数(英语:parameter)是使用通用变量来建立函数和变量之间关系(当这种关系很难用方程来阐述时)的一个数量。

卷积技术

TensorFlow技术

TensorFlow是一个开源软件库,用于各种感知和语言理解任务的机器学习。目前被50个团队用于研究和生产许多Google商业产品,如语音识别、Gmail、Google 相册和搜索,其中许多产品曾使用过其前任软件DistBelief。

张量技术

张量是一个可用来表示在一些矢量、标量和其他张量之间的线性关系的多线性函数,这些线性关系的基本例子有内积、外积、线性映射以及笛卡儿积。其坐标在 维空间内,有 个分量的一种量,其中每个分量都是坐标的函数,而在坐标变换时,这些分量也依照某些规则作线性变换。称为该张量的秩或阶(与矩阵的秩和阶均无关系)。 在数学里,张量是一种几何实体,或者说广义上的“数量”。张量概念包括标量、矢量和线性算子。张量可以用坐标系统来表达,记作标量的数组,但它是定义为“不依赖于参照系的选择的”。张量在物理和工程学中很重要。例如在扩散张量成像中,表达器官对于水的在各个方向的微分透性的张量可以用来产生大脑的扫描图。工程上最重要的例子可能就是应力张量和应变张量了,它们都是二阶张量,对于一般线性材料他们之间的关系由一个四阶弹性张量来决定。

神经网络技术

(人工)神经网络是一种起源于 20 世纪 50 年代的监督式机器学习模型,那时候研究者构想了「感知器(perceptron)」的想法。这一领域的研究者通常被称为「联结主义者(Connectionist)」,因为这种模型模拟了人脑的功能。神经网络模型通常是通过反向传播算法应用梯度下降训练的。目前神经网络有两大主要类型,它们都是前馈神经网络:卷积神经网络(CNN)和循环神经网络(RNN),其中 RNN 又包含长短期记忆(LSTM)、门控循环单元(GRU)等等。深度学习是一种主要应用于神经网络帮助其取得更好结果的技术。尽管神经网络主要用于监督学习,但也有一些为无监督学习设计的变体,比如自动编码器和生成对抗网络(GAN)。

反向传播算法技术

反向传播(英语:Backpropagation,缩写为BP)是“误差反向传播”的简称,是一种与最优化方法(如梯度下降法)结合使用的,用来训练人工神经网络的常见方法。该方法计算对网络中所有权重计算损失函数的梯度。这个梯度会反馈给最优化方法,用来更新权值以最小化损失函数。 在神经网络上执行梯度下降法的主要算法。该算法会先按前向传播方式计算(并缓存)每个节点的输出值,然后再按反向传播遍历图的方式计算损失函数值相对于每个参数的偏导数。

梯度下降技术

梯度下降是用于查找函数最小值的一阶迭代优化算法。 要使用梯度下降找到函数的局部最小值,可以采用与当前点的函数梯度(或近似梯度)的负值成比例的步骤。 如果采取的步骤与梯度的正值成比例,则接近该函数的局部最大值,被称为梯度上升。

卷积神经网络技术

卷积神经网路(Convolutional Neural Network, CNN)是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出色表现。卷积神经网路由一个或多个卷积层和顶端的全连通层(对应经典的神经网路)组成,同时也包括关联权重和池化层(pooling layer)。这一结构使得卷积神经网路能够利用输入数据的二维结构。与其他深度学习结构相比,卷积神经网路在图像和语音识别方面能够给出更好的结果。这一模型也可以使用反向传播算法进行训练。相比较其他深度、前馈神经网路,卷积神经网路需要考量的参数更少,使之成为一种颇具吸引力的深度学习结构。 卷积网络是一种专门用于处理具有已知的、网格状拓扑的数据的神经网络。例如时间序列数据,它可以被认为是以一定时间间隔采样的一维网格,又如图像数据,其可以被认为是二维像素网格。

准确率技术

分类模型的正确预测所占的比例。在多类别分类中,准确率的定义为:正确的预测数/样本总数。 在二元分类中,准确率的定义为:(真正例数+真负例数)/样本总数

大数据技术技术

大数据,又称为巨量资料,指的是传统数据处理应用软件不足以处理它们的大或复杂的数据集的术语。

前馈神经网络技术

前馈神经网络(FNN)是人工智能领域中最早发明的简单人工神经网络类型。在它内部,参数从输入层经过隐含层向输出层单向传播。与递归神经网络不同,在它内部不会构成有向环。FNN由一个输入层、一个(浅层网络)或多个(深层网络,因此叫作深度学习)隐藏层,和一个输出层构成。每个层(除输出层以外)与下一层连接。这种连接是 FNN 架构的关键,具有两个主要特征:加权平均值和激活函数。

物体识别技术

计算机视觉领域的一个分支,研究物体的识别任务

动量技术

优化器的一种,是模拟物理里动量的概念,其在相关方向可以加速SGD,抑制振荡,从而加快收敛

分布式计算技术技术

在计算机科学中,分布式计算,又译为分散式運算。这个研究领域,主要研究分布式系统如何进行计算。分布式系统是一组电脑,通过网络相互链接传递消息与通信后并协调它们的行为而形成的系统。组件之间彼此进行交互以实现一个共同的目标。

图像标注 技术

图像标注(Image Captioning)是计算机根据图像自动生成相对应的描述文字,是自然语言处理与计算机视觉领域的结合。由于这项工作同时涉及到图像理解和语言生成,在深度学习到来以前是很难完成的复杂任务。在深度学习到来后,凭借 CNN(卷积神经网络)和 RNN(循环神经网络)强大的特征分析能力,我们可以通过 CNN 将图片编码为一个特征向量,再利用 RNN 的语言模型将其解码为句子。这种解决问题的方式,是从机器翻译演变而来的。在机器翻译中,我们用 RNN 把源句子编码为一个向量,现在我们把 RNN 替换为 CNN,把源句子替换为源图像,即转化到了图像标注的问题上。随着研究的深入,在这一个问题上,也有了更多样化的解决思路,比如引入 GAN(对抗生成网络)和强化学习来提高语言的生成质量。

批归一化技术

批归一化(Batch Normalization,BN)由谷歌于2015年提出,是一个深度神经网络训练的技巧,它不仅可以加快模型的收敛速度,还能在一定程度上缓解深层网络中的“梯度弥散”问题,从而使得训练深层网络模型更加容易和稳定。目前BN已经成为几乎所有卷积神经网络的标配技巧了。从字面意思看来Batch Normalization(简称BN)就是对每一批数据进行归一化。

受限玻尔兹曼机技术

受限玻尔兹曼机(英语:restricted Boltzmann machine, RBM)是一种可通过输入数据集学习概率分布的随机生成神经网络。RBM最初由发明者保罗·斯模棱斯基于1986年命名为簧风琴(Harmonium),但直到杰弗里·辛顿及其合作者在2000年代中叶发明快速学习算法后,受限玻兹曼机才变得知名。受限玻兹曼机在降维、分类、协同过滤、特征学习和主题建模中得到了应用。根据任务的不同,受限玻兹曼机可以使用监督学习或无监督学习的方法进行训练。受限玻兹曼机也可被用于深度学习网络。具体地,深度信念网络可使用多个RBM堆叠而成,并可使用梯度下降法和反向传播算法进行调优。

优化器技术

优化器基类提供了计算梯度loss的方法,并可以将梯度应用于变量。优化器里包含了实现了经典的优化算法,如梯度下降和Adagrad。 优化器是提供了一个可以使用各种优化算法的接口,可以让用户直接调用一些经典的优化算法,如梯度下降法等等。优化器(optimizers)类的基类。这个类定义了在训练模型的时候添加一个操作的API。用户基本上不会直接使用这个类,但是你会用到他的子类比如GradientDescentOptimizer, AdagradOptimizer, MomentumOptimizer(tensorflow下的优化器包)等等这些算法。

推荐文章
暂无评论
暂无评论~