深度学习(DL,Deep Learning)是机器学习(ML,Mchaine Leaning)的一个新的研究方向,他被进入机器学习是使其更接近于最初的目标人工智能(AI,Artificial Intelligence)。“深度”就是从“输入层”到“输出层”所经历的层次的数目,即“隐藏层”的数目,层次越多,网络的深度越深,越是复杂的问题需要的网络深度越深。
深度学习是有着三十多年历史的反向传播算法的新版本,它基于一种抽象的神经元模型。神经元层级将一个信号(如声波的振幅或图像的像素亮度)映射到对这个信号的含义更为明确的高层描述中(如该声波传达的文字或图像中的物体)。反向传播最初只能在两三层神经元中工作,而现在的新版算法可以在更多层级的神经元中工作,使得网络层级越来越深,类似于大脑中相关联的神经元之间的“深度”层级,因而被称为“深度学习”。
即使对于老手而言,深度学习仍然是一种神秘的艺术。因为人们通常在大型数据集上进行复杂的实验,这就掩盖了数据集、超参数和性能之间的基本关系,人们无法窥一斑而知全豹。
通用逼近性定理指出,一个具有单个隐藏层和标准激活函数的简单前馈神经网络(即多层感知器),如果隐藏层具有足够数量的单位,它就可以近似任何连续函数。随着隐藏单位数量的增加,训练数据的逼近误差一般会减小。
在实践中,更深的多层感知器(具有超过一个隐藏层)在许多感兴趣的任务上的表现,在很大程度上都胜过浅层感知器。为什么会出现这种情况呢?有人认为更深的网络需要的参数量多,但李宏毅的课程中对同样参数的“矮胖”(即只有一层,但神经元多)和“高瘦”(层数多,神经元少)网络进行了测试,证明“高瘦”网络更有效。
不同层数的结果对比
通过对比,深度网络能充分利用数据,他类比用树的思路来分析,通过对特征的层层分解和提取,可有效利用数据。
深度学习和大数据密切相关;通常认为,当数据集的规模大到足够克服过拟合时,深度学习只会比其他技术(如浅层神经网络和随机森林)更有效,并更有利于增强深层网络的表达性。
当数据集不平衡时(如一个类的样本比另一个类还多),分类的正确率确实会降低。重采样可以显著提高性能,使用少数类中抽样替换的样本。在重采样法不是有效的情况下,那么可能需要复合方式来合成新的训练样本,以提高正确率。
当处理非常高维的数据时,神经网络可能难以学习正确的分类边界。在这些情况下,可以考虑在将数据传递到神经网络之前进行无监督的降维。这做法提供的是帮助还是摧毁呢?数据 PCA 为更小的维数,并查看分类正确率是否提高。当维度非常大时,无监督的 PCA 步骤可以显著改善下游分类。但有一个有趣的阈值行为。当维数超过一个阈值时,分类的质量会有显著的下降。在这些情况下,少几 维的 PCA 可显著地改善下游分类。
运行时间会随着批大小的增加而下降。然而,这导致了测试正确率的妥协,因为测试正确率随着批大小的增加而单调递减。但这与普遍的观点不一致,严格来说,即中等规模的批大小更适用于训练。这可能是由于没有调整不同批大小的学习率。因为更大的批大小运行速度更快。总体而言,对批大小的最佳折衷似乎是为 64 的批大小。
Xavier 和高斯(具有较低的方差)初始化会得到很好的训练。Xavire 初始化提供了最好的性能,这并不奇怪。标准偏差小的高斯也适用(但不像 Xavire 那样好)。如果方差变得太大,那么训练速度就会变得较慢,这可能是因为神经网络的大部分输出都发生了爆炸。有趣的是,持续的初始化(理论上不应该能够训练神经网络)在几个轮数之后就会导致训练进行。这可能是由于核心并行化导致小的数值误差,最终导致了不同权重的散度。当权重都为 1 时,这些就都不起作用了。
我们期望后一层的权重会更快地收敛,因为它们在整个网络中进行反向传播时,后期阶段的变化会被放大。最终结论也是后一层的权重比前一层收敛得更快。
正则化对训练过程中习得的权重有着显著的影响。我们在 L1 正则化的情况下能够获得一定程度的稀疏性,虽然看起来有较大的正则化强度,这就导致正确率的折衷。而 L2 正则化不会导致稀疏性,它只有更小幅度的权重。同时,对正确率似乎没有什么有害的影响。
层数比较多的神经网络模型在训练时也是会出现一些问题的,其中就包括梯度消失问题(gradient vanishing problem)和梯度爆炸问题(gradient exploding problem)。梯度消失问题和梯度爆炸问题一般随着网络层数的增加会变得越来越明显。
以下图的反向传播为例(假设每一层只有一个神经元,其中激活函数为sigmoid函数)
可以推导出:
因此对于上面的链式求导,层数越多,求导结果越小,因而导致梯度消失的情况出现,这样,梯度爆炸问题的出现原因就显而易见了,也就是w比较大的情况。但对于使用sigmoid激活函数来说,这种情况比较少。
其实梯度爆炸和梯度消失问题都是因为网络太深,网络权值更新不稳定造成的,本质上是因为梯度反向传播中的连乘效应。对于更普遍的梯度消失问题,可以考虑用ReLU激活函数取代sigmoid激活函数。另外,LSTM的结构设计也可以改善RNN中的梯度消失问题。
Batchnorm是归一化的一种手段,极限来说,这种方式会减小图像之间的绝对差异,突出相对差异,加快训练速度,如果我们每一个batch输入的数据都具有不同的分布,显然会给网络的训练带来困难。另一方面,数据经过一层层网络计算后,其数据分布也在发生着变化,会给下一层的网络学习带来困难。batchnorm就是为了解决这个分布变化问题。
BatchNorm就是对神经网络的每一层进行归一化,假设将每一层输出后的数据都归一化到0均值,1方差,满足正太分布,但是,此时有一个问题,每一层的数据分布都是标准正太分布,导致其完全学习不到输入数据的特征,因为,费劲心思学习到的特征分布被归一化了,因此,直接对每一层做归一化显然是不合理的。但是如果稍作修改,加入可训练的参数做归一化,那就是BatchNorm实现的了。
之前也说过如果直接做归一化不做其他处理,神经网络是学不到任何东西的,但是加入这两个参数后,事情就不一样了,先考虑特殊情况下,如果γ和β分别等于此batch的标准差和均值,那么 [公式] 不就还原到归一化前的x了吗,也即是缩放平移到了归一化前的分布,相当于batchnorm没有起作用,β和γ分别称之为 平移参数和缩放参数 。这样就保证了每一次数据经过归一化后还保留的有学习来的特征,同时又能完成归一化这个操作,加速训练。
batchnorm是在输入值和激活函数之间进行的,每次训练给一个批量,然后计算批量的均值方差,但是在测试的时候可不是这样,测试的时候每次只输入一张图片,这怎么计算批量的均值和方差,于是,在训练的时候实现计算好mean var测试的时候直接拿来用就可以了,不用计算均值和方差。
在Logistic regression二分类问题中,我们可以使用sigmoid函数将输入Wx+b映射到(0,1)区间中,从而得到属于某个类别的概率。将这个问题进行泛化,推广到多分类问题中,我们可以使用softmax函数,对输出的值归一化为概率值。
这里假设在进入softmax函数之前,已经有模型输出C值,其中C是要预测的类别数,模型可以是全连接网络的输出aa,其输出个数为C,即输出为:a1,a2,……,aC
所以对每个样本,它属于类别i的概率为:
通过上式可以保证属于各个类别的概率和为1。
输入值很大时对应的函数值接近1或0,处于函数的饱和区,导致梯度几乎为0,造成梯度消失问题。
说交叉熵之前先介绍相对熵,相对熵又称为KL散度(Kullback-Leibler Divergence),用来衡量两个分布之间的距离
这里H§是p的熵。假设有两个分布p和q,它们在给定样本集上的相对熵定义为
从这里可以看出,交叉熵和相对熵相差了H§,而当p已知的时候,H§是个常数,所以交叉熵和相对熵在这里是等价的,反映了分布p和q之间的相似程度。
关于熵与交叉熵等概念回到我们多分类的问题上,真实的类标签可以看作是分布,对某个样本属于哪个类别可以用One-hot的编码方式,是一个维度为C的向量,比如在5个类别的分类中,[0, 1, 0, 0, 0]表示该样本属于第二个类,其概率值为1。我们把真实的类标签分布记为p,该分布中,ti=1当i属于它的真实类别c。同时,分类模型经过softmax函数之后,也是一个概率分布,所以我们把模型的输出的分布记为q,它也是一个维度为CC的向量,如[0.1, 0.8, 0.05, 0.05, 0]。
对一个样本来说,真实类标签分布与模型预测的类标签分布可以用交叉熵来表示:
最终,对所有的样本n,我们有以下loss function:
其中 tki是样本k属于类别i的概率, yki是模型对样本k预测为属于类别i的概率。
每次做完dropout相当于从原网络中找到一个更瘦的网络,强迫神经元和其他随机挑选出来的神经元共同工作,减弱了神经元节点间的联合适应性,增强泛化能力。
通过特征变换的方式把低维空间转换到高维空间,而在低维空间不可分的数据,到高维空间中线性可分的几率会高一些。具体方法:核函数,如:高斯核,多项式核等等
参考链接:深度学习从入门到进阶的12个经典问题及解答[公众号:AI前线]
深度学习面试要点总结(面试题)
自己总结的一点和深度学习相关的面试考点