分享

深度学习原理及实践应用

本帖最后由 hero1122 于 2017-3-13 14:19 编辑
问题导读:
1.深度学习是什么?
2.深度学习用来解决哪些实际问题?
3.如何构建深度学习训练环境?
4.常用的深度学习框架有哪些?如何选择?
5.如何对深度学习的训练数据集进行管理?
6.如何实现深度学习的模型训练?
7.深度学习的技术如何在生产环境中应用?


引言
自2006年Hinton提出神经网络新的训练方法起,深度学习发展迅速,促使人工智能在图像、语音、自然语言处理等多个领域有了实质性的突破,达到产业应用标准。然而,深度学习作为人工智能领域的一项前瞻技术,实践性强,入门门槛高,关于深度学习的研究与应用,现在仍有很多问题没有找到满意的答案,这些都给深度学习的广泛应用带来挑战。

本文旨在提供一份清晰、简洁的深度学习实践说明,以便从事深度学习研究与工程技术人员能够快速掌握深度学习的实际经验。

深度学习概述
深度学习是模拟人脑进行分析学习的多层神经网络,它模仿人脑的机制来解释数据,处理数据,通过组合低层特征形成更加抽象的高层表示属性类别或特征,以发现数据的分布式特征表示。

深度学习本质上是机器学习技术的一种,根据一般的机器学习和深度学习的工作方法和我们的经验,我们认为采用深度学习技术解决实际业务问题的完整过程主要包括五个方面:问题理解与分析、训练环境构建、数据管理、模型训练以及生产应用。基于此,我们对每个环节分别阐述最佳实践,作为研究与工程应用的参考指南。

深度学习五个基本环节

深度学习五个基本环节
图1.深度学习解决问题的五个基本环节

问题理解与分析
深度学习不是一项“放之四海而皆准”的技术,采用深度学习解决复杂问题,首先需对实际问题全面剖析:问题是否适合采用深度学习解决,是否具备深度学习应用的数据条件,如何将实际业务问题转换成深度学习可以解决的技术问题等。

场景分析

原则上,传统机器学习能够解决的问题,深度学习都能够解决,譬如传统机器学习主要面向学习类问题,包括有监督学习(分类和回归场景),无监督学习(聚类等),均能够采用深度学习网络训练模型和应用,但是两者应用效果会有所差异。依据实践,在如下场景,可以优先考虑采用深度学习:

(1)业界提供了公开成熟的深度学习网络模型的细分场景。面对这些场景的业务问题,可以基于公开的网络模型进行网络权重微调(fine-tune),能够达到不错效果。以图像识别为例,业界已经公开了AlexNet,ResNet等深度网络模型,在解决实际图像分类问题时可避免从头训练深度模型,在该模型的基础上, 使用样本数据进行模型参数优化(fine-tune)即可。

(2)深度学习应用成功的行业,譬如,深度学习在图像分类、语音识别、自然语言处理等感知领域均取得实际应用效果,并在行业内得到验证,因此如果问题域属于图像、语音、视频等领域的问题,深度学习应用效果往往比较理想。

(3)业务问题本身复杂,样本数据充足,但问题本身又无法或者难以用人工的方式提取特征,此时传统机器学习无法进行模型训练,采用深度学习,可以有效发挥深度学习自动提取特征的价值。

与此同时,某些场景并不适合采用深度学习来解决问题,譬如在小规模的数据场景下,深度学习容易过拟合(Overfitting),正如奥卡姆剃刀原则所说,“如无必要,勿增实体”。

此外,深度学习模型训练过程中,需要大量的浮点计算以及矩阵运算,若问题解决方不具备高效的计算环境以及海量样本数据的客观条件,也不推荐使用深度学习解决问题。

数据评估

无论是有监督学习,还是无监督学习,深度学习的模型训练都建立在大量样本的迭代训练基础之上,在采用深度学习解决实际问题之前,需对问题领域数据仔细分析,衡量数据规模与质量。以下提供几条基本原则供借鉴:

(1)深度学习能够从样本数据自动提取特征,但在实际考查准备样本数据集时,建议尽可能与问题领域的业务专家充分交流,洞察问题与数据的相关性,剔除噪声数据,这样可以大大提高模型训练的效率,少走弯路。

(2)考察问题领域的存量数据后,若发现不是特别充裕,可考虑如下方法进行数据扩充:爬取公共数据;对已有数据进行变换,扩充数据,譬如利用反射变化扩充图片数据;人工制造,譬如人工拍摄图像数据等;与产业界公司进行数据合作等。

(3)当采用业界公开的网络模型进行微调(fine-tune),需要进一步验证问题数据类型与公开网络模型训练数据类型的相似性。若两者数据类型差距比较大,采用微调(fine-tune)的方法训练出来的模型效果往往不理想,可能需要考虑从头开始训练新的模型。

(4)样本数据在整个深度学习模型训练过程不是一成不变的,模型实际训练过程中,会视模型的训练效果,不断进行多轮数据的迭代优化等,让样本数据类型覆盖更多的实际测试数据的类型,降低噪声数据。因此,需要牢记,数据考量会贯穿整个模型训练过程。

问题抽象

在利用传统机器学习分析具体问题时,需要将问题抽象为有监督学习问题或者无监督问题。如果是有监督问题,还需要进一步抽象成分类或回归问题,最后再选择适合的算法来训练模型。深度学习本质上仍属机器学习范畴,因此利用深度学习解决实际问题,需要同样的问题抽象过程:
与传统机器学习一样,有监督学习问题和无监督学习问题主要由样本数据是否需要标签来决定:

(1)有监督学习问题通过有标签训练数据集的形式,在输入和输出的数据之间建立相关性。

(2)无监督学习问题通过分析非标记数据,帮助检测数据的相似性和差异性,譬如图片搜索和欺诈检测等应用场景。

当问题定位为有监督问题后,需进一步确认是分类问题还是回归问题,判断原则如下:

(1)回归问题通常用来预测一个值,如预测下一季度银行卡消费金额、交易笔数等等,回归是对真实值的一种逼近预测。

(2)分类问题是用于将数据打上一个标签,通常结果为离散值,分类并没有逼近的概念,最终正确结果只有一个,错误的就是错误的,不会有相近的概念。

当实际问题抽象成具体深度学习技术问题后,即可以结合问题的数据类型选择合适的深度网络结构进行模型训练,譬如图像数据处理,选择卷积神经网络(CNN)等。

训练环境构建

构建深度学习研究环境首先要考虑硬件环境的支持,这也是深度学习算法区别于其他机器学习算法的重要一点,同时还要依据实际需求对深度学习软件框架进行规划和选择。

硬件环境选择

深度学习需要很高的内在并行度、大量的浮点计算能力以及矩阵运算,传统的基于CPU集群的云计算技术并不擅长处理这类问题,例如,斯坦福大学的研究人员Adam Coates采用GPU将三台计算机连贯在一起进行深度学习实验,结果却得到了与Google数千台计算机一样的效果。由此可见,只有更好的硬件加速条件,才能满足现有数据和模型规模继续扩大的需求。

目前,最主流的硬件加速器件非GPU莫属。最重要的是GPU出色的浮点计算性能特别提高了深度学习两大关键活动:分类和卷积的性能,同时又达到所需的精准度,并且在相同的精度下,相对传统CPU的方式,拥有更快的处理速度、更少的服务器投入和更低的功耗。因此,Google和Facebook等巨头也在转向使用GPU作为硬件加速的基础原件。

此外,业界也出现了其他进行深度学习硬件加速的方案。比如,部分公司正在研究采用FPGA作为进行深度学习加速,以期使其对深度学习领域经常使用的上层软件兼容性更强,并行训练架构更加灵活。同时,FPGA在单位能耗下性能更强,这对大规模服务器部署或资源有限的嵌入式应用的研究而言也至关重要。

建设深度学习硬件加速环境需要较大的资金和技术投入,需要进行精细研究并审慎选择,建议遵循以下原则:

  • 选择硬件加速环境时尽量采用具备更多用户友好开发工具的芯片,这样能够很好的降低学习门槛。
  • 建立庞大且需要平行的深度网络,需要考虑硬件的开放性、数据并行和模型并行支持度,以及单位能耗特点。
  • 深度学习模型训练过程中需对深度网络进行多次反向传导运算计算量大,而深度模型进行生产应用时只需进行前向传播计算,因此建议在训练环境中采用硬件加速,生产应用环境无需进行硬件加速。

常用深度学习软件框架简介

深度学习是一个发展迅速的领域,除了众多学术界专家在理论方面的贡献之外,工业界也为深度学习提供了很多工具框架,例如,伯克利视觉和学习中心开发的Caffe,微软推出的开源深度学习框架CNTK,LISA开发的基于Python的Theano,Google主推的TensorFlow、以及Torch、MxNet等。目前来看,业界使用最多的是Caffe、Theano和TensorFlow。

(1)Caffe

Caffe是由伯克利视觉和学习中心(Berkeley Vision and Learning Center,BVLC)开发的基于C++/CUDA/Python实现的卷积神经网络框架,提供了面向命令行、Matlab和Python的绑定接口。Caffe 遵循BSD-2协议,代码组织良好,可读性强。同时,Caffe提供了一整套工具集,可用于模型训练、预测、微调、发布、数据预处理,以及良好的自动测试。

(2)Theano

Theano是由LISA开发的基于Python的深度学习框架,可以定义数学表达式并高效地优化、求值。Theano支持机器学习中的逻辑回归(LR)、多层感知器(MLP)、深度卷积网络等监督学习方法,以及自编码器(AE)、降噪自编码器、受限玻尔兹曼机(RBM)、深度置信网络(DBN)等非监督/半监督学习方法。但是Theano计算速度慢,虽然有GPU加速,但仍然不如其他框架高效。

(3)TensorFlow

TensorFlow是Google在2015 Google Research Blog宣布推出的新一代人工智能学习系统。TensorFlow是一个异构分布式学习系统上的大规模机器学习框架,移植性好,小到移动设备如手机,大到规模集群,都能支持。同时TensorFlow支持多种深度学习模型,随着TensorFlow源码不断开放,对新硬件、新设备、新的加速库如cuDNN的支持力度也在不断提升。

深度学习软件框架选择
通过对Caffe、Theano、TensorFlow的研究经验,其优势与缺陷可归纳为下表所示:

深度学习软件框架

深度学习软件框架

在实际的工作中,需要依据问题特征和业务需求进行深度学习框架工具的选择,以下是挑选工具框架的几点建议:

(1)进行数据特征提取或基于现有模型进行微调选用Caffe。

(2)需要对预训练模型进行复杂处理选用Theano。

(3)处理适用于RNN模型的问题,选用Theano或者TensorFlow。

(4)建立庞大且需要平行的深度网络模型时选用TensorFlow。

(5)Caffe、Theano、TensorFlow各有自身独特优势,在选择某一深度学习框架时要保持对其他工具技术发展的关注。


数据管理

深度学习是建立在对大量训练数据进行学习、特征提取等基础之上的实践性方法,深度学习模型只有在海量数据输入下才能达到最好的性能,可见有效的数据对深度学习的重要性。同时,数据管理中的数据的采集、处理等各环节也很有讲究,有些实践性的技巧。

数据获取
依据获取数据的成本可将市场上的数据划分为三类:免费公开数据、付费公开数据以及私有数据。以下列举了不同类型数据的获取渠道:

(1)免费公开数据源

(a)公开的数据库

公开数据库是获取海量数据最简单有效的方式。公开数据库基本按照学术问题、行业应用划分针对性较强,而且数据库中数据大都经过人工整理和标注,规范性和易用性更强。以下是一些常用的公开数据库资源列表:

公开数据库

公开数据库

(b)网络爬虫

网络爬虫是获取各类网站公开数据的有效工具,使用网络爬虫是研究深度学习技术的一项必备技能。网络采集器属于网络爬虫的一种,通过软件的形式实现简单快捷地采集网络上分散的内容,具有很好的内容收集作用,而且不需要技术成本,可被用作为初级的数据采集工具,例如火车采集器、八爪鱼、集搜客等。此外,针对特定网站的特定数据采集需求,也可结合开源系统自行开发爬虫工具,这样具有更高的自由性和自主性。利用爬虫可以获取一些从其它渠道获取不到的数据资源,更重要的是帮助研究者打开寻找和搜集数据的思路。

(2)付费公开数据源

(a)商业化数据交易平台

数据交易平台是一些专注于互联网综合数据交易和服务的公司,其致力于融合和盘活各类大数据资源。可以通过数据购买的方式在数据交易平台上获取深度学习训练和测试数据。国内知名的商业化数据交易凭条有优易数据、数据堂等,其提供的服务和数据资源各有特色:

商业化数据交易平台

商业化数据交易平台

(b)政府性数据交易平台

随着国家十三五规划中提出的国家大数据战略的实施,各地方政府对大数据产业发展高度重视,因而国内政府性交易平台建设也蓬勃发展,成为重要的数据源头:

政府性数据交易平台

政府性数据交易平台

(3)私有数据源

(a)商业合作交换

目前产业发展已经进入大数据时代,数据是企业生存的核心竞争力之一,因而各行各业对自身数据的保护都倍加关注,想通过付费或爬取的方式获得企业的核心数据就变得更加困难。然而,如果行业间的数据合作能够给双方带来巨大的数据增值收益,则可以通过推动跨领域商业合作的方式进行数据互换,从而完成数据收集形成完整的数据链。

(b)自建数据库

在有些数据是外界无法获取的情况下有可能需要自主进行数据采集并维护一个小型的数据库。为了保证数据采集的有效性在进行数据采集的过程中关键是明确数据要求。以银行卡分类问题为例,通常采用照片拍摄与视频拍摄,为了避免拍摄之后复杂的裁剪旋转工作,设定如下拍摄要求:

  • 在拍摄板中央固定一个卡槽,相机固定在中央上方并与板面保持平行;
  • 选择阳光、阴天、夜晚三个场景于室内室外分别拍摄。
  • 增加可变灯光进行场景模拟。

数据预处理

获取数据后需要进行数据处理,在深度学习中,常常面临数据不足的问题,在这种情形下,深度学习算法往往难以达到最优的效果,因此需要对现有的原始数据源进行必要的扩充与拓展或称为数据合成。

以图片数据处理为例,常见的数据扩充方法大致有如下几种:

(1)旋转|反射变换(rotation/reflection): 随机旋转图像一定角度,改变图像内容的朝向。

(2)翻转变换(flip):沿着水平或者垂直方向翻转图像。

(3)缩放变换(zoom):按照一定的比例放大或者缩小图像。

(4)平移变换(shift):在图像平面上对图像以一定方式进行平移,可以采用随机或人为定义的方式指定平移范围和平移步长,沿水平或竖直方向进行平移,改变图像内容的位置。

(5)尺度变换(scale):对图像按照指定的尺度因子, 进行放大或缩小; 或者参照SIFT特征提取思想, 利用指定的尺度因子对图像滤波构造尺度空间. 改变图像内容的大小或模糊程度。

(6)对比度和亮度变换: 在图像的HSV颜色空间,改变饱和度S和V亮度分量,保持色调H不变。对每个像素的S和V分量进行指数运算(指数因子在0.25到4之间), 增加光照变化。

(7)噪声扰动(noise): 对图像的每个像素RGB进行随机扰动, 常用的噪声模式是椒盐噪声和高斯噪声。

此外,从视频中提取图片也是获取大量数据的有效途径,通过自制视频转换工具可将上述图片预处理方法进行集成,这样能够有效扩大数据采集量。

数据标注

对于有监督的分类任务一项重要的工作就是数据标注。目前数据标注的方法可划分为人工标记与自动化标记。

(1)人工标注

对于分类问题,可以人工将类别相同的数据放在一个文件夹中,然后通过代码遍历访问数据形成分类标签。对于检测问题,需要人工用矩形框来标记图片中的物体,往往会采用标注工具,比如LabelImg,辅助完成。

(2)自动化标记

自动化标记则是通过少量样本人工标记,然后提取传统特征(比如SIFT、LBP等)并训练分类器,接着对大量待标记样本进行分类标记。经过一次分类器分类的样本标记往往错误较多,对于这批标记数据进行抽样训练另一个分类器进行分类,对于两次具有不同标签的数据进行人工修正,则可以以少量人力得到精度较高的标记数据。

模型训练
常用深度网络简介
深度学习技术的核心基础是深度网络模型,在其产生和发展演进的过程产生了诸多网络结构,目前常用的深度网络结构有DBN、CNN、RNN。下表对DBN、CNN、RNN的网络结构和特特性进行了简要对比。

深度网络介绍

深度网络介绍

深度网络模型选择

学界对深度网络所使用的问题已经有了基本的认识,下表给出了一些深度学习算法和对应的领域:

深度网络模型选择

深度网络模型选择

因而,建议从问题特征出发选择对应的深度网络结构,并遵循如下原则:

(1)对于文本领域,整体选择RNTN(递归张量神经网络)或DBN来处理,RNTN是RNN(循环神经网络)的一个变种。

(2)对于文档(相对于文本更大),选择自编码器或者DBN解决问题。

(3)对于图像来说,DBN或CNN应用更多,处理图像搜索或图片语义问题采用自编码器更好。

(4)处理声音问题,选择RNN或CNN。

(5)处理时间序列问题,比如预测分析,选择DBN或DNN。

参数调优技巧

在确定深度网络结构后,需要通过大量训练和测试以获取有效的模型,以下是一些常用的参数设定和调优原则。

(1)尽量基于成熟模型进行微调(fine-tune)

深度网络参数训练优化是一项冗长而复杂的工作,若技术人员的经验不足,则容易导致训练过程参数不收敛或者陷入局部最优而得不到很好的结果。因此,基于前人已经训练好的网络参数模型进行微调是目前通行的良好实践原则。

(2)权重初始化策略

在开始训练深度网络之前,需要对网络连接权值进行初始化,目前在神经网络中建议使用的权重初始化策略是将值归一化到范围[-b,b],b为:

权重初始化策略

权重初始化策略

权值向量

权值向量
分别是权值向量之前和之后的隐藏层大小,这样有助于加速网络参数收敛,避免局部最优或网络失灵。

(3)高维度网络结构克服局部最小

深层网络由于是高度非线性的,有着太多的局部极值,传统观念认为在这样的条件下很难保证能够得到一个可以接受的好的解,容易陷入局部最小。实际上通过增加深度网络的维度和训练时间,陷入局部最优解的概率会越小。当损失函数接近全局最小时,如果我们找到了真正的局部最小,那么它将非常接近全局最小,这种差异是无关紧要的。
比如从alexnet、VGG、googlenet、resnet等卷积模型中进行选择并在自己的数据集进行微调。这些网络效果随层数递增,因而采用resnet或者更新的googlenet-v4将会发现测试结果会更令人满意。

(4)数据批量大小设定

增加网络强度的一种方式(受计算而不是内存限制)是,将数据分成小批量。这可以避免一些内存操作,GPU也擅长并行处理大矩阵计算。然而,增加批次的大小的话可能会对训练算法有影响,并且合并需要更多时间。重要的是要找到一个很好的平衡点,以在最短的时间内获得最好的效果。此外,使用小批量的数据,梯度会更加稳定。

(5)训练误差衡量准则

在训练与测试一个深度神经网络模型时,我们通常使用三个数据集,即训练集、开发集、测试集。模型对应这三个数据集有三个误差,训练集误差、开发集误差、与测试集误差,另外还有一个人类梳理这类问题的误差值—人类水平误差。基于此的著名的偏差-方差权衡理论是指导我们调参的准则:
人类误差与训练集误差之间的差距称为可避免的偏差,这部分误差可以通过进一步学习及模型调优来避免。而训练集和开发集之间的差距称为方差,它是训练集与开发集的分布差异造成的。

当训练误差较大时,是指模型并未达到最优解(陷入局部最优)或者模型不够表达你的数据集。这时需要更换更深的模型,或者训练更长的时间。当训练误差较小,而开发集误差较大,则是模型过拟合,即训练样本并未完全包含目标任务的数据类型,这时候需要增加训练样本或者使用正则化来防止过拟合。

如果训练集误差与开发集误差都很小,测试集误差较大,那么是开发集与测试集的分配不合适,需要增大开发集所占的比例。

(6)其他训练技巧

  • 归一化实值数据,减去平均值,再除以标准差。
  • 降低训练过程中的学习率。
  • 使用动量,帮助参数通过停滞区。


生产应用

上述几个小节介绍的都是在深度学习研究过程中需要注意的事项,本节将讨论如何将深度网络模型与生产系统进行无缝对接。

训练环境与生产环境的数据接口

实现深度学习训练模型到生产系统的迁移,需要在屏蔽训练环境和生产应用环境的软硬件环境的基础上实现网络结构和参数数据的无缝兼容。目前通行的原则是网络定义文件、网络参数文件分离。

(1)深度网络定义文件

用于定义深度网络的节点设置和节点间连接结构的参数文件,例如采用Caffe的prototext文件。

(2)深度网络参数文件

用于保存训练结束时得到的深度网络各连接之间加权值,以二进制流形式存储,例如采用caffe的caffemodel文件。

生产应用环境服务接口

深度学习的理论模型投入生产仍需要“IT团队”花费大量时间进行系统性的改变和优化,因此在深度学习生产应用环境中,通过Restful API向企业其他生产系统提供服务是很好的形式,这样既可以屏蔽内部实现细节,又可以在产生模型变动时实现平滑的迁移。在API的规划中需包含如下必要接口:

生产环境下的服务

生产环境下的服务

模型退化的解决方法

深度学习问题建模的过程中,训练数据集是固定的,大部分数据由数据合成产生,数据质地和分布可能与实际生产应用不一致,容易导致训练集误差、开发集误差、与测试集误差。因而在生产环境中进行模型应用时,随着调用案例的增加,会产生模型退化问题,即训练模型分类错误增多。要解决这一问题,可以采取以下措施:

(1)对判别置信度低或用户反馈出现判别错误的数据进行保存收集。

(2)定期利用收集到的数据对原有模型进行微调并在生产应用环境进行模型更新。



转自:infoQ
作者:费志军、刘想、王宇、华锦芝








本帖被以下淘专辑推荐:

已有(1)人评论

跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条