点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
作者:陈恩加
https://zhuanlan.zhihu.com/p/48374690
本文已由作者授权转载,禁二次转载
【导读】实习加秋招忙的要死,今年算法又难找真是让人透心凉。贴一些自己平时整理的知识点,有点凌乱,以后有新的会接着补充。部分截图或文字也许来自平时看过他人博客过后的总结,侵删。
1、dropout的原理:
可以把dropout看成是 一种ensemble方法,每次做完dropout相当于从原网络中找到一个更瘦的网络
强迫神经元和其他随机挑选出来的神经元共同工作,减弱了神经元节点间的联合适应性,增强泛化能力
使用dropout得到更多的局部簇,同等数据下,簇变多了,因而区分性变大,稀疏性也更大
2、维数灾难:
高维空间训练得到的分类器相当于低维空间的一个复杂非线性分类器,这类分类器容易产生过拟合
如果一直增加维度,原有的数据样本会越来越稀疏,要避免过拟合就需要不断增加样本
数据的稀疏性使得数据的分布在空间上是不同的,在高维空间的中心比边缘区域具有更大的稀疏性(举例,正方体和内切圆到超立方体和超球面,随着维度趋于无穷,超球面体积趋向于0而超立方体体积永远是1)
3、伪标签技术:
将test数据集中的数据加入到train数据集中,其对应的标签为基于原有数据集训练好的模型预测得到的
伪标签技术在一定程度上起到一种正则化的作用。如果训练开始就直接使用该技术,则网络可能会有过拟合风险,但是如果经过几轮训练迭代后(只是用原有训练集数据)将训练集和未打标签的数据一起进行训练,则会提升网络的泛化能力
操作过程中一般每个batch中的1/4到1/3的数据为伪标签数据
4、为什么SSD对小目标检测效果不好:
小目标对应的anchor比较少,其对应的feature map上的pixel难以得到训练,这也是为什么SSD在augmentation之后精确度上涨(因为crop之后小目标就变为大目标)
要检测小目标需要足够大的feature map来提供精确特征,同时也需要足够的语义信息来与背景作区分
5、Xception,ResNext和ShuffleNet:
ResNext中,作者提到cardinality的概念,表示对通道进行分组
Xception中,卷积对每一个通道进行单独计算,也就是cardinality等于通道数,如果有N维通道输出,那么Cardinality就等于N(depth-wise separable convolution)
group convolution的优点:卷积操作把所有的通道信息考虑在内,可能是一种信息浪费,卷积参数有限,产生的结构难免会有一定相关性,有可能造成过拟合(类似于全连接层)
ShuffleNet就对group conv后的通道进行交换,得到更加均匀融合后的通道
6、绘制ROC的标准和快速方法以及ROC对比PR曲线的优势:
标准方法:横坐标为FPR, 纵坐标为TPR, 设置一个区分正负预测结果的阈值并进行动态调整,从最高得分(实际上是正无穷)开始逐渐下降,描出每个阈值对应的点最后连接
快速方法:根据样本标签统计出正负样本数,将坐标轴根据样本数进行单位分割,根据模型预测结果将样本进行排序后,从高到低遍历样本,每遇到一个正样本就沿纵轴方向绘制一个单位长度的曲线,反之则沿横轴,直到遍历完成
PR曲线的横坐标是Recall,纵坐标是Precision,相对于PR曲线来说,当正负样本发生剧烈变化时,ROC曲线的形状能够基本保持不变,而PR曲线的形状会发生剧烈改变
7、核函数
核函数并不是一种映射,它只是用来计算映射到高维空间后数据内积的一种方法
在低维空间中线性不可分的数据集在高维空间中存在线性可分的超平面(这点可以和维数灾难中高维空间形成的分类器相当于低维空间中一个非常复杂的非线性分类器产生过拟合联系起来),但在特征空间中仍要计算内积,因此在原计算式子中代入的不再是x而是φ(x)。计算核函数K时不需要知道具体φ(x)的定义和计算过程。核函数定义为(满足一定条件)
K(x1, x2) = φ(x1)'φ(x2)
8、L0、L1和L2范数:
L0范数:很难优化求解(NP难问题)
L1范数:是L0的最优凸近似(L1是L0的最紧的凸放松),且具有特征自动选择和使得模型更具解释性的优点
L2范数:使得权重接近于0但是不等于0,有利于处理条件数不好情况下矩阵求逆问题(条件数用来衡量病态问题的可信度,也就是当输入发生微小变化的时候,输出会发生多大变化,即系统对微小变动的敏感度,条件数小的就是well-conditioned的,大的就是ill-conditioned的),对于线性回归来说,如果加上L2规则项,原有对XTX(转置)求逆就变为可能,而目标函数收敛速率的上界实际上是和矩阵XTX的条件数有关,XTX的 condition number 越小,上界就越小,也就是收敛速度会越快;另外从优化的角度来看,加入规则项实际上是将目标函数变成λ强凸,这样可以保证函数在任意一点都存在一个非常漂亮的二次函数下界,从而能通过梯度更快找到近似解。总结就是:L2范数不但可以防止过拟合,还可以让我们的优化求解变得稳定和快速。
![7f21da3735f5322c930b1c275d0257fd.jpeg](https://img-blog.csdnimg.cn/img_convert/7f21da3735f5322c930b1c275d0257fd.jpeg)
9、逆卷积(或者叫转置卷积)的实质:
一般的卷积运算可以看成是一个其中非零元素为权重的稀疏矩阵C与输入的图像进行矩阵相乘,反向传播时的运算实质为C的转置与loss对输出y的导数矩阵的矩阵相乘
逆卷积的运算过程与卷积正好相反,是正向传播时做成C的转置,反向传播时左成C
10、空洞卷积及其优点:
pooling操作虽然能增大感受野,但是会丢失一些信息。空洞卷积在卷积核中插入权重为0的值,因此每次卷积中会skip掉一些像素点
空洞卷积增大了卷积输出每个点的感受野,并且不像pooling会丢失信息,在图像需要全局信息或者需要较长sequence依赖的语音序列问题上有着较广泛的应用
11、Fast RCNN中位置损失为何使用Smooth L1:
表达式为:
![075ab02c09d362a712a8dce1e2837952.jpeg](https://img-blog.csdnimg.cn/img_convert/075ab02c09d362a712a8dce1e2837952.jpeg)
作者这样设置的目的是想让loss对于离群点更加鲁棒,相比于L2损失函数,其对离群点、异常值(outlier)不敏感,可控制梯度的量级使训练时不容易跑飞
12、Batch Normalization:
使用BN的原因是网络训练中每一层不断改变的参数会导致后续每一层输入的分布发生变化,而学习的过程又要使每一层去适应输入的分布,因此不得不降低网络的学习率,并且要小心得初始化(internal covariant shift)
如果仅通过归一化方法使得数据具有零均值和单位方差,则会降低层的表达能力(如使用Sigmoid函数时,只使用线性区域)
BN的具体过程(注意第三个公式中分母要加上epsilon)
![ff5ac271010198781ae03f04dc79a412.jpeg](https://img-blog.csdnimg.cn/img_convert/ff5ac271010198781ae03f04dc79a412.jpeg)
注意点:在测试过程中使用的均值和方差已经不是某一个batch的了,而是针对整个数据集而言。因此,在训练过程中除了正常的前向传播和反向求导之外,我们还要记录每一个Batch的均值和方差,以便训练完成之后按照下式计算整体的均值和方差
另一个注意点:在arxiv六月份的preprint论文中,有一篇叫做“How Does Batch Normalization Help Optimization?”的文章,里面提到BN起作用的真正原因和改变输入的分布从而产生稳定性几乎没有什么关系,真正的原因是BN使对应优化问题的landscape变得更加平稳,这就保证了更加predictive的梯度以及可以使用更加大的学习率从而使网络更快收敛,而且不止BN可以产生这种影响,许多正则化技巧都有这种类似影响
13、Dual Path Network:
ResNet结构通过跨层参数共享和保留中间特征的方式,有效较低特征冗余度,重复利用已有特征,但难以利用高层信息再发掘低层特征
DenseNet每一层都重新在之前所有层的输出中重新提取有用信息,可以有效利用高层信息再次发掘底层新特征,但存在特征冗余
DPN网络可以理解为在ResNeXt的基础上引入了DenseNet的核心内容,使得模型对特征的利用更加充分
14、超参数搜索方法:
网格搜索:在所有候选的参数选择中,通过循环遍历,尝试每一种可能性,表现最好的参数就是最终的结果
贝叶斯优化:贝叶斯优化其实就是在函数方程不知的情况下根据已有的采样点预估函数最大值的一个算法。该算法假设函数符合高斯过程(GP)
随机搜索:已经发现,简单地对参数设置进行固定次数的随机搜索,比在穷举搜索中的高维空间更有效。这是因为事实证明,一些超参数不通过特征变换的方式把低维空间转换到高维空间,而在低维空间不可分的数据,到高维空间中线性可分的几率会高一些。具体方法:核函数,如:高斯核,多项式核等等。
基于梯度:计算相对于超参数的梯度,然后使用梯度下降优化超参数。
15、LR如何解决低维不可分问题:
通过特征变换的方式把低维空间转换到高维空间,而在低维空间不可分的数据,到高维空间中线性可分的几率会高一些。具体方法:核函数,如:高斯核,多项式核等等
16、Boosting和Bagging:
Boosting主要思想是将一族弱学习器提升为强学习器的方法,具体原理为:先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,来训练下一个基学习器,如此重复进行直至学习器数目达到了事先要求,最终进行学习器的加权结合
Bagging是并行式集成学习方法最著名的代表,具体做法是对样本进行有放回的采样,然后基于每个采样训练集得到一个基学习器,再将它们进行组合。在预测时,对于分类任务通常使用简单投票法,对回归任务使用简单平均法
17、梯度下降和牛顿法的区别:
梯度下降公式如下
牛顿法公式如下,其中H为海塞矩阵,其实就是目标函数对参数θ的二阶导数。只适用于Hessian矩阵是正定的情况
![ad9dc74ff1b8d1f619bad41c4ee0f992.jpeg](https://img-blog.csdnimg.cn/img_convert/ad9dc74ff1b8d1f619bad41c4ee0f992.jpeg)
牛顿法:二阶优化,收敛速度较快,需要更新一个二阶矩阵(计算代价大),对初始值有一定要要求,在非凸优化过程中容易陷入鞍点。
梯度下降法:一阶优化,收敛速度较慢,容易逃离鞍点,优化过程中需要进行步长调整
18、DenseNet的要点:
由于前后层之间的Identity function,有效解决了梯度消失问题,并且强化了特征的重用和传播
相比ResNet输出通过相加的方式结合从而阻碍信息的传播,DN通过串联方式结合
串联要求特征图大小一致,故把pooling操作放在transition layer中
为防止靠后的串联层输入通道过多,引入bottleneck layer,即1x1卷积。文中把引入bottleneck layer的网络成为DenseNet-B
在transition layer中进一步压缩通道个数的网络成为DN-C(输入m个通道,则输出θm个通道,0<θ≤1)。同时包含bottleneck layer的和压缩过程的网络称为DN-BC
(以下网址是一些我觉得非常赞的文章,以目标检测为主)
19、关于Faster RCNN一篇非常精彩的博文解说,来自troy labs团队:
tryolabs.com/blog/2018/
20、关于one-shot目标检测原理一篇非常精彩的综述博文(不过文章真的很长很长...................)
machinethink.net/blog/o
21、关于目标检测的几篇博文(来自Medium一位我很喜欢的大叔,名字叫
Jonathan Hui,目测应该是华人,目前有1.6k的followers)
Region based类型:medium.com/@jonathan_hu
one-shot类型:medium.com/@jonathan_hu
YOLO各个版本:medium.com/@jonathan_hu
22、关于YOLO的一份PPT,解说非常生动形象(不过是针对v1老版本的)
docs.google.com/present
23、常见激活函数特点
sigmoid:输入值很大时对应的函数值接近1或0,处于函数的饱和区,导致梯度几乎为0,造成梯度消失问题
Relu:解决梯度消失问题,但是会出现dying relu现象,即训练过程中,有些神经元实际上已经"死亡“而不再输出任何数值
Leaky Relu:f = max(αx, x),解决dying relu问题,α的取值较大时比较小时的效果更好。它有一个衍生函数,parametric Leaky Relu,在该函数中α是需要去学习的
ELU:避免dying神经元,并且处处连续,从而加速SGD,但是计算比较复杂
激活函数的选择顺序:ELU>Leaky Relu及其变体>Relu>tanh>sigmoid
24、Softmax交叉熵损失
使用交叉熵损失的原因是它求导结果简单,易于计算,最后结果中Softmax损失函数对应于每一项概率的偏导即为通过Softmax计算出的概率向量中对应真正结果的那一维减1。比如通过若干层计算,最后得到某个训练样本对应的分类得分为[1, 5, 3],那么通过Softmax计算得到概率分别为[0.015, 0.886, 0.117],假设样本正确的分类为第二类,则对应每项的偏导为[0.015, 0.886-1, 0.117],根据这个向量就可以进行反向传播了
25、mean pooling和max pooling的反向传播
主要原则是需要保证传递的loss(或者梯度)总和不变。
mean pooling的前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变
![152ee4cf70352fc3c57772638d107992.jpeg](https://img-blog.csdnimg.cn/img_convert/152ee4cf70352fc3c57772638d107992.jpeg)
max pooling的前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0。max pooling操作和mean pooling操作不同点在于需要记录下池化操作时到底哪个像素的值是最大,也就是max id,这个变量就是记录最大值所在位置的,因为在反向传播中要用到
26、如何理解卷积、池化等、全连接层等操作:
卷积的作用:捕获图像相邻像素的依赖性;起到类似滤波器的作用,得到不同形态的feature map
激活函数的作用:引入非线性因素,
池化的作用:减少特征维度大小,使特征更加可控;减少参数个数,从而控制过拟合程度;增加网络对略微变换后的图像的鲁棒性;达到一种尺度不变性,即无论物体在图像中哪个方位均可以被检测到
27、1x1大小的卷积核的作用
通过控制卷积核个数实现升维或者降维,从而减少模型参数
对不同特征进行归一化操作
用于不同channel上特征的融合
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~