尽管深度学习的目标是设计能够处理各种任务的算法,但截至目前,其应用仍需一定程度的特化,我们重点关注CV,语音识别,NLP,以及其他商业领域的应用。
1. 大规模深度学习
DL基于联结主义,大量神经元作用在一起往往能够表示智能。神经元数量必须很大。相比上个世纪80年代,如今NN的精度和任务复杂度进一步提升,一个关键因素是网络规模的巨大提升。但即便如此,NN的规模也仅和昆虫级别差不多。
每个神经元的联结量,已接近高级生物水平(数字表示对应年份的成果)
神经元的数量,达到昆虫级别,和人类仍差距很大
1.1 快速的CPU实现
传统的NN用单机CPU训练(那会儿也没啥用),如今看来不可取。在大规模使用GPU之前,研究者们通过设计一些特定的CPU上的操作来大大提升计算效率,例如调整定点运算等。
1.2 GPU实现
现代NN的实现基于GPU(图形处理器/显卡),其最初是为图形应用而开发的专用硬件。视频游戏系统的消费市场,刺激了GPU的发展,在游戏设计上的特性,很好的转到了NN的计算上来。
1.2.1 为何能从游戏转到NN上?
- 并行化:视频游戏渲染需要快速、并行地执行计算。游戏环境和角色模型通过3D坐标实现,为了将其转化为2D显示器上的坐标,显卡需要并行地对许多矩阵执行乘法和除法。然后,显卡继续在每个像素上执行计算。这些计算是非常简单的,不涉及CPU常遇到的那种复杂分支运算等。例如,同一个刚体内的每个顶点都会乘上相同矩阵。各个计算过程完全独立,因此可并处处理。
- 带宽高:游戏视频的计算过程中,还涉及处理大量内存缓冲,以及描述每一个需要被渲染对象的纹理的位图信息,这些要求使得显卡设计时,拥有高度并行特性,和很高的内存带宽。
NN算法所需要的性能特性是相同的。训练时通常不涉及大量分支运算和控制指令。计算中大量参数每次迭代都要更新,带来很大缓冲,内存带宽常为瓶颈。NN可被分为多个单独的神经元,并独立于同一层内其他神经元进行处理,带来并行。因此,GPU很适合NN的训练。
1.2.2 GPU的火爆
人们发现了GPU用于科学计算,发布了通用GPU,用显卡训练NN的风潮开始了。NVIDIA发布了CUDA编程语言。软硬环境的齐备,通用GPU成为训练NN的理想平台。
在GPU上写高效代码是一个难题。在GPU上获得良好性能所需技术和传统CPU不同,例如GPU中,大多数可写内存位置并不会被高速缓存,计算某个值两次往往比计算一次然后从内存中读取更快。GPU代码天生多线程,不同线程之间要仔细协调好。GPU中常见设定是一个组中的所有线程都同时执行同一指令,意味着难以执行分支操作。
为解决这个问题,人们建立了一个包含高效操作的软件库,如包含卷积和矩阵乘法,然后从库中调用所需的操作来建立模型。例如 ML库 Pylearn2 中的算法均基于调用Theano和cuda-convnet 提供的高性能操作来指定。分层好处在于,简化对多种硬件的支持,因为Theano程序可在CPU/Gpu模式下运行,无需改变调用方式。其他还包括TensorFlow,Torch等。
1.2.3 大规模的分布实现
把训练或者推断的任务,分摊到多个机器上实现。
- 数据并行:每台机器跑一部分样本(每台都部署模型,多个安检口)
- 模型并行:每台机器负责一部分模型(数据在各台上流动,训的训,推的推)
作者简要提了,不再赘述。
1.2.4 模型压缩
商业应用中,一个时间内存开销都小的推断算法,比训练算法更为重要。对不需个性化设计的应用,只需一次训练,然后成千上万用户使用,例如部署到手机上。减少推断所需开销的一个策略:模型压缩,用一个更小的模型取代原始耗时的模型。
了解下概念,不再赘述。
1.2.5 动态结构
加速数据处理系统的一种策略:动态结构。给定一个输入,系统可动态决定运行NN的哪部分。也被称为条件计算。由于模型结构中许多部分可能只跟输入的一小部分有关,只计算那些需要的特征可起到加速的目的。决策树模型就是动态结构的一个例子,它是一堆if-else的集合。借鉴过来,训练一个决策树,其中每个节点使用NN做出决策(1992年)。
1.2.6 专用硬件实现
自从NN研究以来,硬件设计者已在致力于加速NN的专用硬件实现。如近年来的FPGA的长足发展足以证明(有人用FPGA强大的计算能力来做NN训练)。在针对诸如手机等低功率设备开发新的硬件设计,并且想要用于DL的一般公众应用(如语音识别等)时,研究专用硬件能够进一步推动其发展。2015年研究表明,低精度实现的工作是一个方向。
2. 计算机视觉
视觉是一个对人类以及许多动物毫不费力,但对计算机充满挑战的任务。DL中常用标准基准任务包括对象识别和OCR。大多数CV中的深度学习往往用于对象识别或者某种形式的检测(复现人类能力)。
2.1 预处理
原始输入往往以深度学习架构难以表示的形式出现。CV通常只需要相对少的预处理。图像应该标准化,使得像素在相同并且合理的范围内。将图像格式化为具有相同比例,严格上说是唯一一种必要的预处理。然而,即使这种操作也并不总是必要的,一些现代CNN接受可变大小的输入,并可动态调整池化大小以保持输出大小的恒定。其他CNN模型具有可变大小输出,尺寸可随输入自动缩放,例如图像逐像素标注模型。
数据集增强,可看做是只对训练集预处理的方式