计算机视觉/图像处理相关面经1

   以下资料均来自于网上公开面经资料,非本人面经,这篇博客里偏深度学习基础,整理以备用…

L1和L2做loss的优缺点

L1 loss优点:L1 loss让loss对于离群点更加鲁棒,即:相比于L2损失函数,其对离群点、异常值(outlier)不敏感,梯度变化相对更小,训练时不容易跑飞;在low level里,L1则可以较好的保持颜色亮度特征,不会过度惩罚两张图的差异,具有更好的收敛属性;
L2 loss优点:在high level里收敛属性更好,在low level里直接match上PSNR指标
两者的优点与缺点是对应的,这里不再赘述缺点;

L1和L2正则化

L1正则化对于所有参数的惩罚力度都一样,可以让一部分权重变为0,因此产生稀疏模型,能够去除某些特征(权重为0)
L2正则化减少了权重固定比例,使权重平滑,L2正则化不会使权重变为0,所有选择了更多的特征
L1正则化的优点是获得sparse的模型,有利于节省空间,并利用稀疏性进行特征选择
L2正则化的优点是实现简单,缺点是无法得到sparse的模型

为什么L1稀疏:
求导之后,L1的导数为-1或者1,因此梯度更新时可以稳步向0推进,而L2 loss则越接近0,梯度值越小。
从几何上看,L1正则表示的是正方形,在坐标轴上的突出的角比直线的边离等值线近,而L2则是一个圆,因此交点不在坐标轴上,所以很难有0值。

反卷积的棋盘格现象

现象:通过神经网络生成的图片,放大了看会有棋盘格的现象
原因:反卷积时,到stride和ksize 不能整除时,就会有这种现象,二维图像的时候更显著
解决方法:1.使用pixel shuffle或者插值上采样的方式;2.在反卷积后加上seperable conv去抑制这种现象

adam、SGD、RMSProp区别

SGD:梯度下降仅与当前梯度有关,但容易陷入局部最优;
SGD momentum:在SGD基础上引入动量惯性的概念,使得梯度方向不变的维度上速度变快,梯度方向有所改变的维度上的更新速度变慢,但是不能进行自适应的参数调节
SGD with Nesterov Acceleration:在计算梯度时,不是在当前位置,而是未来的位置上。因此这里的梯度是跟着累积动量走了一步后的梯度
AdaGrad:引入二阶动量的概念,二阶动量为该维度上迄今为止所有梯度值的平方和,其作用在梯度更新的分母上,使得前期梯度可以放大,后期梯度被收缩,但是到了中后期,分母上梯度平方的累加将会越来越大,使得训练提前结束
RMSprop:解决Adagrad学习率急剧下降的问题,RMSProp改变了二阶动量计算方法,即用窗口滑动加权平均值计算二阶动量。
Adam:Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率,集成了SGD的一阶动量和RMSProp的二阶动量。。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。

为什么分类问题用交叉熵损失而不用均方误差损失

1.损失函数的选择和设计要能表达你希望模型具有的性质与倾向,交叉熵损失函数更加适用于分类问题,而MSE则不仅与要分类的label有关,还与其他项有关,容易得到过于平均的结果;
2.从反向传播的角度看,在使用MSE时,w、b的梯度均与sigmoid函数对自变量z的偏导有关系,而sigmoid函数的偏导在自变量非常大或者非常小时,偏导数的值接近于零,这将导致w、b的梯度将不会变化,也就是出现所谓的梯度消失现象。而使用cross-entropy时,w、b的梯度就不会出现上述的情况。所以MSE不适用于分类问题。

Pooling池化操作的反向梯度传播

实现时保证传递的loss(或者梯度)总和不变。根据这条原则,mean pooling和max pooling的反向传播也是不同的。
mean pooling的前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变,还是比较理解的
max pooling的前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0。所以max pooling操作和mean pooling操作不同点在于需要记录下池化操作时到底哪个像素的值是最大,也就是max id,这个变量就是记录最大值所在位置的,因为在反向传播中要用到

BN为什么防止过拟合呢

同样一个样本的输出不再仅仅取决于样本本身,也取决于跟这个样本属于同一个mini-batch的其它样本。同一个样本跟不同的样本组成一个mini-batch,它们的输出是不同的(仅限于训练阶段,在inference阶段是没有这种情况的)。我把这个理解成一种数据增强:同样一个样本在超平面上被拉扯,每次拉扯的方向的大小均有不同。不同于数据增强的是,这种拉扯是贯穿数据流过神经网络的整个过程的,意味着神经网络每一层的输入都被数据增强处理了。

如何解决梯度消失和梯度爆炸

1.预训练加微调
2.梯度剪切
3.relu、leakrelu、elu等激活函数
4.batch normalization
5.残差结构

sigmoid函数优缺点

优点:从图片上
(1)可以看到sigmoid函数处处连续 ->便于求导;
(2)可以将函数值的范围压缩到[0,1]->可以压缩数据,且幅度不变。
(3)便于前向传输
缺点:(1)在趋向无穷的地方,函数值变化很小,容易缺失梯度,不利于深层神经网络的反馈传输
(2)幂函数还是比较难算的
(3)函数均值不为0,当输出大于0时,则梯度方向将大于0,也就是说接下来的反向运算中将会持续正向更新;同理,当输出小于0时,接下来的方向运算将持续负向更新。

BN和IN

Batch Normalization是指多张图片中的每一张图片的同一个通道一起进行Normalization操作。而Instance Normalization是指单张图片的单个通道单独进行Noramlization操作。
IN一般用于style transfer,因为是对单张图片进行domain adapation

核函数为什么要半正定

核函数的作用是计算两个数据点在另一个高维空间的inner product,而核函数是半正定的话能保证这个高维空间的存在,也就是保证计算得到的核函数的值真的是在某一个空间里的inner product

不同激活函数

Sigmoid函数优点:可以用来做二分类。在特征相差比较复杂或是相差不是特别大时效果比较好。
Sigmoid函数缺点:Sigmoid函数饱和使梯度消失,激活函数计算量大,输出不是零中心的

Relu函数优点:ReLU求导几乎不存在任何计算量,,收敛更快
Relu函数缺点:训练的时候很”脆弱”,很容易就”die”

Tanh函数优点:解决了Sigmoid的输出是不是零中心的问题
Tanh函数缺点:仍然存在饱和问题

LeakyReLu函数:使负轴信息不会全部丢失,解决了ReLU神经元“死掉”的问题

MobileNet为什么在CPU上速度不快

简单的说就是,MobileNet在GPU上达不到GPU计算强度的上限,内存交换速度(带宽)成为了瓶颈。在CPU上可以MobileNet可以达到上限,所以mobilenet在cpu上会有优势。mobilenet 就是利用了分离的技巧,用更多的层数换取了更高的缓存命中率,所以对 CPU 计算更友好。

im2col

padding=1时矩阵是如何变化的

当filter的中心(K)与image的边角重合时,开始做卷积运算

GAN不收敛和模式崩溃

生成对抗神经网络训练不稳定有如下三点原因:
1.很难使一对模型(G和D同时)收敛,有时候博弈双方虽然最终达到了均衡,但双方在不断的抵消对方的进步并没有使双方同时达到一个有用的地方。对所有模型同时梯度下降使得某些模型收敛但不是所有模型都达到收敛最优。
2.生成器G发生模式崩溃:对于不同的输入生成相似的样本,最坏的情况仅生成一个单独的样本,判别器的学习会拒绝这些相似甚至相同的单一样本。
3.生成器梯度消失问题:当判别器非常准确时,判别器的损失很快收敛到0,从而无法提供可靠的路径使生成器的梯度继续更新,造成生成器梯度消失。

解决方法:
1.探索新的网络架构:如CGAN
2.引入新的损失函数:如WGAN-GP

Inception模块作用

V1:增加了网络的宽度,增加了网生成器梯度消失问题:当判别器非常准确时,判别器的损失很快收敛到0,从而无法提供可靠的路径使生成器的梯度继续更新,造成生成器梯度消失。络对尺度的适应性,不同的支路的感受野是不同的,所以有多尺度的信息在里面。
V2:加入了BN层,使每一层都规范化到一个N(0,1)的高斯,另一方面学习VGG使用2个3x3cobv代替inception模块中的5x5,降参,加速计算。
V3:分解,将 7x7分解成1x7和7x1,加速计算,加深网络,增加网络非线性。

BN和dropout混用

当网络从训练转为测试时,Dropout 可以通过其随机失活保留率(即 p)来缩放响应,并在学习中改变神经元的方差,而 BN 仍然维持 X 的统计滑动方差。这种方差不匹配可能导致数值不稳定(见下图中的红色曲线)。而随着网络越来越深,最终预测的数值偏差可能会累计,从而降低系统的性能

卷积层为什么不使用dropout?

dropout对卷积层的效果没那么好。原因可能在于卷积层中的激活单元是空间关联的,使用 dropout 后信息仍然能够通过卷积网络传输。drop out是用来防止过拟合的过多参数才会容易过拟合

不同卷积感受野计算

参考:https://zhuanlan.zhihu.com/p/56940729
https://www.cnblogs.com/shine-lee/p/12069176.html

loss不收敛的原因

没有对数据进行归一化
忘记检查输入和输出
没有对数据进行预处理
没有对数据正则化
使用过大的样本
使用不正确的学习率
在输出层使用错误的激活函数
网络中包含坏梯度
初始化权重错误
过深的网络
隐藏单元数量错误

不同网络的梯度反传

网络初始化

https://www.datalearner.com/blog/1051561108849107

感受野计算

https://www.cnblogs.com/shine-lee/p/12069176.html
https://zhuanlan.zhihu.com/p/56940729

BN反向传播

https://blog.csdn.net/yuechuen/article/details/71502503

0%