1、第4章 深度学习背景 深度学习是一种基于神经网络的学习方法。和传统的机器学习方法相比,深度学习模型一般需要更丰富的数据、更强大的计算资源,同时也能达到更高的准确率。目前,深度学习方法被广泛应用于计算机视觉、自然语言处理、强化学习等领域。本章将依次进行介绍。4.1 神经网络基础知识4.1.1 深度神经网络神经网络是一个有向图,以神经元为顶点,神经元的输入为顶点的入边,神经元的输出为顶点的出边。因此神经网络实际上是一个计算图(Computational Graph),直观地展示了一系列对数据进行计算操作的过程。接受一定形式的数据作为输入,经过系统内的一系列计算操作后,给出一定形式的数据作为输出。系
2、统内的运算可以被视为一个黑箱子。神经网络示意图 输入层:接受来自网络外部的数据的顶点,组成输入层。输出层:向网络外部输出数据的顶点,组成输出层。隐藏层:除了输入层和输出层以外的其他层,均为隐藏层。4.1.2 正向传播正向传播(Forward-propagation)是指对神经网络沿着从输入层到输出层的顺序,依次计算并存储模型的中间变量(包括输出)。正向传播算法,也叫前向传播算法,顾名思义,是由前往后进行的一个算法。4.1.3 激活函数1.SoftMax2.Sigmoid3.Tanh4.ReLU4.2 神经网络的训练4.2.1 神经网络的参数神经网络中经常提及参数和超参数。参数是通过模型的训练得
3、到的,一般是指神经网络模型的权重和偏置,支持向量机中的支持向量,线性回归或逻辑回归中的系数等。超参数是人为手动设置的,一般是神经网络模型的学习率、模型的层数、每层的节点数,以及支持向量机的C和sigma超参数等。参数的概念感知器感知器训练算法超参数每个神经网络都会有最佳超参数组合,这组参数能够得到最大的准确率。对每个神经网络而言,并没有确定最佳超参数组合的直接方法,所以通常都是通过反复试验得到的。机器学习过程中,主要需要关注以下几种超参数的取值1.学习率选择最优学习率是很重要的,因为它决定了神经网络是否可以收敛到全局最小值。选择较高的学习率几乎从来不能到达全局最小值,因为很可能跳过它。所以,总
4、是在全局最小值附近,但是从未收敛到全局最小值。选择较小的学习率有助于神经网络收敛到全局最小值,但是会花费很多时间。这样你必须用更多的时间来训练神经网络。较小的学习率也更可能使神经网络困在局部极小值里面,也就是说,神经网络会收敛到一个局部极小值,而且因为学习率比较小,它无法跳出局部极小值。所以,在设置学习率的时候必须非常谨慎。2.神经网络架构并不存在能够在所有的测试集中带来高准确率的标准网络架构。必须实验,尝试不同的架构,从实验结果进行推断,然后再尝试。建议使用已经得到验证的架构,而不是构建自己的网络架构。例如:对于图像识别任务,有 VGG net、Resnet、谷歌的 Inception 网络
5、等。这些都是开源的,而且已经被证明具有较高的准确率。所以可以把这些架构复制过来,然后根据自己的目的做一些调整。3.优化器和损失函数这方面有很多可供选择。事实上,如果有必要,可以自定义损失函数。常用的优化器有 RMSprop、随机梯度下降和 Adam。这些优化器貌似在很多用例中都可以起作用。如果任务是分类任务,那么常用的损失函数是类别交叉熵。如果在执行回归任务,那么均方差是最常用的损失函数。可以自由地使用这些优化器超参数进行试验,也可以使用不同的优化器和损失函数。4.批大小和 Epoch 次数同样,没有适用于所有用例的批大小和 Epoch 次数的标准值。你必须进行试验,尝试不同的选择。在通常的实
6、践中,批大小被设置为 8、16、32Epoch 次数则取决于开发者的偏好以及他/她所拥有的计算资源。5.激活函数激活函数映射非线性函数输入和输出。激活函数是特别重要的,选择合适的激活函数有助于模型学习得更好。现在,整流线性单元(ReLU)是最广泛使用的激活函数,因为它解决了梯度消失的问题。更早时候,Sigmoid 和 Tanh 函数都是最常用的激活函数。但是它们都会遇到梯度消失的问题,即在反向传播中,梯度在到达初始层的过程中,值在变小,趋向于 0。这不利于神经网络向具有更深层的结构扩展。ReLU 克服了这个问题,因此也就可以允许神经网络扩展到更深的层。4.2.2 向量化向量化运算是指在同一时间
7、进行多次操作,通常对不同的苏剧知行同样的一个或者一批指令,或者说把指令应用与一个数组/向量。使用向量化可以充分利用计算机的并行性,提高机器学习的效率。比如说在梯度下降过程中我们需要不断地调整的值来完成梯度下降,可是使用循环会很慢,因为我们现在的计算机大部分都是SIMD也就是单指令流多数据流。如果使用for循环的话,那么之一条指令的数据流就是for循环里所规定的,并没有进行并行运算,没有充分运用计算机资源。然而,在深度学习里,我们常常需要进行很多的梯度下降,等等之类需要循环的,使用显式的循环会让运算速度十分的缓慢。4.2.3 价值函数几乎所有深度学习问题都涉及到了对价值函数的评估。机器在进行学习
8、的过程中会遵循一定的行为模式,这种行为上的固定选择被称为策略,而价值函数正与这种策略相关。通过价值函数,我们可以得到当前状态下学习所能够获得的期望回报和其后继状态之间存在的关联。机器通过所得的概率分布选择合适的状态进行学习,这就是学习的策略。4.2.4 梯度下降和反向传播多层感知器多层感知器的问题由于隐藏层的预期输出并没有在训练样例中给出,隐藏层结点的误差无法像单层感知器那样直接计算得到。为了解决这个问题,后向传播(Backpropagation,BP)算法被引入,其核心思想是将误差由输出层向前层后向传播,利用后一层的误差来估计前一层的误差。后向传播算法由Henry J.Kelley在1960
9、 和Arthur E.Bryson在1961分别提出。使用后向传播算法训练的网络称为BP神经网络。1.梯度下降常用的损失函数2.反向传播4.3 神经网络的优化和改进4.3.1 神经网络的优化策略之所以不能把训练误差作为模型参数选择的标准,是因为训练集可能存在以下问题。(1)训练集样本太少,缺乏代表性。(2)训练集中本身存在错误的样本,即噪声。如果片面地追求训练误差的最小化,就会导致模型参数复杂度增加,使得模型过拟合(Overfitting)为了选择效果最佳的模型,防止过拟合的问题,通常可以采取的方法有使用验证集调参和对损失函数进行正则化。拟合拟合过拟合过拟合4.3.2 交叉验证 参数的选择(即
10、调参)必须在一个独立于训练集和测试集的数据集上进行,这样的用于模型调参的数据集被称为开发集或验证集。然而很多时候我们能得到的数据量非常有限。这个时候我们可以不显式地使用验证集,而是重复使用训练集和测试集,这种方法称为交叉验证。常用的交叉验证方法有以下两种。(1)简单交叉验证。在训练集上使用不同超参数训练,使用测试集选出最佳的一组超参数设置(2)K-重交叉验证(K-fold Ross Validation)。将数据集划分成K等份,每次使用其中一份作为测试集,剩余的为训练集;如此进行K次之后,选择最佳的模型。4.3.3 正则化方法DropoutDropout是一种正则化技术,通过防止特征的协同适应
11、(co-adaptations),可用于减少神经网络中的过拟合。Dropout的效果非常好,实现简单且不会降低网络速度,被广泛使用。Dropout从解决特征间的协同适应入手,有效地控制了神经网络的过拟合。Dropout的实现原理Dropout在每次训练中,按照一定概率p随机的抑制一些神经元的更新,相应地,按照概率1p保留一些神经元的更新。当神经元被抑制时,它的前向结果被置为0,而不管相应的权重和输入数据的数值大小。被抑制的神经元在后向传播中,也不会更新相应权重,也就是说被抑制的神经元在前向和后向中都不起任何作用。通过随机的抑制一部分神经元,可以有效防止特征的相互适应。【例4-1】Dropout
12、的实现。1from torch.distributions import Bernoulli23activations=torch.rand(5,5)4m=Bernoulli(0.5)5mask=m.sample(activations.shape)6activations*=mask7print(activations)tensor(0.0000,0.5935,0.0975,0.0000,0.5066,0.0000,0.6437,0.1462,0.9188,0.0000,0.8829,0.6852,0.0000,0.0000,0.5704,0.0000,0.6003,0.0000,0.477
13、7,0.0000,0.0000,0.9796,0.0000,0.1457,0.0000)Dropout训练模式和测试模式Dropout会在训练和测试时做出不同的行为,PyTorch的torch.nn.Module提供了train方法和eval方法,通过调用这两个方法就可以将网络设置为训练模式或测试模式,这两个方法只对Dropout这种训练和测试不一致的网络层起作用,而不影响其他的网络层,后面介绍的BatchNormalization也是训练和测试步骤不同的网络层。【例4-2】Dropout在训练模式和测试模式下的区别1p,count,iters,shape=0.5,0.,50,(5,5)2dr
14、opout=nn.Dropout(p)3dropout.train()45for _ in range(iters):6 activations=torch.rand(shape)+1e-57 output=dropout(activations)8 count+=torch.sum(output=activations*(1/(1-p)910print(train模式Dropout影响了的神经元.format(1-float(count)/(activations.nelement()*iters)1112count=013dropout.eval()14for _ in range(ite
15、rs):15 activations=torch.rand(shape)+1e-516 output=dropout(activations)17 count+=torch.sum(output=activations)18print(eval模式Dropout影响了的神经元.format(1-float(count)/(activations.nelement()*iters)train模式Dropout影响了0.49119999999999997的神经元 eval模式Dropout影响了0.0的神经元一些说明 第5-8行执行了统计dropout影响到的神经元数量,注意因为PyTorch的D
16、ropout采用了Inverted Dropout,所以在第8行对activations乘上了1/(1-p),以对应Dropout的尺度变换。结果发现它大约影响了50%的神经元,这一数值和我们设置的p=0.5基本一致,换句话说,p的数值越高,训练中的模型就越精简。第14-17行统计了Dropout在测试时影响到的神经元数量,结果发现它并没有影响到任何神经元,也就是说Dropout在测试时并不改变网络的结构。4.4 卷积神经网络一般来说,卷积神经网络(Convolutional Neural Network,CNN)由一个卷积层、一个池化层、一个非线性激活函数层组成如图所示。在图像分类中表现良好
17、的深度神经网络往往由许多“卷积层+池化层”的组合堆叠而成,通常多达数十乃至上百层如图所示。4.4.1 卷积运算 1.局部连接 2.参数共享 3.多个卷积核 4.多通道卷积 5.边界填充1.局部连接2.参数共享由于不同的图像在结构上相差甚远,同一个局部位置的特征并不具有共性,对于某一个局部使用特定的连接权值不能让我们得到更好的结果。因此我们考虑让空间中不同位置的结点连接权值进行共享卷积类似的有二维卷积等 3.多个卷积核 利用一个卷积核进行卷积抽取特征是不充分的,因此在实践中,通常使用多个卷积核来提升特征提取的效果,之后将所得不同卷积核卷积所得特征张量沿第一维拼接形成更高一个维度的特征张量。4.多
18、通道卷积 在处理彩色图像时,输入的图像有RGB三个通道的数值,这个时候分别使用不同的卷积核对每一个通道进行卷积,然后使用线性或非线性的激活函数将相同位置的卷积特征合并为一个。5.边界填充4.4.2 池化层 目的:降低特征空间的维度,只抽取局部最显著的特征,同时这些特征出现的具体位置也被忽略 以图像处理为例,我们通常关注的是一个特征是否出现,而不太关心它们出现在哪里;这被称为图像的静态性。通过池化降低空间维度的做法不但降低了计算开销,还使得卷积神经网络对于噪声具有鲁棒性。常见的池化类型有最大池化、平均池化等.4.4.3 CNN实例 计算机视觉是一门研究如何使计算机识别图片的科学,也是深度学习的主
19、要应用领域之一。在众多深度模型中,卷积神经网络独领风骚,已经称为计算机视觉的主要研究工具之一。VGG,InceptionNet,ResNet等CNN网络从大规模图像数据集训练的用于图像分类的网络,ImageNet从2010年起每年都举办图像分类的竞赛4.5 深度学习的优势4.5.1 计算机视觉计算机视觉是使用计算机及相关设备对生物视觉的一种模拟。它的主要任务是通过对采集的图片或视频进行处理以获得相应场景的三维信息。计算机视觉是一门关于如何运用照相机和计算机来获取我们所需的,被拍摄对象的数据与信息的学问。形象地说,就是给计算机安装上眼睛(照相机)和大脑(算法),让计算机能够感知环境。优势l在深度
20、学习算法出现之前,对于视觉算法来说,大致可以分为以下5个步骤:特征感知,图像预处理,特征提取,特征筛选,推理预测与识别。早期的机器学习中,占优势的统计机器学习群体中,对特征的重视是不够的。l图片特征就是最能表现图像特点的一组参数,如颜色特征、纹理特征、形状特征和空间关系特征。在深度学习技术没有出现的时候,图像特征需要研究人员手动提取,这是一个繁杂且冗长的工作,因为很多时候研究人员并不能确定什么样的特征组合是有效的,而且常常需要研究人员去手动设计新的特征。在深度学习技术出现后,问题显著简化了许多。过去的算法主要依赖于特征算子,比如最著名的SIFT算子,即所谓的对尺度旋转保持不变的算子。这些算子还
21、包括Hog、Textons,Spin image,RIFT和GLOH,都是在深度学习诞生之前或者深度学习真正的流行起来之前,占领视觉算法的主流。然后是2001年基于Haar的人脸检测算法,在当时的硬件条件下已经能够达到实时人脸检测。但这种成功例子太少了,因为手工设计特征需要大量的经验,需要研究人员对这个领域和数据特别了解,在设计出来特征还需要大量的调试工作。另一个难点在于,研究人员不只需要手工设计特征,还要在此基础上有一个比较合适的分类器算法。同时设计特征然后选择一个分类器,这两者合并达到最优的效果,几乎是不可能完成的任务。CNN,是一种对人脑比较精准的模拟。人脑在识别图片的过程中,并不是对整
22、张图同时进行识别,而是感知图片中的局部特征,之后将局部特征综合起来再得到整张图的全局信息。实现:对于一张爱因斯坦的照片,可以学习n个不同的卷积和函数,然后对这个区域进行统计。可以用不同的方法统计,比如着重统计中央,也可以着重统计周围,这就导致统计的和函数的种类多种多样,为了达到可以同时学习多个统计的累积和。在卷积神经网络中,除了卷积层,还有一种叫池化的操作。池化操作在统计上的概念更明确,就是一个对一个小区域内求平均值或者求最大值的统计操作。池化层对每一个大小为22的区域求最大值,然后把最大值赋给生成的Feature Map的对应位置。如果输入图像的大小是100100像素的话,那输出图像的大小就
23、会变成5050像素,Feature Map变成了一半。同时保留的信息是原来22区域里面最大的信息。相比以往,卷积神经网络对计算机的运算要求比较高,需要大量重复可并行化的计算。在1998年CPU只有单核且运算能力比较低的情况下,不可能进行个很深的卷积神经网络的训练。随着GPU计算能力的增长,卷积神经网络结合大数据的训练才成为可能。整个卷积神经网络在模拟人的抽象和迭代的过程。总而言之,卷积神经网络的兴起与近些年来技术的发展是密切相关的,而这一领域的革新则不断推动了计算机视觉的发展与应用。4.5.2 自然语言处理 让计算机来理解人类的语言。语言建模 词性标注 中文分词 句法分析 情感分类 机器翻译
24、阅读理解相比传统识别1.人工参与程度 人的参与程度越来越低,但系统的效果越来越好。这是合乎直觉的,因为人对于世界的认识和建模总是片面的、有局限性的。如果可以将自然语言处理系统的构建自动化,将其基于对世界的观测点(即数据集),所建立的模型和方法一定会比人类的认知更加符合真实的世界。2.数据量 近年来深度学习加速硬件的算力突飞猛进,人们对于使用巨量的参数更加肆无忌惮,这就显得数据量日益捉襟见肘。特别是一些低资源的语言和领域中,数据短缺问题更加严重。这种数据的短缺,迫使人们研究各种方法来提高数据利用效率。3.可解释性 一个模型能允许人们检查它的运行机制和问题成因,允许人们干预和修补问题,要做到这一点
25、是非常重要的,尤其是对于一些商用生产的系统来说。传统基于规则的方法中,一切规则都是由人手动规定的,要更改系统的行为非常容易;而在传统的统计学方法中,许多参数和特征都有明确的语言学含义,要想定位或者修复问题通常也可以做到。然而现在主流的神经网络模型都不具备这种能力。现在人们希望神经网络的架构都可以不需要设计,而是根据具体的任务和数据来搜索得到。这一新兴领域方兴未艾,可以预见随着研究的深入,自然语言处理的自动化程度一定会得到极大提高。4.5.3 强化学习 强化学习主要可以分为无模型的(Model-Free)和有模型的(Model-Based)两大类。无模型算法又分成基于概率的和基于价值的。Mode
26、l-Based方法中,Agent可以根据模型预测下一步的结果,并提前规划行动路径。但真实模型和学习到的模型是有误差的,这种误差会导致Agent虽然在模型中表现很好,但是在真实环境中可能打不到预期结果。Model-Free的算法看似随意,但这恰好更易于研究者们去实现和调整。基于概率的算法直接输出下一步要采取的各种动作的概率,然后根据概率采取行动。每种动作都有可能被选中,只是可能性不同。相比基于概率的方法,基于价值的决策部分更为死板。4.6 深度学习训练与推理框架训练(Training)和推理(Inference)4.6.1 训练框架 框架存在的意义就是屏蔽底层的细节,使研究者可以专注于模型结构。
27、目前较为流行的深度学习训练框架有 Caffe、TensorFlow 以及 Pytorch等。1.Caffe Caffe是一个清晰而高效的深度学习框架,它基于纯粹的C+/CUDA架构,支持命令行、Python和MATLAB接口,可以在CPU和GPU直接无缝切换。它的模型与优化都是通过配置文件来设置,无须代码。Caffe设计之初就做到了尽可能的模块化,允许对数据格式、网络层和损失函数进行扩展。Caffe的模型定义是用Protocol Buffer(协议缓冲区)语言写进配置文件的,以任意有向无环图的形式。Caffe会根据网络需要正确占用内存,通过一个函数调用实现CPU和GPU之间的切换。Caffe每
28、一个单一的模块都对应一个测试,使得测试的覆盖非常方便,同时提供Python和Matlab接口,用这两种语法进行调用都是可行的。2.TensorFlow TensorFlow 不是一个严格的“神经网络”库。只要用户可以将计算表示为一个数据流图就可以使用TensorFlow。用户负责构建图,描写驱动计算的内部循环。TensorFlow提供有用的工具来帮助用户组装“子图”,当然用户也可以自己在TensorFlow基础上写自己的“上层库”。定义新复合操作和写一个Python函数一样容易。TensorFlow的可扩展性相当强,如果用户找不到想要的底层数据操作,也可以自己写一些C+代码来丰富底层的操作。T
29、ensorFlow在CPU和GPU上运行,有一个合理的C+使用界面,也有一个易用的python使用界面来构建和执行你的Graphs。3.PyTorch PyTorch通过一种反向自动求导的技术,可以让用户零延迟地任意改变神经网络的行为,尽管这项技术不是PyTorch 独有,但目前为止它实现是最快的,这也是PyTorch对比TensorFlow最大的优势。PyTorch的设计思路是线性、直观且易于使用的,当用户执行一行代码时,它会忠实地执行,所以当用户的代码出现Bug的时候,可以通过这些信息轻松快捷地找到出错的代码,不会让用户在Debug 的时候因为错误的指向或者异步和不透明的引擎浪费太多的时间
30、。PyTorch的代码相对于TensorFlow而言,更加简洁直观,同时对于TensorFlow高度工业化的很难看懂的底层代码,PyTorch的源代码就要友好得多,更容易看懂。深入API,理解PyTorch 底层肯定是一件令人高兴的事。4.6.2 推理框架 训练好了一个模型,在训练数据集中表现良好,但在实际应用中可能就没有良好稳定的表现。我们使用训练好的模型进行测试评估的过程,称为推理。推理框架包括:模型优化器和推理引擎两部分。在选择时需要注意以下几点。(1)带GPU的桌面系统。(2)手机上选择,Tvm,Ncnn等Arm Opencl的优化成果。阿里腾讯,移动端切身所需。需要附加量化工具。(3)MAC、Windows、Linux等没有GPU桌面系统 用Openvino.intel自家优化x86,有量化。(4)原生libtensorflow libtorch都不用。
侵权处理QQ:3464097650--上传资料QQ:3464097650
【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。