机器学习、深度学习 面经(未完待更)

ML、DL 面经

  • ML
    • Q. 交叉熵公式
    • Q.为什么决策树之前用PCA会好一点
    • Q. 如何解决过拟合?(字节)
    • Q. SVM推导
    • Q. SVM如果不用对偶怎么做?(字节)
    • Q. GDBT,XGB,LGB之间的区别和联系(字节)
  • DL
    • Q. 神经网络为啥不用拟牛顿法而是用梯度下降?(为什么深度学习不用二阶的优化算法?)
    • Q. 激活函数比较(字节)
  • CV
    • Q. 在视频推荐这个领域能不能用上embedding的思想,如果可以,要怎么构建和训练模型?(字节)
    • Q. 池化有哪些方法,分别用在什么场景下?(字节)
    • Q. BN 的原理(字节)
    • Q. BN为什么防止过拟合呢?
    • Q. Fast RCNN(字节)
    • Q. 比较one-stage / two_stage的目标检测(字节)
    • Q. 卷积层的参数量(字节)
    • Q. Pooling 的反向传播(字节)
    • Q. 介绍一下常用的backbone(字节)
    • Q. RoI Pooling 和 RoI Align, 怎么做插值,写插值公式(字节)
  • NLP
    • Q. word2vec两个模型的损失函数是什么?(字节)
  • 概率题
    • Q. 1-7的随机数等概率生成器,怎么等概率的生成1-5的整数?(字节)
    • Q. 圆环上随机取3个点组成一个锐角三角形的概率(字节)

ML

Q. 交叉熵公式

交叉熵主要用于度量两个概率分布间的差异性信息。

在信息论中,交叉熵是表示两个概率分布p,q,其中p表示真实分布,q表示非真实分布。在相同的一组事件中,用非真实分布q来表示某个事件发生所需要的平均比特数。从这个定义中,我们很难理解交叉熵的定义。下面举个例子来描述一下:

假设现在有一个样本集中两个概率分布p,q,其中p为真实分布,q为非真实分布。假如,按照真实分布p来衡量识别一个样本所需要的编码长度的期望为:

H ( p ) = ∑ i p i ⋅ l o g ( 1 / p i ) H(p) = \sum_i p_i \cdot log(1/p_i) H(p)=ipilog(1/pi)

但是,如果采用错误的分布q来表示来自真实分布p的平均编码长度,则应该是:

H ( p , q ) = ∑ i p i ⋅ l o g ( 1 / q i ) H(p,q) = \sum_i p_i \cdot log(1/q_i) H(p,q)=ipilog(1/qi)

此时就将 H ( p , q ) H(p,q) H(p,q)称之为交叉熵

交叉熵的计算方式如下:

H ( p , q ) = ∑ i p i ⋅ l o g ( 1 / q i ) H(p,q) = \sum_i p_i \cdot log(1/q_i) H(p,q)=ipilog(1/qi) (离散)

H ( p , q ) = − ∫ x p ( x ) l o g q ( x ) d x = E p [ − l o g Q ] H(p,q) = -\int_x p(x)logq(x)dx = E_p[-logQ] H(p,q)=xp(x)logq(x)dx=Ep[logQ] (连续)

应用

交叉熵可在神经网络(机器学习)中作为损失函数,p表示真实标记的分布,q则为训练后的模型的预测标记分布,交叉熵损失函数可以衡量p与q的相似性。

在特征工程中,可以用来衡量两个随机变量之间的相似度。

将交叉熵引入计算语言学消岐领域,采用语句的真实语义作为交叉熵的训练集的先验信息,将机器翻译的语义作为测试集后验信息。计算两者的交叉熵,并以交叉熵指导对歧义的辨识和消除。

相对熵与交叉熵

相对熵也成为KL散度,定义为

D K L ( p ∣ ∣ q ) = ∑ x p ( x ) l o g p ( x ) q ( x ) = − ∑ x p ( x ) l o g q ( x ) − ( − ∑ x p ( x ) l o g p ( x ) ) = H ( p , q ) − H ( p ) D_{KL}(p||q) = \sum_xp(x)log\frac{p(x)}{q(x)} \\ = -\sum_x p(x)logq(x) - (-\sum_x p(x)logp(x)) \\ =H(p, q) - H(p) DKL(pq)=xp(x)logq(x)p(x)=xp(x)logq(x)(xp(x)logp(x))=H(p,q)H(p)

在机器学习中,训练数据的分布已经固定下来,那么真实分布的熵 H ( p ) H(p) H(p)是一个定值,最小化相对熵等价于最小化交叉熵

Q.为什么决策树之前用PCA会好一点

考虑下图中的大量数据点。如果要求我们画出一条直线,这条线要尽可能覆盖这些点, 那么最长的线可能是哪条?在上图中 , 3条直线中B 最长 。在PCA中,我们对数据的坐标进行了旋转,该旋转的过程取决于数据的本身。第一条坐标轴旋转到覆盖数据的最大方差位置,即图中的直线B 。数据的最大方差给出了数据的最重要的信息。
机器学习、深度学习 面经(未完待更)_第1张图片

在选择了覆盖数据最大差异性的坐标轴之后,我们选择了第二条坐标轴。假如该坐标轴与第一条坐标轴垂直, 它就是覆盖数据次大差异性的坐标轴。这里更严谨的说法就是正交(orthogonal)。在上图中, 直线 C 就是第二条坐标轴。利用PCA,我们将数据坐标轴旋转至数据角度上的那些最重要的方向。

我们已经实现了坐标轴的旋转,接下来开始讨论降维。 坐标轴的旋转并没有减少数据的维度。
机器学习、深度学习 面经(未完待更)_第2张图片
考虑上图中的3个不同的类别,如果使用决策树区分这3个类别。决策树每次都是基于一个特征来做决策的。我们会发现,在 x 轴上可以找到一些值,这些值能够很好地将这3个类别分开。这 样 ,我们就可能得到一些规则,比 如 当 x < -6 时 ,数据属于类别0

Q. 如何解决过拟合?(字节)

我们先说为什么会出现过拟合?一是数据集太小,而是模型复杂度过高。因此解决思路如下:

(1)正则化

在损失函数中加入正则项来惩罚模型参数,以此降低模型的复杂度。

L1正则化就是在loss function后面加上L1范数( C ∣ ∣ w ∣ ∣ 1 C||w||_1 Cw1),加上L1范数容易得到稀疏解(0比较多)

L2正则化就是在loss function后面加上L2范数的平方( C ∣ ∣ w ∣ ∣ 2 2 C||w||_2^2 Cw22),加上L2范数会使对模型贡献不大的特征所对应的参数的值趋于0,以此来降低模型的复杂度

(2)剪枝处理

剪枝是决策树中一种控制过拟合的方法,分为预剪枝和后剪枝

(3)Bagging、Boosting

Bagging、Boosting是ML中常见的集成方法,多个模型的组合可以弱化每个模型中的异常点的影响,保留模型之间的通性,弱化单个模型的特性

(4)权值贡献

权值共享最常见与CNN中,旨在减小模型中的参数,同时减少计算量

(5)BN(batch normalization)

也是常见于CNN中,让大型卷积网络快速收敛的同时提高了分类的准确率

(6)Dropout

Dropout常见于DL中

Q. SVM推导

机器学习、深度学习 面经(未完待更)_第3张图片
机器学习、深度学习 面经(未完待更)_第4张图片
机器学习、深度学习 面经(未完待更)_第5张图片
机器学习、深度学习 面经(未完待更)_第6张图片
机器学习、深度学习 面经(未完待更)_第7张图片
机器学习、深度学习 面经(未完待更)_第8张图片
机器学习、深度学习 面经(未完待更)_第9张图片

Q. SVM如果不用对偶怎么做?(字节)

首先要说明的是,SVM本质上是凸二次规划问题,即QP问题。而针对QP问题,Python有封装好的包可以用叫做CVXOPT。另外也有一些用牛顿法和拟牛顿法求解的。也就是说SVM并不是一定就只有对偶解法。

那么我们可以选用其他的方法求解吗?

可以。对于 w w w b b b这两个参数,它们是和数据的维度相关的,而将原问题转换成对偶问题并不会降低求解的时间复杂度。因此,并不是一定都要利用对偶求解。

在低维的时候,对偶求解和直接求解没有显著的速度优势,所以对于原问题可以利用Python的liblinear求解,而liblinear对于原问题采用 trust region newton method(TRON)进行优化。

在高维的时候,将原问题的 w w w b b b的求解转变为对 λ \lambda λ的求解,而 λ \lambda λ的求解则是与维度完全无关的问题,只和样本相关,所以对于高维但样本量有限的数据集,直接
转化为对偶问题进行求解是合适的。另外,引入对偶的最关键的一个优势是对偶问题中出现了 x i x_i xi x j x_j xj的内积 ( x i ⋅ x j ) (x_i\cdot x_j) (xixj),内积方便引入核函数。为什么呢?因为核函数的本质就是高维空间中两个向量的内积。

Q. GDBT,XGB,LGB之间的区别和联系(字节)

  • lightgbm,xgboost,gbdt的区别与联系
  • 机器不学习:机器学习时代三大神器GBDT、XGBoost、LightGBM
  • GBDT、Xgboost、LightGBM对比,异同点,并行策略

GBDT 和 XGboost

XGboost是GBDT的一个变种,最大的区别是XGboost通过对目标函数做二阶泰勒展开,从而求出下一步要拟合的树的叶子节点权重。然后,根据损失函数求出每一次分裂节点的损失减小的大小,以此来选择合适的属性进行分裂。

此外,

(1)传统 GBDT以 CART作为基分类器,XGboost还支持线性分类器,这时XGboost相当于带 L1 和 L2 正则化项的逻辑斯蒂回归(分类问题)或者线性回归(回归问题)

(2)从分裂算法上说,GBDT采用的是精确分裂的算法,就是把每个属性的每个取值都当作一次阈值进行遍历。而Xgboost采用近似分裂算法,对每个属性的所有取值进行分桶,按照各个桶之间的值作为划分阈值。具体来首,XGboost提出了一个特殊的分桶策略,一般的分桶策略是每个样本的权重都是相同的,但是XGboost使每个样本的权重为损失函数在该样本点的二阶导。

(3)XGboost在loss function里加入了正则项,用于控制模型的复杂度。从Bias-variance tradeoff角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合。
机器学习、深度学习 面经(未完待更)_第10张图片
(4)XGboost借鉴了随机森林的做法,支持列抽样,不仅能降低过拟合,还能减少计算,这也是xgboost异于传统gbdt的一个特性。

(5)传统的GBDT没有设计对缺失值进行处理,XGboost能够自动学习出缺失值的处理策略:在计算分裂增益的时候XGboost只利用没有缺失值的样本,但是在推理的时候,也就是在确定了树的结构,需要将样本映射到叶子节点的时候,需要对含有缺失值的样本进行划分,XGboost分别假设该样本属于左子树和右子树,比较两者分裂增益,选择增益较大的那一边作为该样本的分裂方向。

(6)XGboost在实现上支持并行化,这里的并行化并不是类似于随机森立那样树与树之间的并行化,XGboost同Boosting方法一样,在树的粒度上是串行的。但是在构建树的过程中,也就是在分裂节点的时候支持并行化:XGboost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代中重复地使用这个结构,大大减小计算量。在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。

lightGBM 和 XGboost

(1)XGboost采用的是level-wise的分裂策略,而lightGBM采用了leaf-wise的策略,区别是XGboost对每一层所有节点做无差别分裂,可能有些节点的增益非常小,对结果影响不大,但是XGboost也进行了分裂,带来了务必要的开销。 leaft-wise的做法是在当前所有叶子节点中选择分裂收益最大的节点进行分裂,如此递归进行,很明显leaf-wise这种做法容易过拟合,因为容易陷入比较高的深度中,因此需要对最大深度做限制,从而避免过拟合。
机器学习、深度学习 面经(未完待更)_第11张图片

(2)lightGBM使用了基于histogram的决策树算法。基本思想是先把连续的浮点特征值离散化成k个整数,同时构造一个宽度为k的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。相比于XGboost预排序的方法,其优点在于:预排序需要保存数据的特征值以及特征排序的结果,而histogram只保存特征离散化后的值,而这个值一般用8位整型存储就足够了,因此占用更少的内存;预排序算法每遍历一个特征值就需要计算一次分裂的增益,而histogram观察到一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到。因此,直方图做差仅需遍历直方图的k个桶。利用这个方法,可以在构造一个叶子的直方图后,用非常微小的代价得到它兄弟叶子的直方图,在速度上可以提升一倍。

(3)lightGBM采用了特征并行、数据并行和投票并行。

对于特征并行,lightGBM的每个worker留有一份完整的数据集,但是每个worker仅在特征子集上进行最佳切分点的寻找;worker之间需要相互通信,通过比对损失来确定最佳切分点;然后将这个最佳切分点的位置进行全局广播,每个worker进行切分即可。XGboost的每个worker中仅有部分的列数据,也就是垂直切分,每个worker寻找局部最佳切分点,worker之间相互通信,然后在具有最佳切分点的worker上进行节点分裂,再由这个节点广播一下被切分到左右节点的样本索引号,其他worker才能开始分裂。

对于数据并行,​ lightGBM中先对数据水平切分,每个worker上的数据先建立起局部的直方图,然后合并成全局的直方图,采用直方图相减的方式,先计算样本量少的节点的样本索引,然后直接相减得到另一子节点的样本索引,这个histogram算法使得worker间的通信成本降低一倍,因为只用通信以此样本量少的节点。 XGboost中的数据并行也是水平切分,然后单个worker建立局部直方图,再合并为全局,不同在于根据全局直方图进行各个worker上的节点分裂时会单独计算子节点的样本索引,因此效率很慢,每个worker间的通信量也就变得很大。

对于投票并行,XGboost没有。lightGBM的每个worker首先会找到本地的一些优秀的特征,然后进行全局投票,根据投票结果,选择top的特征进行直方图的合并,再寻求全局的最优分割点。

DL

Q. 神经网络为啥不用拟牛顿法而是用梯度下降?(为什么深度学习不用二阶的优化算法?)

(1) 计算量的问题
如果优化问题是 n 维的,那么单轮梯度下降的复杂度为 O ( n ) O(n) O(n),Quasi-Newton 是 O ( n 2 ) O(n^2) O(n2),Newton method 是 O ( n 3 ) O(n^3) O(n3)。在神经网络中, n 通常是个不小的数字,虽然 Newton method迭代次数远少于梯度下降,但是也无法弥补单轮复杂度上的巨大劣势

(2) 解的精度的问题
首先指出,机器学习问题不需要高精度解

忽略常数系数以及与这儿无关的项,泛化误差可以理解为

当 前 模 型 最 优 解 的 泛 化 误 差 ( 统 计 误 差 ) + 优 化 误 差 当前模型最优解的泛化误差(统计误差) + 优化误差 +

而第一项只与模型的选择、数据的分布、数据量的大小等相关,完全独立于优化算法。因此,当优化误差已经远低于统计误差时,继续优化带来的实际收益非常小,对整个泛化误差的影响很可能微乎其微

(3)稳定性的问题
越简单的东西往往越鲁棒,对于优化算法也是这样。

神经网络优化有三个问题:大数据(样本多), 高参数,非凸。而 Newton 和 Quasi-Newton 在凸优化情形下,如果迭代点离全局最优很近时,收敛速度快于梯度下降。非凸情形下,Newton 和 Quasi-Newton 会被鞍点吸引,故而每一步迭代可能不降反升。

Q. 激活函数比较(字节)

Sigmod

在这里插入图片描述
机器学习、深度学习 面经(未完待更)_第12张图片
sigmod存在两个问题:
(1)梯度消失。当神经元的激活在接近0或1处时会饱和,在这些区域梯度几乎为0,这就会导致梯度消失,几乎就有没有信号通过神经传回上一层。
(2)Sigmoid函数的输出不是零中心的。因为如果输入神经元的数据总是正数,那么关于 w w w的梯度在反向传播的过程中,将会要么全部是正数,要么全部是负数,这将会导致梯度下降权重更新时出现z字型的下降。

然后,就有了tanh

Tanh

在这里插入图片描述
机器学习、深度学习 面经(未完待更)_第13张图片

Tanh解决了Sigmoid的输出是不是零中心的问题,但仍然存在饱和问题。

接着就是ReLU

ReLU

在这里插入图片描述
机器学习、深度学习 面经(未完待更)_第14张图片

相较于sigmoid和tanh函数,ReLU对于随机梯度下降的收敛有巨大的加速作用;sigmoid和tanh在求导时含有指数运算,而ReLU求导几乎不存在任何计算量。

对比sigmoid类函数主要变化是:
(1)单侧抑制;
(2)相对宽阔的兴奋边界;
(3)稀疏激活性。

但是,ReLU单元比较脆弱并且可能“死掉”,而且是不可逆的,因此导致了数据多样化的丢失。通过合理设置学习率,会降低神经元“死掉”的概率。

Leaky ReLU

在这里插入图片描述
机器学习、深度学习 面经(未完待更)_第15张图片
其中 ε \varepsilon ε是很小的负数梯度值,比如0.01,这样做目的是使负轴信息不会全部丢失,解决了ReLU神经元“死掉”的问题。更进一步的方法是PReLU,即把 ε \varepsilon ε当做每个神经元中的一个参数,是可以通过梯度下降求解的。

Maxout

在这里插入图片描述
Maxout具有ReLU的优点,如计算简单,不会 saturation,同时又没有ReLU的一些缺点,如容易go die。

但是,每个神经元的参数double,这就导致整体参数的数量激增。

Softmax

机器学习、深度学习 面经(未完待更)_第16张图片
Softmax用于多分类神经网络输出,目的是让大的更大。

CV

Q. 在视频推荐这个领域能不能用上embedding的思想,如果可以,要怎么构建和训练模型?(字节)

  • YouTubeNet 深度推荐系统模型
  • 重读Youtube深度学习推荐系统论文,字字珠玑,惊为神文

Q. 池化有哪些方法,分别用在什么场景下?(字节)

特征提取的误差主要来自两个方面:
(1)邻域大小受限造成的估计值方差增大;
(2)卷积层参数误差造成估计均值的偏移。

mean-pooling能减小第一种误差(邻域大小受限造成的估计值方差增大),更多的保留图像的背景信息;

max-pooling能减小第二种误差(卷积层参数误差造成估计均值的偏移),更多的保留纹理信息。

Stochastic-pooling则介于两者之间,通过对像素点按照数值大小赋予概率,再按照概率进行亚采样,在平均意义上,与mean-pooling近似,在局部意义上,则服从max-pooling的准则。

Q. BN 的原理(字节)

  • Batch Normalization学习笔记及其实现
  • BN层原理解析
  • 【基础算法】六问透彻理解BN(Batch Normalization)
  • 深度学习中 Batch Normalization为什么效果好?(言有三、我不坏的回答)
  • 如何区分并记住常见的几种 Normalization 算法

首先来说,BN层的引入是解决神经网络训练难的问题的。这里面有两点:

(1)分布形状的问题

一般来说,如果模型的输入特征不相关且满足标准正态分布 N ( 0 , 1 ) N(0, 1) N(0,1)时,模型的表现一般较好。在训练神经网络模型时,我们可以事先将特征去相关并使得它们满足一个比较好的分布,这样,模型的第一层网络一般都会有一个比较好的输入特征,但是随着模型的层数加深,网络的非线性变换使得每一层的结果变得相关了,且不再满足 N ( 0 , 1 ) N(0, 1) N(0,1)分布。更糟糕的是,可能这些隐藏层的特征分布已经发生了偏移。从而使DNN训练变得困难。

于是,在训练时,BN层利用隐藏层输出结果的均值 μ B \mu_{\mathcal B} μB与方差 σ m a t h c a l B 2 \sigma_{mathcal B}2 σmathcalB2来标准化每一层特征的分布,并且维护所有mini-batch数据的均值与方差,最后利用样本的均值与方差的无偏估计量用于测试时使用。

鉴于在某些情况下非标准化分布的层特征可能是最优的,标准化每一层的输出特征反而会使得网络的表达能力变得不好,作者为BN层加上了两个可学习的缩放参数 γ \gamma γ和偏移参数 β \beta β来允许模型自适应地去调整层特征分布。

(2)梯度弥散的问题

在这里插入图片描述
上式可以记作

∂ l ∂ x i = a ∂ l ∂ x ^ i + b \begin{aligned}\frac{\partial l}{\partial x_i}=a\frac{\partial l}{\partial \hat x_i}+b\end{aligned} xil=ax^il+b

这样整体给梯度一个提升,补偿了激活函数上的损失,进而改善了梯度弥散的问题。

关于BN的有效性,有以下几个主要观点:
(1) 主流观点,Batch Normalization调整了数据的分布,不考虑激活函数,它让每一层的输出归一化到了均值为0方差为1的分布,这保证了梯度的有效性,目前大部分资料都这样解释,比如BN的原始论文认为的缓解了Internal Covariate Shift(ICS)问题。

(但是后来有篇论文《How Does Batch Normalizetion Help Optimization》推翻了这个结论,该论文认为BN带来的性能提升与ICS的减少无关。 并且在一定程度上认为BN并不能减少 ICS)

(2) 可以使用更大的学习率,《 Understanding batch normalization》一文指出BN有效是因为用上BN层之后可以使用更大的学习率,从而跳出不好的局部极值,增强泛化能力,在它们的研究中做了大量的实验来验证。

(3) 损失平面平滑。也就是是上文提到的《How Does Batch Normalizetion Help Optimization》指出,BN有效的根本原因是BN使得优化问题的曲面更加平滑,这使得梯度更容易预测以及允许更大范围的学习率和更快的网络收敛。该论文证明了BN提升了模型的LOSS的Lipschitzness和梯度的Lipschitzness

Q. BN为什么防止过拟合呢?

引用论文作者在论文中的表述

When training with Batch Normalization, a training example is seen in conjunction with other examples in the mini-batch, and the training network no longer producing deterministic values for a given training example. In our experiments, we found this effect to be advantageous to the generalization of the network.

Q. Fast RCNN(字节)

  • Fast RCNN算法详解
  • 【目标检测】Fast RCNN算法详解
  • 论文作者汇报演示稿
  • RCNN,Fast RCNN, Faster RCNN整理总结
  • 目标检测算法Fast R-CNN简介

首先来讲,Fast RCNN主要提出了下面几个方面的改进:

(1) 利用RoI Pooling进行特征的尺寸变换。因为全连接层的输入需要尺寸大小一样,所以不能直接将大小不同的region proposal喂入全连接层。而归一化的过程会使图形产生形变,这对CNN的特征提取来说是相当不利的。

(2)卷积不再是对每个region proposal进行,而是直接对整张图像,这样减少了很多重复计算。原来RCNN是对每个region proposal分别做卷积,因为一张图像中有2000左右的region proposal,肯定相互之间的重叠率很高,因此产生重复计算。

(3)Fast RCNN采用了多任务损失函数(multi-task loss)统一了类别输出任务和候选框回归任务。分类采用softmax代替SVM进行分类,共输出N(类别)+1(背景)类。回归损失输出的是4*N(类别),4表示的是(x,y,w,h分别表示候选框的中心坐标和宽、高)。

(4)SVD对全连接层进行分解。由于一张图像约产生2000个RoI,将近一半多的时间用在全连接层计算,为了提高运算速度,可以用SVD(奇异值分解)对全连接层进行变换来提高运算速度。一个大的矩阵可以近似分解为三个小矩阵的乘积,分解后的矩阵的元素数目远小于原始矩阵的元素数目,从而达到减少计算量的目的。通过对全连接层的权值矩阵进行SVD分解,使得处理一张图像的速度明显提升。

Fast R-CNN目标检测主要流程如下:

  1. 提取候选区域:利用SS(Selective Search)算法在输入图像中提取出候选区域,并把这些候选区域按照空间位置关系映射到最后的卷积特征层;

  2. 区域归一化:对于卷积特征层上的每个候选区域进行RoI Pooling操作,得到固定维度的特征;

  3. 分类与回归:将提取到的特征输入全连接层,然后用Softmax进行分类,对候选区域的位置进行回归。

机器学习、深度学习 面经(未完待更)_第17张图片

Q. 比较one-stage / two_stage的目标检测(字节)

  • 目标检测中One-stage的检测算法
  • 深度学习: one-stage/two-stage/multi-stage 目标检测算法
  • 目标检测之one-stage和two-stage网络的区别

two-stage检测算法将检测问题划分为两个阶段,首先产生候选区域(region proposals),然后对候选区域分类(一般还需要对位置精修)

one-stage检测算法,其不需要region proposal阶段,直接产生物体的类别概率和位置坐标值,经过单次检测即可直接得到最终的检测结果

因此,one_stage / two_stage 最主要的区别就是:

  • one-stage网络速度要快很多
  • two-stage网络的准确性要高很多

为什么one-stage网络速度要快很多?

one-stage网络生成的ancor框只是一个逻辑结构,或者只是一个数据块,只需要对这个数据块进行分类和回归就可以,不会像two-stage网络那样,生成的ancor框会映射到feature map的区域(rcnn除外),然后将该区域重新输入到全连接层进行分类和回归,每个ancor映射的区域都要进行这样的分类和回归,所以它非常耗时

为什么one-stage网络的准确性要比two-stage网络要低?

one-stage网络最终学习的ancor有很多,但是只有少数ancor对最终网络的学习是有利的,而大部分ancor对最终网络的学习都是不利的,这部分的ancor很大程度上影响了整个网络的学习,拉低了整体的准确率;而two-stage网络最终学习的ancor虽然不多,但是背景ancor,也就是对网络学习不利的ancor也不会特别多,它虽然也能影响整体的准确率,但是肯定没有one-stage影响得那么严重,所以它的准确率比one-stage肯定要高

Q. 卷积层的参数量(字节)

  • 如何计算卷积层中对应参数个数?
  • CNN中卷积层参数量与输出特征图(feature map)尺寸的计算公式

参数量大小的计算,分为weights和biases:

  • 首先来计算weights的参数量: F × F × C i n p u t × K F×F×C_{input}×K F×F×Cinput×K,其中 F F F为卷积核边长、 C i n p u t C_input Cinput为输入特征图的通道数、 K K K为输出通道数
    接着计算biases的参数量: K K K
    所以总参数量为: F × F × C i n p u t × K + K F×F×C_{input}×K+K F×F×Cinput×K+K

顺便提醒一下:Pooling是没有参数的

Q. Pooling 的反向传播(字节)

  • cnn中关于平均池化和最大池化的理解

原则:把1个像素的梯度传递给4个像素,但是需要保证传递的loss(或者梯度)总和不变

Mean Pooling

机器学习、深度学习 面经(未完待更)_第18张图片
Max Pooling

机器学习、深度学习 面经(未完待更)_第19张图片

Q. 介绍一下常用的backbone(字节)

  • 深度学习知识点总结六(网络常用的backbone)
  • 模型backbone汇总
  • 深度学习中的经典基础网络结构(backbone)总结
  • 神经网络模型(Backbone)
  • 纵览轻量化卷积神经网络:SqueezeNet、MobileNet、ShuffleNet、Xception
  • 目标检测算法横向比较,包括backbone、特征融合、loss、proposal/anchor/heatmap、NMS、正负样本设置等
  • Paper reading之一 目标检测专用backbone—DetNet
  • 目标检测算法 CNN主干网络
  • 目标检测backbone

AlexNet

  1. 继LeNet5之后,AlexNet使网络更深更大,相比于LeNet5的 2 层卷积 + 3 层全连接层,有大概6万个参数,而AlexNet有 5 层卷积 + 3 层全连接,有6000万个参数和65000个神经元。
  2. 取代了Sigmod使用ReLU
  3. 使用了数据增强和dropout来解决过拟合问题
  4. 使用最大池化取代平均池化,并且在池化的时候让步长比池化核的尺寸小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性
  5. 提出了LRN层,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。(关于LRN的内容参见 局部响应归一化层(LRN))

但是吧,AlexNet太老了,现在基本不用了

VGG-16

  1. 选用比较小的卷积核(3x3),而之前无论 AlexNet 还是 LeNet5 都是采用较大的卷积核,比如 11x11, 7x7。而采用小卷积核的意义主要有两点,一是在取得相同的感受野的情况下,比如两个3x3的感受野和一个5x5的感受野的大小相同,但是计算量却小了很多;第二点是两层3x3相比一层5x5可以引入更多的非线性,从而使模型的拟合能力更强
  2. 使用1x1的卷积核在不影响输入输出的维度情况下,通过ReLU进行非线性处理,提高模型的非线性

GoogLeNet V1

  1. 在 GoogLeNet 上开始出现了分支,而不是一条线连到底,这是最直观的差异,也被称作 Inception module,如下图所示。从图中可以看到, 每个 module 中采用了不同 size 的 kernel,然后在将特征图叠加,实际上起到了一个图像金字塔的作用,即所谓的 multiple resolution

机器学习、深度学习 面经(未完待更)_第20张图片

  1. 上图中有很多 1x1 的卷积核,这里的1x1的卷积操作与之前讲到是不一样的,这里利用它来改变 output 的 channel, 具体说这里是减少 channel 数,从而达到减少计算的目的。
  2. 用 Global Ave Pool 取代 FC. 采用Ave Pool之后,超参数变为0,所以可以起到防止过拟合的作用,另外作者发现采用 Ave Pool 之后,top-1的精度提高了大概0.6%. 但是需要注意的是,在 GoogLeNet 中并没有完全取代 FC
  3. 采用了辅助分类器。整个模型有三个 output(之前的网络都只有一个 output),这里的多个 output 仅仅在训练的时候用,也就是说测试或者部署的时候仅仅用最后一个输出。在训练的时候,将三个输出的loss进行加权平均,weight=0.3, 通过这种方式可以缓解梯度消失,同时作者也表示有正则化的作用。其实这个思想有点类似于传统机器学习中的投票机制

ResNet

  1. ResNet 的核心思想是采用了 identity shortcut connection
  2. ResNet 中已经没有 FC 了, 而是用的 Ave Pool. 另外还可以发现在 ResNet 中只有开头和结尾的位置有 pooling 层,中间是没有的,这是因为 ResNet 中间采用了 stride 为2的卷积操作,取代了 pooling 层的作用

ResNeXt 相比较于 ResNet,主要是分组进行了卷积,最后再concatenate在一起
机器学习、深度学习 面经(未完待更)_第21张图片

DenseNet

  1. 与ResNet一致,DenseNet也采用shortcut连接,但是其将前面所有层与后面层密集连接。 另外DenseNet采用channel-wise concatenate来实现特征重用,而ResNet采用的是element-wise addition
    机器学习、深度学习 面经(未完待更)_第22张图片
    机器学习、深度学习 面经(未完待更)_第23张图片

  2. 由于密集连接方式,DenseNet提升了梯度的反向传播,使得网络更容易训练 (每层可以直达最后的误差信号)

  3. 由于特征复用,分类器使用到了低级特征

相较于前面的几个大型网络,近年提出了几个轻量化的模型

SqueezeNet

  1. SqueezeNet是通过减少模型参数来达到轻量化的目的
  2. 多用 1x1 的卷积核,而少用 3x3 的卷积核。因为 1x1 的好处是可以在保持 feature map size 的同时减少 channel
  3. 在用 3x3 卷积的时候尽量减少 channel 的数量,从而减少参数量
  4. 延后用 pooling,因为 pooling 会减小 feature map size,延后用 pooling, 这样可以使 size 到后面才减小,而前面的层可以保持一个较大的 size,从而起到提高精度的作用

机器学习、深度学习 面经(未完待更)_第24张图片
MobileNet V1

  1. MobileNet 是通过优化卷积操作来达到轻量化的目的。具体来说,文中通过 Deepwise Conv(其实是Deepwise Conv + Pointwise Conv)代替原始的卷积操作实现,从而达到减少计算的目的(通常所使用的是 3×3 的卷积核,计算量会下降到原来的九分之一到八分之一)
    机器学习、深度学习 面经(未完待更)_第25张图片
    ShuffleNet V1

  2. ShuffleNet 是通过优化网络结构来达到轻量化的目的

  3. ShuffleNet 的核心思想是对卷积进行分组,从而减少计算量,但是由于分组相当于将卷积操作局限在某些固定的输入上,为了解决这个问题采用 shuffle 操作将输入打乱,从而解决这个问题。

group convolution(分组卷积): 分组卷积的思路是将输入特征图按通道数分为几组,然后采用不同的卷积核再对各个组进行卷积,这样会降低卷积的计算量。传统的卷积是卷积核在所有通道上进行卷积,算全通道卷积,而分组卷积算通道上的稀疏卷积,如下图所示。(mobileNet算是一种特殊的分组卷积,分组数和通道数一样)
机器学习、深度学习 面经(未完待更)_第26张图片
channel shuffle(通道混洗) : 分组卷积的一个问题是不同组之间的特征图信息不通信,就好像分了几个互不相干的路,大家各走各的,会降低网络的特征提取能力。MobileNet 是采用密集的1*1pointwise convolution 进行通道特征融合,计算量较大。channel shuffle的思路是对分组卷积之后的特征图的排列顺序进行打乱重新排列,这样下一个分组卷积的输入就来自不同的组,信息可以在不同组之间流转。

机器学习、深度学习 面经(未完待更)_第27张图片
DetNet

DetNet是一个专门用于目标检测的backbone

目前大多数用于目标检测的backbone都是使用在ImageNet上预训练的网络,比如常用的VGG,Resnet系列等等,但是这些网络都是为图像分类而设计的,把这些网络用于目标检测领域,通常不能完美贴合,会或多或少的增加一些层。这样会有两个问题:

  1. 目前的目标检测器,如FPN和RtinaNet,通常需要额外的阶段来处理不同尺度的目标。
  2. 传统的骨干网采用更大的降采样率产生更大的感受野,这对于图像分类来说有效,即牺牲了空间分辨率,不利于精确定位大的目标和识别小的目标

于是,DetNet做出了如下的改进:

(1) 增加了网络高层输出特征的分辨率,换句话说就是高层不对特征图做尺寸缩减。
机器学习、深度学习 面经(未完待更)_第28张图片
从图(C)可以明显地看出DetNet的不同之处,首先相比(B)这一传统的分类网络,DetNet增加了一个阶段P6(64X,作者没有画出第一阶段2X的部分),FPN也同样是增加了P6,目的是为了识别更大的目标。其次作者所说的保持空间分辨率,也就是在最后三个阶段(P4,P5,P6)分辨率一直保持着16X

(2) 引入带孔卷积层增加网络高层的感受野。

继第一点改进之后,如果网络高层的特征不做像分类网络那样多的降采样(将stride等于32修改为stride等于16)会带来两个问题:

  1. 增加计算量。这个很容易理解,毕竟特征图比之前的大,计算量的增加不可避免。
  2. 高层的感受野(receptive field)减小。感受野和信息丢失类似跷跷板,既然前面选择了尽可能减少高层的特征信息丢失,那么感受野减小也是情理之中。

为了解决第二个问题,作者使用dilated bottleneck作为一个基础的网络块有效地扩大的感受野

机器学习、深度学习 面经(未完待更)_第29张图片

(3)减小网络高层的宽度,减少因增大分辨率带来的计算量。

为解决(2)中所述的第一个问题,作者减小了网络高层的宽度。从下图可见,高层的几个stage的每个block的输入特征通道都是256. 而常见的分类算法中,比如ResNet越往高层的stage,特征通道数往往越大。
机器学习、深度学习 面经(未完待更)_第30张图片

Q. RoI Pooling 和 RoI Align, 怎么做插值,写插值公式(字节)

  • 【摘记】ROI Pooling and ROI Align

NLP

Q. word2vec两个模型的损失函数是什么?(字节)

  • 一文看懂 Word2vec(基本概念+2种训练模型+5个优缺点)
  • 一篇浅显易懂的word2vec原理讲解
  • word2vec个人总结-理论篇

Skip-gram 的损失函数为(假设滑动窗口为 m m m,文本序列长度为 T T T

− ∑ t = 1 T ∑ j = − m , t ≠ 0 m l o g p ( w t + j ∣ w t ) \begin{aligned}-\sum_{t=1}^T\sum_{j=-m,t\neq 0}^mlogp(w_{t+j}|w_t)\end{aligned} t=1Tj=m,t=0mlogp(wt+jwt)

CBOW的损失函数为

− ∑ t = 1 T l o g p ( w t ∣ w t − m , ⋯   , w t − 1 , w t + 1 , ⋯   , w t + k ) \begin{aligned}-\sum_{t=1}^Tlogp(w_t|w_{t-m},\cdots,w_{t-1},w_{t+1},\cdots,w_{t+k})\end{aligned} t=1Tlogp(wtwtm,,wt1,wt+1,,wt+k)

详细参考论文 Efficient Estimation of Word Representations in Vector Space

概率题

Q. 1-7的随机数等概率生成器,怎么等概率的生成1-5的整数?(字节)

给定一个函数rand5(),使函数rand7()可以随机等概率的生成1-7的整数

其实思路是一样的,利用 r a n d 7 ( ) ∗ r a n d 7 ( ) rand7()*rand7() rand7()rand7()生成 1 − 49 1-49 149,只保留 1 − 45 1-45 145,每9个数映射成一组

Q. 圆环上随机取3个点组成一个锐角三角形的概率(字节)

  • 数理统计 - 圆环上随机取3个点组成一个锐角三角形的概率

你可能感兴趣的:(读书笔记,机器学习,深度学习,神经网络,算法)