http://blog.csdn.net/sunyangwei1993/article/details/77478484?locationNum=1&fps=1
导语
本文是本人学习深度学习过程中遇到的部分问题,并自己寻找答案,将答案汇总,一是方便自己今后查阅和复习,二是将其分享出来,希望能帮助到需要的同学,共同学习共同进步。
1、卷积神经网络有那些重要技巧(trick),你认为哪个技巧最影响结果?
卷积神经网络(CNN)在图像分类方面展现出了优异的天赋,现已成为图像处理领域的标准规范。针对特定的问题,需要有多种技巧来调整模型,以使模型在测试数据上有好的效果和更强大的泛化能力。CNN在图像方面主要有扩增训练数据、图像预处理、权值初始化、训练技巧、激活函数选择、正则化、训练过程可视化、类数据不平衡等技巧。
1)训练数据扩增
深度学习需要大量的数据,而有时数据量却不够模型的训练,对于卷积神经网络来说,如果训练图像不够,就需要对原始图像进行扩增。常用的扩增方法有对数据进行水平翻转(horizontally flipping),随机裁剪(random crops),颜色抖动(color jittering)等变换方法,生成新的训练图像。
2)图像预处理
常用的图像预处理方法有:
-
均值0中心化(zero-center),规范化(normalize)
-
PCA白化 (PCA Whitening)
3)权值初始化
权值初始化有:全0初始化、随机初始化、校正方差
全0初始化:即初始化时所有权值为0,这会带来一个问题,在进行参数更新时,由于每个神经元输出都一样,在反向传播时会得到同样的梯度值,使得参数更新一样,整个网络呈现对称性。
随机初始化:可以设置权值为非常接近于0的随机值,会让网络非对称,以便于训练。
校正方差:随机初始化的方法会让输出方差随着输入神经元的个数而变化。把权值除以输入神经元个数的开方就可以让输出神经元方差为1,这样可以让每层输出具有相同方差,能够大大提高收敛速度。在实际的编程实现中,常用如下代码:
w = np.random.randn(n) / sqrt(n)
考虑到ReLU激活函数,推荐的做法是:
w = np.random.randn(n) / sqrt(n/2.0)
4)训练技巧
设定合适的卷积核和pooling size
训练过程,输入图像的大小希望为2的幂次,比如32(cifar-10),64,224(ImageNet),384,或者512。而且采用小的卷积核大小(如3*3)和小的滑动步长(如1)和填充0是比较重要的,不但能减少权值参数、调整输出空间维度而且还能提高整个网络的准确率。
学习率衰减
指数衰减的学习率既可以让模型在训练的前期快速接近较优解,又可以保证模型在训练后期不会有太大的波动,从而更加接近局部最优。
5)激活函数选择
激活函数让深度网络具有非线性表达能力。几种常见的激活函数:sigmoid,tanh,ReLU,leaky ReLU,Parametric ReLU,Randomized ReLU。
sigmoid函数
sigmoid函数表达式如下,把实数压缩在0~1之间。sigmoid函数会在很多地方看到,它很好的模拟了神经元的激活状态,从0到1表示了该神经元的活跃状态。


但是sigmoid函数有两个主要缺点,现在很少用它。①激活值容易饱和,容易接近0或1,会使梯度为非常接近0的数,无法进行权值更新,同时在初始化权值时很难设置初始值,因为容易使激活值饱和。②激活值是非0中心化的。如果激活值都是正值,则反向传播算w梯度都是正值或负值,这会让在权值更新时出现锯齿变化,但是相比①消极影响是不严重的。
tanh函数
tanh函数把实数压缩在-1~1之间。和sigmoid函数一样激活值容易饱和,容易接近-1或1,会使梯度为非常接近0的数,无法进行权值更新.但是它是0中心化的。在实际应用中,我们更愿意使用tanh(x),而非sigmoid函数。

ReLU函数
ReLU在最近几年非常流行,函数表达式为 f(x) = max(0,x)。

ReLu有以下两点好处:①该函数相比sigmoid、tanh计算简单,不会发生饱和;②训练过程中能够加快随机梯度下降收敛.但是,ReLu有一个主要问题:由于神经元梯度容易为0,这就导致该神经元在训练过程中失效。实际情况如果学习率设置过高,神经网络中有大约40%的神经元失效。
leaky ReLU函数
该激活函数是为了解决ReLu问题,在输入小于0时不设置0,而用乘上一个很小的常数值来代替。函数表达式为f(x) = max(ax,x),a是很小的常数,比如0.01。
6)正则化
采用正则化方法,可以有效防止过拟合。方法有以下几种:
L2正则化:这是一种最常见的正则化方法,直接在损失函数里加上惩罚项。也就是对神经网络里每个权值W计算L2范数,然后加到损失函数里,用0.5*lamda*W^2。lamda是正则化强度,lamda越大正则化越强,越能防止过拟合,但是太大了就会变成欠拟合,实际工程中,一般取利用验证集做超参数确定。最后得到的权值W是分散的,数值也比较小。
L1正则化:这是另一种常见的正则化方法。也就是对神经网络里每个权值W计算L1范数,然后加到损失函数里,用lamda*|W|。这种L1正则化方法会让权值变得稀疏,会让权值W绝大数接近于0,这就相当于只让部分输入数据参与到神经网络,对具有噪声或者冗余的这部分输入具有鲁棒性。这种性质可以用来做特征选择。如果不需要做特征选择,一般才去L2正则化。
最大规范约束:这种正则化方法限制了权值的L2范数小于某个数值,比如3或者4.这样做好处就是当学习率设置太高了也能训练深度网络。
Dropout:该方法相比以上方法是非常高效、简单的,在训练过程中,将神经网络进行采样,也就是随机的让神经元激活值为0,而在测试时不再采用dropout。通常设置随机采样概率为0.5,也可以通过验证集来确定采样概率。
7)训练过程可视化
训练过程中,我们可以把训练中间结果(如loss值,正确率)以图表的形式打印出来,能够实时监控训练状态,看是否有效。
学习率:学习率是比较敏感的。非常大的学习率会导致异常的loss曲线。小的学习率又会让你的loss曲线下降得很慢,收敛困难。相反大的学习率会让loss曲线刚开始下降得特别快,然后很快收敛,这往往是停留在局部最优。而一个好的学习率loss曲线比较平滑,最后在测试集上有比较好的表现。

loss值:对训练样本进行批训练,设置批训练大小(batch size),在每一轮批训练结束之后,可以将loss值输出,最后得到整体的loss曲线图。如果loss曲线呈线性下降则说明学习率过小;如果loss曲线不下降太多,则说明学习率过大。而求loss曲线的上下宽度和batch值有关,如果太宽说明震荡比较厉害,就要提高batch值。、
正确率:在训练的时候可以实时的将正确率输出,比较训练集的正确率和验证集的正确率得出某些结论帮助我们调整模型。比如在训练集上的正确率很大,验证集的正确率比较小且趋向于收敛,此时如果差距很大说明模型过拟合,需要适当地加大正则项力度。如果差距很小且正确率都比较低,则说明模型的比较差,需要增强模型的表达能力。
8)类数据不平衡问题
在实际应用中,各类的数据经常是不平衡的:有的类有大量的训练样本,而有的类有很少的数据样本,这会非常影响深度网络的表现。解决类不平衡的方法有:
上采样:对每一份数据集中比较少的类,直接复制其中的图片增大样本数量直至所有类别平衡。这种采样方法有一个明显的缺点,就是同一个点会在高维空间重复出现,这会导致一旦分类正确就是全部正确,一旦分类错误就是全部错误,对模型的结果有很不好的影响。解决这个问题的方法是在生成新样本时加一个随机的轻微的扰动。
下采样:从多数量类的样本中剔除一部分使其和少数量样本类一样。 缺点显而易见,那就是最终的训练集丢失了数据,模型只学到了总体模式的一部分。解决的方法是多次下采样,产生多个不同的训练集,进而训练多个不同的分类器,通过组合多个分类器的结果得到最终的结果。
分类器加权:设置不同类别分错的代价。
k C(k,1) C(k,2) … 1 0 2 … 2 1 0 … 3 3 1 … … … … …
表中C(i,j)表示将类别为j的类判别为i类别的代价,我们可以根据实际情况设置它们的值。
小结
上面简单讲述了几种CNN中常用的技巧,这些技巧不仅在CNN中适用,同时也在其他深度学习模型中适用。总的来说,这几种技巧在深度学习中很常用,常常结合多种技巧使模型的效果达到最好,因此并没有最好或最重要的说法。
2、卷积神经网络有那些前沿应用,他是怎么起作用的?
卷积神经网络在计算机视觉中的应用
CNN在计算机视觉中的应用包括图像分类、物体检测、图像分割、人脸识别等。
图像分类
图像分类是指通过对图像的分析,将图像划归为若干类别中的某一类,主要强调对图像的整体语义进行判别。当下有很多关于图像分类的数据集,其中最有名当属ImageNet Large Scale Visual Recognition Challenge(ILSVRC)竞赛,该竞赛的数据集是ImageNet的子数据集,包含上百万张带标签的高分辨率图像,这些图像分别属于1000个类别。在2012年以前,获胜的团队都是手工提取特征然后用SVM等传统机器学习算法进行分类,取得的最好结果是28.2%的错误率。ILSVRC2012是一折重要的转折点,深度神经网络首次被用于图像分类,并取得了突破性的进展,从此所有的冠军模型都是基于深度神经网络。2012年的AlexNet模型如下图所示,是一个8层的卷积神经网络,其中前5层是卷积层,后3层是全连接层。

AlexNet网络结构
物体检测
相比图像分类,物体检测是一个更复杂的任务,因为不仅一个图像可能含有多个物体,而且还要对他们进行定位。AlexNet在ILSVRC2012中所取得的成功不仅影响了图像分类方向的研究,也得到了计算机视觉其他方向研究者的关注。Ross Girshick等便将CNN运用于物体检测中,提出了R-CNN模型。如下图所示,该模型首先使用非深度学习算法来提出待分类的候选区域,然后将每个候选区域输入到CNN中提取特征,接着将这些特征输入到线性SVM中进行分类。为了使定位更加准确,R-CNN还训练了一个线性回归模型来对候选区域坐标进行修正,该过程称为Bounding box regression。该模型在PASCAL VOC的物体检测数据集上取得了比传统算法高大约20%的平均正确率,奠定了以后使用CNN进行物体检测的模型结构基础。

图像分割
图像分割是指:对于一张图来说,图上可能有多个物体、多个任务甚至多层背景,希望能做到对于图上每个像素点,能预测它是属于哪个部分的(人、动物、背景…)。最近几年深度学习也在图像分割任务重逐渐被运用。一种方法是将一些深度神经网络改为全卷积网络。利用一些流行的分类网络(AlexNet、VGG、Google Net)在保留一些他们在图像分类方面所训练得到的参数基础上,进行“修剪”,转变为针对图像分割的模型。然后将一些网络较深的层的所得的特征和一些较浅的层所得的特征结合起来,最后用一个反卷积层方法放大到原始图像大小来提供提供一个更为准确的分割结果,称之为跳跃结构。
以AlexNet为例,如下图所示,将AlexNet最后三层改为全卷积层,这一步不仅加快了训练速度、减小了参数,进而减少了过拟合,还为最后一步的反卷积提供了便利。对于信息丢失过多的最后一层卷积层,可以先将它反卷积扩大1倍,达到上一层pooling完了之后的大小,之后将两者的信息整合,进而再次反卷积,再扩大16倍,取得的效果也有所提升。

基于AlexNet的全卷积神经网络
人脸识别
人脸识别技术包括人脸检测、人脸特征提取、人脸识别3个过程。
人脸检测是从输入图像或视频流中检测并提取人脸图像,并进一步给出人脸的位置、大小以及各个主要面部器官的位置信息,通常是采用Haar特征和Adaboost算法训练级联分类器对图像中每一个矩形子区域进行分类。特征提取是通过一组数据来表征人脸信息,这组数据就是所需要提取的人脸特征。常见的人脸特征分为几何特征和表征特征。几何特征是指各个主要面部器官之间的几何关系,如距离、面积和角度等,这种特征只适合于人脸图像的粗略识别无法在实际中应用。表征特征利用人脸图像的灰度或色彩信息通过以下算法提取全局或局部特征,将待识别的人脸所提取的特征与数据库中已有的特征信息进行对比,然后进行判别分类。
使用深度学习方法提取到的人脸特征表示具有传统手工特征表示所不具备的重要特性,例如局部遮挡、光照变化、表情变化等具有良好的鲁棒性。这些特性都是在海量的图像数据上训练自然得到的,网络模型中并没有添加其他显式的约束条件,得到的人脸特征也没有进行其他的后期处理。这说明深度学习并非是单纯地使用具有大量参数的、非常复杂的非线性神经网络模型去拟合数据集,而是通过逐层训练学习,最终得到蕴含数据本质信息的特征表示,从而大大提高了识别率。
卷积神经网络在自然语言处理中的应用
CNN在自然语言处理中的应用主要是分类任务,包括语义分析、垃圾邮件检测、情感分类和话题分类。
在文本分类任务中,CNN的构造相当简单,输入层是一个表示句子的矩阵,每一行是word2vec词向量。接着是由若干个滤波器组成的卷积层,然后是最大池化层,最后是softmax分类器。也有人直接用原始数据训练CNN模型,不需要预训练得到word2vec或GloVe等词向量表征,它直接对one-hot向量进行卷积运算。

用CNN对文本进行分类
上述的模型表征都是在单词的层面上,另外有一些团队则研究如何将CNNs模型直接用于字符。Santos和Zadrozny等人利用CNN学到了字符层面的向量表征,将它们与预训练的词向量结合,用来给语音打标签。Xiang Zhang和Yann LeCun研究了直接用CNNs模型直接从字符学习,而不必预训练词向量了。值得注意的是,作者使用了一个相对较深的网络结构,共有9层,用来完成语义分析和文本分类任务。结果显示,用字符级输入直接在大规模数据集(百万级)上学习的效果非常好,但用简单模型在小数据集(十万级)上的学习效果一般。
3、生成式深度模型包含哪些具体内容?
对抗样本
对抗样本是指通过在数据集中添加细微的噪声干扰,受干扰之后导致模型以高置信度输出错误的结果。Christian Szegedy等人在ICLR2014发表的论文中提出了对抗样本的概念,并提出在深度学习其他模型包括卷积神经网络也对对抗样本有这样的高脆弱性。他们的研究提到,很多情况下,在训练集的不同子集上训练得到的具有不同结构的模型都会对相同的对抗样本实现误分,这意味着对抗样本成为了训练算法的一个盲点。Ian Goodfellow等人由此提出了生成对抗网络(Generative Adversarial Nets),利用对抗样本进行对抗训练,提高模型的抗干扰能力。
生成式对抗网络
GAN模型主要包括两个网络,G(Generator)和D(Discriminator):
- G是一个生成图片的网络,它接收一个随机的噪声z,通过这个噪声生成图片,记做G(z)。
- D是一个判别网络,判别一张图片是不是“真实的”。它的输入参数是x,x代表一张图片,输出D(x)代表x为真实图片的概率,如果为1,就代表100%是真实的图片,而输出为0,就代表不可能是真实的图片。

GAN模型框架图
在训练过程中,生成网络G的目标就是尽量生成真实的图片去欺骗判别网络D。而D的目标就是尽量把G生成的图片和真实的图片分别开来。这样,G和D构成了一个动态的“博弈过程”。
在最理想的状态下,G可以生成足以“以假乱真”的图片G(z)。对于D来说,它难以判定G生成的图片究竟是不是真实的,因此D(G(z)) = 0.5。
用公式表示如下:
简单分析一下这个公式:
- 整个式子由两项构成。x表示真实图片,z表示输入G网络的噪声,而G(z)表示G网络生成的图片。
- D(x)表示D网络判断真实图片是否真实的概率(因为x就是真实的,所以对于D来说,这个值越接近1越好)。而D(G(z))是D网络判断G生成的图片的是否真实的概率。
- G的目的:上面提到过,D(G(z))是D网络判断G生成的图片是否真实的概率,G应该希望自己生成的图片“越接近真实越好”。也就是说,G希望D(G(z))尽可能得大,这时V(D, G)会变小。因此我们看到式子的最前面的记号是min_G。
- D的目的:D的能力越强,D(x)应该越大,D(G(x))应该越小。这时V(D,G)会变大。因此式子对于D来说是求最大(max_D)
通过这样的巧妙设计,GAN 就拥有了一个非常吸引人的性质。GAN 中的 G 作为生成模型,不需要像传统图模型一样,需要一个严格的生成数据的表达式。这就避免了当数据非常复杂的时候,复杂度过度增长导致的不可计算。同时,它也不需要 inference 模型中的一些庞大计算量的求和计算。它唯一的需要的就是,一个噪音输入,一堆无标准的真实数据,两个可以逼近函数的网络。
4、Autoencoder,Boltzmann Machine和GAN在网络结构上的区别和联系有哪些?
AutoEncoder 是多层神经网络,其中输入层和输出层表示相同的含义,具有相同的节点数。AutoEncode学习的是一个输入输出相同的“恒等函数”。不过输入和输出相同,使得这个网络的输出没有任何意义。AutoEncoder的意义在于学习的(通常是节点数更少的)中间coder层(最中间的那一层),这一层是输入向量的良好表示。这个过程起到了“降维”的作用。当AutoEncoder只有一个隐含层的时候,其原理相当于主成分分析(PCA),当AutoEncoder有多个隐含层的时候,每两层之间可以用RBM来pre-training,最后由BP来调整最终权值。网络权重更新公式很容易用求偏导数的方法推导出来,算法是梯度下降法。


AutoEncoder和Restricted Boltzmann machine
Autoencoder和RBM是一类的,都属于学习模型;而稀疏编码更像是施加在这些基本模型上的一种优化手段,它是把大多数的神经元限制为0,只允许少量的神经元激活,来达到“稀疏”的效果。这主要是为了模拟人眼视觉细胞的特性。在算法里,其实就是在需要优化的目标函数里面加入一个表示稀疏的正则项。
Autoencoder和RBM的不同之处:Autoencoder的神经元是确定型的,用的是sigmold函数,就像传统的神经网络一样。而RBM的神经元是随机的。(最基本的RBM神经元只有0和1两种状态,但是扩展后可以在这个区间上取任何值)由于autoencoder的确定性,它可以用BP方法来训练。但是RBM就只能用采样的方法来得到一个服从RBM所表示分布的随机样本。(Gibbs采样,CD采样等等)在深度学习里面,可以把autoencoder和RBM都看作是一个个特征提取器,我们可以用许多这样的特征提取器构造出深层次的网络。基本思路是前面先用这些特征提取器搭出几层网络,自动学习出数据的一些特征后,后面再用一个分类器来分类,得到最后的结果。如果用autoencoder作特征提取器,得到的就是stacked autoencoder;如果用RBM作特征提取器,得到的就是deep belief network。
上述两种网络结构都属于生成式模型,认为输出y是由输入x决定的,即通过模型可以学习到输入x的一个良好的特征表示。生成模型的最大优势是直接从输入样本x中进行无监督或半监督学习,并不需要大量的带标签样本。而GAN是由生成模型和判别模型组成,即组合了深度学习两大模型结构,可以说综合了他们的优点。GAN的生成模型由输入x得到输出y,判别模型义y作为输入,判别是原来的真实数据还是通过噪声产生的数据,经过两者的平衡博弈,便得到了输入样本的相似表达。