深度神经网络 订阅
深度神经网络是机器学习(ML, Machine Learning)领域中一种技术。 展开全文
深度神经网络是机器学习(ML, Machine Learning)领域中一种技术。
信息
外文名
Deep Neural Network
中文名
深度神经网络
深度神经网络特点
多层的好处是可以用较少的参数表示复杂的函数。在监督学习中,以前的多层神经网络的问题是容易陷入局部极值点。如果训练样本足够充分覆盖未来的样本,那么学到的多层权重可以很好的用来预测新的测试样本。但是很多任务难以得到足够多的标记样本,在这种情况下,简单的模型,比如线性回归或者决策树往往能得到比多层神经网络更好的结果(更好的泛化性,更差的训练误差)。非监督学习中,以往没有有效的方法构造多层网络。多层神经网络的顶层是底层特征的高级表示,比如底层是像素点,上一层的结点可能表示横线,三角; 而顶层可能有一个结点表示人脸。一个成功的算法应该能让生成的顶层特征最大化的代表底层的样例。如果对所有层同时训练,时间复杂度会太高; 如果每次训练一层,偏差就会逐层传递。这会面临跟上面监督学习中相反的问题,会严重欠拟合。2006年,hinton提出了在非监督数据上建立多层神经网络的一个有效方法,简单的说,分为两步,一是每次训练一层网络,二是调优使原始表示x向上生成的高级表示r和该高级表示r向下生成的x'尽可能一致。方法是1,首先逐层构建单层神经元,这样每次都是训练一个单层网络。2,当所有层训练完后,hinton使用wake-sleep算法进行调优。将除最顶层的其它层间的权重变为双向的,这样最顶层仍然是一个单层神经网络,而其它层则变为了图模型。向上的权重用于”认知“,向下的权重用于”生成“。然后使用Wake-Sleep算法调整所有的权重。让认知和生成达成一致,也就是保证生成的最顶层表示能够尽可能正确的复原底层的结点。比如顶层的一个结点表示人脸,那么所有人脸的图像应该激活这个结点,并且这个结果向下生成的图像应该能够表现为一个大概的人脸图像。Wake-Sleep算法分为醒(wake)和睡(sleep)两个部分。2.1,wake阶段,认知过程,通过外界的特征和向上的权重(认知权重)产生每一层的抽象表示(结点状态),并且使用梯度下降修改层间的下行权重(生成权重)。也就是“如果现实跟我想像的不一样,改变我的权重使得我想像的东西就是这样的“。2.2,sleep阶段,生成过程,通过顶层表示(醒时学得的概念)和向下权重,生成底层的状态,同时修改层间向上的权重。也就是“如果梦中的景象不是我脑中的相应概念,改变我的认知权重使得这种景象在我看来就是这个概念“。由于自动编码器(auto-encoder,即上面说的神经网络。广义上的自动编码器指所有的从低级表示得到高级表示,并能从高级表示生成低级表示的近似的结构,狭义上指的是其中的一种,谷歌的人脸识别用的)有联想功能,也就是缺失部分输入也能得到正确的编码,所以上面说的算法也可以用于有监督学习,训练时y做为顶层网络输入的补充,应用时顶层网络生成y'。
收起全文
精华内容
下载资源
问答
  • 深度神经网络
    千次阅读
    2022-04-05 15:38:26

    以数据为中心
    1、从大数据转向优质数据;

    2、保持神经网络不变,转向寻找改进数据的方法。能够检测出大数据的标注错误的工具需要开发出来,以改善数据的一致性。能够将注意力定位到分类错误的一类,然后详细分析,调整该类数据,而不是为了该类数据而去改进模型。

    3、合成数据不仅仅用来增加整个数据集的量,而且可以只针对表现不佳的类别进行数据的合成,更有针对性的解决问题。希望看到使用合成的数据成为迭代模型开发闭环的一部分。

    更多相关内容
  • 深入认识深度神经网络

    千次阅读 2020-06-26 22:23:57
    本文重点是较为全面、系统的对深度神经网络进行通俗解释,包括网络结构、通用近似定理,神经网络模型变宽与变深及加深的问题,深度神经网络模型训练解决方案,如何让你的深度神经网络跑得更快等内容。

    0 前言

    人们对神经网络的研究已经超过半个世纪。最初时,人们研究的神经网络通常只有几层的网络,随着研究的深入,特别是深度学习的兴起,深度网络通常有更多的层数,今天的神经网络一般在五层以上,甚至多达一千多层。我们用的神经网络,通常是中间有一个隐层或者有两个隐层。今天,我们所说的深度神经网络指的是什么?直白的说就是用的神经网络隐藏层有很多层,例如,2012年ImageNet 竞赛的冠军模型AlexNet用了8层,2014年冠军模型GooleNet用了22层,2015年冠军模型RestNet用了152 层,2016年多达1207层。
    我们在与学习研究神经网络对比,增加了深度求解遇到三个主问题:
    一是神经网络的原生问题,求解过程中会遇到梯度消失或者梯度爆炸问题;
    二是神经网络性能,训练过程太慢,耗费资源;
    三是神经网络过拟合问题。
    2006年,深度学习之父 Geoffrey Hinton等人利用预训练方法缓解了局部最优解问题,基于深信度网(DBN)提出非监督贪心逐层训练算法,解决深层结构训练等优化难题。将隐含层推动到了7层,至此,神经网络真正意义上有了“深度”,不过,仍没有给出“深度”等明确定义,例如在语音识别中4层网络就被认为是“较深的”,而对于图像识别模型,20多层也比较常见。为了克服梯度消失问题,用ReLU等激活函数代替了 sigmoid,形成了深度神经网络( DNN)的基本形式。单从结构上来说,全连接的DNN和多层感知机是没有任何区别的。
    在这里插入图片描述
    我们以ImageNet竞赛为例,从各年最佳参赛者的表现来看。可以看出算法的准确情况由最初25%以上的错误率25%,到2015年,ImageNet竞赛冠军模型ResNet已经超过人类水平的错误率(5%),将错误率降到3%以下。

    1 深度神经网络通俗解释

    虽然根据不同应用场景,深度神经网络的结构和深度各异,但基本符合神经网络的输入层、隐藏层、输出层结构,而且,目前重点是快速演化以提升模型准确性和效率。所有深度神经网络的输入值,是一套与神经网络表征能力密切相关的信息值。这些值可以是一张图片的像素,也可以是一段音频样本的频率和振幅的数字化表示。
    神经网络的层与层之间一般是全连接(FC,也指多层感知器),即第n层的任意一个神经元一定与第n+1层的任意一个神经元相连。虽然DNN从整体上看起来很庞大、复杂,但是从微观的局部模型来说,与感知机是一样,即一个线性关系加上一个激活函数。
    在这里插入图片描述
    在这里插入图片描述
    输入诺干个x 经过线运算得z,激活函数的运算得到一个新的值,这个值相当于开始输入的x,用a代指。
    在这里插入图片描述
    我们谈论的深度学习实际指的是基于深度神经网络(deep neural networks,DNN)的学习,也就是深度人工神经网络所进行的学习过程,或称作Deep Learning。这里Deep所指的神经网络的深度就是指神经网络层数多。不过,AI业界没有清晰地、具体地给出多少层的深度网络算是深层神经网络。所以在这里我们也就不强调多深算深的概念了,我们就权且管超过2隐藏层的深度都叫深度神经网络。
    实际上,DNN这个深度神经网络概念广义上一般来说CNN、RNN、GAN等都属于其范畴之内。DNN与CNN(卷积神经网络)的区别是DNN特指全连接的神经元结构,并不包含卷积单元或是时间上的关联。DNN是指包含多个隐层的神经网络,根据神经元的特点,可以分为MLP、CNNs、RNNs等,从神经元的角度来讲解,MLP是最朴素的DNN,CNNs是encode了空间相关性的DNN,RNNs是encode进了时间相关性的DNN。
    在DNN中,用于处理输入的神经网络一般有两种主要结构:前馈神经网络以及循环神经网络。在前馈神经网络中,所有输入计算处理都是在前一层输出基础上进行的,直到最后一层就是深度神经网络的输出;在循环神经网络(例如LSTM )中,网络中间环节是有内在记忆的,数据输入计算处理顺序依存上一次输出为相关影响,循环反馈作用于神经网络后输出,在这样深度神经网络中,一些中间值会被存储于网络中,也被用作与后续输入影响神经计算。
    在这里插入图片描述
    用于网络链接的深度神经网络,一般可以使用全连接(FC,也指多层感知器)的形式,如图左两层间部分所示。在一个全连接层中,所有上一层的输出与下一层的所有输入都是相连接的。这样很耗费资源,占用大量的存储和计算空间。不过,在许多实际应用中,我们可以采用移除激活之间的一些连接方式,也就是将参数权重设置为0,形成一个稀疏连接层,而且这类结构化的稀疏性也不影响准确性,如果这套权重被用于每一个输入计算,就会进一步提高模型效率,显著降低权重的存储要求。
    在这里插入图片描述

    2 通用近似定理—万能神经网络

    通用近似定理(Universal approximation theorem,也译万能逼近定理)是指:如果一个前馈神经网络具有线性输出层和至少一层隐藏层,只要给予网络足够数量的神经元,便可以实现以足够高精度来逼近任意一个在 ℝn 的紧子集 (Compact subset) 上的连续函数。
    在这里插入图片描述
    如图11-5中所示神经网络通用近似模拟函数,(a)为任意函数,(b)为任意函数被神经网络以任意精度模拟。
    即使函数是连续的,有关神经网络能不能解决所有问题,也是很有争议的。原因很简单,我们的理想很美好,现实问题比较多。比如,深度学习的生成对抗网络(GAN)的提出者伊恩·古德费洛(IanGoodfellow)就曾说过:“仅含有一层的前馈网络的确足以有效地表示任何函数,但是,这样的网络结构可能会格外庞大,进而无法正确地学习和泛化。

    人工神经网络最神奇的地方可能就在于,它可以在理论上证明:“一个包含足够多隐含层神经元的多层前馈网络,能以任意精度逼近任意预定的连续函数”。通用近似定理告诉我们,不管函数 f ( x ) f(x) f(x)在形式上有多复杂,我们总能确保找到一个神经网络,对任何可能的输入,以任意高的精度近似输出 f ( x ) f(x) f(x),即使函数有多个输入和输出,即 f ( x 1 , x 2 , x 3 ⋯ x n ) f(x_1,x_2,x_3⋯x_n ) f(x1,x2,x3xn)
    第一层:
    h 1 = f ( ∑ i = 1 m w i x i + b 1 ) h_1=f(∑_{i=1}^{m}w_i x_i+b_1 ) h1=f(i=1mwixi+b1)
    第二层:
    h 2 = f ( ∑ j = 1 n w j x j + b 2 ) h_2=f(∑_{j=1}^{n}w_j x_j+b_2 ) h2=f(j=1nwjxj+b2)

    通用近似定理的结论告诉我们,可能存在能够正确地学习和泛化的某种结构的神经网络。也就是说一个前馈神经网络如果具有线性输出层和至少一层具有任何一种激活函数(例如sigmoid激活函数)的隐藏层,只要给予网络足够数量的隐藏单元,它可以以任意的精度来近似任何从一个有限维空间到另一个有限维空间的Borel 可测函数。

    3 神经网络模型变宽与变深

    基于通用近似定理的理想,我们以什么样的方法,如何构建复杂的神经网络来解决问题呢?我们主要从神经网络的层数、神经元的数量两个方面入手,也就是宽度和深度是深度学习模型的两个基本维度
    Goodfellow等著《深度学习》中的一张图片(图11-6),表明对某个特定问题而言,隐藏层越多,精确度越高。
    在这里插入图片描述
    我们知道理论上一个浅度神经网络可以做得和深度网络一样好,但是事实往往并非如此。为什么呢?Goodfellow等著《深度学习》为上面的问题的解答提供了一些理由。
    (1)浅度网络的神经元数量将随着任务复杂度的提升进行几何级数的增长,因此浅度网络要发挥作用,会变得很大,很可能比深度网络更大。这个理由的依据是很多论文都证明了在某些案例中,浅度网络的神经元数量将随着任务复杂度的提升进行几何级数的增长,但是我们并不清楚这一结论是否适用于诸如MNIST分类和围棋这样的任务。
    (2)选择深度模型编码了一个非常通用的信念,我们想要学习的函数应该涉及若干较简单的函数的组合。从表征学习的视角来说,我们相信正学习的问题包括发现一组差异的底层因素,这些因素可以进一步用其他更简单的差异的底层因素来描述。
    我们要解决比较复杂的问题,要么增加深度,要么增加宽度,而增加宽度的代价往往远高于深度。
    2015年,ImageNet上提出的152层的残差网络赢得了多项图像辨识竞赛的冠军。这是一个巨大的成功,看起来是一个令人难以抗拒的越深越好的论据。
    在参数一样的前提下,模型深的比浅的效果更好,加大深度”就相当于函数中的模块化,也就是“并不急于解决问题,而是把问题切成比较小的问题,再解决”。而且这样的好处是:“数据集要求低,并不需要太多的数据”。

    4 神经网络加深的问题

    浅层神经网络可以表示的特征抽象程度不高,而层次越深,特征的抽象程度越高,也就是在某些特定任务上所谓的“效果越好”,这也是为什么深度神经网络可以做出很多只有人类才能做到的需要高度抽象理解能力的事情。
    随着深度的增加,逼近函数的效果好,已经有论文证明神经网络训练的过程就是调整参数的过程,可以调整的参数(weights and bias)越多,意味着调整的自由度越大,从而逼近效果越好。
    然而,预测效果却不一定好。针对同一个问题,层数少的时候效果差,这时候逐渐增加层数可以提高效果,但是如果盲目不停地增加层数,则会容易引起过拟合,从而导致预测效果不好,所以并不是层数越多,预测效果就一定会越好的。此外,添加更多层会导致更高的训练误差。
    因此,神经网络随着深度的增加,实际的效果是先变好,然后再变差。例如在CIFAR-10项目上使用56层的网络其错误率,不仅在训练集上,而且在测试集上,都高于20层网络。
    在这里插入图片描述
    这种现象的本质问题是由于出现了信息丢失而产生的过拟合问题。随着神经网络层数的加深,我们将面临三个重大问题:
    (1)非凸优化问题,即优化函数越来越容易陷入局部最优解;
    神经网络核心神经元是线性回归,在线性回归当中,从任意一个点出发搜索,最终必然是下降到全局最小值附近的。而在多层神经网络中,从不同点出发,可能最终困在局部最小值。局部最小值是神经网络结构带来的挥之不去的阴影,随着隐层层数的增加,非凸的目标函数越来越复杂,局部最小值点成倍增长,利用有限数据训练的深层网络,性能还不如较浅层网络。所以,从本质上来看,深度结构带来的非凸优化仍然不能解决(包括现在的各类深度学习算法和其他非凸优化问题都是如此),这限制着深度结构的发展。
    (2)梯度消失问题(Gradient Vanish)
    随着网络层数增加,“梯度消失”(或者说是梯度发散diverge)现象更加严重。比如我们常常在多层神经网络中使用sigmoid作为神经元的激活函数。对于幅度为1的信号,在BP反向传播梯度时,每传递一层,梯度衰减为原来的1/4。这样随着层数增多,梯度指数衰减后,后面的隐层基本上接受不到有效的训练信号。那么在深度学习中是如何解决局部极值及梯度消失问题的呢?
    这个问题实际上是由神经元中使用激活函数所引起的,比如多层使用Sigmoid系函数,会使得输入信号从输出层开始呈指数衰减。

    在数学上,激活函数的作用就是将输入数据映射到0到1上(其中,tanh是映射-1到+1上)。至于映射的原因,除了对数据进行正则化外,大概是控制数据,使其只在一定的范围内。当然也有另外细节作用,例如Sigmoid(tanh)中,能在激活的时候,更关注数据在零(或中心点)前后的细小变化,而忽略数据在极端时的变化,例如ReLU还有避免梯度消失的作用。通常,Sigmoid(tanh)多用于全连接层,而ReLU多用于卷积层。

    对于梯度消失问题, Hinton为了解决深层神经网络的训练问题,于2006年提出逐层预训练方法,比如深度信念网的训练;以及最近提出CNN中的ReLu激活函数,则从根本上提出了度消失问题的解决方案;对于深受度消失问题困扰的RNN,其变种LSTM也克服了这个问题。
    (3)过拟合问题。
    真实的应用中想要的并不是让模型尽量模拟训练数据的行为,而是希望通过训练出来的模型对未知的数据给予判断。模型在训练数据上的表现并不一定代表了它在未知数据上的表现。模型过拟合是神经网络庞大复杂结构和参数,以及数据集所带来的,这样结构和参数、数据集尽管使训练错误率降的很低,但是测试错误率却高的离谱,模型达不到泛化要求。
    对于深度神经网络模型,与其他机器学习模型相比,一般不易过拟合。而神经网络过拟合问题,往往是在训练数据不够多,网络结构很复杂,或者过度训练时,可能会产生过拟合问题。
    那么过拟合的通俗解释就是,随着对于给定的模型的训练过程的进行,在训练集上的错误率渐渐减小,但是在测试集上的错误率却反而渐渐增大。这是因为训练出来的网络过拟合了训练集,对测试集外的数据效果不好。也就是如过产生了过拟合问题,那么用训练集得到的准确率同测试集得到的准确率相差非常大。
    那么为了防止过拟合问题,我们可用的方法有:增大数据集(例如增加噪声)、采用正则化方法、在网络层采用dropout方法,以及损失函数是用于优化训练数据。

    5 深度神经网络模型训练解决方案

    为了解决神经网络变深、结构变复杂所带来难以训练的问题,我们总结出一系列训练解决方案。

    5.1 训练数据集

    我们开发人员往往习惯把原始数据直接扔给DNN,在这种情况下,DNN仍然能够给出不错的结果。但是,有句老话说“给定恰当的数据类型,一个简单的模型能比复杂 DNN 提供更好、更快的结果”。我们不讨论特例,在今天,这句话仍然没有过时。因此,不管你是在计算机视觉( CV),自然语言处理(NLP)还是统计建模(Statistical Modelling)等领域,想要对原始数据预处理,有几个方法可以得到更好的训练数据:

    • 获取更多的数据,增大数据集;
    • 剔除所有包含损坏数据的训练样本,比如短文字,高度扭曲的图像,假输出标签,包含许多虚值(null values)的属性;
    • 通过数据扩张(Data Augmentation)增加样本,以图像为例,包括增加噪声、旋转图像、拉伸图像等等。

    5.2 选择恰当的激励函数(activation function)

    激励函数是把非线性(non-linearity)加入了神经网络模型中,是神经网络的重要核心部分。
    激励函数包括Sigmoid 函数、Tanh函数、ReLu函数等等激励函数。比如多年来,很多人一直倾向的选择Sigmoid 函数,但是,Sigmoid 函数将进一步导致梯度消失,近年来,我们更多是使用ReLu函数。实际工作中,需要根据具体情况,选择适合的激励函数。

    5.3 隐藏单元和隐层(Hidden Units and Layers)的数量

    我们通常采用保留超出最优数量的隐藏单元方案,尽量避免出现模型欠拟合(underfitting)几率,而且任何正则化方法( regularization method)都会处理超出的单元。
    另外,当采用无监督预训练的表示时(unsupervised pre-trained representations),隐藏单元的最优数目一般会变得更大。因此,通过增加隐藏单元的数目,模型会得到所需的灵活性,以在预训练表示中过滤出最合适的信息。
    对于隐层的数量,我们采用直接选择最优数目方案。正如 Yoshua Bengio 在 Quora中提到的:“你只需不停增加层,直到测试误差不再减少。”

    5.4 权重初始化 (Weight Initialization)

    我们常见几种权重初始化方法:全部初始化为零、初始化为随机数、Xavier/Glorot Initialization初始化、MSRA/He initialization初始化等等,常用的神经网络权重初始化方法有Xavier和MSRA。

    5.4.1 全部初始化为零

    这种方式最简单,我们在线性回归、logistics回归的时候,经常把参数初始化为0。
    W = np.zeros(input_layer_neurons, hidden_layer_neurons)
    如果是将权重W全部初始化为零,这样它们的梯度一样,那么每一层所学到的参数都是一样的,在反向传播的过程中,每一层的神经元也是相同的。因此会导致代价函数在开始的时候明显下降,但是一段时间以后,停止继续下降。

    5.4.2 初始化为较小的随机数

    用小的随机数字初始化权重,以打破不同单元间的对称性,权重参数随机初始化为服从均值为零和方差为1的高斯分布函数。
    W = np.random.randn(input_layer_neurons, hidden_layer_neurons)
    开始模型可以很好的运行一段时间,但是随着时间增加,前向传递时,方差开始减少,梯度也开始向零靠近,会导致梯度消失。特别地,当激活函数为sigmoid时,梯度接近0.5;当激活函数为时tanh,梯度接近0。

    5.4.3 Xavier/Glorot Initialization

    Xavier initializatio是Glorot等人为了解决随机初始化的问题提出来的另一种初始化方法,他们的思想很简单,就是尽可能的让输入和输出服从相同的分布,这样就能够避免后面层的激活函数的输出值趋向于0,适用于激活函数是sigmoid和tanh。
    W = np.random.randn(input_layer_neurons, hidden_layer_neurons)* sqrt(1/input_layer_neurons)

    5.4.4 MSRA/He initialization

    He初始化方法适用于激活函数Relu,在初始化使得正向传播时,状态值的方差保持不变;反向传播时,关于激活值的梯度的方差保持不变。
    其初始化方法为:W~N(0,√(2/n)),其中,n为第 l 层神经元个数。
    W = np.random.randn(input_layer_neurons,hidden_layer_neurons)* sqrt(2/input_layer_neurons)

    5.4.5 Batch Normalization

    随着网络层数的增加,分布逐渐发生偏移,之所以收敛慢,是因为整体分布往非线性函数取值区间的上下限靠近。这会导致反向传播时梯度消失。BN就是通过规范化的手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值0方差1的标准正态分布,使得激活输入值落入非线性函数中比较敏感的区域。可以让梯度变大,学习收敛速度快,能大大加快收敛速度。
    由于现在batch norm比较流行所以可能对初始化要求不是那么高,一般用relu的话使用he初始化会好一些,或者直接用norm batch。
    使用 BN 时,减少了网络对参数初始值尺度的依赖,此时使用较小的标准差(例如0.01)进行初始化即可,初始化方法没有那么重要了。

    5.5 学习率

    这是训练模型最重要的超参数之一,用于调节着学习过程。如果学习率设置得太小,则模型很可能需要很长时间来收敛,如果设置得过大,损失可能将会极高。通常出事设置为0.01 的学习率比较保险。但是这不是一个严格的标准,最优学习率与实际训练模型相关。
    相比固定学习率,可以采用逐渐降低学习率训练方法。虽然这能更快地训练,但需要人工决定新的学习率。一般来说,学习率可以在每个周期后减半。最近研究发展,出现了自适应学习率(adaptive learning rates)。
    目前,我们有许多选择,从老式动能方法( Momentum Method ),到 Adagrad、Adam 、RMSProp 等等。

    5.6 超参数调参:扔掉网格搜索,拥抱随机搜索

    网格搜索(Grid Search )在经典机器学习中十分普遍。但它在寻找 DNN 的最优超参数方面效率较低。这主要是因为 DNN 尝试不同超参数组合所耗费的时间。随着超参数不断增长,网格搜索需要的计算性能会指数级增长。超参数组合通常在期望范围之内、从均匀分布中被选择出来。加入之前获得的知识来进一步缩小搜寻空间,也是有可能的(比如,学习率不应该太大也不应该太小)。大家发现,随机搜索比网格搜索高效地多。
    有两种解决办法:
    (1)如果我们的团队有之前的经验,我们可以人工对部分常见超参数调参,比如学习率、隐层数目;
    (2)采用随机搜索(random search),或者随机采样代替网格搜索,来选择最优超参数。

    5.7 学习方法

    随机梯度下降( Stochastic Gradient Descent )的老方法也许对于 DNN 不是那么有效率(有例外)。最近,有许多研究聚焦于开发更灵活的优化算法,比如 Adagrad、Adam,、AdaDelta,、RMSProp 等等。在提供自适应学习率之外,这些复杂的方法还对于模型的不同参数使用不同的学习率,通常能有更平滑的收敛。把这些当做超参数是件好事,你应该每次都在训练数据的子集上试试它们。

    5.8 无监督预训练(Unsupervised Pretraining )

    不管你进行的是 NLP(自然语言处理)、计算机视觉还是语音识别等任务,无监督预训练永远能帮助你训练监督、或其他无监督模型:NLP 中词向量就(Word Vectors)无所不在;你可以用 ImageNet 的数据库,使用无监督方式对你的模型预训练,或是对于两个类别的监督分类;或是更大频域的音频样本,来在扬声器消崎模型(speaker disambiguation model)中使用该信息。

    5.9 Mini-Batch(小批量) 对比随机学习(Stochastic Learning)

    Mini-Batch(小批量)相对于Batch梯度下降法,是对整个训练集的一次遍历(称为一个 epoch)能做 mini-batch 个数个梯度下降。并可以一直遍历训练集,直到最后收敛到一个合适的精度。
    那么如何选择mini-batch 大小?
    首先,如果训练集较小,小于2000个样本,直接使用batch梯度下降法,样本集较小就没必要使用mini-batch梯度下降法。
    对于样本数量较多的情况,实践经验上,一般的mini-batch大小设置为32到256,用于CPU训练环境,32到1024用于GPU训练环境,考虑到计算机内存设置和使用的方式,如果mini-batch大小是2^n,训练会运行地快一些,获得 mini-batch 的方法如下:

    m = X.shape[1]
    permutation = list(np.random.permutation(m))
    shuffled_X = X[:, permutation]
    shuffled_Y = Y[:, permutation].reshape((1,m))
    

    训练神经网络模型的主要目的是学习合适的参数,即训练生输入到输出的最优映射。这些参数依据每个训练样本进行调参,不管你决定使用 batch、mini-batch 还是随机学习。
    mini-batch 的大小为 1,即是随机梯度下降法(stochastic gradient descent),每个样本都是独立的 mini-batch;
    mini-batch 的大小为 m(数据集大小),即是 batch 梯度下降法。

    5.10 打乱训练样本

    这来自于信息理论(Information Theory)——“学习到一件不太可能发生的事却发生了,比学习一件很可能发生的事已经发生,包含更多的信息。”同样的,把训练样例的顺序随机化(在不同周期,或者 mini-batch),会导致更快的收敛。如果模型看到的很多样例不在同一种顺序下,运算速度会有小幅提升。

    5.11 使用 Dropout 正则化

    使用Dropout,就是每次随机选择一些神经元不参与训练,只有在预测的时候这些神经元才生效。
    如果有数百万的参数需要学习,正则化就是避免 DNN 过拟合的必须手段。你也可以继续使用 L1/L2 正则化,但 Dropout 是检查 DNN 过拟合的更好方式。执行 Dropout 很容易,并且通常能带来更快地学习。通常Dropout 的默认值是0.5,如果模型不太复杂,Dropout 值设置0.2或许就可以。
    注意,在测试阶段,Dropout 应该被关闭,权重要调整到相应大小。

    5.12 周期 / 训练迭代次数

    “对深度学习模型进行多个周期的训练,会得到更好的模型”——我们经常听到这句话。但多少周期才是“多”呢?其实,这里有一个简单的策略:继续按照一个固定的样例数或者周期训练模型,比如两万个样例或者一个周期。在每批样例之后,比较测试误差(test error)和训练误差(train error),如果它们的差距在缩小,那么继续训练。另外,记得在每批训练之后,保存模型的参数,所以训练好之后你可以从多个模型中做选择。

    5.13 训练过程可视化

    训练深度学习模型有上千种出差错的方式。我猜大家都遇到过这样的场景:模型已经训练了几个小时或者好几天,然而在训练完成之后,才意识到某个地方出问题了。为了不让你自己神经错乱,一定要对训练过程作可视化处理。比较显而易见的措施是保存或打印损失值、训练误差、测试误差等项目的日志。
    在此之外,一个很好的措施是采用可视化库(visualization library ),在几个训练样例之后、或者周期之间,生成权重柱状图。这或许能帮助我们追踪深度学习模型中的一些常见问题,比如梯度消失与梯度爆发(Exploding Gradient)。

    6 如何让你的深度神经网络跑得更快

    在我们生活的移动端,如何让深度模型在移动设备上运行,也是模型压缩加速的一大重要目标。Krizhevsky 在 2014 年的文章中,提出了两点观察结论:卷积层占据了大约 90-95% 的计算时间和参数规模,有较大的值;全连接层占据了大约 5-10% 的计算时间,95% 的参数规模,并且值较小。这为后来的研究深度模型的压缩与加速提供了统计依据。
    例如有 50 个卷积层的 ResNet-50 需要超过 95MB 的存储器以及 38 亿次浮点运算。在丢弃了一些冗余的权重后,网络仍照常工作,但节省了超过 75% 的参数和 50% 的计算时间。
    随着AI的发展,人们对AI应用需求旺盛,如何让你的深度神经网络跑得更快,这是我迫切需要的。我们的深度神经网络发展得益于计算能力的大幅提升,但是由于内存和计算能力有限,随着网络变得越来越深,而且对于移动设备在内的有严格时延要求的有限资源平台而言,神经网络压缩就成为一个关键问题。我们需要在计算能力和深度神经网络之间达到平衡,给出剪枝和共享、低秩分解、紧凑卷积滤波器、知识蒸馏等解决方案。
    研究结果告诉我们,通常情况下,参数修剪和共享、低秩分解和知识蒸馏方法可以用于全连接层和卷积层的 CNN,而使用转移/紧凑型卷积核的方法仅支持卷积层。

    6.1 参数修剪和共享

    通俗的说,剪枝就是移除对模型性能影响不大的参数。参数的冗余和稀疏特性对模型性能的影响甚微,而剪枝正好利用了这一特性。例如在训练的很多卷积神经网络中的卷积核并非每个都是完全有用的,也就是说很多卷积核是赘余的,这有两种可能,一是去掉整个卷积核,整个都是赘余的,二是去掉卷积核中的某些权重,因为整个卷积核中的某些权重是赘余的。对于剪枝可以进一步划分为稀疏剪枝、fiters pruning、channel pruning等三类。
    在这里插入图片描述
    (1)稀疏剪枝
    在模型训练过程中,基于大小的权重剪枝会逐渐将模型权重设为零,实现模型稀疏性。稀疏模型更易于压缩,我们可以在推断过程中跳过零以缩短延迟时间。
    此技术通过模型压缩改进了模型。今后,对此技术的框架支持可以缩短延迟时间。我们发现模型压缩的性能提升了6倍(Tensorflow官方网站2020年https://www.tensorflow.org/model_optimization/guide/pruning),并且对准确率造成的影响极低。
    此技术正在各种语音应用(例如语音识别和文字转语音)中接受评估,并已针对各种视觉和翻译模型进行了实验。
    一般情况下,可以理解为操作方式就是:

    • 取训练好的model
    • 取出每一个CNN的卷积核
    • 取出每个卷积核的weight
    • 设置一个阈值,比如接近0的阈值
    • 每个weight进行比较比这个阈值小就直接设为0(或者接近0)即可
    • 之后可以重新反复剪枝后retrain,之后再不断剪枝

    这种方法虽然很多赘余的权重全被减掉了,对于速度,因为剪枝之后计算和存储都相当于稀疏矩阵的方式,所以有特定的加速计算的方式,对于稀疏矩阵,对于存储也是会采用0×次数类似的方式来减小尺寸,所以速度和存储大小都会被优化。

    (2)channel pruning/fiters pruning
    通道(channel)剪枝是压缩深度神经网络的主要方法之一。通道剪枝要在一个层上移除通道可能会急剧改变下一个层的输入。然而,通道剪枝保持了原始模型的架构,并没有引入额外的层,在GPU上的绝对加速比要更高。
    一般情况下,channel pruning过程如下。

    • 取训练好的model
    • 取出每一个通道的
    • 识别具有高平均百分比为零的神经元,计算通道激活为零的平均百分比
    • 设置个阀值,例如取最高平均百分比为零通道
    • 删除选定通道
    • 最后生成新的model和网络文件
    • 再训练

    keras-surgeon是一个keras的模型剪枝工具,该项目支持神经元,通道以及网络层级别的剪枝操作,下面这个例子使用《Network Trimming: A Data-Driven Neuron Pruning Approach towards Efficient Deep Architectures》Hengyuan Hu(2016)等人描述的方法来确定要修剪哪些神经元。
    我们定义了平均零百分比(APoZ)来度量ReLU映射后的神经元,平均零的百分比(APoZ),其中 O c ( i ) O_{c}^{(i)} Oc(i)表示第i层c通道的输出。
    A P o Z c ( i ) = A P o Z ( O c ( i ) ) = ( ∑ k N ∑ j M f ( O c , j ( i ) ( k ) = 0 ) ) / ( N × M ) APoZ_{c}^{(i)}=APoZ(O_{c}^{(i)} )=(∑_{k}^{N}∑_{j}^{M}f(O_{c,j}^{(i)} (k)=0) )/(N×M) APoZc(i)=APoZ(Oc(i))=(kNjMf(Oc,j(i)(k)=0))/(N×M)
    其中,当为真时 f ( ∙ ) = 1 f(∙)=1 f()=1,为假时 f ( ∙ ) = 0 f(∙)=0 f()=0,M表示 O c ( i ) O_{c}^{(i)} Oc(i)输出特征图的维数,N表示验证示例的总数。验证实例越多,APoZ的测量越精确。
    https://github.com/BenWhetton/keras-surgeon

    from keras.layers import Dense, Conv2D, MaxPool2D, Flatten
    from keras.models import Sequential
    from keras import layers
    from keras import callbacks
    from tensorflow.examples.tutorials.mnist import input_data
    
    from kerassurgeon import identify
    from kerassurgeon.operations import delete_channels
    
    def main():
        training_verbosity = 2
        # Download data if needed and import.
        mnist = input_data.read_data_sets('/MNIST_data', one_hot=True, reshape=False)
        val_images = mnist.validation.images
        val_labels = mnist.validation.labels
    
        # Create LeNet model
        model = Sequential()
        model.add(Conv2D(20,
                         [3, 3],
                         input_shape=[28, 28, 1],
                         activation='relu',
                         name='conv_1'))
        model.add(MaxPool2D())
        model.add(Conv2D(50, [3, 3], activation='relu', name='conv_2'))
        model.add(MaxPool2D())
        model.add(layers.Permute((2, 1, 3)))
        model.add(Flatten())
        model.add(Dense(500, activation='relu', name='dense_1'))
        model.add(Dense(10, activation='softmax', name='dense_2'))
    
        model.compile(optimizer='adam',
                      loss='categorical_crossentropy',
                      metrics=['accuracy'])
    
        early_stopping = callbacks.EarlyStopping(monitor='val_loss',
                                                 min_delta=0,
                                                 patience=10,
                                                 verbose=training_verbosity,
                                                 mode='auto')
        reduce_lr = callbacks.ReduceLROnPlateau(monitor='val_loss',
                                                factor=0.1,
                                                patience=5,
                                                verbose=training_verbosity,
                                                mode='auto',
                                                epsilon=0.0001,
                                                cooldown=0,
                                                min_lr=0)
    
        # Train LeNet on MNIST
        results = model.fit(mnist.train.images,
                            mnist.train.labels,
                            epochs=200,
                            batch_size=128,
                            verbose=2,
                            validation_data=(val_images, val_labels),
                            callbacks=[early_stopping, reduce_lr])
    
        loss = model.evaluate(val_images, val_labels, batch_size=128, verbose=2)
        print('original model loss:', loss, '\n')
    
        layer_name = 'dense_1'
        # Dead cycle, please add break and exit by yourself
        while True:
            layer = model.get_layer(name=layer_name)
            apoz = identify.get_apoz(model, layer, val_images,bs=128)
            high_apoz_channels = identify.high_apoz(apoz)
            model = delete_channels(model, layer, high_apoz_channels)
    
            model.compile(optimizer='adam',
                          loss='categorical_crossentropy',
                          metrics=['accuracy'])
    
            loss = model.evaluate(val_images,
                                  val_labels,
                                  batch_size=128,
                                  verbose=2)
            print('model loss after pruning: ', loss, '\n')
    
            results = model.fit(mnist.train.images,
                                mnist.train.labels,
                                epochs=200,
                                batch_size=128,
                                verbose=training_verbosity,
                                validation_data=(val_images, val_labels),
                                callbacks=[early_stopping, reduce_lr])
    
            loss = model.evaluate(val_images,
                                  val_labels,
                                  batch_size=128,
                                  verbose=2)
            print('model loss after retraining: ', loss, '\n')
    if __name__ == '__main__':
        main()
    

    安装keras-surgeon剪枝工具:
    pip install kerassurgeon。

    (3)过滤器剪枝(fiters pruning)
    主流的滤波器剪枝(filter pruning)方法都是在第一轮训练完成之后用各种metrics(比如filter norm大小)直接剔除不那么重要的filters,并重新finetune模型以补偿剪枝过程中带来的性能损失。按soft pruning[1]的说法,这类剪枝方法应该叫hard pruning,也就是在训练之后强行将一部分filters剔除。
    一般情况下,fiters pruning过程如下。

    • 取训练好的model
    • 取出每一个CNN的卷积核
    • 计算每个卷积核的所有权重之和大小
    • 设置一个阈值,比如为1
    • 如果这个卷积核的权重值和小于1则直接剔除掉
    • 最后生成新的model和网络文件
    • 再训练

    这种方法可以瞬间减小你的model的尺寸,并且加快速度,因为你的计算量明显减小了,并且model中的卷积核的个数也少了,也就是说你总体的权重少了,剩下来的都是默认有用的卷积核或者权重,但是问题来了,就是精度会大大降低,因为这个也没告诉你怎么剪枝,具体每层每层之间怎么裁剪,只能不断尝试。对于channel,这边的channel就是某个卷积层通过乘以每个卷积核得到的那些feature channel,来判断这些channel哪些是冗余的方式来消除filters。
    注意:前面一两层最好不剪枝,或者少量剪枝;和SSD有关联的层尽量不剪枝,或者少剪枝;剪枝之后一定要再训练,acc会上升一些,但是不要次数过多,会过拟合。

    (4)量化和二进制化
    量化就是将无限域的值转化为有限域离散值的过程。假设我们有一张灰度图像。量化(N级)就是将图像中的每个像素点的颜色用N份权重来表示。而二进制化只会给出图像的两个灰度级别(灰或非灰)。
    网络量化通过减少表示每个权重所需的比特数来压缩原始网络。量化限制了可用于我们内核中的不同权重数目。对于N个比特位,可以表示2的N次方个权重。我们的目的是修改内核中的权重只能取2的N次方个值。因此,低于四个比特位参数量化虽然准确率没有受到很大损失,但却很难表示权重。

    6.2 低秩分解

    低秩分解的方法其实就是运用了矩阵分解和矩阵乘法的结合律。实际上就是把较大的卷积核分解为两个级联的行卷积核和列卷积核。常见的就是一个3×3的卷积层,替换为一个3×1的卷积层加上一个1×3的卷积核。
    低秩估计的方法的优势在于,没有改变基础运算的结构,不需要额外定义新的操作。分解后的网络仍是用卷积操作来实现的,所以其适用面比较广泛。分解方法多种多样,但一般分解后的网络都需要参数调优,以保证分解后网络模型的准确率。
    常见的低秩分解有:奇异值分解SVD、CP分解、Tucker分解、Tensor Train分解和Block Term分解等,用低秩矩阵近似原有权重矩阵。

    6.3 模型蒸馏

    理想AI模型的目标不是拟合训练数据,而是学习如何泛化到新的数据。所以蒸馏的目标是让student学习到teacher的泛化能力,理论上得到的结果会比单纯拟合训练数据的student要好。另外,对于分类任务,如果soft targets的熵比hard targets高,那显然student会学习到更多的信息。
    模型蒸馏也叫知识蒸馏,是Hinton在NIPS2014提出了知识蒸馏(Knowledge Distillation)的概念,最基本的想法就是将大模型学习出来的知识作为先验,将先验知识传递到小规模的神经网络中,之后实际应用中部署小规模的神经网络。这样做有三点依据:

    • 大规模神经网络得到的类别预测包含了数据结构间的相似性;
    • 有了先验的小规模神经网络只需要很少的新场景数据就能够收敛;
    • Softmax函数随着温度变量(temperature)的升高分布更均匀。

    对于网络压缩和加速,模型蒸馏则直接设计了一个简单结构的小网络,那小网络的准确率怎么和大网络比呢?Hinton前辈提出了一个非常简单且有效的方法——网络蒸馏。主要思想是用预训练好的网络,是指通常结构较复杂,准确率较高的网络,来指导小网络的训练,并使小网络达到与复杂网络相近的准确率。大网络类比于老师,小网络类比于学生,老师经过漫长时间的“训练”摸索出一套适用于某个任务的方法,于是将方法提炼成“知识”传授给学生,帮助学生更快地学会处理相似的任务。整个思想中最大的难题在于如何有效地表达“知识”,并有效地指导小网络的训练。

    展开全文
  • 深度神经网络总结

    万次阅读 多人点赞 2019-01-09 17:52:24
    深度神经网络(Deep Neural Networks,DNN)可以理解为有很多隐藏层的神经网络,又被称为深度前馈网络(DFN),多层感知机(Multi-Layer perceptron,MLP)。 1 前向传播算法 1.1 从感知机到神经网络 感知机的模型...

    深度神经网络(Deep Neural Networks,DNN)可以理解为有很多隐藏层的神经网络,又被称为深度前馈网络(DFN),多层感知机(Multi-Layer perceptron,MLP)。

    1 前向传播算法

    1.1 从感知机到神经网络

    感知机的模型是一个有若干输入和一个输出的模型,如下图:

    输出和输入之间学习到一个线性关系,得到中间输出结果:

    接着是一个神经元激活函数,得到输出结果1或者-1。:

    这个模型只能用于二元分类,且无法学习比较复杂的非线性模型,因此在工业界无法使用。

    而神经网络则在感知机的模型上做了扩展,总结下主要有三点:

    • 1)加入了多层隐藏层,增强模型的表达能力。
    • 2)输出层神经元可以不止一个,可以有多个输出,这样模型可以灵活的应用于分类,回归,降维和聚类等。下图输出层有4个神经元。

    • 3) 对激活函数做扩展。感知机的激活函数是sign(z),虽然简单但是处理能力有限,因此神经网络中一般使用:Sigmoid,tanx, ReLU,softplus,softmax等加入非线性因素,提高模型的表达能力。

    1.2 DNN的基本结构

    按不同层的位置划分,DNN内部的神经网络层可以分为:输入层,隐藏层和输出层,一般第一层是输入层,最后一层是输出层,而中间的层数都是隐藏层。层与层之间是全连接的,即第i层的任意一个神经元一定与第i+1层的任意一个神经元相连。

    虽然DNN看起来很复杂,但是从小的局部模型来说,还是和感知机一样,即一个线性关系加上一个激活函数σ(z)。

    由于DNN层数多,参数较多,线性关系系数w和偏倚b的定义需要一定的规则。线性关系系数w的定义:第二层的第4个神经元到第三层的第2个神经元的线性系数定义为。上标3代表线性系数w所在的层数,而下标对应的是输出的第三层索引2和输入的第二层索引4。你也许会问,为什么不是w342, 呢?这主要是为了便于模型用于矩阵表示运算,如果是w342而每次进行矩阵运算是wTx+b,需要进行转置。将输出的索引放在前面的话,则线性运算不用转置,即直接为wx+b。注意,输入层是没有w参数,偏倚参数b。

     偏倚b的定义:第二层的第三个神经元对应的偏倚定义为。其中,上标2代表所在的层数,下标3代表偏倚所在的神经元的索引。

    1.3 DNN前向传播算法数学原理

    假设选择的激活函数是σ(z),隐藏层和输出层的输出值为a。

    1.4 DNN前向传播算法

    DNN的前向传播算法是利用若干个权重系数矩阵W,偏倚向量b来和输入值向量x进行一系列线性运算和激活运算,从输入层开始,利用上一层的输出计算下一层的输出,一层层的向后计算,一直到运算到输出层,得到输出结果为值。

    2 DNN反向传播算法

    使用前向传播计算训练样本的输出,使用损失函数,来度量训练样本计算出的输出和真实的训练样本标签之间的损失。DNN的反向传播算法(Back Propagation,BP)通过对损失函数用梯度下降法进行迭代优化求极小值,找到合适的隐藏层和输出层对应的线性系数矩阵W,偏倚向量b,让所有的训练样本输入计算出的输出尽可能的等于或接近样本标签。

    2.1 DNN反向传播算法的基本思路

    使用均方差来度量损失进行推导。即对于每个样本,期望最小化下式:

    2.2 DNN反向传播算法过程

    梯度下降法有批量(Batch),小批量(mini-Batch),随机三个变种,为了简化描述,这里以最基本的批量梯度下降法为例来描述反向传播算法。实际上在业界使用最多的是mini-Batch的梯度下降法。不过区别仅仅在于迭代时训练样本的选择而已。

    3 损失函数和激活函数

    3.1 均方差损失函数+Sigmoid激活函数的问题

    Sigmoid激活函数的表达式和图像:

    对于Sigmoid,当z的取值越来越大(或z的取值越来越小时),函数曲线变得越来越平缓,导数σ′(z)也越来越小。仅仅在z取值为0附近时,导数σ′(z)的取值较大。在使用均方差+Sigmoid的反向传播算法中,每一层向前递推都要乘以σ′(z),得到梯度变化值。Sigmoid的这个曲线意味着在大多数时候,梯度变化值很小,导致W,b更新到极值的速度较慢,算法收敛速度较慢。

    2. 使用交叉熵损失函数+Sigmoid激活函数改进DNN算法收敛速度

    每个样本的交叉熵损失函数的形式:

    另外,表示预测值与实际值的误差,当误差越大时,梯度就越大,参数w和b的调整就越快,训练的速度也就越快。通常情况下,如果使用了sigmoid激活函数,交叉熵损失函数肯定比均方差损失函数好用。综上:如果输出神经元是线性的,那么二次代价函数就是一种合适的选择,如果输出神经元是S型函数(sigmoid,tanh),那么比较适合用交叉熵代价函数。

    3. 使用对数似然损失函数和softmax激活函数进行DNN分类输出

    对数似然函数与softmax的组合和交叉熵与sigmoid函数的组合相似,对数似然代价函数在二分类时可以化简为交叉熵代价函数的形式。

    将DNN用于分类问题,在输出层用softmax激活函数非常常见。DNN分类模型要求是输出层神经元输出的值在0到1之间,同时所有输出值之和为1。普通DNN是无法满足这个要求。对现有的全连接DNN稍作改良,将输出层的激活函数从Sigmoid之类的函数转变为上式的softmax激活函数,即可用于解决分类问题。在现有的DNN模型中,将输出层第i个神经元的激活函数定义为如下形式:

    softmax激活函数在前向传播算法时的使用:假设输出层为三个神经元,而未激活的输出为3,1和-3,求出各自的指数表达式为:20,2.7和0.05,归一化因子即为22.75,则三个类别的概率输出分布为0.88,0.12和0。

    4. 梯度爆炸,梯度消失与ReLU激活函数

    在反向传播算法中,由于使用了是矩阵求导的链式法则,有一大串连乘,如果连乘的数字在每层都是小于1的,则梯度越往前乘越小,导致梯度消失,而如果连乘的数字在每层都是大于1的,则梯度越往前乘越大,导致梯度爆炸。对于梯度爆炸,则一般可以通过调整DNN模型中的初始化参数得以解决。

    反向传播算法中δ的计算:

    甚至接近于0,导致梯度几乎消失,进而导致前面隐藏层的W,b参数随着迭代的进行几乎没有大的改变,收敛速度较慢。

    一个可能部分解决梯度消失问题的办法是使用ReLU(Rectified Linear Unit)激活函数:σ(z)=max(0,z),ReLU在卷积神经网络CNN中得到了广泛的应用。

    5. DNN损失函数和激活函数小结

    1)如果使用sigmoid激活函数,则交叉熵损失函数一般肯定比均方差损失函数好。2)如果是DNN用于分类,则一般在输出层使用softmax激活函数和对数似然损失函数。3)ReLU激活函数对梯度消失问题有一定程度的解决,尤其是在CNN模型中。

    DNN常用的激活函数:

    • 1)sigmoid:
    • 2)ReLU:σ(z)=max(0,z)
    • 3) tanh:sigmoid的变种,输出区间为[-1,1]表达式为:

    tanh激活函数和sigmoid激活函数的关系为:

    • 4) softplus:sigmoid函数的原函数,表达式为:

    它的导数就是sigmoid函数。softplus的函数图像和ReLU有些类似。它出现的比ReLU早,可以视为ReLU的鼻祖。

    • 5)PReLU:ReLU的变种,特点是如果未激活值小于0,不是简单粗暴的直接变为0,而是进行一定幅度的缩小。

    正则化

    1. DNN的L1&L2正则化

    L1正则化和L2正则化原理类似,重点讲述DNN的L2正则化。DNN的L2正则化通常只针对与线性系数矩阵W,而不针对偏倚系数b。

    假如每个样本的损失函数是均方差损失函数,则所有的m个样本的损失函数为:

    则加上了L2正则化后的损失函数是:

    其中,λ即正则化超参数,实际使用时需要调参。而w为所有权重矩阵W的所有列向量。

    如果使用上式的损失函数,进行反向传播算法时,流程和没有正则化的反向传播算法完全一样,区别仅仅在于进行梯度下降法时,W的更新公式。反向传播算法中,W的梯度下降更新公式为:

    加入L2正则化以后,迭代更新公式变成:

    注意到上式中的梯度计算中我忽略了,因为α是常数,而除以m也是常数,所以等同于用了新常数α来代替。类似的L2正则化方法可以用于交叉熵损失函数或者其他的DNN损失函数。

    2. DNN通过集成学习的思路正则化

    除了常见的L1&L2正则化,DNN可以用Bagging的思路来正则化。常用的机器学习Bagging算法中,随机森林是最流行的。它通过随机采样构建若干个相互独立的弱决策树学习器,最后采用加权平均法或者投票法决定集成的输出。在DNN中同样可以使用Bagging的思路。不过和随机森林不同的是,这里不是若干个决策树,而是若干个DNN的网络。

    首先对原始的m个训练样本进行有放回随机采样,构建N组m个样本的数据集,然后分别用这N组数据集训练DNN。即采用前向传播算法和反向传播算法得到N个DNN模型的W,b参数组合,最后对N个DNN模型的输出用加权平均法或者投票法决定最终输出。

    不过用集成学习Bagging的方法有一个问题,就是DNN模型本来就比较复杂,参数很多。现在又变成了N个DNN模型,这样参数又增加了N倍,从而导致训练这样的网络要花更加多的时间和空间。因此一般N的个数不能太多,比如5-10个就可以了。

    3. DNN通过dropout 正则化

    Dropout指的是在用前向传播算法和反向传播算法训练DNN模型时,一批数据迭代时,随机的从全连接DNN网络中去掉一部分隐藏层的神经元。在对训练集中的一批数据进行训练时,随机去掉一部分隐藏层的神经元,并用去掉隐藏层的神经元的网络来拟合一批训练数据。如下图,去掉了一半的隐藏层神经元:

    然后用这个去掉隐藏层的神经元的网络来进行一轮迭代,更新所有的W,b。

    dropout并不意味着这些神经元永远的消失了。在下一批数据迭代前,会把DNN模型恢复成最初的全连接模型,然后再用随机的方法去掉部分隐藏层的神经元,接着去迭代更新W,b。当然,这次用随机的方法去掉部分隐藏层后的残缺DNN网络和上次的残缺DNN网络并不相同。

    总结下dropout的方法: 每轮梯度下降迭代时,它需要将训练数据分成若干批,然后分批进行迭代,每批数据迭代时,需要将原始的DNN模型随机去掉部分隐藏层的神经元,用残缺的DNN模型来迭代更新W,b。每批数据迭代更新完毕后,要将残缺的DNN模型恢复成原始的DNN模型。

    dropout和Bagging的正则化思路不同,dropout模型中的W,b是共享的,所有的残缺DNN迭代时,更新的是同一组W,b;而Bagging正则化时每个DNN模型有自己独有的一套W,b参数,相互之间是独立的。相同点是:每次使用基于原始数据集得到的分批的数据集来训练模型。

    使用基于dropout的正则化比基于bagging的正则化简单,当然天下没有免费的午餐,由于dropout会将原始数据分批迭代,因此原始数据集最好较大,否则模型可能会欠拟合。

    4. DNN通过增强数据集正则化

    增强模型泛化能力最好的办法是有更多的训练数据,但是在实际应用中,更多的训练数据往往很难得到。有时候我们不得不去自己想办法无中生有,来增加训练数据集,进而得到让模型泛化能力更强的目的。


    从感知机到神经网络

    感知机是二分类的线性模型,假设训练数据集是线性可分的,感知机学习的目标是求得一个能够将训练数据集正负样本点正确分开的超平面使误分类的样本点到超平面的距离之和最小。这个模型只能用于二元分类,且无法学习比较复杂的非线性模型,因此在工业界无法使用。

    将单个神经元的激活函数设为sign可以得到感知机;激活函数设为sigmoid,即可得到二分类的LR;将激活函数设为softmax可以得到多分类的LR,但需要注意的是:它们需要优化的损失函数并不相同,所以LR和感知机的不同体现在两点:激活函数和损失函数。

    神经网络在感知机的模型上做了扩展,主要有三点:

    1. 加入了多层隐藏层,特征的“等级”随着网络深度的加深而变高,增强了模型的表达能力。
    2. 输出层神经元可以有多个输出,模型可以灵活的应用于分类,回归,降维和聚类等。
    3. 对激活函数做扩展。感知机的激活函数是sign(z),虽然简单但是处理能力有限,因此神经网络中一般使用:Sigmoid,Softmax,tanx, ReLU,softplus等激活函数,加入非线性因素,提高模型的表达能力。

    深度神经网络(Deep Neural Networks,DNN)的基本结构

    DNN可以分为:输入层,隐藏层和输出层,一般第一层是输入层,最后一层是输出层,而中间的层数都是隐藏层。层与层之间是全连接的,即第i层的任意一个神经元一定与第i+1层的任意一个神经元相连。

    DNN前向传播算法

    从输入层开始,利用输入向量x,若干个权重系数矩阵W和偏置向量b,进行一系列线性运算和激活运算,利用上一层的输出计算下一层的输出,一层层的向后计算,一直到运算到输出层得到输出结果

    DNN反向传播算法(Back Propagation,BP)

    反向传播算法的学习过程由正向传播和反向传播组成。在正向传播过程中,输入信息通过输入层,经隐藏层逐层处理并传向输出层。如果在输出层得不到期望的输出值,则取输出结果与样本标签误差的平方和作为目标函数,转入反向传播,通过对损失函数用梯度下降法进行迭代优化求极小值,找到合适的输出层和隐藏层对应的线性系数矩阵W,偏置向量b,网络的学习在权值修改过程中完成,误差达到所期望值时,网络学习结束。

    DNN激活函数

    为什么引入非线性激活函数

    不用激活函数时,每一层输出都是上层输出的线性函数, 无论神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,引入激活函数相当于加入非线性因素,可以有效避免多层网络等效于单层线性函数,提高模型表达力,使模型更有区分度。激活函数通常有如下一些性质:非线性(提高模型表达力),可微性(方便求梯度),单调性(损失函数为凸函数)

    DNN常用的激活函数

    梯度消失与梯度爆炸

    在反向传播算法中,由于使用了矩阵求导的链式法则,后层的梯度以连乘方式叠加到前层,当神经网络中的激活函数为S型激活函数时,由于其饱和特性,在输入达到一定值的情况下,输出就不会发生明显变化,其导数逐渐趋近于0。使用梯度进行参数更新时,如果连乘的数字在每层都是小于1的,则梯度越往前乘越小,误差梯度反传到前层时几乎会衰减为0,因此无法对前层的参数进行有效的更新学习,这就会导致梯度消失,而如果连乘的数字在每层都是大于1的,则梯度越往前乘越大,导致梯度爆炸。梯度消失会导致隐层的W,b参数随着迭代的进行几乎没有大的改变,甚至不会收敛,因此无法通过加深网络层次来改善神经网络的预测效果。梯度爆炸会导致网络权重的大幅更新,引起网络不稳定,在极端情况下,权重的值变得非常大,以至于溢出,导致 NaN 值。

    ReLU系列相对于Sigmoid和Tanh激活函数的优点是什么?它的缺点以及如何改进?

    优点

    1. 从计算的角度上,Sigmoid和Tanh激活函数均需要计算指数,复杂度高,而ReLU只需要一个阈值即可得到激活值。
    2. 深层网络中,S型激活函数反向传播时容易出现梯度消失现象,ReLU的非饱和性可以有效地解决梯度消失的问题,提供相对宽的激活边界。
    3. ReLU的单侧抑制会使一部分神经元的输出为 0,提供了网络的稀疏表达能力,并且减少了参数的相互依存关系,可以缓解过拟合。

    缺点
    使用Relu激活函数在训练过程中Relu会导致神经元不可逆死亡。因为函数会导致负梯度在经过该ReLU单元时被置为0,且在之后也不被任何数据激活,即流经该神经元的梯度永远为0,不对任何数据产生响应。在实际训练中,如果学习率(Learning Rate)设置较大,会导致超过一定比例的神经元不可逆死亡,进而参数梯度无法更新,整个训练过程失败。                              

    缺点的改进

    为解决练过程中会导致神经元死亡的问题,人们设计了ReLU的变种LReLU( Leaky ReLU),其形式表示为:

    LReLU与ReLU的区别在于:当z<=0时,其值不为0,而是一个斜率为a的线性函数,一般a为一个很小的正常数,这样既实现了单侧抑制,又保留了部分负梯度信息以致不完全丢失。但a值的选择增加了问题难度,需要较强的先验知识或多次重复训练以确定合适的参数值。

    DNN损失函数

    常用的损失函数有:平方误差损失函数,交叉熵损失函数,对数似然损失函数

    对数似然损失是对预测概率的似然估计,其最小化的本质是利用样本中的已知分布,求解导致这种分布的最佳模型参数,使这种分布出现概率最大。它衡量的是预测概率分布和真实概率分布的差异性,取值越小越好。其标准形式为:

    对数似然损失函数在二分类时可以化简为交叉熵损失函数。交叉熵表示两个概率分布之间的距离,交叉熵越大,两个概率分布距离越远,概率分布越相异;交叉熵越小,两个概率分布距离越近,概率分布越相似,通过交叉熵可以判断哪个预测结果与标准答案更接近。

    交叉熵损失函数的计算公式为:

    对数损失在多分类问题中的计算公式为:

    平方误差损失函数和交叉熵损失函数分别适合什么场景?

    一般来说,平方误差损失函数更适合输出为连续,并且最后一层不含Sigmoid或Softmax激活函数的神经网络;如果是使用Sigmoid或Softmax激活函数进行二分类或多分类的神经网络,使用交叉熵损失或对数似然损失会有更快的收敛速度。

    推导平方误差损失函数相对于输出层的导数:其中最后一项σ′(z)为激活函数的导数。反向传播算法中,每一层向前递推都要乘以σ′(z),得到梯度变化值,当激活函数为S型函数时,如果z 的绝对值较大,函数会趋于饱和,即σ′(z)的绝对值非常小,导致W,b更新到极值的速度较慢,算法收敛速度较慢。当使用交叉熵损失函数时,相对于输出层的导数为:(也可以认为是残差),此时的导数是线性的,因此不会存在学习速度过慢的问题,而且其表示预测值与实际值的误差,误差越大时,梯度越大,参数w和b的调整就越快,训练的速度也就越快

    将输出层的激活函数从Sigmoid之类的函数转变为Softmax激活函数可以使输出层神经元输出的值在0到1之间,同时所有输出值之和为1,可用于解决多分类问题。

    DNN激活函数和损失函数小结:

    1. 如果神经元的输出是线性的,平方损失函数是一种合适的选择,如果输出神经元是S型激活函数,则交叉熵损失函数会有更快的收敛速度。
    2. softmax激活函数与对数似然损失的组合和sigmoid函数与交叉熵的组合相似,所以一般使用sigmoid激活函数与交叉熵进行二分类输出;使用softmax激活函数与对数似然损失进行DNN多分类输出。

    正则化(L1&L2,Bagging,Dropout,数据扩充)

    1. DNN的L1&L2正则化

    假如每个样本的损失函数是均方差损失函数,则加上了L2正则化后的损失函数是(L1正则化类似):

    其中,λ即正则化超参数,实际使用时需要调参。

    2. DNN通过Bagging正则化

    首先对原始的m个训练样本进行有放回随机采样,构建N组m个样本的数据集,然后分别用这N组数据集训练DNN。即采用前向传播算法和反向传播算法得到N个DNN模型的W,b参数组合,最后对N个DNN模型的输出用加权平均法或者投票法决定最终输出。

    需要注意的是:DNN模型本来就比较复杂,参数很多。N个DNN模型集成,参数增加了N倍,导致训练网络要花更加多的时间和空间。N的取值一般为:5-10个。

    3. DNN通过Dropout 正则化

    Dropout(随机失活)是指在深度网络的训练中,将训练数据分成若干批,使用一批数据进行梯度下降迭代时,以一定的概率随机地 “临时丢弃”一部分神经元节点,然后用这个去掉隐藏层神经元的网络来拟合一批训练数据,并更新所有的权重和偏置(W,b)。在下一批数据迭代前,会把DNN模型恢复成最初的全连接模型,然后再用随机去掉部分隐藏层的神经元,迭代更新权重和偏置。

    由于其随机丢弃部分神经元的机制,每次dropout都相当于训练了原始网络的子网络,它们共享部分权值,并且具有相同的网络层数,而模型整体的参数数目不变,这就大大简化了运算,而且这个过程会减弱神经元之间的依赖关系,减少过拟合,增强模型的泛化能力。(避免神经元相互连接,参数过多,将结果记住)

    Bagging集成算法是多个模型的同时训练与测试评估,当网络与参数规模庞大时,需要消耗大量的运算时间与空间。Dropout在小批量数据集上进行操作,最后的结果相当于很多子网络的组合,这可以看做是bagging集成的近似,如果每次训练的子网络之间有一定的独立性,最后融合会降低模型的方差,增强模型的泛化能力。

    Dropout和Bagging的正则化的异同

    • 不同点:dropout模型中的W,b是一套共享的,所有的残缺DNN迭代时,更新的是同一组W,b;而Bagging正则化时每个DNN模型有自己独有的一套W,b参数,相互之间是独立的。
    • 相同点:二者都是使用基于原始数据集分批得到的数据集来训练模型。

    Dropout和 L1,L2的正则化的异同

    二者的目的都是用来减少 overfitting(过拟合)。但 L1,L2正则化是针对损失函数进行优化,Dropout是改变神经网络本身的结构。

    4. DNN通过扩充数据集正则化

    减少模型过拟合,增强模型泛化能力最好的办法是有更多的训练数据。如:计算机视觉中可以使用图像数据增强技术。

    深度学习输入数据归一化的原因(使数据处于同一数量级,具有相同的数据分布)

    1. 神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;
    2. 数据归一化可以在反向传播的过程中,加快网络中每一层权重参数的收敛速度。如果每批训练数据的分布各不相同,那么网络就要在每次迭代都去学习适应不同的数据分布,这样将会大大降低网络的训练速度

    什么样的数据集不适合用深度学习?

    1. 数据集太小,深度学习容易产生过拟合。
    2. 数据集没有局部相关特性,目前深度学习表现比较好的领域主要是图像/语音/自然语言处理等领域,这些领域的一个共性是局部相关性。图像中像素组成物体,语音信号中音位组合成单词,文本数据中单词组合成句子,这些特征元素的组合一旦被打乱,表示的含义同时也被改变
    展开全文
  • 卷积神经网络和深度神经网络的区别是什么?

    万次阅读 多人点赞 2019-11-28 11:29:25
    DNN是指深度神经网络,它是一个很广的概念,某种意义上CNN、RNN、GAN等都属于其范畴之内。DNN与CNN(卷积神经网络)的区别是DNN特指全连接的神经元结构,并不包含卷积单元或是时间上的关联。DNN是指包含多个隐层的...

    作者:飘哥
    链接:https://www.zhihu.com/question/29366638/answer/864113705
     

    DNN是指深度神经网络,它是一个很广的概念,某种意义上CNN、RNN、GAN等都属于其范畴之内。DNN与CNN(卷积神经网络)的区别是DNN特指全连接的神经元结构,并不包含卷积单元或是时间上的关联。DNN是指包含多个隐层的神经网络,根据神经元的特点,可以分为MLP、CNNs、RNNs等,从神经元的角度来讲解,MLP是最朴素的DNN,CNNs是encode了空间相关性的DNN,RNNs是encode进了时间相关性的DNN。

    一.神经网络的发展

    1.感知机

    神经网络技术起源于上世纪五、六十年代,当时叫感知机(perceptron),拥有输入层、输出层和一个隐含层。输入的特征向量通过隐含层变换达到输出层,在输出层得到分类结果。早期感知机的推动者是Rosenblatt。但是,Rosenblatt的单层感知机有一个严重得不能再严重的问题,对于计算稍微复杂的函数其计算力显得无能为力。

    2.多层感知机

    随着数学的发展,这个缺点直到上世纪八十年代才被Rumelhart、Williams、Hinton、LeCun等人发明的多层感知机(multilayer perceptron)克服。多层感知机,顾名思义,就是有多个隐含层的感知机。

    多层感知机可以摆脱早期离散传输函数的束缚,使用sigmoid或tanh等连续函数模拟神经元对激励的响应,在训练算法上则使用Werbos发明的反向传播BP算法。对,这就是我们现在所说的神经网络( NN)!多层感知机解决了之前无法模拟异或逻辑的缺陷,同时更多的层数也让网络更能够刻画现实世界中的复杂情形。多层感知机给我们带来的启示是,神经网络的层数直接决定了它对现实的刻画能力——利用每层更少的神经元拟合更加复杂的函数。

    即便大牛们早就预料到神经网络需要变得更深,但是有一个梦魇总是萦绕左右。随着神经网络层数的加深,优化函数越来越容易陷入局部最优解,并且这个“陷阱”越来越偏离真正的全局最优。利用有限数据训练的深层网络,性能还不如较浅层网络。同时,另一个不可忽略的问题是随着网络层数增加,“梯度消失”现象更加严重。具体来说,我们常常使用 sigmoid 作为神经元的输入输出函数。对于幅度为1的信号,在BP反向传播梯度时,每传递一层,梯度衰减为原来的0.25。层数一多,梯度指数衰减后低层基本上接受不到有效的训练信号。

    3.深度神经网络(DNN)

    2006年,Hinton利用预训练方法缓解了局部最优解问题,将隐含层推动到了7层(参考论文:Hinton G E, Salakhutdinov R R. Reducing the Dimensionality of Data with Neural Networks[J]. Science, 2006, 313(5786):504-507.),神经网络真正意义上有了“深度”,由此揭开了深度学习的热潮。这里的“深度”并没有固定的定义——在语音识别中4层网络就能够被认为是“较深的”,而在图像识别中20层以上的网络屡见不鲜。为了克服梯度消失,ReLU、maxout等传输函数代替了 sigmoid,形成了如今 DNN 的基本形式。单从结构上来说,全连接的DNN和上图的多层感知机是没有任何区别的。值得一提的是,今年出现的高速公路网络(highway network)和深度残差学习(deep residual learning)进一步避免了梯度弥散问题,网络层数达到了前所未有的一百多层(深度残差学习:152层)

    4.卷积神经网络(CNN)

    我们看到全连接DNN的结构里下层神经元和所有上层神经元都能够形成连接,带来的潜在问题是参数数量的膨胀。假设输入的是一幅像素为1K*1K的图像,隐含层有1M个节点,光这一层就有10^12个权重需要训练,这不仅容易过拟合,而且极容易陷入局部最优。另外,图像中有固有的局部模式(比如轮廓、边界,人的眼睛、鼻子、嘴等)可以利用,显然应该将图像处理中的概念和神经网络技术相结合。此时我们可以祭出题主所说的卷积神经网络CNN。对于CNN来说,并不是所有上下层神经元都能直接相连,而是通过“卷积核”作为中介。同一个卷积核在所有图像内是共享的,图像通过卷积操作后仍然保留原先的位置关系。

    对于图像,如果没有卷积操作,学习的参数量是灾难级的。CNN之所以用于图像识别,正是由于CNN模型限制了参数的个数并挖掘了局部结构的这个特点。顺着同样的思路,利用语音语谱结构中的局部信息,CNN照样能应用在语音识别中。在普通的全连接网络或CNN中,每层神经元的信号只能向上一层传播,样本的处理在各个时刻独立,因此又被称为前向神经网络(Feed-forward Neural Networks)。

    神经网络计算方法与传统方法的区别?

    神经网络具备:
    - 并行
    - 容错
    - 硬件实现
    - 自我学习
    以上是神经网络计算方法与传统方法的区别所在。

    多层神经网络包含哪几层?

    传统意义上的多层神经网络包含 三层
    - 输入层
    - 隐藏层
    - 输出层
    其中 隐藏层的层数根据需要而定,没有明确的理论推导来说明到底多少层合适,多层神经网络做的步骤是:特征映射到值,特征是人工挑选。

    二.DNN(深度神经网络)

    传统的人工神经网络(ANN)由三部分组成:输入层,隐藏层,输出层,这三部分各占一层。而深度神经网络的“深度”二字表示它的隐藏层大于2层,这使它有了更深的抽象降维能力

    三.CNN(卷积神经网络)

    对卷积神经网络的研究始于二十世纪80至90年代,时间延迟网络和LeNet-5是最早出现的卷积神经网络;在二十一世纪后,随着深度学习理论的提出和数值计算设备的改进,卷积神经网络得到了快速发展,并被大量应用于计算机视觉、自然语言处理等领域 。

    1.什么是卷积神经网络

    卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的 前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一 。由于卷积神经网络能够进行平移不变分类(shift-invariant classification),因此也被称为“平移不变人工神经网络(Shift-Invariant Artificial Neural Networks, SIANN)” 。
    《百度百科》

    2.卷积神经网络的基本概念

    • 局部感受野(local receptive fields)
    • 共享权重(shared weights)
    • 池化(pooling)

    3.卷积神经网络的构成

    典型的卷积神经网络由3部分构成:

    • 卷积层
    • 池化层
    • 全连接层

    卷积层负责提取图像中的局部特征池化层用来大幅降低参数量级(降维);全连接层类似传统神经网络的部分,用来输出想要的结果

    A.卷积——提取特征

    卷积层的运算过程如下图,用一个卷积核扫完整张图片:

    这个过程我们可以理解为我们使用一个过滤器(卷积核)来过滤图像的各个小区域,从而得到这些小区域的特征值。

    在具体应用中,往往有多个卷积核,可以认为,每个卷积核代表了一种图像模式,如果某个图像块与此卷积核卷积出的值大,则认为此图像块十分接近于此卷积核。如果我们设计了6个卷积核,可以理解:我们认为这个图像上有6种底层纹理模式,也就是我们用6中基础模式就能描绘出一副图像。以下就是25种不同的卷积核的示例:

     

    总结:卷积层的通过卷积核的过滤提取出图片中局部的特征,跟上面提到的人类视觉的特征提取类似。

    B.池化层(下采样)——数据降维,避免过拟合

    池化层简单说就是下采样,他可以大大降低数据的维度。其过程如下:

    上图中,我们可以看到,原始图片是20×20的,我们对其进行下采样,采样窗口为10×10,最终将其下采样成为一个2×2大小的特征图。

    之所以这么做的原因,是因为即使做完了卷积,图像仍然很大(因为卷积核比较小),所以为了降低数据维度,就进行下采样。

    总结:池化层相比卷积层可以更有效的降低数据维度,这么做不但可以大大减少运算量,还可以有效的避免过拟合。

    C.全连接层——输出结果

    这个部分就是最后一步了,经过卷积层和池化层处理过的数据输入到全连接层,得到最终想要的结果。

    经过卷积层和池化层降维过的数据,全连接层才能”跑得动”,不然数据量太大,计算成本高,效率低下。

    典型的 CNN 并非只是上面提到的3层结构,而是多层结构,例如 LeNet-5 的结构就如下图所示:

    卷积层 – 池化层- 卷积层 – 池化层 – 卷积层 – 全连接层

     

    4.卷积神经网络有2大特点

    • 能够有效的将大数据量的图片降维成小数据量
    • 能够有效的保留图片特征,符合图片处理的原则

    5.卷积神经网络的擅长处理领域

    卷积神经网络 – 卷积神经网络最擅长的就是图片的处理

    6.卷积神经网络解决了什么问题?

    在卷积神经网络出现之前,图像对于人工智能来说是一个难题,有2个原因:

    • 图像需要处理的数据量太大,导致成本很高,效率很低
    • 图像在数字化的过程中很难保留原有的特征,导致图像处理的准确率不高

    A.需要处理的数据量太大

    图像是由像素构成的,每个像素又是由颜色构成的。现在随随便便一张图片都是 1000×1000 像素以上的, 每个像素都有RGB 3个参数来表示颜色信息。假如我们处理一张 1000×1000 像素的图片,我们就需要处理3百万个参数!

    1000×1000×3=3,000,000

    这么大量的数据处理起来是非常消耗资源的,而且这只是一张不算太大的图片!

    卷积神经网络 – CNN 解决的第一个问题就是「将复杂问题简化」,把大量参数降维成少量参数,再做处理。

    更重要的是:我们在大部分场景下,降维并不会影响结果。比如1000像素的图片缩小成200像素,并不影响肉眼认出来图片中是一只猫还是一只狗,机器也是如此。

    B.保留图像特征

    假如一张图像中有圆形是1,没有圆形是0,那么圆形的位置不同就会产生完全不同的数据表达。但是从视觉的角度来看,图像的内容(本质)并没有发生变化,只是位置发生了变化

    所以当我们移动图像中的物体,用传统的方式的得出来的参数会差异很大!这是不符合图像处理的要求的。

    而 CNN 解决了这个问题,他用类似视觉的方式保留了图像的特征,当图像做翻转,旋转或者变换位置时,它也能有效的识别出来是类似的图像。

    7.卷积神经网络的典型架构

    • LeNet-5
    • AlexNet
    • VGG-16
    • Inception-V1
    • Inception-V3
    • RESNET-50
    • Xception
    • Inception-V4
    • Inception-ResNets
    • ResNeXt-50到
    展开全文
  • 分布式深度神经网络(DDNN)

    千次阅读 2019-04-26 17:18:42
    分布式深度神经网络不仅能够允许在云端进行深度神经网络的推理,还允许在边缘和终端设备上使用神经网络的浅层部分进行快速、本地化推理。在可伸缩的分布式计算层次结构的支持下,DDNN可以在神经网络规模上进行扩展和...
  • 深度神经网络模型剪枝

    千次阅读 2020-04-20 23:43:13
    深度神经网络模型剪枝 神经网络剪枝 Neural Network Pruning
  • 刚接触深度学习时,我们经常会看到神经网络、深度神经网络、卷积神经网络这些词。初看可能一头雾水,没关系,下面我们就来了解一下这些词背后的意义吧。 图1 神经元的结构 神经元(Neuron): 从生物上来说...
  •     本文提出了一个多任务深度神经网络(MT-DNN),用于跨多个自然语言理解(NLU)任务学习表示。MT-DNN不仅利用了大量的跨任务数据,而且还受益于正则化效应,从而产生更通用的表示,以帮助适应新的任务和领域。MT-...
  • 深度神经网络算法分析

    千次阅读 2019-07-25 18:45:45
    深度神经网络算法分析 人工智能的分类 弱人工智能:特定任务与人类智力或者效率持平 通用人工智能:具有人类智力水平,解决通用问题 超人工智能:超过人类智力水平,可以在创造力上超过常人 机器学习的类型...
  • 深度神经网络 一、神经网络原理 1.传统机器学习算法的局限性 越简单的关系越容易过拟合。 对于特征的变换、升阶,以及多个特征相互组合形成新特征的过程,就是机器学习过程中既耗时又耗力的特征工程。 特征空间是...
  • DNN(深度神经网络)

    万次阅读 2020-05-09 23:12:10
    深度神经网络(Deep Neural Networks, 以下简称DNN) 神经网络发展 第一代神经网络又称为感知器,由科学家Frank Rosenblatt发明于1950至1960年代,它的算法只有两层,输入层输出层,,主要使用的是一种叫做...
  • 神经网络(Artificial Neural Networks)和深度神经网络(Deep Neural Networks)1. 2. 循环神经网络(Recurrent Neural Networks)和递归神经网络(Recursive Neural Networks)1.3. 卷积网络(Convolut...
  • 多层感知机(MLP)和深度神经网络(DNN)是一样的模型,只是叫法不同。 深度神经网络,卷积神经网络(CNN)都属于深度前馈神经网络(DFNN)。 一、连接方式 连接方式分为两种 全连接,MLP采用,当前层的单元与上一...
  • 深度神经网络的应用

    千次阅读 2019-11-20 07:49:42
    深度神经网络的应用
  • 为什么是深度神经网络而不是宽度神经网络?增加神经网络的深度相比于增加宽度有哪些优点? Bengio和LeCun等人的论文《Scaling learning algorithms towards AI》中提到,如果一个深层结构能够刚刚好解决问题,那么就...
  • 传统机器学习和深度神经网络对比

    千次阅读 2020-04-29 00:42:53
    Table of ContentAlpha GO神经网络从工业的角度对比传统机器学习和深度神经网络 Alpha GO 虽然大家会说AlexNet是深度学习的开始,但真正引爆整个AI行业的可以说是Alpha GO(人称阿尔法狗)。Alphabet子公司Deepmind...
  • 深度神经网络中的Inception模块介绍

    千次阅读 2021-01-31 17:52:38
    深度神经网络(Deep Neural Networks, DNN)或深度卷积网络中的Inception模块是由Google的Christian Szegedy等人提出,包括Inception-v1、Inception-v2、Inception-v3、Inception-v4及Inception-ResNet系列。...
  • 深度神经网络(DNN)模型

    万次阅读 2019-11-15 16:06:15
    深度神经网络(Deep Neural Networks, 以下简称DNN)是深度学习的基础 DNN网络结构 DNN内部的神经网络层可以分为三类,输入层,隐藏层和输出层,如下图示例,一般来说第一层是输入层,最后一层是输出层,而中间的层...
  • DNN(深度神经网络算法)

    千次阅读 2020-11-18 14:35:44
    深度神经网络概念TensorFlow 成为最受欢迎的深度学习库,原因数据集tensorflow 读取数据通过feed_dict传递数据从文件中读取预加载的数据定义模型训练/学习评估模型 自从 1962 年 Rosenblat 提出感知机(Perceptron)...
  • 理解深度神经网络——DNN(Deep Neural Networks)

    千次阅读 多人点赞 2020-04-26 10:51:50
    深度神经网络——DNN 是深度学习的基础。 要理解DNN最好先搞清楚它的模型。本篇博文主要对DNN的模型与前向传播算法做一个易于理解的总结。 1.从感知机到神经网络的理解。 感知机是这么一种模型:一个有若干输入和...
  • 深度神经网络,大家可以理解为更加复杂的神经网络,随着深度学习的快速发展,它已经超越了传统的多层感知机神经网络,而拥有对空间结构进行处理(卷积神经网络)和时间序列进行处理(递归神经网络)的能力。...
  • 出品 | AI科技大本营(公众号ID...近年来,深度神经网络在语音、图像领域取得突出进展,以至于很多人将深度学习与深度神经网络等同视之。但周志华表示,总结 Kaggle 竞赛中的获奖结果可以发现,神经网络获胜的往往就...
  • 深度神经网络(DNN)Deep Neural Networks 介绍

    万次阅读 多人点赞 2018-03-25 19:12:35
    这里将自己做的一个PPT纪录一下,根据斯坦福大学CS234 lecture 5 整理而来Some of the content for this lecture is borrowed from Hugo Larochelle 神经网络相对于训练集:太小(欠拟合),找到的规律模型未能够很...
  • 训练深度神经网络的常用方法和技巧背景知识要求摘要正文1. 方法和技巧2. 神经网络模型的一般形式3.方法和技巧的单独说明SGD(Stochastic gradient descent)Mini-batch(解决第一个缺点)momentum(解决第一个缺点)...
  • 深度神经网络DNN

    千次阅读 2019-02-28 01:14:11
    深度网络DNN的概念,是基于浅层网路——多层感知机MLP(或称人工神经网络ANN)的基础上发展而来。关于MLP或ANN的知识,此处不作赘述,网上有很多资料可以参考。 DNN是一个很广的概念,大名鼎鼎的CNN、RNN、GAN等都...
  • 背景 我们知道,目前,深度学习十分热门,深度学习在搜索技术,数据挖掘,机器学习,机器翻译,自然语言处理,多媒体学习,语音,推荐和个性化技术,以及其他相关领域都取得了很多...神经网络技术起源于上世纪五...
  • 引言
  • 本课程将会讲解发表在计算机视觉顶级会议上的ICCV 2017和CVPR2018交错组卷积的方法,优于ResNets和谷歌的Mobilenets。...在相同参数量相同计算量的条件下,会得到比标准卷积和Mobilenet更宽的网络,所以结果会更好。
  • 一、准备工作 ####需要准备什么环境 需要安装有Visual Studio并且配置了OpenCV。能够使用OpenCV的core模块。...本例实现了简单的深度神经网络,基于OpenCV的矩阵类Mat。程序实现了BP算法,支持创建和训练
  • OpenCV4 深度神经网络(DNN)实战教程

    千人学习 2019-11-09 14:56:07
    理解卷积神经网络基本原理,熟练掌握OpenCV深度神经网络模块API开发技术,学会加载模型,解析模型输出结果;学会如何把正常的tensorflow对象检测模型转化为OpenCV可以接受的模型,实时人脸检测与识别案例。学会使用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 323,740
精华内容 129,496
关键字:

深度神经网络

友情链接: FTP.rar