哪些策略梯度法可以缓解dnn中梯度消失的问题

转载自:/pinard/p/6437495.html
在中,我们对DNN的前向反向传播算法的使用做了总结。里面使用的损失函数是均方差,而激活函数是Sigmoid。实际上DNN可以使用的损失函数和激活函数不少。这些损失函数和激活函数如何选择呢?下面我们就对DNN损失函数和激活函数的选择做一个总结。
1. 均方差损失函数+Sigmoid激活函数的问题
    在讲反向传播算法时,我们用均方差损失函数和Sigmoid激活函数做了实例,首先我们就来看看均方差+Sigmoid的组合有什么问题。
    首先我们回顾下Sigmoid激活函数的表达式为:
σ(z)=11+e-zσ(z)=11+e-z
    σ(z)σ(z)的函数图像如下:
    从图上可以看出,对于Sigmoid,当zz的取值越来越大后,函数曲线变得越来越平缓,意味着此时的导数σ′(z)σ′(z)也越来越小。同样的,当zz的取值越来越小时,也有这个问题。仅仅在zz取值为0附近时,导数σ′(z)σ′(z)的取值较大。
    在上篇讲的均方差+Sigmoid的反向传播算法中,每一层向前递推都要乘以σ′(z)σ′(z),得到梯度变化值。Sigmoid的这个曲线意味着在大多数时候,我们的梯度变化值很小,导致我们的W,bW,b更新到极值的速度较慢,也就是我们的算法收敛速度较慢。那么有什么什么办法可以改进呢?
2. 使用交叉熵损失函数+Sigmoid激活函数改进DNN算法收敛速度
    上一节我们讲到Sigmoid的函数特性导致反向传播算法收敛速度慢的问题,那么如何改进呢?换掉Sigmoid?这当然是一种选择。另一种常见的选择是用交叉熵损失函数来代替均方差损失函数。
    我们来看看每个样本的交叉熵损失函数的形式:
J(W,b,a,y)=-y?lna-(1-y)?ln(1-a)J(W,b,a,y)=-y?lna-(1-y)?ln(1-a)
    其中,??为向量内积。这个形式其实很熟悉,在中其实我们就用到了类似的形式,只是当时我们是用最大似然估计推导出来的,而这个损失函数的学名叫交叉熵。
    使用了交叉熵损失函数,就能解决Sigmoid函数导数变化大多数时候反向传播算法慢的问题吗?我们来看看当使用交叉熵时,我们各层δlδl的梯度情况。
δl=?J(W,b,al,y)?zl=-y1al(al)(1-al)+(1-y)11-al(al)(1-al)=-y(1-al)+(1-y)al=al-y(1)(2)(3)(4)(1)δl=?J(W,b,al,y)?zl(2)=-y1al(al)(1-al)+(1-y)11-al(al)(1-al)(3)=-y(1-al)+(1-y)al(4)=al-y
    可见此时我们的δlδl梯度表达式里面已经没有了σ′(z)σ′(z),作为一个特例,回顾一下我们上一节均方差损失函数时在δLδL梯度,
?J(W,b,x,y)?zL=(aL-y)⊙σ′(z)?J(W,b,x,y)?zL=(aL-y)⊙σ′(z)
    对比两者在第L层的δLδL梯度表达式,就可以看出,使用交叉熵,得到的的δlδl梯度表达式没有了σ′(z)σ′(z),梯度为预测值和真实值的差距,这样求得的Wl,blWl,bl的地图也不包含σ′(z)σ′(z),因此避免了反向传播收敛速度慢的问题。
    通常情况下,如果我们使用了sigmoid激活函数,交叉熵损失函数肯定比均方差损失函数好用。
3. 使用对数似然损失函数和softmax激活函数进行DNN分类输出
    在前面我们讲的所有DNN相关知识中,我们都假设输出是连续可导的值。但是如果是分类问题,那么输出是一个个的类别,那我们怎么用DNN来解决这个问题呢?
    比如假设我们有一个三个类别的分类问题,这样我们的DNN输出层应该有三个神经元,假设第一个神经元对应类别一,第二个对应类别二,第三个对应类别三,这样我们期望的输出应该是(1,0,0),(0,1,0)和(0,0,1)这三种。即样本真实类别对应的神经元输出应该无限接近或者等于1,而非改样本真实输出对应的神经元的输出应该无限接近或者等于0。或者说,我们希望输出层的神经元对应的输出是若干个概率值,这若干个概率值即我们DNN模型对于输入值对于各类别的输出预测,同时为满足概率模型,这若干个概率值之和应该等于1。
    DNN分类模型要求是输出层神经元输出的值在0到1之间,同时所有输出值之和为1。很明显,现有的普通DNN是无法满足这个要求的。但是我们只需要对现有的全连接DNN稍作改良,即可用于解决分类问题。在现有的DNN模型中,我们可以将输出层第i个神经元的激活函数定义为如下形式:
aLi=ezLi∑j=1nLezLjaiL=eziL∑j=1nLezjL
    其中,nLnL是输出层第L层的神经元个数,或者说我们的分类问题的类别数。
    很容易看出,所有的aLiaiL都是在(0,1)
之间的数字,而∑j=1nLezLj∑j=1nLezjL作为归一化因子保证了所有的aLiaiL之和为1。
    这个方法很简洁漂亮,仅仅只需要将输出层的激活函数从Sigmoid之类的函数转变为上式的激活函数即可。上式这个激活函数就是我们的softmax激活函数。它在分类问题中有广泛的应用。将DNN用于分类问题,在输出层用softmax激活函数也是最常见的了。
    下面这个例子清晰的描述了softmax激活函数在前向传播算法时的使用。假设我们的输出层为三个神经元,而未激活的输出为3,1和-3,我们求出各自的指数表达式为:20,2.7和0.05,我们的归一化因子即为22.75,这样我们就求出了三个类别的概率输出分布为0.88,0.12和0。
    从上面可以看出,将softmax用于前向传播算法是也很简单的。那么在反向传播算法时还简单吗?反向传播的梯度好计算吗?答案是Yes!
    对于用于分类的softmax激活函数,对应的损失函数一般都是用对数似然函数,即:
J(W,b,aL,y)=-∑kyklnaLkJ(W,b,aL,y)=-∑kyklnakL
    其中ykyk的取值为0或者1,如果某一训练样本的输出为第i类。则yi=1yi=1,其余的j≠ij≠i都有yj=0yj=0。由于每个样本只属于一个类别,所以这个对数似然函数可以简化为:
J(W,b,aL,y)=-lnaLiJ(W,b,aL,y)=-lnaiL
    其中ii即为训练样本真实的类别序号。
    可见损失函数只和真实类别对应的输出有关,这样假设真实类别是第i类,则其他不属于第i类序号对应的神经元的梯度导数直接为0。对于真实类别第i类,它的WLiWiL对应的梯度计算为:
?J(W,b,aL,y)?WLi=?J(W,b,aL,y)?aLi?aLi?zLi?zLi?wLi=-1aLi(ezLi)∑j=1nLezLj-ezLiezLi(∑j=1nLezLj)2aL-1i=-1aLi(ezLi∑j=1nLezLj-ezLi∑j=1nLezLjezLi∑j=1nLezLj)aL-1i=-1aLiaLi(1-aLi)aL-1i=(aLi-1)aL-1i(5)(6)(7)(8)(9)(5)?J(W,b,aL,y)?WiL=?J(W,b,aL,y)?aiL?aiL?ziL?ziL?wiL(6)=-1aiL(eziL)∑j=1nLezjL-eziLeziL(∑j=1nLezjL)2aiL-1(7)=-1aiL(eziL∑j=1nLezjL-eziL∑j=1nLezjLeziL∑j=1nLezjL)aiL-1(8)=-1aiLaiL(1-aiL)aiL-1(9)=(aiL-1)aiL-1
    同样的可以得到bLibiL的梯度表达式为:
?J(W,b,aL,y)?bLi=aLi-1?J(W,b,aL,y)?biL=aiL-1
    可见,梯度计算也很简洁,也没有第一节说的训练速度慢的问题。举个例子,假如我们对于第2类的训练样本,通过前向算法计算的未激活输出为(1,5,3),则我们得到softmax激活后的概率输出为:(0.015,0.866,0.117)。由于我们的类别是第二类,则反向传播的梯度应该为:(0.015,0.866-1,0.117)。是不是很简单呢?
    当softmax输出层的反向传播计算完以后,后面的普通DNN层的反向传播计算和之前讲的普通DNN没有区别。 
4. 梯度爆炸梯度消失与ReLU激活函数
    学习DNN,大家一定听说过梯度爆炸和梯度消失两个词。尤其是梯度消失,是限制DNN与深度学习的一个关键障碍,目前也没有完全攻克。
    什么是梯度爆炸和梯度消失呢?从理论上说都可以写一篇论文出来。不过简单理解,就是在反向传播的算法过程中,由于我们使用了是矩阵求导的链式法则,有一大串连乘,如果连乘的数字在每层都是小于1的,则梯度越往前乘越小,导致梯度消失,而如果连乘的数字在每层都是大于1的,则梯度越往前乘越大,导致梯度爆炸。
    比如我们在前一篇反向传播算法里面讲到了δδ的计算,可以表示为:
δl=?J(W,b,x,y)?zl=?J(W,b,x,y)?zL?zL?zL-1?zL-1?zL-2...?zl+1?zlδl=?J(W,b,x,y)?zl=?J(W,b,x,y)?zL?zL?zL-1?zL-1?zL-2...?zl+1?zl
    如果不巧我们的样本导致每一层?zl+1?zl?zl+1?zl的都小于1,则随着反向传播算法的进行,我们的δlδl会随着层数越来越小,甚至接近越0,导致梯度几乎消失,进而导致前面的隐藏层的W,bW,b参数随着迭代的进行,几乎没有大的改变,更谈不上收敛了。这个问题目前没有完美的解决办法。
    而对于梯度爆炸,则一般可以通过调整我们DNN模型中的初始化参数得以解决。
    对于无法完美解决的梯度消失问题,目前有很多研究,一个可能部分解决梯度消失问题的办法是使用ReLU(Rectified Linear Unit)激活函数,ReLU在卷积神经网络CNN中得到了广泛的应用,在CNN中梯度消失似乎不再是问题。那么它是什么样子呢?其实很简单,比我们前面提到的所有激活函数都简单,表达式为:
σ(z)=max(0,z)σ(z)=max(0,z)
    也就是说大于等于0则不变,小于0则激活后为0。就这么一玩意就可以解决梯度消失?至少部分是的。具体的原因现在其实也没有从理论上得以证明。这里我也就不多说了。
5. DNN其他激活函数
    除了上面提到了激活函数,DNN常用的激活函数还有:
    1) tanh:这个是sigmoid的变种,表达式为:
tanh(z)=ez-e-zez+e-ztanh(z)=ez-e-zez+e-z
    tanh激活函数和sigmoid激活函数的关系为:
tanh(z)=2sigmoid(2z)-1tanh(z)=2sigmoid(2z)-1
    tanh和sigmoid对比主要的特点是它的输出落在了[-1,1],这样输出可以进行标准化。同时tanh的曲线在较大时变得平坦的幅度没有sigmoid那么大,这样求梯度变化值有一些优势。当然,要说tanh一定比sigmoid好倒不一定,还是要具体问题具体分析。
    2) softplus:这个其实就是sigmoid函数的原函数,表达式为:
softplus(z)=log(1+ez)softplus(z)=log(1+ez)
    它的导数就是sigmoid函数。softplus的函数图像和ReLU有些类似。它出现的比ReLU早,可以视为ReLU的鼻祖。
    3)PReLU:从名字就可以看出它是ReLU的变种,特点是如果未激活值小于0,不是简单粗暴的直接变为0,而是进行一定幅度的缩小。如下图。当然,由于ReLU的成功,有很多的跟风者,有其他各种变种ReLU,这里就不多提了。
6. DNN损失函数和激活函数小结
    上面我们对DNN损失函数和激活函数做了详细的讨论,重要的点有:1)如果使用sigmoid激活函数,则交叉熵损失函数一般肯定比均方差损失函数好。2)如果是DNN用于分类,则一般在输出层使用softmax激活函数和对数似然损失函数。3)ReLU激活函数对梯度消失问题有一定程度的解决,尤其是在CNN模型中。
    下一篇我们讨论下DNN模型的正则化问题。
(欢迎转载,转载请注明出处。欢迎沟通交流: pinard.)&
参考资料:
1)&&by&By Michael Nielsen
2)&, book by Ian Goodfellow, Yoshua Bengio, and Aaron Courville
本文已收录于以下专栏:
相关文章推荐
本文先介绍生成模型(generative model)和判别模型(discriminative model)的区别,然后重点介绍生成模型中的两个例子:高斯判别分析(Gaussian discrimin...
这篇文章在前一篇文章:python构建深度神经网络(DNN)的基础上,添加了一下几个内容:
1) 正则化项
2) 调出中间损失函数的输出
3) 构建了交叉损失函数
4) 将训练好的网络进行保存...
上一节我们讲完了各种激励函数的优缺点和选择,以及网络的大小以及正则化对神经网络的影响。这一节我们讲一讲输入数据预处理、正则化以及损失函数设定的一些事情。
2. 数据与网络的设定
前一节提到...
在上一讲中,我们提到,由于感知机不能解决“异或”问题,明斯基并无恶意却把“人工智能”打入“冷宫”二十载。而解决“异或”问题的关键在于,是否能解决非线性可分问题。那么,如何来解决这个问题呢?简单来说,就...
有人开玩笑说,男人有两大烦恼:一是把别人的肚子搞大了,二是把自己的肚子搞大了。对于后者,除了减(jian)肥(shen),似乎别无他法。可你知道吗?这减肥背后的机理,和前馈神经网络利用损失函数,来反向...
作者:寒小阳 && 龙心尘
时间:2016年1月。
http://blog.csdn.net/han_xiaoyang/article/details/
这一部分来探讨下激活函数和损失函数。在之前的logistic和神经网络中,激活函数是sigmoid, 损失函数是平方函数。但是这并不是固定的。事实上,这两部分都有很多其他不错的选项,下面来一一讨论3....
本文是TensorFlow学习的第二部分,主要学习的是激活函数、损失函数、优化方法和正则项,以及在TensorFlow中的实现。...
这篇博文总结一下损失函数,这里重点总结一下常用的损失函数。
softamx cross entropy loss
softmax 交叉熵损失函数是我们常用的一种损失函数,其公式如下:
1 数据处理
首先注明我们要处理的数据是矩阵X,其shape为[N x D] (N =number of data, D =dimensionality).
1.1 Mean subtractio...
他的最新文章
讲师:董岩
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)[深度学习] DNN中防止过拟合的方法 - Hans__Yang的博客 - CSDN博客
[深度学习] DNN中防止过拟合的方法
本文主要讲述深度学习过程中加入L1和L2正则化的作用和方法。
一、过拟合与欠拟合
这两天开始做关于深度学习的内容。由于处理的是样本量较小,而DNN超强的拟合能力,所以很容易造成过拟合的情况出现。
机器学习中一个重要的话题便是模型的泛化能力,泛化能力强的模型才是好模型,对于训练好的模型,若在训练集表现差,不必说在测试集表现同样会很差,这可能是欠拟合导致;若模型在训练集表现非常好,却在测试集上差强人意,则这便是过拟合导致的,过拟合与欠拟合也可以用 Bias 与 Variance 的角度来解释,欠拟合会导致高 Bias ,过拟合会导致高 Variance ,所以模型需要在 Bias 与 Variance 之间做出一个权衡。
使用简单的模型去拟合复杂数据时,会导致模型很难拟合数据的真实分布,这时模型便欠拟合了,或者说有很大的 Bias,Bias 即为模型的期望输出与其真实输出之间的差异;有时为了得到比较精确的模型而过度拟合训练数据,或者模型复杂度过高时,可能连训练数据的噪音也拟合了,导致模型在训练集上效果非常好,但泛化性能却很差,这时模型便过拟合了,或者说有很大的 Variance,这时模型在不同训练集上得到的模型波动比较大,Variance 刻画了不同训练集得到的模型的输出与这些模型期望输出的差异。
模型处于过拟合还是欠拟合,可以通过画出误差趋势图来观察。若模型在训练集与测试集上误差均很大,则说明模型的 Bias 很大,此时需要想办法处理 under-fitting ;若是训练误差与测试误差之间有个很大的 Gap ,则说明模型的 Variance 很大,这时需要想办法处理 over-fitting。
一般在模型效果差的第一个想法是增多数据,其实增多数据并不一定会有更好的结果,因为欠拟合时增多数据往往导致效果更差,而过拟合时增多数据会导致 Gap 的减小,效果不会好太多,多以当模型效果很差时,应该检查模型是否处于欠拟合或者过拟合的状态,而不要一味的增多数据量,关于过拟合与欠拟合,这里给出几个解决方法。
二、常用解决办法
(1)解决欠拟合的方法:*
1、增加新特征,可以考虑加入进特征组合、高次特征,来增大假设空间;
2、尝试非线性模型,比如核SVM 、决策树、DNN等模型;
3、如果有正则项可以较小正则项参数 $\lambda$.
4、Boosting ,Boosting 往往会有较小的 Bias,比如 Gradient Boosting 等.
(2)解决过拟合的方法:
1、交叉检验,通过交叉检验得到较优的模型参数;
2、特征选择,减少特征数或使用较少的特征组合,对于按区间离散化的特征,增大划分的区间。
3、正则化,常用的有 L_1、L_2 正则。而且 L_1 正则还可以自动进行特征选择。
4、如果有正则项则可以考虑增大正则项参数 lambda.
5、增加训练数据可以有限的避免过拟合.
6、Bagging ,将多个弱学习器Bagging 一下效果会好很多,比如随机森林等;
(3)DNN中常见的方法:
1、早停策略。本质上是交叉验证策略,选择合适的训练次数,避免训练的网络过度拟合训练数据。
2、集成学习策略。而DNN可以用Bagging的思路来正则化。首先我们要对原始的m个训练样本进行有放回随机采样,构建N组m个样本的数据集,然后分别用这N组数据集去训练我们的DNN。即采用我们的前向传播算法和反向传播算法得到N个DNN模型的W,bW,b参数组合,最后对N个DNN模型的输出用加权平均法或者投票法决定最终输出。不过用集成学习Bagging的方法有一个问题,就是我们的DNN模型本来就比较复杂,参数很多。现在又变成了N个DNN模型,这样参数又增加了N倍,从而导致训练这样的网络要花更加多的时间和空间。因此一般N的个数不能太多,比如5-10个就可以了。
3、DropOut策略。所谓的Dropout指的是在用前向传播算法和反向传播算法训练DNN模型时,一批数据迭代时,随机的从全连接DNN网络中去掉一部分隐藏层的神经元。 在对训练集中的一批数据进行训练时,我们随机去掉一部分隐藏层的神经元,并用去掉隐藏层的神经元的网络来拟合我们的一批训练数据。使用基于dropout的正则化比基于bagging的正则化简单,这显而易见,当然天下没有免费的午餐,由于dropout会将原始数据分批迭代,因此原始数据集最好较大,否则模型可能会欠拟合。
三、L1和L2正则化方法
在这些方法中,重点讲解一下L1和L2正则化方法。L1正则化和L2正则化原理类似,二者的作用却有所不同。
(1) L1正则项会产生稀疏解。
L2正则项会产生比较小的解。
在Matlab的DeepLearn-Toolbox中,仅实现了L2正则项。而在Keras中,则包含了L1和L2的正则项。
假如我们的每个样本的损失函数是均方差损失函数,则所有的m个样本的损失函数为:
而DNN的L2正则化通常的做法是只针对与线性系数矩阵W,而不针对偏倚系数b。利用我们之前的机器学习的知识,我们很容易可以写出DNN的L2正则化的损失函数。
如果使用上式的损失函数,进行反向传播算法时,流程和没有正则化的反向传播算法完全一样,区别仅仅在于进行梯度下降法时,W的更新公式。回想我们在深度神经网络(DNN)反向传播算法(BP)中,W的梯度下降更新公式为:
则加入L2正则化以后,迭代更新公式变成:
注意到上式中的梯度计算中m我忽略了,因为α是常数,而除以m也是常数,所以等同于用了新常数α来代替αm。进而简化表达式,但是不影响损失算法。类似的L2正则化方法可以用于交叉熵损失函数或者其他的DNN损失函数,这里就不累述了。
对于L1正则项,不同之处仅在于迭代更新公式中的后一项。将其改为1范数的导数即可。而一范数的导数即sign(x),即将后一项改为sign(W)即可。
DNN的正则化的方法是很多的,还是持续的研究中。在Deep Learning这本书中,正则化是洋洋洒洒的一大章。里面提到的其他正则化方法有:Noise Robustness, Adversarial Training等。如果大家对这些正则化方法感兴趣,可以去阅读Deep Learning这本书中的第七章。
1) Neural Networks and Deep Learning by By Michael Nielsen
2) Deep Learning, book by Ian Goodfellow, Yoshua Bengio, and Aaron Courville
3) UFLDL Tutorial
我的热门文章2081人阅读
DeepLearning(172)
CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?
CNN(卷积神经网络)、RNN(循环神经网络)、DNN(深度神经网络)的内部网络结构有什么区别?以及他们的主要用途是什么?只知道CNN是局部感受和参数共享,比较适合用于图像这方面。刚入门的小白真心求助
按投票排序
首先,我感觉不必像 @李Shawn 同学一样认为DNN、CNN、RNN完全不能相提并论。从广义上来说,NN(或是更美的DNN)确实可以认为包含了CNN、RNN这些具体的变种形式。在实际应用中,所谓的深度神经网络DNN,往往融合了多种已知的结构,包括卷积层或是LSTM单元。但是就题主的意思来看,这里的DNN应该特指全连接的神经元结构,并不包含卷积单元或是时间上的关联。因此,题主一定要将DNN、CNN、RNN等进行对比,也未尝不可。
其实,如果我们顺着神经网络技术发展的脉络,就很容易弄清这几种网络结构发明的初衷,和他们之间本质的区别,希望对题主有所帮助。
=========================== 分 割 线 就 是 我 ================================
神经网络技术起源于上世纪五、六十年代,当时叫感知机(perceptron),拥有输入层、输出层和一个隐含层。输入的特征向量通过隐含层变换达到输出层,在输出层得到分类结果。早期感知机的推动者是Rosenblatt。(扯一个不相关的:由于计算技术的落后,当时感知器传输函数是用线拉动变阻器改变电阻的方法机械实现的,脑补一下科学家们扯着密密麻麻的导线的样子…)
但是,Rosenblatt的单层感知机有一个严重得不能再严重的问题,即它对稍复杂一些的函数都无能为力(比如最为典型的“异或”操作)。连异或都不能拟合,你还能指望这货有什么实际用途么o(╯□╰)o
随着数学的发展,这个缺点直到上世纪八十年代才被Rumelhart、Williams、Hinton、LeCun等人(反正就是一票大牛)发明的多层感知机(multilayer perceptron)克服。多层感知机,顾名思义,就是有多个隐含层的感知机(废话……)。好好,我们看一下多层感知机的结构:
图1上下层神经元全部相连的神经网络——多层感知机
多层感知机可以摆脱早期离散传输函数的束缚,使用sigmoid或tanh等连续函数模拟神经元对激励的响应,在训练算法上则使用Werbos发明的反向传播BP算法。对,这货就是我们现在所说的神经网络NN——神经网络听起来不知道比感知机高端到哪里去了!这再次告诉我们起一个好听的名字对于研(zhuang)究(bi)很重要!
多层感知机解决了之前无法模拟异或逻辑的缺陷,同时更多的层数也让网络更能够刻画现实世界中的复杂情形。相信年轻如Hinton当时一定是春风得意。
多层感知机给我们带来的启示是,神经网络的层数直接决定了它对现实的刻画能力——利用每层更少的神经元拟合更加复杂的函数[1]。
(Bengio如是说:functions that can be compactly represented by a depth k architecture might require an exponential number of computational elements to be represented by a depth k - 1 architecture.)
即便大牛们早就预料到神经网络需要变得更深,但是有一个梦魇总是萦绕左右。随着神经网络层数的加深,优化函数越来越容易陷入局部最优解,并且这个“陷阱”越来越偏离真正的全局最优。利用有限数据训练的深层网络,性能还不如较浅层网络。同时,另一个不可忽略的问题是随着网络层数增加,“梯度消失”现象更加严重。具体来说,我们常常使用sigmoid作为神经元的输入输出函数。对于幅度为1的信号,在BP反向传播梯度时,每传递一层,梯度衰减为原来的0.25。层数一多,梯度指数衰减后低层基本上接受不到有效的训练信号。
2006年,Hinton利用预训练方法缓解了局部最优解问题,将隐含层推动到了7层[2],神经网络真正意义上有了“深度”,由此揭开了深度学习的热潮。这里的“深度”并没有固定的定义——在语音识别中4层网络就能够被认为是“较深的”,而在图像识别中20层以上的网络屡见不鲜。为了克服梯度消失,ReLU、maxout等传输函数代替了sigmoid,形成了如今DNN的基本形式。单从结构上来说,全连接的DNN和图1的多层感知机是没有任何区别的。
值得一提的是,今年出现的高速公路网络(highway network)和深度残差学习(deep residual learning)进一步避免了梯度消失,网络层数达到了前所未有的一百多层(深度残差学习:152层)[3,4]!具体结构题主可自行搜索了解。如果你之前在怀疑是不是有很多方法打上了“深度学习”的噱头,这个结果真是深得让人心服口服。
图2缩减版的深度残差学习网络,仅有34层,终极版有152层,自行感受一下
如图1所示,我们看到全连接DNN的结构里下层神经元和所有上层神经元都能够形成连接,带来的潜在问题是参数数量的膨胀。假设输入的是一幅像素为1K*1K的图像,隐含层有1M个节点,光这一层就有10^12个权重需要训练,这不仅容易过拟合,而且极容易陷入局部最优。另外,图像中有固有的局部模式(比如轮廓、边界,人的眼睛、鼻子、嘴等)可以利用,显然应该将图像处理中的概念和神经网络技术相结合。此时我们可以祭出题主所说的卷积神经网络CNN。对于CNN来说,并不是所有上下层神经元都能直接相连,而是通过“卷积核”作为中介。同一个卷积核在所有图像内是共享的,图像通过卷积操作后仍然保留原先的位置关系。两层之间的卷积传输的示意图如下:
图3卷积神经网络隐含层(摘自Theano教程)
通过一个例子简单说明卷积神经网络的结构。假设图3中m-1=1是输入层,我们需要识别一幅彩色图像,这幅图像具有四个通道ARGB(透明度和红绿蓝,对应了四幅相同大小的图像),假设卷积核大小为100*100,共使用100个卷积核w1到w100(从直觉来看,每个卷积核应该学习到不同的结构特征)。用w1在ARGB图像上进行卷积操作,可以得到隐含层的第一幅图像;这幅隐含层图像左上角第一个像素是四幅输入图像左上角100*100区域内像素的加权求和,以此类推。同理,算上其他卷积核,隐含层对应100幅“图像”。每幅图像对是对原始图像中不同特征的响应。按照这样的结构继续传递下去。CNN中还有max-pooling等操作进一步提高鲁棒性。
图4一个典型的卷积神经网络结构,注意到最后一层实际上是一个全连接层(摘自Theano教程)
在这个例子里,我们注意到输入层到隐含层的参数瞬间降低到了100*100*100=10^6个!这使得我们能够用已有的训练数据得到良好的模型。题主所说的适用于图像识别,正是由于CNN模型限制参数了个数并挖掘了局部结构的这个特点。顺着同样的思路,利用语音语谱结构中的局部信息,CNN照样能应用在语音识别中。
全连接的DNN还存在着另一个问题——无法对时间序列上的变化进行建模。然而,样本出现的时间顺序对于自然语言处理、语音识别、手写体识别等应用非常重要。对了适应这种需求,就出现了题主所说的另一种神经网络结构——循环神经网络RNN。
在普通的全连接网络或CNN中,每层神经元的信号只能向上一层传播,样本的处理在各个时刻独立,因此又被成为前向神经网络(Feed-forward Neural Networks)。而在RNN中,神经元的输出可以在下一个时间戳直接作用到自身,即第i层神经元在m时刻的输入,除了(i-1)层神经元在该时刻的输出外,还包括其自身在(m-1)时刻的输出!表示成图就是这样的:
图5&RNN网络结构
我们可以看到在隐含层节点之间增加了互连。为了分析方便,我们常将RNN在时间上进行展开,得到如图6所示的结构:
图6&RNN在时间上进行展开
Cool,(t+1)时刻网络的最终结果O(t+1)是该时刻输入和所有历史共同作用的结果!这就达到了对时间序列建模的目的。
不知题主是否发现,RNN可以看成一个在时间上传递的神经网络,它的深度是时间的长度!正如我们上面所说,“梯度消失”现象又要出现了,只不过这次发生在时间轴上。对于t时刻来说,它产生的梯度在时间轴上向历史传播几层之后就消失了,根本就无法影响太遥远的过去。因此,之前说“所有历史”共同作用只是理想的情况,在实际中,这种影响也就只能维持若干个时间戳。
为了解决时间上的梯度消失,机器学习领域发展出了长短时记忆单元LSTM,通过门的开关实现时间上记忆功能,并防止梯度消失,一个LSTM单元长这个样子:
图7&LSTM的模样
除了题主疑惑的三种网络,和我之前提到的深度残差学习、LSTM外,深度学习还有许多其他的结构。举个例子,RNN既然能继承历史信息,是不是也能吸收点未来的信息呢?因为在序列信号分析中,如果我能预知未来,对识别一定也是有所帮助的。因此就有了双向RNN、双向LSTM,同时利用历史和未来的信息。
图8双向RNN
事实上,不论是那种网络,他们在实际应用中常常都混合着使用,比如CNN和RNN在上层输出之前往往会接上全连接层,很难说某个网络到底属于哪个类别。不难想象随着深度学习热度的延续,更灵活的组合方式、更多的网络结构将被发展出来。尽管看起来千变万化,但研究者们的出发点肯定都是为了解决特定的问题。题主如果想进行这方面的研究,不妨仔细分析一下这些结构各自的特点以及它们达成目标的手段。入门的话可以参考:
Ng写的Ufldl:
也可以看Theano内自带的教程,例子非常具体:
欢迎大家继续推荐补充。
当然啦,如果题主只是想凑个热闹时髦一把,或者大概了解一下方便以后把妹使,这样看看也就罢了吧。
参考文献:
[1] Bengio Y. Learning Deep Architectures for AI[J]. Foundations & Trends(R) in Machine Learning, ):1-127.
[2] Hinton G E, Salakhutdinov R R. Reducing the Dimensionality of Data with Neural Networks[J]. Science, 86):504-507.
[3] He K, Zhang X, Ren S, Sun J. Deep Residual Learning for Image Recognition. arXiv:, 2015.
[4] Srivastava R K, Greff K, Schmidhuber J. Highway networks. arXiv:, 2015.
反对,不会显示你的姓名
在序列信号的应用上,CNN是只响应预先设定的信号长度(输入向量的长度),RNN的响应长度是学习出来的
反对,不会显示你的姓名
个人觉得CNN、RNN和DNN不能放在一起比较。
DNN是一个大类,CNN是一个典型的空间上深度的神经网络,RNN是在时间上深度的神经网络。
推荐你从UFLDL开始看,这是斯坦福深度学习的课程,了解一些神经网络的基础,会对你的学习有很大帮助。
=============================分割线======================================
前面一位同学回答得非常详细完整,我再回来谈一谈怎么学习这些模型,我来分享一下我的学习历程。我也是在学习中,以后会慢慢继续补充。
这是我最开始接触神经网络时看的资料,把这个仔细研究完会对神经网络的模型以及如何训练(反向传播算法)有一个基本的认识,算是一个基本功。
这是一个开源的深度学习工具包,里面有很多深度学习模型的python代码还有一些对模型以及代码细节的解释。我觉得学习深度学习光了解模型是不难的,难点在于把模型落地写成代码,因为里面会有很多细节只有动手写了代码才会了解。但Theano也有缺点,就是极其难以调试,以至于我后来就算自己动手写几百行的代码也不愿意再用它的工具包。所以我觉得Theano的正确用法还是在于看里面解释的文字,不要害怕英文,这是必经之路。PS:推荐使用python语言,目前来看比较主流。
斯坦福的一门课:卷积神经网络,李飞飞教授主讲。这门课会系统的讲一下卷积神经网络的模型,然后还有一些课后习题,题目很有代表性,也是用python写的,是在一份代码中填写一部分缺失的代码。如果把这个完整学完,相信使用卷积神经网络就不是一个大问题了。
这可能是机器学习领域最经典最知名的公开课了,由大牛Andrew Ng主讲,这个就不仅仅是深度学习了,它是带你领略机器学习领域中最重要的概念,然后建立起一个框架,使你对机器学习这个学科有一个较为完整的认识。这个我觉得所有学习机器学习的人都应该看一下,我甚至在某公司的招聘要求上看到过:认真看过并深入研究过Andrew Ng的机器学习课程,由此可见其重要性。
反对,不会显示你的姓名
DNN以神经网络为载体,重在深度,可以说是一个统称。
RNN,回归型网络,用于序列数据,并且有了一定的记忆效应,辅之以lstm。
CNN应该侧重空间映射,图像数据尤为贴合此场景。
反对,不会显示你的姓名
蟹妖,可参阅我关于深度学习入门的回答。
反对,不会显示你的姓名
建议还是看论文和代码
反对,不会显示你的姓名
CNN就是全连接权值太多,取的一个折衷策略,只取部分连接边扫描一遍整个输入,最后再汇总(求max等等操作)。
RNN就是在隐层加入了自连边和互连边(即隐层可以相互连接),可以按时序展开为一系列FNN。常见训练算法为bptt和lstm。
DNN个人理解就是隐层有很多层,bp反传时可能梯度会锐减或剧增,导致误差传不回来,可以通过重新设计网络结构(类似lstm)的办法来解决。
反对,不会显示你的姓名
中文不好解释,用英文试试,不当之处请谅解。
Artificial neural networks use networks of activation units (hidden units) to map inputs to outputs. The concept of deep learning applied to this model allows the model to have multiple layers of hidden units where we feed output from the previous layers. However,
dense connections between the layers is not efficient, so people developed models that perform better for specific tasks.
The whole &convolution& in convolutional neural networks is essentially based on the fact that we're lazy and want to exploit spatial relationships in images. This is a huge deal because we can then group small patches of pixels and effectively &downsample&
the image while training multiple instances of small detectors with those patches. Then a CNN just moves those filters around the entire image in a convolution. The outputs are then collected in a pooling layer. The pooling layer is again a down-sampling of
the previous feature map. If we have activity on an output for filter a, we don't necessarily care if the activity is for (x, y) or (x+1, y), (x, y+1) or (x+1, y+1), so long as we have activity. So we often just take the highest value of activity on a small
grid in the feature map called max pooling.
If you think about it from an abstract perspective, the convolution part of a CNN is effectively doing a reasonable way of dimensionality reduction. After a while you can flatten the image and process it through layers in a dense network. Remember to use dropout
layers! (because our guys wrote that paper :P)
I won't talk about RNN for now because I don't have enough experience working with them and according to my colleague nobody really knows what's going on inside an LSTM...but they're insanely popular for data with time dependencies.
Let's talk RNN. Recurrent networks are basically neural networks that evolve through time. Rather than exploiting spatial locality, they exploit sequential, or temporal locality. Each iteration in an RNN takes an input and it's previous hidden state, and produces
some new hidden state. The weights are shared in each level, but we can unroll an RNN through time and get your everyday neural net. Theoretically RNN has the capacity to store information from as long ago as possible, but historically people always had problems
with the gradients vanishing as we go back further in time, meaning that the model can't be differentiated numerically and thus cannot be trained with backprop. This was later solved in the proposal of the LSTM architecture and subsequent work, and now we
train RNNs with BPTT (backpropagation through time). Here's a link that explains LSTMs really well:&
Since then RNN has been applied in many areas of AI, and many are now designing RNN with the ability to extract specific information (read: features) from its training examples with attention-based models.
反对,不会显示你的姓名
我个人的看法是,DNN是深度学习思想的一个统称,狭义上它是一种逐层贪婪无监督的学习方法,注意它只是一种思想,需要依赖具体的模型去实现,即深度学习 = 逐层贪婪无监督方法 + 特定深度学习模型。而具体的深度学习模型有CNN、RNN、SDA、RBM、RBM等。逐层贪婪无监督的深度学习思想是2006年提出来的,能有效解决深层网络结构训练的梯度弥散等问题。而CNN等网络模型其实很早就提出来了,之前用BP之类的老方法效果一直不太好,等到深度学习思想提出来后,这些老模型就都焕发了新生,带来了今天深度学习的火热。回归到问题上来,就是CNN、RNN、DNN不是一个层次上的东西,分别是具体的模型和通用的思想。这是我的个人理解,还在学习中,如有错误欢迎指出。
反对,不会显示你的姓名
DNN区别于浅层神经网络,是所有深度学习中的网络模型统称,包括CNN、RNN等,以后还会有新的网络模型提出。题主说的CNN应该是三大特点:local receptive fields、shared weights 和pooling。他们的用途都是拿数据来训练学习特征(太笼统了,嘿嘿),省去手工提取特征的过程,类似是一个通用的学习框架。&回答中提到的课程不错,针对卷积神经网络和视觉识别的,题主可以深入学习一下。UFLDL也很适合初学者。另外如果真想研究深度学习,还是要看论文的--&
反对,不会显示你的姓名
想学专业知识就要少上知户 多看书
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1491946次
积分:17888
积分:17888
排名:第582名
原创:102篇
转载:1367篇
评论:223条
个人邮箱: xuxiduo@
1)OpenCV俱乐部
2) 视频/音频/图像/算法/ML
备注:加群需要回答问题,避免广告党。
如果你是博客看到后加的,请注明“博客”并回答问题,只注明”博客“不回答问题的恕不加入。答案为和群相关的任何技术名词,不能出现1)和2)中的任何字眼
阅读:8467
文章:16篇
阅读:15018
阅读:8519
文章:32篇
阅读:51030
(9)(4)(2)(24)(46)(6)(9)(8)(8)(31)(20)(18)(42)(70)(118)(143)(56)(68)(107)(226)(78)(3)(9)(37)(46)(50)(19)(15)(13)(27)(12)(12)(103)(18)(18)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'}

我要回帖

更多关于 确定性策略梯度 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信