[深度学习] 面试常见问题+解析汇总

什么是深度学习,与传统机器学习算法的区别?

(1)传统机器学习算法,在一开始,性能(识别率)会随着数据的增加而增加,但一段时间后,它的性能会进入平台期。这些模型无法处理海量数据。
(2)最近20年来,人类建立了数字王国,使得我们在电脑、网站、手机上的活动,都制造大量数据。便宜的相机、传感器,也产生大量数据。
(3)不同规模的网络,取得的性能也会有不同(具体如下)。

深度学习是一种特殊的机器学习,它将现实世界表示为嵌套的层次概念体系(由较简单概念间的联系定义复杂概念,从一般抽象概括到高级抽象表示),从而获得强大的性能与灵活性。

Deep learning is a subset of machine learning that is concerned with neural networks: how to use backpropagation and certain principles from neuroscience to more accurately model large sets of unlabelled or semi-structured data.

In that sense, deep learning represents an unsupervised learning algorithm that learns representations of data through the use of neural nets.

 

 

为什么深层神经网络难以训练?

1、梯度消失。梯度消失是指通过隐藏层从后向前看,梯度会变得越来越小,说明前面层的学习会显著慢于后面层的学习,所以学习会卡主,除非梯度变大。

梯度消失的原因:学习率的大小,网络参数的初始化,激活函数的边缘效应等。在深层神经网络中,每一个神经元计算得到的梯度都会传递给前一层,较浅层的神经元接收到的梯度受到之前所有层梯度的影响。如果计算得到的梯度值非常小,随着层数增多,求出的梯度更新信息将会以指数形式衰减,就会发生梯度消失。

2、梯度爆炸。在深度网络或循环神经网络(Recurrent Neural Network, RNN)等网络结构中,梯度可在网络更新的过程中不断累积,变成非常大的梯度,导致网络权重值的大幅更新,使得网络不稳定;在极端情况下,权重值甚至会溢出,变为Nan值,再也无法更新。

3、权重矩阵的退化导致模型的有效自由度减少。

参数空间中学习的退化速度减慢,导致减少了模型的有效维数,网络的可用自由度对学习中梯度范数的贡献不均衡,随着相乘矩阵的数量(即网络深度)的增加,矩阵的乘积变得越来越退化。在有硬饱和边界的非线性网络中(例如 ReLU 网络),随着深度增加,退化过程会变得越来越快。

神经网络模型优化的常用方案

1、增加(减少)隐藏层的复杂度,如增加隐藏层数,调整隐藏层的神经元个数,或者在隐藏层使用更加复杂的网络结构,如CNN、RNN、LSTM、GRU或者增加Attention层等等;

2、添加Dropout层,使用Dropout的原理优化网络参数,防止过拟合;

3、尝试不同的优化器,常用的优化器包括SGD、Adam、RMSprop(动量相关);

4、增加迭代次数,一般为了快速检验模型效果训练次数比较少,优化过程中可以增加训练次数;

5、调整优化器的学习率,学习率太小会造成模型收敛速度下降,还有可能求出的是局部最优解,训练模型时的损失函数下降慢;学习率过大会引起模型无法到达最优解,在最优解附近来回跳转,但是一般情况下学习率并不是一成不变的,而是随着模型的训练在优化;

6、增加批处理的大小,采用批处理的方式训练数据时每个batch的数据进行一次反向传播,更新参数,所以每个batch的数据分布对模型训练有着一定的影响,调整batch_size的大小,对模型优化有一定的作用;

7、正则化,可以优化模型太过复杂而引起运行时间过长的问题,也可以在一定程度上防止模型过拟合。(过拟合也就是模型把训练数据的内部关系都记下来了,在训练集损失函数很小,但是在测试集上损失函数开始增大,也就是在测试集上的效果开始下降)

 

激活函数

1. 激活函数有哪些性质

  1. 非线性
  2. 可微性:当优化方法是基于梯度的时候,就体现了该性质;
  3. 单调性:当激活函数是单调的时候,单层网络能够保证是凸函数;
  4. f(x)≈x:当激活函数满足这个性质的时候,如果参数的初始化是随机的较小值,那么神经网络的训练将会很高效;如果不满足这个性质,那么就需要详细地去设置初始值;
  5. 输出值的范围:当激活函数输出值是有限的时候,基于梯度的优化方法会更加稳定,因为特征的表示受有限权值的影响更显著;当激活函数的输出是无限的时候,模型的训练会更加高效,不过在这种情况小,一般需要更小的 Learning Rate。

2. 为什么需要非线性激活函数

  1. 激活函数可以把当前特征空间通过一定的线性映射转换到另一个空间,学习和模拟其他复杂类型的数据,例如图像、视频、音频、语音等。
  2. 假若网络中全部是线性部件,那么线性的组合还是线性,与单独一个线性分类器无异。这样就做不到用非线性来逼近任意函数。
  3. 使用非线性激活函数 ,以便使网络更加强大,增加它的能力,使它可以学习复杂的事物,复杂的表单数据,以及表示输入输出之间非线性的复杂的任意函数映射。使用非线性激活函数,能够从输入输出之间生成非线性映射。

3. 如何选择激活函数

  1. 如果输出是 0、1 值(二分类问题),则输出层选择 sigmoid 函数,然后其它的所有单元都选择 Relu 函数。
  2. 如果在隐藏层上不确定使用哪个激活函数,那么通常会使用 Relu 激活函数。有时,也会使用 tanh 激活函数,但 Relu 的一个优点是:当是负值的时候,导数等于 0。
  3. sigmoid 激活函数:除了输出层是一个二分类问题基本不会用它。
  4. tanh 激活函数:tanh 是非常优秀的,几乎适合所有场合。
  5. 如果遇到了一些死的神经元,我们可以使用 Leaky ReLU 函数。

3. ReLu激活函数的优点

  1. sigmoid 和 tanh 函数的导数在正负饱和区的梯度都会接近于 0,这会造成梯度弥散,而 Relu 和Leaky ReLu 函数大于 0 部分都为常数,不会产生梯度弥散现象。
  2. 在区间变动很大的情况下,ReLu 激活函数的导数或者激活函数的斜率都会远大于 0,在程序实现就是一个 if-else 语句,而 sigmoid 函数需要进行浮点四则运算,在实践中,使用 ReLu 激活函数神经网络通常会比使用 sigmoid 或者 tanh 激活函数学习的更快。
  3. 需注意,Relu 进入负半区的时候,梯度为 0,神经元此时不会训练,产生所谓的稀疏性,而 Leaky ReLu 不会产生这个问题。

稀疏激活性:从信号方面来看,即神经元同时只对输入信号的少部分选择性响应,大量信号被刻意的屏蔽了,这样可以提高学习的精度,更好更快地提取稀疏特征。当  x<0  时,ReLU 硬饱和,而当 x>0  时,则不存在饱和问题。ReLU 能够在  x>0  时保持梯度不衰减,从而缓解梯度消失问题。

4. 为什么Tanh收敛速度比Sigmoid快?

由上面两个公式可知tanh(x)梯度消失的问题比sigmoid轻,所以Tanh收敛速度比Sigmoid快。

 

为什么在神经网络中,ReLU是比Sigmoid更好、更常用的激活函数?

  

 

交叉熵损失函数及其求导推导

定义:

将交叉熵看做是代价函数有两点原因。

第⼀,它是⾮负的, C > 0。可以看出:式子中的求和中的所有独⽴的项都是负数的,因为对数函数的定义域是 (0,1),并且求和前⾯有⼀个负号,所以结果是非负。

第⼆,如果对于所有的训练输⼊ x,神经元实际的输出接近⽬标值,那么交叉熵将接近 0。实际输出和⽬标输出之间的差距越⼩,最终的交叉熵的值就越低了。(这里假设输出结果不是0,就是1,实际分类也是这样的)

交叉熵代价函数有⼀个⽐⼆次代价函数更好的特性就是它避免了学习速度下降的问题。

交叉熵函数关于权重的偏导数:

化简后得到:

可以看到圈中学习的速度受到  ,也就是输出中的误差的控制。更⼤的误差,更快的学习速度,特别地,这个代价函数还避免了像在⼆次代价函数中类似⽅程中  导致的学习缓慢。当我们使⽤交叉熵的时候, 

 被约掉了,所以我们不再需要关⼼它是不是变得很⼩。这种约除就是交叉熵带来的特效。  

Batch_Size

1. 为什么需要 Batch_Size?

Batch的选择,首先决定的是下降的方向。

如果数据集比较小,可采用全数据集的形式,好处是:

  1. 由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。

  2. 由于不同权重的梯度值差别巨大,因此选取一个全局的学习率很困难。Full Batch Learning 可以使用 Rprop 只基于梯度符号并且针对性单独更新各权值。

对于更大的数据集,假如采用全数据集的形式,坏处是:

  1. 随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。

  2. 以 Rprop 的方式迭代,会由于各个 Batch 之间的采样差异性,各次梯度修正值相互抵消,无法修正。这才有了后来 RMSProp 的妥协方案。

2. Batch_Size 值的选择

假如每次只训练一个样本,即 Batch_Size = 1。线性神经元在均方误差代价函数的错误面是一个抛物面,横截面是椭圆。对于多层神经元、非线性网络,在局部依然近似是抛物面。此时,每次修正方向以各自样本的梯度方向修正,横冲直撞各自为政,难以达到收敛。

既然 Batch_Size 为全数据集或者Batch_Size = 1都有各自缺点,可不可以选择一个适中的Batch_Size值呢?

此时,可采用批梯度下降法(Mini-batches Learning)。因为如果数据集足够充分,那么用一半(甚至少得多)的数据训练算出来的梯度与用全部数据训练出来的梯度是几乎一样的。

3. 在合理范围内,增大Batch_Size有何好处?

  1. 内存利用率提高了,大矩阵乘法的并行化效率提高。

  2. 跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。

  3. 在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小。

4. 盲目增大 Batch_Size 有何坏处?

  1. 内存利用率提高了,但是内存容量可能撑不住了。

  2. 跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同的精度,其所花费的时间大大增加了,从而对参数的修正也就显得更加缓慢。

  3. Batch_Size 增大到一定程度,其确定的下降方向已经基本不再变化。

归一化

1. 为什么要归一化?

  1. 避免神经元饱和。就是当神经元的激活在接近 0 或者 1 时会饱和,在这些区域,梯度几乎为 0,这样,在反向传播过程中,局部梯度就会接近 0,这会有效地“杀死”梯度。

  2. 保证输出数据中数值小的不被吞食。

  3. 加快收敛。数据中常存在奇异样本数据,奇异样本数据存在所引起的网络训练时间增加,并可能引起网络无法收敛,为了避免出现这种情况及后面数据处理的方便,加快网络学习速度,可以对输入信号进行归一化,使得所有样本的输入信号其均值接近于 0 或与其均方差相比很小。

2. 为什么归一化能提高求解最优解速度

 

上图是代表数据是否归一化的最优解寻解过程(圆圈可以理解为等高线)。左图表示未经归一化操作的寻解过程,右图表示经过归一化后的寻解过程。

当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;而右图对两个原始特征进行了归一化,其对应的等高线显得很圆,在梯度下降进行求解时能较快的收敛。

因此如果机器学习模型使用梯度下降法求最优解时,归一化往往非常有必要,否则很难收敛甚至不能收敛。

3. 归一化有哪些类型?

1、线性归一化

适用范围:比较适用在数值比较集中的情况。

缺点:如果 max 和 min 不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定。

2、标准差归一化

经过处理的数据符合标准正态分布,即均值为 0,标准差为 1

3、非线性归一化

适用范围:经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括 log、指数,正切等。

4. 批归一化(Batch Normalization)算法的优点

批归一化(BN)就是在神经网络中间层也进行归一化处理。

优点:

  1. 减少了人为选择参数。在某些情况下可以取消 dropout 和 L2 正则项参数,或者采取更小的 L2 正则项约束参数;

  2. 减少了对学习率的要求。现在我们可以使用初始很大的学习率或者选择了较小的学习率,算法也能够快速训练收敛;

  3. 可以不再使用局部响应归一化。BN 本身就是归一化网络(局部响应归一化在 AlexNet 网络中存在)

  4. 破坏原来的数据分布,一定程度上缓解过拟合(防止每批训练中某一个样本经常被挑选到,文献说这个可以提高 1% 的精度)。

  5. 减少梯度消失,加快收敛速度,提高训练精度。

 

训练深层神经网络很复杂,因为在训练过程中,随着前几层输入的参数不断变化,每层输入的分布也随之变化。一种方法是将每层输入规范化,输出函数均值为0,标准差为1。对每一层的每个小批量输入都采用上述方式进行规范化(计算每个小批量输入的均值和方差,然后标准化)。这和神经网络的输入的规范化类似。

批量标准化的好处

对输入进行规范化有助于神经网络学习。但神经网络不过是一系列的层,每层的输出又成为下一层的输入。也就是说,我们可以将其中每一层视作子网络的第一层。把神经网络想象成一系列互相传递信息的网络结构,因此在激活函数作用于输出之前,先将每一层输出规范化,再将其传递到下一层(子网络)。

 

5. Batch Normalization和Group Normalization的比较

Batch Normalization:可以让各种网络并行训练。但是维度进行归一化会带来一些问题-----批量统计估算不准确导致批量变小时,BN 的误差会迅速增加。在训练大型网络和将特征转移到计算机视觉任务中(包括检测、分割和视频),内存消耗限制了只能使用小批量的 BN。

Group Normalization:GN将通道分组,并且每组内计算归一化的均值和方差。GN的计算与批量大小无关,并且其准确度在各种批量大小下都很稳定。

6. Weight Normalization和Batch Normalization比较

两者都属于参数重写的方式,只是采用的方式不同。

Weight Normalization 是对网络权值 W 进行 normalization;Batch Normalization 是对网络某一层输入数据进行 normalization。

Weight Normalization相比Batch Normalization有以下三点优势:

  1. Weight Normalization 通过重写深度学习网络的权重W的方式来加速深度学习网络参数收敛,没有引入 minbatch 的依赖,适用于 RNN(LSTM)网络(Batch Normalization 不能直接用于RNN,进行 normalization 操作,原因在于:1) RNN 处理的 Sequence 是变长的;2) RNN 是基于 time step 计算,如果直接使用 Batch Normalization 处理,需要保存每个 time step 下,mini btach 的均值和方差,效率低且占内存)。

  2. Batch Normalization 基于一个 mini batch 的数据计算均值和方差,而不是基于整个 Training set 来做,相当于进行梯度计算式引入噪声。因此,Batch Normalization 不适用于对噪声敏感的强化学习、生成模型(Generative model:GAN,VAE)使用。相反,Weight Normalization 对通过标量 g 和向量 v  对权重  W  进行重写,重写向量 v 是固定的,因此,基于 Weight Normalization 的 Normalization 可以看做比 Batch Normalization 引入更少的噪声。

  3. 不需要额外的存储空间来保存 mini batch 的均值和方差,同时实现 Weight Normalization 时,对深度学习网络进行正向信号传播和反向梯度计算带来的额外计算开销也很小。因此,要比采用 Batch Normalization 进行 normalization 操作时,速度快。但是 Weight Normalization 不具备 Batch Normalization 把网络每一层的输出 Y 固定在一个变化范围的作用。因此,采用 Weight Normalization 进行 Normalization 时需要特别注意参数初始值的选择。

7.  Batch Normalization在什么时候用比较合适?

在CNN中,BN应作用在非线性映射前。在神经网络训练时遇到收敛速度很慢,或梯度爆炸等无法训练的状况时可以尝试BN来解决。另外,在一般使用情况下也可以加入BN来加快训练速度,提高模型精度。

BN比较适用的场景是:每个mini-batch比较大,数据分布比较接近。在进行训练之前,要做好充分的shuffle,否则效果会差很多。另外,由于BN需要在运行过程中统计每个mini-batch的一阶统计量和二阶统计量,因此不适用于动态的网络结构和RNN网络。

   

学习率衰减常用参数有哪些

 

十 正则化

1. 为什么要正则化

深度学习可能存在过拟合问题-----高方差,有两个解决方法,一个是正则化,另一个是准备更多的数据,这是非常可靠的方法,但你可能无法时时刻刻准备足够多的训练数据或者获取更多数据的成本很高,但正则化通常有助于避免过拟合或减少你的网络误差。

 

左图是高偏差,右图是高方差,中间是Just Right。

2. 理解dropout正则化

不要依赖于任何一个特征,因为该单元的输入可能随时被清除,因此该单元通过这种方式传播下去,并为单元的四个输入增加一点权重,通过传播所有权重,dropout将产生收缩权重的平方范数的效果,和之前讲的L2正则化类似;实施dropout的结果实它会压缩权重,并完成一些预防过拟合的外层正则化;L2对不同权重的衰减是不同的,它取决于激活函数倍增的大小。

3. dropout率的选择

1、经过交叉验证,隐含节点dropout率等于0.5的时候效果最好,原因是0.5的时候dropout随机生成的网络结构最多。

2、dropout也可以被用作一种添加噪声的方法,直接对input进行操作、输入层设为更更接近 1 的数。使得输入变化不会太大(0.8)

3、对参数w的训练进行球形限制(max-normalization),对 dropout 的训练非常有用。

4、使用pretrain方法也可以帮助dropout训练参数,在使用dropout时,要将所有参数都乘以1/p

4. dropout有什么缺点

dropout一大缺点就是代价函数J不再被明确定义,每次迭代,都会随机移除一些节点,如果再三检查梯度下降的性能,实际上是很难进行复查的。定义明确的代价函数J每次迭代后都会下降,因为我们所优化的代价函数J实际上并没有明确定义,或者说在某种程度上很难计算,所以我们失去了调试工具来绘制这样的图片。我通常会关闭dropout函数,将keep-prob的值设为1,运行代码,确保J函数单调递减。然后打开dropout函数,希望在dropout过程中,代码并未引入bug。我觉得你也可以尝试其它方法,虽然我们并没有关于这些方法性能的数据统计,但你可以把它们与dropout方法一起使用。

十一 如何理解 Internal Covariate Shift?

深度神经网络模型的训练为什么会很困难?其中一个重要的原因是,深度神经网络涉及到很多层的叠加,而每一层的参数更新会导致上层的输入数据分布发生变化,通过层层叠加,高层的输入分布变化会非常剧烈,这就使得高层需要不断去重新适应底层的参数更新。为了训好模型,我们需要非常谨慎地去设定学习率、初始化权重、以及尽可能细致的参数更新策略。

oogle 将这一现象总结为 Internal Covariate Shift,简称 ICS。什么是 ICS 呢?

大家都知道在统计机器学习中的一个经典假设是“源空间(source domain)和目标空间(target domain)的数据分布(distribution)是一致的”。如果不一致,那么就出现了新的机器学习问题,如 transfer learning / domain adaptation 等。而 covariate shift 就是分布不一致假设之下的一个分支问题,它是指源空间和目标空间的条件概率是一致的,但是其边缘概率不同。

大家细想便会发现,的确,对于神经网络的各层输出,由于它们经过了层内操作作用,其分布显然与各层对应的输入信号分布不同,而且差异会随着网络深度增大而增大,可是它们所能“指示”的样本标记(label)仍然是不变的,这便符合了covariate shift的定义。由于是对层间信号的分析,也即是“internal”的来由。

那么ICS会导致什么问题?

简而言之,每个神经元的输入数据不再是“独立同分布”。

其一,上层参数需要不断适应新的输入数据分布,降低学习速度。

其二,下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止。

其三,每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。

 

 

 

 

 

参考: 算法岗面试:Deep Learning 27类常见问题+解析汇总

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章