选自 arXiv
机器之心合辑
参与:吴盼、姜思远、李亚洲
初学者在学习神经网络时,常常会不知从何入手,甚至不知道选择什么工具入手。 近日,来自意大利的四位研究人员发表了一篇题为《Neural Networks for Beginners A fast implementation in Matlab, Torch, TensorFlow》(Neural Networks for Beginners A fast implementation in Matlab, Torch, TensorFlow)的论文,三种神经网络工具,MATLAB,Torchmatlab全局变量怎么定义,和 TensorFlow,进行了介绍和比较。 机器之心对部分内容进行了整理介绍(包括第6节比较结论部分的完整介绍)。 论文原文请点击文末“阅读原文”。
本报告的目的
本报告介绍了最常见开发环境中的一些机器学习工具。 本报告主要关注实际问题,跳过任何理论介绍。 本报告面向想要进入机器学习领域的学生和正在寻找新框架的专家。
这篇论文是关于人工神经网络 (ANNs, [1,2]) 的,因为这是目前最热门的话题,并且已经在许多 AI 任务上取得了最先进的性能。 在分别介绍了各个框架之后,我们也给出了实现一些常见问题的setup方法,以便于比较。
由于该主题已得到广泛研究并继续快速增长,我们已将此文档与 GitHub 存储库配对,该存储库中的文档会动态更新,并且将来可能会增加大小。
GitHub地址:
目录
1 MATLAB:统一友好的环境
1.1 简介
1.2 设置异或实验
1.3 停止准则和正则化
1.4 绘制分离面
2 Torch和Lua环境
2.1 简介
2.2 开始
2.2.1 路亚
2.2.2 手电筒环境
2.3 设置异或实验
2.4 停止准则和正则化
2.5 绘制分离面
3张量流
3.1 简介
3.2 开始
3.2.1 蟒蛇
3.2.2 TensorFlow 环境
3.2.3 安装
3.3 设置异或实验
4 MNIST 手写字符识别
4.1 MATLAB 上的 MNIST
4.2 Torch 上的 MNIST
4.3 TensorFlow 上的 MNIST
5 卷积神经网络
5.1 软件
5.2 手电筒
5.3 张量流
6 关键比较
6.1 软件
6.2 手电筒
6.3 张量流
6.4 比较总体概况
6.5 计算问题
1 Matlab:统一友好的环境
1.1 简介
Matlab 是一个强大的工具,能够简单快速地处理大多数类型的数值运算、算法、编程和测试。 其直观友好的交互界面使处理、可视化和分析数据变得容易。 该软件为各种类型的任务提供了大量的内置数学函数,以及大量易于访问的文档。 它的主要设计是处理矩阵,所以几乎所有的函数和操作都是向量化的,这意味着它们可以管理标量以及向量、矩阵和张量(通常会有)。 因此,避免循环(在可能的情况下)并构建利用矩阵乘法的运算更为有效。
在本文档中,我们仅展示了一些用于开始使用人工神经网络 (ANN) 的简单机器学习相关工具。 我们假设读者具有基本知识,并专注于官方文档以获取更多信息。 例如,您可以从Matlab 的官方网站上找到有关如何掌握该软件的信息。 事实上,该许可证不是免费的,虽然大多数大学都向学生提供教学许可证,但可能无法获得所有当前的软件包。 特别是,Statistic and Machine Learning Toolbox 和 Neural Network Toolbox 提供了大量内置函数和模型,可用于实现适用于各种任务的不同 ANN 架构。
即使我们参考一些简单的孤立案例,也基本上需要这两个工具。 最容易理解的是 nnstart 函数,它激活一个简单的 GUI 并引导用户完成一个简单的 2 层架构。 它允许加载可用的数据样本或使用用户定义的数据(即输入数据和与目标对应的两个矩阵),训练网络并分析结果(错误趋势、混淆矩阵、ROC 曲线等)。
但是,还有更多功能可用于特定任务。 例如,patternnet 函数专为模式识别问题设计,newfit 函数适用于回归问题,feedforwardnet 函数最灵活,允许构建自定义和复杂的网络。 所有版本都以类似的方式实现,主要选项和方法适用于所有功能。 在下一章中matlab全局变量怎么定义,我们将展示如何管理可定制的架构并开始解决非常基本的问题。 相关详情可在官网查询:
2 Torch和Lua环境
2.1 简介
Torch7是一个简单易用且非常高效的科学计算框架,本质上是面向机器学习算法的。 Torch7是用C语言编写的,保证了高效率。 然而,通过 LuaJIT 界面(它提供了一种快速直观的脚本语言),我们可以完全交互(通常很方便)。 此外,它还集成了必要的库以支持 GPU 计算的 CUDA 环境。 Torch7 是迄今为止最常用的用于制作任何类型拓扑的 ANN 原型的工具之一。 事实上,Torch7 现在有很多包,一个庞大的社区和不断的更新和改进,这使得开发几乎任何一种架构都变得非常容易。
有关安装的信息可以在官网的入门部分找到:。 对于基于 UNIX 的操作系统,这个过程很简单,而 Windows 系统没有官方支持,即使有替代方案( )。 如果安装了 CUDA,则会自动添加 cutorch 和 cunn 包,其中包含使用 Nvidia GPU 所需的所有工具。
3张量流
3.1 简介
TensorFlow [5] 是一个用于数值计算的开源软件库,与其他机器学习框架相比是最年轻的。 TensorFlow 最初由 Google Brain 团队的研究人员和工程师开发,旨在鼓励对深层架构的研究。 但是,该环境为数值编程的某些领域提供了大量合适的工具。 它的计算方法是在数据流图的概念下构想的。 图的节点代表数学运算,图的边代表张量(多维数据数组)。 这个机器学习包的核心是用 C++ 编写的,但它提供了一个优秀的 Python API 并且有很好的文档记录。 TensorFlow 的主要特点是它的符号方法,它允许正向模型的通用定义,而相应的导数计算则由环境本身执行。
4 MNIST 手写字符识别
在本节中,我们将讨论如何构建一个 2 层 ANN 来解决 MNIST [6] 的分类问题,MNIST 是一个著名的手写字体识别数据集。 它广泛用于测试和比较通用机器学习算法和计算视觉方法。 该数据集提供手写数字的 28×28 像素(灰度)图像。 训练集和测试集分别包含 60,000 和 10,000 个样本。 压缩文件可以在官网获取: ,还有最常见算法的性能评估列表。
我们展示了一个标准的 2 层 ANN,每个隐藏层由 300 个神经元构成。 如图4所示,由于该网络是官网评测中报道的架构之一,我们可以很容易地对比得到的结果。 它的输入需要reshape成一个28·28=784个元素的一维向量来满足神经网络。 每幅图像最初由一个包含[0, 255]内的灰度像素值并归一化到[0, 1]内的灰度像素值的矩阵表示。 输出将是一个包含 10 个元素的预测向量,因为每个元素的标签将由一个 one-hot 编码的 10 槽二进制向量组成。 激活和惩罚函数在不同的环境中是不同的,以提供不同方法的概述。
图 4:MNIST 数据的 2 层网络模型的一般架构
5 卷积神经网络
在本节中,我们将介绍卷积神经网络 (CNNs [7, 6, 8]),这是一种广泛用于计算机视觉应用的重要且强大的学习架构。 卷积神经网络目前代表了图像分类任务的最先进算法,并构成了深度学习的主要架构。 我们展示了如何在所有提到的框架内构建和训练这样一个神经网络,还探索了它最常用的功能,并在 MNIST 上进行了一些实验以指出一些重要的功能。
图 8:MNIST 数据的 CNN 模型的一般架构
图 9:使用 Matlab 对 MNIST 图像进行训练后,第一个卷积层的 5×5 滤波器。
图 11:第一个卷积层的 5 × 5 滤波器使用 Torch 在 2 × 2 最大池化 MNIST 图像上训练。
图 12:使用 TensorFlow 训练的第一个卷积层的 5 × 5 滤波器和 MNIST 图像上描述的架构。
6 关键比较
在本节中,我们将概述这些环境。 尽管我们根据我们认为与机器学习软件开发主要相关的一些特征在表 1 中提供了分数比较,但本研究的目的并不是通过这种简单的评估来完成分析。 相反,我们希望提供一个有用的指南,帮助进入 ANN 和机器学习领域的人们根据个人背景和要求在环境中进行自我定位。 可以在以下位置找到更完整且具有统计相关性的比较:,我们在其中进行总结以帮助人们加快个人和全球任务的开发。
我们首先对每个环境进行一般描述,然后我们尝试比较它们在某些特定要求上的优缺点。 最后,我们对不同任务的计算性能进行了指示性数值分析,这也可以作为比较和讨论的主题。
6.1 软件
编程语言直观,软件还提供完整的软件包——允许用户定义和训练几乎任何类型的人工神经网络架构,而无需编写任何特定代码。 它的代码并行化(code parallelization)是自动完成的,与CUDA的集成也非常直接。 其可用的内置函数是高度可定制和可优化的,从而提供了一种快速且可扩展的实验设置方式,使您可以轻松获取网络的变量以进行深入分析。 然而,扩展和集成 Matlab 工具需要高级的环境知识。 这可能会促使用户从头开始编写代码,从而导致计算性能普遍下降。 这些特性使它成为一个完美的统计和分析工具箱,但作为开发环境它还是有点慢。 它的 GUI 需要一些重量级的计算,但另一方面,它是用户友好的,并提供最好的图形数据可视化。 MATLAB 的文档在官网上很完整,整理的也很好。
6.2 手电筒
Torch 的编程语言 (Lua) 有时可能有点困难,但它应该比其他一些语言快一点。 它提供所有需要的 CUDA 集成和 CPU 并行自动化。 其基于模块的结构允许灵活的 ANN 架构,并且扩展所提供的软件包相对容易。 还有其他一些功能强大的软件包,但总的来说需要一定的专业知识才能有意识地操作。 Torch 可以很容易地用作特定和通用算法测试的原型环境。 它的文档遍布 Torch 的 GitHub 存储库,有时特定问题不会立即得到解决。
6.3 张量流
它使用 Python 这种非常动态的语言,允许用户轻松编写脚本。 它的 CPU 并行化是自动的,并且它使用可以轻松利用 GPU 计算的计算图结构。 它提供了出色的数据可视化,使初学者可以轻松获得现成的包,尽管本文不涉及这方面。 其符号计算的力量仅涉及用户的前向步骤,而其反向步骤则完全源自 TensorFlow 环境。 这种灵活性使任何知识水平的用户都能非常快速地发展。
6.4 总体比较概述
如前所述,我们尝试在表 1 中总结全球比较,根据不同的角度打分 1-5。 关键比较指标如下所述:
表 1:三种环境的得分
6.5 计算问题
在表2中,我们比较了不同任务的运行时间,分析了CPU和GPU计算的优势和差异。 结果是 5 个实验的平均分数,所有实验均在同一台计算机上完成,该计算机具有 32 个内核的 Intel Xeon CPU E5-2650 v2 @ 2.60GHz、66 GB 内存、Geforce 和 4 GB 内存 GTX 960。操作系统是 Debian GNU/ Linux 8(杰西)。 我们在不同的网络框架、批量大小(包括随机梯度下降 (SGD)、1000 个样本批量和完整批量 (Full Bacth))和硬件(在 HW 列中描述)上测试了标准梯度下降管道。 这里使用的 CNN 架构与图 8 中给出的相同。结果是通过尝试使用尽可能相似的优化过程获得的。 在实践中,我们很难在 Matlab 内置的工具箱中应用特定的优化技术。 对于 Torch 的第二个架构(第 8 行),我们跳过了 SGD 的情况,因为它的第一个架构需要大量的计算时间。 我们还跳过了使用 GPU 的 ANN 上 Matlab 的 SGD,因为它的训练功能不支持 GPU 计算(第 4 行和第 10 行)。 事实上,这可能是一个不常见的案例研究,但我们报告其结果是为了最好的完整性。 我们跳过了 GPU 上的 CNN Full Batch 实验,因为它对内存的要求太高。
表 2:在 MNIST 数据上使用不同架构训练 10 个时期 5 次后给定环境的平均时间(以秒为单位)。 所有架构都使用 ReLU 作为激活函数,softmax 作为输出函数,交叉熵作为惩罚。