搭建神经网络通常需要以下硬件设施:
此外,搭建神经网络的硬件设施还具有以下特点和优势:
比赛获胜者Alex Krizhevsky(NIPS 2012)开发了由Yann LeCun开创的深度卷积神经网络类型。其架构包括7个隐藏层(不包括池化层)。前五层是卷积层,后面两层是全连接层。激活函数在每个隐藏层中被修正为线性单元。这些训练比Logistic单元更快,更有表现力。除此之外,当附近的单元有更强的活动时,它还使用竞争规范化来压制隐藏的活动,这有助于强度的变化。有一些技术手段可以显著提高神经网络的泛化能力:1.从256×256图像中随机挑选224×224块图像以获取更多数据,并使用图像的左右反射。在测试时,结合10个不同的图像:四个角落加上中间,再加上它们水平翻转的五个。2.使用「dropout」来调整全局连接层(包含大部分参数)的权重。Dropout指的是随机移除每个训练样本一层中的一半隐藏单元,使其不再过多地依赖其它隐藏单元。就硬件要求而言,Alex在2个英伟达的GTX 580 GPU(超过1000个快速小内核)上使用了非常高效的卷积网络实现。GPU非常适合矩阵乘法,并且具有非常高的内存带宽。这让它在一周内训练了网络,并在测试时快速结合了10个图像块的结果。如果我们可以足够快地交换状态,我们可以在很多内核上传播一个网络。随着内核越来越便宜,数据集越来越大,大型神经网络将比老式计算机视觉系统发展得更快。3.循环神经网络
因此,情况对神经网络不利。但是,为什么?他们的想法毕竟是想将一连串简单的数学神经元结合在一起,完成一些复杂任务,而不是使用单个神经元。换句话说,并不是只有一个输出层,将一个输入任意传输到多个神经元(所谓的隐藏层,因为他们的输出会作为另一隐藏层或神经元输出层的输入)。只有输出层的输出是「可见」的——亦即神经网络的答案——但是,所有依靠隐藏层完成的间接计算可以处理复杂得多的问题,这是单层结构望尘莫及的。有两个隐藏层的神经网络言简意赅地说,多个隐藏层是件好事,原因在于隐藏层可以找到数据内在特点,后续层可以在这些特点(而不是嘈杂庞大的原始数据)基础上进行操作。以图片中的面部识别这一非常常见的神经网络任务为例,第一个隐藏层可以获得图片的原始像素值,以及线、圆和椭圆等信息。接下来的层可以获得这些线、圆和椭圆等的位置信息,并且通过这些来定位人脸的位置——处理起来简单多了!而且人们基本上也都明白这一点。事实上,直到最近,机器学习技术都没有普遍直接用于原始数据输入,比如图像和音频。相反,机器学习被用于经过特征提取后的数据——也就是说,为了让学习更简单,机器学习被用在预处理的数据上,一些更加有用的特征,比如角度,形状早已被从中提取出来。传统的特征的手工提取过程的视觉化因此,注意到这一点很重要:Minsky和Paper关于感知机的分析不仅仅表明不可能用单个感知机来计算XOR,而且特别指出需要多层感知机——亦即现在所谓的多层神经网络——才可以完成这一任务,而且罗森布拉特的学习算法对多层并不管用。那是一个真正的问题:之前针对感知机概括出的简单学习规则并不是适用于多层结构。想知道原因?让我们再来回顾一下单层结构感知机如何学习计算一些函数:
同质化计算:一个典型的神经网络仅由两种操作组合而成:矩阵乘法和线性整流函数(ReLu)。传统软件里的指令与之相比,明显会更加复杂和异构。由于只要用软件1.0的方法实现非常少部分的核心代码(比如矩阵乘法),正确性/性能验证都会容易很多。对芯片更友好:因为神经网络所需要的指令集相对更小,作为推论,在芯片上实现它们将会更容易,比如,使用自定义[ASIC芯片](https://www.forbes.com/sites/moorinsights/2017/08/04/will-asic-chips-become-the-next-big-thing-in-ai/#7d6d7c0511d9)、[neuromorphic chips](https://spectrum.ieee.org/semiconductors/design/neuromorphic-chips-are-destined-for-deep-learningor-obscurity)等等。当低能耗的智能设备充斥在我们周围时,这个世界也将为此改变。比如,把预训练卷积网络、语音识别、WaveNet语音合成网络装载到便宜又小巧的设备中,这样你可以用它连接其它东西。常量级的运行时间:一个典型的神经网络的每次前向迭代,需要的计算量(FLOPs)是高度一致的。在你手写的复杂C++代码中会出现的各种执行分支,在软件2.0中是不存在的。当然,你也许会有动态图的需求,但是执行流通常也是被严格限制了。即使在这种情况下,我们几乎也能保证,不会陷入未预料的无限循环之中。常量级的内存消耗:和上面一点相关,因为没有动态分配内存的需要,所以几乎没有可能需要与硬盘进行swap,代码中也没内存泄漏的可能。高度可移植:同传统的二进制文件或脚本相比,一连串的矩阵乘法操作要更容易运行在各种计算机环境下。