[CV]一些关于计算机视觉面试题的整理

6 篇文章 0 订阅
4 篇文章 2 订阅
  •  Batchnormalization

批量标准化

深度学习有个本质性的问题:随着网络深度加深,训练起来困难,本质是反向传播的时候梯度消失。

比如我们看sigmoid函数

        
​​​图源百度百科

显而易见的就是在大于4的时候,函数已经变化非常平缓了,也就是再训练下去就要梯度消失了。在训练的时候,非线性映射后,特征数据会逐渐向激活函数的输出区间的上下两端靠近,此时BN就是对这些逐渐向饱和区冲过去的数据拉回来。拉回到均值为0,方差为1的正态分布。使得输入神经元的数据可以进入到激活函数比较敏感的区域。

那BN又要怎么做呢

步骤如下

 先求这一批数据的均值,然后求出方差,将其标准化,最后再做一个扩展和平移。扩展和平移的参数\gamma 和 \beta 是网络学习得到的。

我一直不是很明白这个\gamma 和 \beta 的作用。

有人这样说:会与其他待训练参数一同被训练化,使标准正态分布后的特征数据通过缩放因子和偏移因子,优化了特征数据分布的宽窄和偏移量。保证了网络的非线性表达力(如果不加入这两个参数,相当于这一层所学习的特征分布被搞坏了)。

也有人这样说:scale、shift是两个独立的参数,也即和数据是没有依赖关系的,它们完全有可能将BN的作用给抵消掉,然而这恰好也是这个方法的优势,可以根据具体情况由网络自身在训练过程中来决定需不需要BN。

还有人这样说:原来这是为了让神经网络自己去学着使用和修改这个扩展参数 gamma, 和 平移参数 β, 这样神经网络就能自己慢慢琢磨出前面的 normalization 操作到底有没有起到优化的作用, 如果没有起到作用, 我就使用 gamma 和 beta来抵消一些 normalization 的操作。

可能最后一个好理解一点。但还是有点模糊。

接下来 面试时候可能会问到关于BN的哪些问题呢?

BN训练和测试时的参数是一样的嘛?

对于BN,在训练时,是对每一批的训练数据进行归一化,也即用每一批数据的均值和方差。而在测试时,比如进行一个样本的预测,就并没有batch的概念,因此,这个时候用的均值和方差是全量训练数据的均值和方差,这个可以通过移动平均法求得。当一个模型训练完成之后,它的所有参数都确定了,包括均值和方差。

BN训练时为什么不用全量训练集的均值和方差呢?

因为用全量训练集的均值和方差容易过拟合,对于BN,其实就是对每一批数据进行归一化到一个相同的分布,而每一批数据的均值和方差会有一定的差别,而不是用固定的值,这个差别实际上能够增加模型的鲁棒性,也会在一定程度上减少过拟合。

也正是因此,BN一般要求将训练集完全打乱,并用一个较大的batch值,否则,一个batch的数据无法较好得代表训练集的分布,会影响模型训练的效果。

BN的偏移量和缩放量怎么算?有什么用?

怎么算?没找到

有什么用,上面有提到。再补充一点点...

补偿网络的非线性表达能力。

为什么BN层一般用在线性层和卷积层后面,而不是放在非线性单元后

因为非线性单元的输出分布形状会在训练过程中变化,归一化无法消除他的方差偏移,相反的,全连接和卷积层的输出一般是一个对称,非稀疏的一个分布,更加类似高斯分布,对他们进行归一化会产生更加稳定的分布。其实想想也是的,像relu这样的激活函数,如果你输入的数据是一个高斯分布,经过他变换出来的数据能是一个什么形状?小于0的被抑制了,也就是分布小于0的部分直接变成0了,这样不是很高斯了。

BN的计算量

FLOPs = 2 * C * W * H

C是通道数 W H 是输入特征图宽和高的分辨率

实际应用中往往将BatchNormalization层合并到卷积层,而不单独考虑其计算量。

BN的参数量

一个BatchNormalization层涉及到的参数包含在四个矩阵(向量)中,分别是gamma, beta, moving_mean, moving_variance,这四个矩阵的元素数都是相同的,即等于输入个数(或者输入通道数),其中一半是可训练的,而另一半是不需要训练的。

BN的反向传播公式推导(我感觉我这缺失一点顺序逻辑)

修正带是给我涂的烂烂的😅

参考:什么是 Batch normalization_一碗风的博客-CSDN博客_batchnormalization

什么是批标准化 (Batch Normalization) - 知乎

Batch Normalization(批标准化,BN)_mb5fdb09c3c3319的技术博客_51CTO博客

还有很多参考有遗漏。如有冒犯。私信来骂我哈。我改~

  • 再浅提一口layernomalization

LN BN区别

LN是和BN非常近似的一种归一化方法,不同的是BN取的是不同样本的同一个特征,而LN取的是同一个样本的不同特征。在BN和LN都能使用的场景中,BN的效果一般优于LN,原因是基于不同数据,同一特征得到的归一化特征更不容易损失信息。

但是有些场景是不能使用BN的,例如batchsize较小或者在RNN中,这时候可以选择使用LN,LN得到的模型更稳定且起到正则化的作用。RNN能应用到小批量和RNN中是因为LN的归一化统计量的计算是和batchsize没有关系的。

 图源 见水印哈

  • padding的作用

防止图像的边界信息丢失

缩小图像

same => 输出 = 输入 / 步长 (向上取整)

valid =>  输出 = (输入 – 滤波器大小 + 1) / 步长 (向上取整)

  • pooling池化层的作用

相当于是把某一个区域当作水池,挑出这个水池中的代表性特征。

下采样

降维 去除冗余信息 对特征进行压缩 降低网络复杂度 减少计算量

扩大感知野。

实现不变性 包括平移不变性 / 旋转不变性 / 尺度不变性(我不理解)

防止过拟合

  • Embedding

一个函数映射的过程

把高维数据投到低维的过程

具体后续补充....

  • 激活函数

softmax(多分类网络输出)

s_i = \frac{e^i}{\sum_{j}e_j}

把输出结果归一化,映射到(0,1)且会满足概率性质。相当于最后是输出概率最大值。

sigmoid(常用于二分类)

函数对称性好。超出一定范围就会不敏感。

sigmoid(x) = \frac{1}{1 + e^{-x}}

tanh

与sigmoid曲线相近,两个函数输入很大或者很小的时候梯度几乎消失。输出区间在(-1, 1),函数以0为中心,比sigmoid好。

tanh(x) = \frac{sinh(x)}{cosh(x)} = \frac{e^x-e^{-x}}{e^x + e^{-x}}

图源 忘记了...

relu

f(x) = max(0, x)

优点 => 相比于tanh sigmod克服了梯度消失的问题。

缺点 => 负数完全不激活 / 输出要么是0 要么是正数 完全不对称

它不可微为什么还可以做激活函数?

首先确定relu数学上来讲不可微的,提供伪梯度使其可分,faux gradient是伪梯度,使得在0值不可分;这里讲到了本质,反馈神经网络正常工作需要的条件就是每一个点提供一个方向,即导数;0值不可微,本质上来说是因为这个地方可画多条切线,但我们需要的只是一条;由于这出现的0值的概率极低,任意选择一个子梯度就OK了,在0处的次微分集合是[0,1];即选择其中一个就OK了;一般默认是0;

 Leakly relu

f(x) = max(ax, x)

a=0.01时是leaklyrelu函数。修正数据分布,保留负轴的值。

  • 正则化

概念:是对学习算法的修改,为了减少泛化误差而不是训练误差。另外一个名字叫惩罚项。一个东西超出了限制,就需要一些东西来制约。

深度学习里的正则化的方法

L1, L2 正则化

dropout

早停止法

数据(图像)增强

剪切、旋转/反射/翻转变换、缩放变换、平移变换、尺度变换、对比度变换、噪声扰动、颜色变换。

正则化后会导致参数稀疏,一个好处是可以简化模型,避免过拟合。因为一个模型中真正重要的参数可能并不多,如果考虑所有的参数起作用,那么可以对训练数据可以预测的很好,但是对测试数据就只能常可能产生过拟合了。 另一个好处是参数变少可以使整个模型获得更好的可解释性。且参数越小,模型就会越简单,这是因为越复杂的模型,越是会尝试对所有的样本进行拟合,甚至包括一些异常样本点,这就容易造成在较小的区间里预测值产生较大的波动,这种较大的波动也反映了在这个区间里的导数很大,而只有较大的参数值才能产生较大的导数。因此复杂的模型,其参数值会比较大。

  • 训练的一些问题

前导基础知识

“偏差-方差分解”(bias-variance decomposition) 是解释学习算法泛化性能的一种重要工具。

泛化误差可分解为偏差、方差与噪声,泛化性能是由学习算法的能力、数据的充分性以及学习任务本身的难度所共同决定的。

偏差:度量了学习算法的期望预测与真实结果的偏离程度,即刻画了学习算法本身的拟合能力 方差:度量了同样大小的训练集的变动所导致的学习性能的变化,即刻画了数据扰动所造成的影响 噪声:表达了在当前任务上任何学习算法所能够达到的期望泛化误差的下界,即刻画了学习问题本身的难度。 那么偏差、方差与我们的数据集划分到底有什么关系呢?

1、训练集的错误率较小,而验证集/测试集的错误率较大,说明模型存在较大方差,可能出现了过拟合 2、训练集和测试集的错误率都较大,且两者相近,说明模型存在较大偏差,可能出现了欠拟合 3、训练集和测试集的错误率都较小,且两者相近,说明方差和偏差都较小,这个模型效果比较好。

过拟合 ⇒ (高方差)

  1. 可能是因为模型参数量过大 / 模型过于复杂

  2. 训练集过于noisy 加入了太多噪声

  3. 不是很相关的关系和变量加到了模型里

如何解决过拟合 ⇒

  1. 减少数据集里的噪声,是否做好了data clean
  2. 可以使用更多的训练数据反复验证
  3. 使模型变简单 减少参数 减少变量
  4. 正则化

欠拟合 ⇒ (高偏差)

  1. 训练样本过少
  2. 模型过于简单
  3. 增加训练时间

解决办法 ⇒

  1. 增加特征维度
  2. 增加训练样本的数据

  • Separable Convolution卷积核操作

正常卷积如下图

图源wuhu四海

 可以看到正常的卷积是每一个卷积核操作所有图片的通道。

Google的Xception 和 MobileNet均有描述separable convolution可分为两步操作,depthwise convlution和pointwise convlution。

depthwise convlution

具体如下图

 相当于是图片的每一个通道与一层的卷积核相互作用。

生成的特征图的数量完全与输入的图的通道数相同。

但其他它没有有效的利用不同map在相同空间位置上的信息。

于是我们还需要一个pointwise convlution

Pointwise convolution

 每幅图片都给一个深度与图片通道数相同,1*1的卷积核相作用,生成新的特征图。

不难发现这俩组合比常规卷积核操作参数量小了很多。具体计算可见参考文章。

参考:卷积神经网络中的Separable Convolution

但据说更耗时😅为什么depthwise convolution 比 convolution更加耗时?_文尹习习的博客-CSDN博客

啊啊啊啊啊我只是大自然的搬运工。。好多东西没写出处。。。有问题滴滴我。。。

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值