AI面试题第二弹(神经网络基础)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AI面试题第二弹(神经网络基础)相关的知识,希望对你有一定的参考价值。
参考技术A 提取主要特征,减小网络参数量,减小计算量层层传递的梯度>1 梯度爆炸
层层传递的梯度<1 梯度消失
与权重有很大关系,激活函数的影响较小。
每次训练一层隐节点,训练时将上一层隐节点的输出作为输入,而本层隐节点的输出作为下一层隐节点的输入,此过程就是逐层“预训练”(pre-training);在预训练完成后,再对整个网络进行“微调”(fine-tunning)。Hinton在训练深度信念网络(Deep Belief Networks中,使用了这个方法,在各层预训练完成后,再利用BP算法对整个网络进行训练。
这个方案主要是针对梯度爆炸提出的,其思想是设置一个梯度剪切阈值,然后更新梯度的时候,如果梯度超过这个阈值,那么就将其强制限制在这个范围之内。这可以防止梯度爆炸。
比较常见的是l1l1l1正则,和l2l2l2正则,在各个深度框架中都有相应的API可以使用正则化
反向传播中,经过每一层的梯度会乘以该层的权重。
举个简单例子:
为了得到一致假设而使假设变得过度复杂称为过拟合(overfitting), 过拟合表现在训练好的模型在训练集上效果很好,但是在测试集上效果差 。也就是说模型的泛化能力弱。
过拟合主要由两个原因造成,数据集太小或模型太复杂
(1). 数据集扩增(Data Augmentation)
(2). 改进模型
·Early Stopping。在模型效果比较好的时候便提前停止训练
·正则化(regularization)
L1:稀疏参数
L2:更小参数
·Dropout
·多任务学习
深度学习中两种多任务学习模式:隐层参数的硬共享和软共享
硬共享机制是指在所有任务中共享隐藏层,同时保留几个特定任务的输出层来实现。硬共享机制降低了过拟合的风险。多个任务同时学习,模型就越能捕捉到多个任务的同一表示,从而导致模型在原始任务上的过拟合风险越小。
软共享机制是指每个任务有自己的模型,自己的参数。模型参数之间的距离是正则化的,以便保障参数相似性。
见后文
leaky relu
输入是x输出是y,正常的流程是:我们首先把x通过网络前向传播,然后把误差反向传播以决定如何更新参数让网络进行学习。使用Dropout之后,过程变成如下:
(1)首先随机(临时)删掉网络中一半的隐藏神经元,输入输出神经元保持不变(图中虚线为部分临时被删除的神经元)
(2) 然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w,b)。
(3)然后继续重复这一过程:
恢复被删掉的神经元(此时被删除的神经元保持原样,而没有被删除的神经元已经有所更新)
从隐藏层神经元中随机选择一个一半大小的子集临时删除掉(备份被删除神经元的参数)。
对一小批训练样本,先前向传播然后反向传播损失并根据随机梯度下降法更新参数(w,b) (没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果)。
不断重复这一过程。
没有对数据进行归一化
忘记检查输入和输出
没有对数据进行预处理
没有对数据正则化
使用过大的样本
使用不正确的学习率
在输出层使用错误的激活函数
网络中包含坏梯度
初始化权重错误
过深的网络
隐藏单元数量错误
网络设计不合理(任务-网络不匹配)
机器学习有个很重要的假设:就是假设训练数据和测试数据是满足独立同分布的,这保障了通过训练数据获得的优秀模型也能够在测试集获得好的效果。但是在机器学习训练中输入层的每个批量(X,Y)中X的分布是不一致的,并且神经网络的隐藏层的输入分布在每次训练迭代中发生变化。 BatchNorm就是在深度神经网络训练过程中使得每一层神经网络的输入保持相同分布的。
BN的基本思想其实相当直观:因为深层神经网络在做非线性变换前(激活前)的 输入值 (就是那个x=WU+B,U是输入) 随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近 (对于Sigmoid函数来说,意味着激活输入值WU+B是大的负值或正值),所以这 导致反向传播时低层神经网络的梯度消失 ,这是训练深层神经网络收敛越来越慢的 本质原因 , 而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布 ,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是 这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,能大大加快训练速度。
但是接下来的问题是:如果都通过BN,那么不就跟把非线性函数替换成线性函数效果相同了,意味着网络的非线性表达能力下降了, 所以BN为了保证非线性的获得,对变换后的满足均值为0方差为1的x又进行了scale加上shift操作(y=scale*x+shift), 每个神经元增加了两个参数scale和shift参数,这两个参数是通过训练学习到的,意思是通过scale和shift把这个值从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于激活前的值经过标准正太分布归一化后再从正中心周围的线性区往非线性区动了动。核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢
Batch Normalization 好处:(1)提高了训练速度,收敛速度也大大加快(2)另外调参过程也简单多了,对于初始化要求没那么高,而且可以使用大的学习率等 (3)可以防止梯度消失(4)BN类似于Dropout的一种防止过拟合的正则化表达方式,可以有效防止过拟合,不用太依赖dropou和正则化
以下情况最好不要使用BN:(1)数据不平衡(2)batch_size太小
batch_size是机器学习中的一个重要参数,决定了梯度下降的方向,如果数据集比较小,完全可以采用全数据集的形式计算梯度,由全数据集确定的梯度方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向。对于大型数据集则需要使用mini-batch_size,因为随着数据集的海量增长和内存限制,一次性载入所有的数据进来变得越来越不可行。
当batch_size=1,即在线学习,模型难以达到收敛 。
合理增加batch_size好处 :
(1)内存利用率提高了,大矩阵乘法的并行化效率提高
(2)跑完一次 epoch(全数据集)所需的迭代次数减少,对于相同数据量的处理速度进一步加快。
(3)在一定范围内,一般来说 Batch_Size 越大,其确定的下降方向越准,引起训练震荡越小
盲目增大 Batch_Size 坏处 :
(1)内存利用率提高了,但是内存容量可能撑不住了
(2)跑完一次 epoch(全数据集)所需的迭代次数减少,要想达到相同精度所需要的 epoch 数量越来越多,花费的时间越长
(3)大的batchsize收敛到sharp minimum,而小的batchsize收敛到flat minimum,后者具有更好的泛化能力。
总之batchsize在变得很大(超过一个临界点)时,会降低模型的泛化能力。在这个临界点之下,模型的性能变换随batch size通常没有学习率敏感
目标所在的真实框(ground truth) 与算法预测的目标所在的框(bounding box)的交集与并集的比值,我们会用IOU阈值来判定预测的bounding box是否有效。一般阈值会设定在0.5,当IOU的值大于等于0.5时,我们会把这个预测的bounding box 归为正类,而小于0.5的归为负类。
牛顿法使用的是目标函数的二阶导数,在高维情况下这个Hessian(n*n维度)矩阵非常大,计算复杂度是n*n,计算和存储都是问题
(1) 通过控制卷积核个数实现升维或者降维,从而减少模型参数和计算量
(2) 用于不同channel上特征的融合
(3)1x1的卷积相当于全连接层的计算过程,并且加入了非线性激活函数,从而增加了网络的非线性,使得网络可以表达更加复杂的特征。
它能够把输入的连续实值变换为0和1之间的输出,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1
缺点:
(1)函数的饱和区,导致梯度几乎为0,造成梯度消失问题
(2)Sigmoid 的 output 不是0均值,具体解释见 https://blog.csdn.net/tyhj_sf/article/details/79932893
(3)其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。
它解决了Sigmoid函数的不是零均值输出问题,然而,梯度消失(gradient vanishing)的问题和幂运算的问题仍然存在。
(1)在正区间解决了梯度消失的问题
(2)函数简单,计算速度快,收敛速度远快于sigmoid和tanh
缺点:
(1)Relu函数输出不是0均值
(2)神经元坏死问题:指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新,有两个主要原因导致这种状况发生
(1) 非常不幸的参数初始化,这种情况比较少见
(2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法
为了解决ReLU函数带来的神经元坏死问题 , 提出了将ReLU的前半段设为αx,α通常设为0.01,,另外一种直观的想法是基于参数的方法PReLU函数, α可由方向传播算法学习出来。
ELU也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,以及:(1)不会有神经元坏死现象(2)函数输出均值接近于0
但是ELU的小问题就是计算量稍微有点大。
1、使用不同的激活函数,比如Relu,Leak-Relu,PRelu,elu等激活函数代替sigmoid函数
2、使用Batch Normalizaion(批量归一化)
3、使用残差网络
4、预训练加微调
1、梯度裁剪
2、权重正则化
两个3x3的卷积核的感受野比5x5的卷积核的感受野大,在保持相同感受野的同时,用3x3的卷积核可以提升网络的深度,可以很明显的减少计算量。
1、局部连接
2、权值共享:减小参数量
3、池化操作:增大感受野
4、多层次结构:可以提取low-level以及high-level的信息
1、数据集太小,数据样本不足时,深度学习相对其它机器学习算法,没有明显优势。
2、数据集没有局部相关特性,目前深度学习表现比较好的领域主要是图像/语音/自然语言处理等领域,这些领域的一个共性是局部相关性。图像中像素组成物体,语音信号中音位组合成单词,文本数据中单词组合成句子,这些特征元素的组合一旦被打乱,表示的含义同时也被改变。对于没有这样的局部相关性的数据集,不适于使用深度学习算法进行处理。举个例子:预测一个人的健康状况,相关的参数会有年龄、职业、收入、家庭状况等各种元素,将这些元素打乱,并不会影响相关的结果。
作用 :对输入的特征图进行压缩,
一方面使特征图变小,简化网络计算复杂度;
一方面进行特征压缩,提取主要特征。
通常来讲,max-pooling的效果更好,虽然max-pooling和average-pooling都对数据做了下采样,但是 max-pooling感觉更像是做了特征选择,选出了分类辨识度更好的特征,提供了非线性 。 pooling的主要作用一方面是去掉冗余信息,一方面要保留feature map的特征信息,在分类问题中,我们需要知道的是这张图像有什么object,而不大关心这个object位置在哪,在这种情况下显然max pooling比average pooling更合适。在 网络比较深的地方,特征已经稀疏了,从一块区域里选出最大的,比起这片区域的平均值来,更能把稀疏的特征传递下去 。
average-pooling更强调对整体特征信息进行一层下采样,在减少参数维度的贡献上更大一点,更多的体现在 信息的完整传递这个维度 上,在一个很大很有代表性的模型中,比如说DenseNet中的模块之间的连接大多采用average-pooling,在减少维度的同时,更有利信息传递到下一个模块进行特征提取。
average-pooling在 全局平均池化操作 中应用也比较广,在ResNet和Inception结构中最后一层都使用了平均池化。有的时候在模型接近 分类器的末端使用全局平均池化还可以代替Flatten操作 ,使输入数据变成一位向量。
CNN网络中另外一个不可导的环节就是Pooling池化操作,因为Pooling操作使得feature map的尺寸变化,假如做2×2的池化(步长也为2),假设那么第l+1层的feature map有16个梯度,那么第l层就会有64个梯度,这使得梯度无法对位的进行传播下去。其实解决这个问题的思想也很简单,就是把1个像素的梯度传递给4个像素,但是需要保证传递的loss(或者梯度)总和不变。根据这条原则,mean pooling和max pooling的反向传播也是不同的
mean pooling的前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把 某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变 ,图示如下 :
(2) max pooling
max pooling也要满足梯度之和不变的原则 ,max pooling的前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么 反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0。 所以max pooling操作和mean pooling操作不同点在于需要记录下池化操作时到底哪个像素的值是最大,也就是max id,这个变量就是记录最大值所在位置的,因为在反向传播中要用到,那么假设前向传播和反向传播的过程就如下图所示 :
28、细粒度分类
29、LSTM&RNN
30、解释LSTM结构(相对于RNN)的好处
31、RNN的梯度消失原因和解决办法
32、Object Detection
33、Unet的介绍
34、FCN和Unet的区别
35、RCNN系列的算法流程和区别
36、Fast RCNN中 bbox 回归的损失函数什么
37、解释 ROI Pooling 和 ROI Align
38、Mask RCNN中 mask branch 如何接入 Faster RCNN中
39、解释 FPN
40、解释 ROI Align
41、简述 YOLO 和 SSD
42、简述 Hough 直线检测、Sobel 边缘检测算法流程
43、Mask RCNN中的anchors如何判定为正负样本
44、简述 NMS 算法流程
45、attention起源是用在哪里?pixel还是frame,是soft还是hard
46、anchor的正负样本比是多少
47、算法和激活函数等
48、BN的原理和作用
49、BN层反向传播,怎么求导
50、BN 的作用和缺陷,以及针对batch_size小的情况的改进(GN)
51、BN层,先加BN还是激活,有什么区别
52、手推BP
53、优化算法举例和他们的区别(SGD、SGDM、RMSprop、Adam)
54、随机梯度下降和梯度下降
55、训练不收敛的原因有哪些
56、简述 SVM 流程、核函数寻参及常见的核函数举例
57、batch_size 和 learning rate 的关系(怎么平衡和调整二者)
58、解释过拟合和欠拟合,以及解决方法
59、激活函数有哪些,各自区别
60、损失函数有哪些
61、Sigmoid 和 ReLu 对比(各自优缺点)
62、为什么不用sigmoid而用relu?做出了哪些改进?
63、梯度消失和梯度爆炸的原因和解决方法
64、Precision 和 Recall 的定义
65、精确率高、召回率低是为什么
66、SVM,线性回归和逻辑回归的原理及区别
67、PCA原理,PCA和SVD的区别和联系
68、正则化怎么选择,有哪些方式
69、L1、L2范数,区别
70、boost、Adaboost
71、dropout和batch normalization
72、讲一下决策树和随机森林
73、讲一下GBDT的细节,写出GBDT的目标函数。 GBDT和Adaboost的区别与联系
74、偏差、方差
75、距离度量公式哪些,区别
76、多标签识别怎么做
77、data argumentation怎么处理的
78、数据不均衡怎么处理、只有少量带标签怎么处理
79、权重初始化方法都有哪些
80、权值衰减这个参数怎么设置
81、分类问题有哪些评价指标?每种的适用场景。
82、无监督学习了解哪些
83、图像处理Opencv
84、边缘检测算子有哪些
85、霍夫变换
86、直方图是什么
87、canny算子是怎么做的
88、图像的特征提取有哪些算法,适用范围、优缺点
参考:
https://blog.csdn.net/bluesliuf/article/details/89389117
https://zhuanlan.zhihu.com/p/107279000
https://zhuanlan.zhihu.com/p/56475281
以上是关于AI面试题第二弹(神经网络基础)的主要内容,如果未能解决你的问题,请参考以下文章
研赛数模集训·第二弹《神经网络算法简介& Matlab 实现》线上讲座通知