深度学习基础原理 - 仁在江湖飘

时间:2024-04-17 16:11:56

深度学习基础原理

深度学习

1.深度学习是否无所不能?

适合掌握深度学习的任务应具备这样一些特点:

(1)具备大量样本数据。如果样本数据难以获取或者数量太少,我们认为就不适合深度学习技术解决

(2)样本数据对场景的覆盖度足够完善。深度学习模型的效果完全依赖样本数据表现,如果出现样本数据外的情况,模型的推广性会变差

(3)结果对可解释性的要求不高。如果应用场景不仅要机器能够完成某项任务,还需对完成过程有明确的可解释性,这样的场景就不那么适合深度学习。

2.深度学习的基本流程

(1)模型搭建

(2)数据预处理

(3)训练模型

(4)结果可视化

(5)测试(预测)

3.常见的CNN模型有哪些?各有什么优缺点,如何选择模型

【1】用于图像分类问题的卷积神经网络架构正则表达式:

输入层-->(卷积层+ -->池化层?) + --> 全连接层+

一般不会连续使用超过三个卷积层。部分论文中发现可以通过调整卷积层步长来代替池化层的减少参数作用,有些网络中没有池化层。卷积神经网络在输出之前一般有着1-2个全连接层;每经过一次池化,卷积核的深度一般会乘以2倍(逐层递增);卷积步长一般为1;卷积核的尺寸大小一般不超过5;池化层的步长一般为2或者3;步长一般为2或者3;

【2】模型的另一种设计模式(Inception)

将不同的卷积层通过并联的方式结合在一起。每条之路使用不同的卷积核尺寸(原始图像通过填充可以使得卷积后的feature map大小一致)

(1)LeNet5(1998)

lecun大神设计的第一个卷积神经网络,结构:(7层)卷积+池化+卷积+池化+三个全连接层,第一个成功应用于数字识别问题的CNN

(2)AlexNet(2012)

Hinton跟其学生在2012提出。特点:引入了ReLU和dropout,引入数据增强、池化相互之间有覆盖,三个卷积一个最大池化+三个全连接层

(3)ZF Net(2013)

(4)VGGNet(2014)

采用1x1和3x3的卷积核以及2x2的最大池化使得层数变得更深。常用VGGNet-16和VGGNet19

优点:(1)模型网络简洁:使用统一的3x3卷积核+2x2的maxpool(2)几个小的卷积核效果比一个大的卷积核效果好原因:更多的激活函数,更多的非线性,模型提取特征更加深层;同时参数更少(3)模型变得更深,如此可以提高网络的性能

缺点:(1)耗费更多的计算资源,更多的参数,更多的内存,因为有三个全连接层

(5)Google Net(2014 Inception v1)

这个在控制了计算量和参数量的同时,获得了比较好的分类性能,和上面相比有几个大的改进:  

 【1】去除了最后的全连接层,而是用一个全局的平均池化来取代它;   

​ 【2】引入Inception Module,这是一个4个分支结合的结构。所有的分支都用到了11的卷积,这是因为11性价比很高,可以用很少的参数达到非线性和特征变换。  

 【3】Inception V2第二版将所有的55变成2个33,而且提出来著名的Batch Normalization; (2015)

 【4】Inception V3第三版就更变态了,把较大的二维卷积拆成了两个较小的一维卷积,加速运算、减少过拟合,同时还更改了Inception Module的结构。(2015)

(6)ResNet(2015)

引入残差模块,让模型变得更深

4.LSTM、GRU、RNN又是什么样的模型结构

LSTM:长短时记忆网络

RNN:递归神经网络

GRU:

5.常见的数据预处理有哪些

(1)数据增强:翻转、剪切、加噪声、调节亮度饱和度色度等

(2)大小调整:NN的输入节点数是固定的,需要将图像的大小统一

(3)标准化:消除量纲的影响;加速GD算法的收敛速度;提高模型的精度(KNN)

(4)PCA算法降维:一种无监督的降维算法

(5)图像编码:存储时先是压缩编码,用时进行解码还原成三维矩阵(Tensorflow)

(6)处理标注框:关注需要识别的对象目标

6. 数据增强的方式有哪些?

(1)对图像数据的翻转、剪切、加噪声等

(2)生成模型:GAN生成数据

(3)机器翻译:翻译成需要的语种数据

7.训练模型的基本步骤

(1)初始化权值

(2)前向反馈计算loss

(3)反向传播计算loss相对权值的梯度

(4)更新权值,梯度下降

(5)直至模型收敛

7.初始化权重的方法有哪些?(如何初始化权重)

(1)一般使用服从的高斯分布mean=0, stddev=1)或均匀分布的随机值作为权重的初始化参数;使用 0 作为偏置的初始化参数

(2)一些启发式方法会根据输入与输出的单元数来决定初始值的范围(均匀分布,Xiver初始化)

(3)随机正交矩阵、截断高斯分布(tensorflow里面很常见)

(4)使用pretrain的方法进行初始化

随机初始化、正太分布初始化、hekaiming的初始化方式、Xiver初始化算法

注意
(1)不能把神经网络的参数初始化为0,因为初始化为0,每一层学习到的东西一样(输出值一样),在反向传播的时候,每层内的神经元也一样,因为他们的梯度一样。
(2)简单的随机初始化:实际上是从均值为0,方差为1的高斯分布中采样,当层数加深时,激活函数的输出值接近0,梯度也会接近0,由此可能产生梯度消失问题。
(3)Xiver初始化:解决随机初始化的问题。可以有效应对tanh激活函数,但对relu函数无能为力。
基本思想:保持输入和输出的方差一致,这样就避免了所有输出值都趋向于0
(4)He 初始化:专门针对relu函数的初始化方法。很有效。现在的神经网络常用relu激活函数,初始化方式常用He 初始化方法。(高斯分布)
基本思想:在ReLU网络中,假定每一层有一半的神经元被激活,另一半为0,所以,要保持variance不变,只需要在Xavier的基础上再除以2
(5)BN层的应用可以缓解对初始化的依赖
【参考】

5.前向反馈中设计到哪些操作?

(1)卷积运算(卷积层):对应元素相乘再相加

(2)池化(最大池化与平均池化)

(3)激活函数的选择

(4)1x1卷积(降维)、BN层、dropout

(5)全连接层

6.引入激活函数的目的是啥?常见的激活函数有哪些?各有什么特点,如何选择激活函数

目的:是为了向网络中引入非线性,从而加强网络的表示能力,解决线性模型无法解决的问题

注:没有激活函数的神经网络,每一层的输出都是输入的线性组合,是线性模型;不过部分层是纯线性的话可以减少参数的数量

为何引入非线性可以加强网络的表示能力

神经网络的万能近似定理:只要神经网络具有至少一个非线性隐藏层,那么只要给予网络足够数量的隐藏单元,它就可以以任意的精度来近似任何从一个有限维空间到另一个有限维空间的函数 (已经有数学证明)

sigmoid:取值范围在[0,1]之间,符合概率的取值范围,在分类问题中比较受欢迎

公式: $\sigma (x) = \frac{1}{1+exp(-x)} $ 取值在0-1之间,关于\((0, \frac{1}{2})\) 对称

缺点:(1)会出现梯度消失(弥散)现象(2)图像不是关于原点对称(3)计算\(exp(-x)\) 值比较慢,耗时

优点:(1)引入非线性,加强网络的表征能力(2)输出值在0-1之间,符合概率的取值范围,在分类中效果比较好

tanh:双曲正切函数,范围在[-1,1]之间,形状同sigmoid

公式:\(tanh(x) = 2\sigma(x) - 1\) 关于原点对称

缺点:(1)梯度弥散现象没有解决

优点:(1)关于原点对称 (2)收敛速度比sigmoid函数快

RELU:小于0时输出0,大于0时输出本身

公式:\(f(x) = max(0, x)\)

缺点:(1)梯度弥散问题没有完全解决 (2)在(-)部分神经元死亡且不会复活

优点:(1)很大程度解决了梯度消失问题(2)收敛速度更快

Leaky ReLU:针对RELU函数的改进,(-)部分改变,解决神经元死亡问题

公式:\(f(x)= \begin{cases} \alpha x& \text{x<0}\\ x& \text{x>=0} \end{cases}\)

maxout:分段线性函数

公式:\(f(x) = max(w^T_1 x + b_1, w^T_2 x + b_2)\)

缺点:(1)参数比较多,本质相当于在结果的后面新加入一个层

优点:(1)解决了RELU的缺点(2)拟合能力非常强,可以拟合任意的凸函数(3)具备relu的优点

Relu跟Sigmoid函数的比较

(1)Relu可以避免梯度消失:

  • sigmoid函数在输入取绝对值非常大的正值或负值时会出现饱和现象——在图像上表现为变得很平,此时函数会对输入的微小变化不敏感——从而造成梯度消失;

  • ReLU 的导数始终是一个常数——负半区为 0,正半区为 1——所以不会发生梯度消失现象

(2)减缓过拟合

  • ReLU 在负半区的输出为 0。一旦神经元的激活值进入负半区,那么该激活值就不会产生梯度/不会被训练,造成了网络的稀疏性——稀疏激活

  • 这有助于减少参数的相互依赖,缓解过拟合问题的发生

(3)加速计算:

  • ReLU 的求导不涉及浮点运算,所以速度更快

为什么 ReLU 不是全程可微/可导也能用于基于梯度的学习?

  • 虽然从数学的角度看 ReLU 在 0 点不可导,因为它的左导数和右导数不相等;

  • 但是在实现时通常会返回左导数或右导数的其中一个,而不是报告一个导数不存在的错误。从而避免了这个问题

    激活函数的选择跟初始化方式也是有关系的,激活函数的选择很重要

    https://www.cnblogs.com/makefile/p/activation-function.html

7. 1x1卷积有什么作用(也叫Network in Network)

https://www.cnblogs.com/pacino12134/p/10351737.html

(1)实现跨通道的交互和信息整合(卷积都具有的特性)

​ 对于某个卷积层,无论输入图像有多少个通道,输出图像通道数总是等于卷积核数量!

​ 对多通道图像做1x1卷积,其实就是将输入图像于每个通道乘以卷积系数后加在一起,即相当于把原图像中本来各个独立的通道“联通”在了一起。

(2)降维或者升维: 通过改变卷积核的数量达成降维(升维)的目的;信息通道的压缩

8.简单说一下卷积的原理?

卷积层 + 池化层 + 激活函数 + 全连接层

9.什么是过拟合与欠拟合?深度学习中防止过拟合的方式有哪些

欠拟合:是指模型太简单,不能够学习到训练数据集上的内在规律;具体表现为在训练数据集上取不到足够低的训练误差。

过拟合:模型的学习能力太强,在训练数据集上可以达到很低的训练误差,而在测试集上的误差却是比较高,也就是泛化能力比较弱。

防止过拟合的策略:数据增强、dropout、BN层、正则化权重、提早停止训练模型

10.BN层的原理是什么?在什么位置嵌入BN层

位置:一般在卷积层、全连接层的后面,激活函数前加入BN层

11.BN层的作用有哪些?

(1)防止过拟合

(2)减少初始化的影响

(3)加速网络的训练(缓解梯度消失,支持更大的学习率)

12.BN层在训练、测试时分别是怎么操作的?

https://github.com/imhuay/Algorithm_Interview_Notes-Chinese/blob/master/A-%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/A-%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E5%9F%BA%E7%A1%80.md#bn-%E5%9C%A8%E8%AE%AD%E7%BB%83%E5%92%8C%E6%B5%8B%E8%AF%95%E6%97%B6%E5%88%86%E5%88%AB%E6%98%AF%E6%80%8E%E4%B9%88%E5%81%9A%E7%9A%84

13. dropout的原理是什么?一般用在什么位置?为何会 work

以一定的概率随机使网络中的节点不工作(相当于丢弃掉),减少网络的复杂度,防止过拟合。

理解:让节点不工作之后,可以避免模型太依赖局部特征,指导网络学习数据的本质共性,可以防止过拟合

dropout一般用在全连接层的后面

dropout防止过拟合的理由

(1)模型在训练过程中取平均:优点类似集成思想:dropout通过参数共享,相当于集成了经过dropout之后的所有子网络。集成方法能够防止过拟合

(2)破坏了网络层间隐含节点的固定关系,避免模型太依赖局部特征,倾向于学习更加本质的共性特征

(3)神经网络中不同模型的独立误差:随机初始化的差异、批训练数据的随机选择、超参数的差异等非确定性实现往往足以使得集成中的不同成员具有部分独立的误差

集成学习能够防止过拟合现象原因解析:

(1)每个模型在测试集上取得的误差不一样;如果模型成员的误差是独立的,集成将显著提升模型的性能

(2)通过投票裁决(加权方式)可以使得一些负面影响得到消除

14.Dropout 与 Bagging 的不同

  • 在 Bagging 的情况下,所有模型都是独立的;而在 Dropout 的情况下,所有模型共享参数,其中每个模型继承父神经网络参数的不同子集。
  • 在 Bagging 的情况下,每一个模型都会在其相应训练集上训练到收敛。而在 Dropout 的情况下,通常大部分模型都没有显式地被训练;取而代之的是,在单个步骤中我们训练一小部分的子网络,参数共享会使得剩余的子网络也能有好的参数设定。

15.BN层与dropout同时使用效果是否会更好?

dropout有些依赖神经网络中的随机性,因为这样可以使得模型具有独立的误差,效果会好

BN层:统一数据的分布,减少模型初始化的影响;感觉有点破坏随机性,如此看来在BN层之前用dropout不会使效果更好,反而会变差。

论文的解释:(方差偏移)

当模型状态由训练到测试时,Dropout 会使具体神经元的方差产生偏移。但是,BN 在整个测试阶段都会保留它在训练过程学习并累计得到的方差。当在 BN 之前应用 Dropout 时,该方差的不一致(我们将该现象命名为「方差偏移」)造成推理中的数值不稳定性,最终将导致更多的错误预测

总的来说就是:方差发生偏移,导致方差不一致,造成推理中的数值不稳定,有更多的错误预测

https://www.sohu.com/a/218382470_465975

16.如何结合使用dropout与BN层

(1)在BN层的后面使用dropout,避免BN层对dropout的影响;dropout统一放在softmax前的最后一层上

(2)修改dropout的公式,是的她对方差不那么敏感;比如高斯dropout、均匀dropout,这个方案的效果比上面的方案效果好,更加稳定。

17.什么是正则化?常见正则化有哪些?谈谈L1正则与L2正则的区别

​ 正则化是指对经验误差函数加上约束,正则化参数相当于引入参数的先验分布,比如L1正则化是引入拉普拉斯先验;从而使得在优化误差函数的时候倾向于选择满足约束的梯度减少的方向,使最终的解倾向于符合先验知识;正则化的策略主要是用来防止过拟合,减少测试误差,增强模型的泛化能力。(本质是以偏差的增加换取方差的减少)

​ 常见的正则化有L1正则化、L2正则化;

区别:

(1)定义

(2)先验分布

(3)达到的效果

在神经网络中 通常只是对权重做惩罚,对偏置不惩罚 :因为精确拟合偏置需要的数据量比拟合权重要少得多,偏置仅仅控制一个单变量,数量也比较少,这意味着我们不用惩罚也不会导致太大的方差。另外,正则化偏置有可能会导致明显的欠拟合

18.如何选择正则化方式

这个主要看我们正则化的附加目的。虽然都可以用于防止过拟合,但是

(1)L1正则化:倾向于产生稀疏权重,可用于特征选择

(2)L2正则化,也叫岭回归,可以用于减缓变量之间的多重共线性,主要用于防止过拟合

19.L1正则化的先验为何是拉普拉斯分布,L2为何是高斯分布,怎么理解?

https://blog.****.net/m0_38045485/article/details/82147817

https://blog.****.net/qq_32742009/article/details/81674021

20.如何降低欠拟合?

这里欠拟合主要是因为模型过于简单,学习能力不够强导致的。可以考虑模型复杂化,或者反着过拟合的思路

(1)增加模型的复杂度

比如加入网络的层数或者神经元的个数;线性模型:加入高次项

(2)减小正则化项的系数

添加正则化项是为了限制模型的学习能力,减小正则化项的系数则可以放宽这个限制

没有正则化项的模型倾向于选择更加大的群众,如此可以更好的拟合数据

(3)加入新的特征

比如交叉特征、多项式特征等

深度学习:因子分解机、Deep-Crossing、自编码器

21.最大池化与平均池化的区别与联系

相同点:

(1)都是池化方式,都可以使参数的数量变少、特征变少、降维,

(2)pooling:最大的作用是保持某种不变性(旋转、平移、伸缩等)

我的理解:

(1)最大池化:一定区域内取最大值,这里可能忽略了这个区域的部分信息,有点相当于提取局部信息

(2)最大池化:可以减少参数误差造成的均值偏移

(3)平均池化:一定区域内取平均值,这里充分利用了全部的信息,全部求平均,相当于全局信息特征

(4)平均池化:在水平方向求平均,可以减少水平方向上不同视角的影响;平均池化可以减小由于邻域大小造成的方差误差

最常用的还是最大池化

有个细节:池化的反向传播如何操作

(1)平均池化:梯度值平均到每一个像素值

(2)最大池化:用一个变量记录原始feature map中最大值的位置,传播的时候传播到那个位置即可

https://blog.****.net/sunflower_sara/article/details/81322048

22.反向传播的原理是啥?简单说一下梯度下降法

梯度下降法:梯度下降法是求解不带约束最优化问题的常用方法;她通过一步步降低损失函数对参数的梯度来寻找局部最优值。特点是实现简单,但不能保证达到全局最优值,收敛速度也未必是最快的

反向传播算法:就是用于损失函数计算全部参数梯度的具体方法,其本质是利用链式法则对每个参数求偏导

23.权值更新方法有哪些?各有什么优缺点?如何选择?

(1)随机梯度下降法(batch-SGD、minibatch-SGD、SGD)

(2)带动量的SGD算法:加快训练,有可能跑出局部最优值

(3)Nesterov动量SGD,跟标准的区别在于梯度的计算

(4)AdaGrad

(5)RMSprop

(6)Adam

(7)基于二阶梯度的优化方法:牛顿法、共轭梯度、BFGS 等的做法

24.通过什么来评判模型的优越性?

(1)泛化性能

(2)模型训练速度

25.batchsize的选择?minibatch是什么?

(1)一般而言:batchsize越大,结果越接近梯度下降法的结果

(2)mnibatch:训练速度快,同时收敛结果接近GD算法的结果

26.卷积神经网络的特点是什么?为什么要进行卷积而不是全连接

局部连接,权值共享,池化操作,多层次结构。

(1)权值共享,如此可以减少参数,大大降低了网络的训练难度,防止模型过拟合

(2)局部感知:卷积利用的是小的卷积核进行卷积,提取的是局部特征

(3)池化操作与多层次结构,实现了数据的降维,将低层次的局部特征组合成为较高层次的特征,从而对图像进行表示。

27.卷积神经网络(深度学习)为何在计算机视觉、语音识别、自然语言处理中如此work?在其他方面是否也可以?

局部相关性

目前深度学习表现比较好的领域主要是图像/语音/自然语言处理等领域,这些领域的一个共性是局部相关性。图像中像素组成物体,语音信号中音位组合成单词,文本数据中单词组合成句子,这些特征元素的组合一旦被打乱,表示的含义同时也被改变。对于没有这样的局部相关性的数据集,不适于使用深度学习算法进行处理。举个例子:预测一个人的健康状况,相关的参数会有年龄、职业、收入、家庭状况等各种元素,将这些元素打乱,并不会影响相关的结果。

28.什么是梯度消失和爆炸?如何解决

梯度消失问题 :本质是激活函数的选择导致的,如sigmoid函数。在函数的两端梯度求导结果非常小(饱和区)导致后向传播过程中由于多次使用到激活函数的导数值使得整体的乘积梯度结果变得越来越小,也就是梯度出现了消失现象。

  • 神经网络的训练中,通过改变神经元的权重,使网络的输出值尽可能逼近标签以降低误差值,训练普遍使用BP算法,核心思想是,计算出输出与标签间的损失函数值,然后计算其相对于每个神经元的梯度,进行权值的迭代。
  • 梯度消失会造成权值更新缓慢,模型训练难度增加。造成梯度消失的一个原因是,许多激活函数将输出值挤压在很小的区间内,在激活函数两端较大范围的定义域内梯度为0,造成学习停止。

梯度爆炸问题

梯度爆炸:同理,出现在激活函数处在激活区,而且权重W过大的情况下。但是梯度爆炸不如梯度消失出现的机会多

解决方法:通过选择相对较好的激活函数;如RELU激活函数

29.VGG使用2个3*3卷积的优势在哪里?其他的常用模型类似问题

30.神经网络中权值共享如何理解?

CNN中的权值共享就是滤波器共享。滤波器的参数是固定的,在提取特征的时候,用滤波器滑动窗口扫描一遍图像,提取一次特征。权值共享可以很有效地较少神经网络的参数。

为何要如此权值共享:

(1)减少网络的参数,防止过拟合

(2)权值共享意味着在特征图的不同位置使用一样的特征提取器,可以提取到与位置无关的特征模式。可以这样做的前提假设是:图像中一部分的统计特性与其他部分一样

31.神经网络中局部感知如何理解?

卷积核只是作用于feature map中的局部区域

受到的启发:

我们对外界事物的观察都是由局部到全局,但并不是每个像素每个像素的去认知,而是一块区域一块区域的去认识,通过这些区域得到局部信息,然后对这些局部信息的汇总,然后才得到整个全局的信息。

(1)图像的像素之间也是局部的相关性较强,距离较远的像素之间相关性较弱

(2)视觉神经元只是接收局部信息,神经元并不对全局信息响应

(3)如此可以有效减少神经网络的参数

32.卷积层与池化层的区别?全连接层

相同点:

(1)都有卷积核,尺寸大小,步长的选择

(2)都是针对局部区域。卷积是局部连接,池化是局部区域求值

不同点:

(1)卷积中有参数,而池化过程没有参数

(2)池化是不跨层进行的,即需要对feature map的每个通道进行池化;而卷积跨层进行运算

全连接层:全连接方式,参数非常之多。

https://zhuanlan.zhihu.com/p/33101420

https://blog.****.net/u013787595/article/details/49123501