收藏 | 机器学习、深度学习面试知识点汇总
点击上方“视学算法”,选择加"星标"或“置顶”
重磅干货,第一时间送达
来源:NewBeeNLP、极市平台 本文约17000字,建议阅读10+分钟 本文总结了一些秋招面试中会遇到的问题和一些重要的知识点,适合面试前突击和巩固基础知识。
前言
程序员的数学系列,适合重温知识,回顾一些基础的线性代数、概率论。 深度学习花书,总结类书,有基础知识的讲解,比较全面。 统计学习方法,总结类书,篇幅不长,都是核心。 Pattern Recognition and Machine Learning,条理清晰,用贝叶斯的方式来讲解机器学习。 机器学习西瓜书,适合当教材,内容较广但是不深。
常见的常识题
L1正则可以使少数权值较大,多数权值为0,得到稀疏的权值;L2正则会使权值都趋近于0但非零,得到平滑的权值; 在AdaBoost算法中,被错分的样本的权重更新比例的公式相同; Boosting和Bagging都是组合多个分类器投票的方法,但Boosting是根据单个分类器的正确率决定其权重,Bagging是可简单地设置所有分类器权重相同; EM算法不能保证找到全局最优值; SVR中核函数宽度小欠拟合,宽度大容易过拟合 PCA和LDA都是经典的降维算法。PCA是无监督的,也就是训练样本不需要标签;LDA是有监督的,也就是训练样本需要标签。PCA是去除掉原始数据中冗余的维度,而LDA是寻找一个维度,使得原始数据在该维度上投影后不同类别的数据尽可能分离开来。
KNN K近邻
K近邻算法的注意事项
K近邻算法的优点是什么呢?
K近邻算法的缺点是什么呢?
二维高斯核函数
`def gaussian_2d_kernel(kernel_size = 3,sigma = 0):
kernel = np.zeros([kernel_size,kernel_size])
center = kernel_size // 2
if sigma == 0:
sigma = ((kernel_size-1)*0.5 - 1)*0.3 + 0.8
s = 2*(sigma**2)
sum_val = 0
for i in range(0,kernel_size):
for j in range(0,kernel_size):
x = i-center
y = j-center
kernel[i,j] = np.exp(-(x**2+y**2) / s)
sum_val += kernel[i,j]
#/(np.pi * s)
sum_val = 1/sum_val
return kernel*sum_val
`
训练采样方法
交叉验证; 留一法; 自助法(bootstrap):有放回的抽样方法,可能会抽到重复的样本。
Kmean和GMM原理、区别、应用场景
可以看这里 https://zhuanlan.zhihu.com/p/36331115 也可以看百面机器学习P93、P102
如何在多台计算机上做kmeans
KNN算法以及流程
K值较小,则模型复杂度较高,容易发生过拟合,学习的估计误差会增大,预测结果对近邻的实例点非常敏感。 K值较大可以减少学习的估计误差,但是学习的近似误差会增大,与输入实例较远的训练实例也会对预测起作用,使预测发生错误,k值增大模型的复杂度会下降。 在应用中,k值一般取一个比较小的值,通常采用交叉验证法来来选取最优的K值。
无监督学习和有监督学习的区别
感知机 K近邻法 朴素贝叶斯 决策树 逻辑回归 支持向量机 提升方法 隐马尔科夫模型 条件随机场
聚类-kmeans SVD奇异值分解 PCA主成分分析
逻辑回归与SVM区别
感知机前后都没有引入与超平面“距离”的概念,它只关心是否在超平面的一侧; LR引入了距离,但是在训练模型求其参数的时候没有距离的概念,只是在最后预测阶段引入距离以表征分类的置信度; SVM两个地方有距离的概念:其一,在求超平面参数的时候有距离的概念,其表现为在与超平面一定距离内的点着重关注,而其他的一切点都不再关注。被关注的点称之为“支撑向量”。其二,预测新样本的时候,和LR一样,距离代表置信度。
https://blog.csdn.net/maymay_/article/details/80016175
https://blog.csdn.net/jfhdd/article/details/52319422
https://www.cnblogs.com/eilearn/p/9026851.html
bagging boosting 和 提升树
样本选择上:Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的. Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化.而权值是根据上一轮的分类结果进行调整。 样例权重:Bagging 使用均匀取样,每个样例的权重相等 Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。 预测函数:Bagging:所有预测函数的权重相等. Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。 并行计算:Bagging:各个预测函数可以并行生成 Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
在构建决策树的过程中是不需要剪枝的。 整个森林的树的数量和每棵树的特征需要人为进行设定。 构建决策树的时候分裂节点的选择是依据最小基尼系数的。
SVM
凸集、凸函数、凸优化
为什么深度学习中的图像分割要先编码后解码
降低显存和计算量,图小了显存也小,计算量也小; 增大感受野,使用同样3x3的卷积能在更大的图像范围上进行特征提取。大感受野对分割很重要,小感受野做不了多分类分割,而且分割出来很粗糙 多出几条不同程度额下采样分支,可以方便进行多尺度特征的融合。多级语义融合会让分类更加准确。
(全局)平均池化average pooling和(全局)最大池化max pooling的区别
最大池化保留了纹理特征; 平均池化保留整体的数据特征; 全局平均池化有定位的作用(看知乎)。
https://zhuanlan.zhihu.com/p/42384808
https://www.zhihu.com/question/335595503/answer/778307744
https://www.zhihu.com/question/309713971/answer/578634764
全连接的作用,与1x1卷积层的关系
全连接层(fully connected layers,FC)在整个卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用。在实际使用中,全连接层可由卷积操作实现:对前层是全连接的全连接层可以转化为卷积核为1x1的卷积;而前层是卷积层的全连接层可以转化为卷积核为hxw的全局卷积,h和w分别为前层卷积结果的高和宽
降维( dimension reductionality )。比如,一张500x500且厚度depth为100的图片在20个filter上做1*1的卷积,那么结果的大小为500*500*20。 加入非线性。卷积层之后经过激励层,1*1的卷积在前一层的学习表示上添加了非线性激励( non-linear activation ),提升网络的表达能力,但是也可以这样说:使之由单纯的线性变换,变为复杂的feature map之间的线性组合,从而实现特征的高度抽象过程。这一过程视为由线性变换为非线性,提高抽象程度。而非加入激活函数的作用。 个人应该是降维或者升维来减小参数个数和增加网络深度,以及跨通道的特征聚合 可以代替全连接层
看这个问题的回答:https://www.zhihu.com/question/56024942/answer/369745892
看这个问题的回答:
https://www.zhihu.com/question/41037974/answer/150522307
concat与add(sum)的区别
concat改成sum确实会好很多,这两个都是特征融合,到底有什么本质区别呢?我用的时候也没什么原则就是两个都试一下(其实更喜欢用sum,毕竟更省显存)。 我之前做过类似ASP的实验,金字塔型空洞卷积融合,最后实验结果sum比concat要好一些,但是原因不知道怎么解释 我看过一些论文是concat比sum好的,可能这跟数据集等具体情况有关吧 不同的特征 sum 了,有什么意义呢,这些特征又损失了吧;如果直接 concat,让后面的网络学习,应该更好啊,用到的特征更多了
SSD怎么改动变成FasterRCNN
反向传播的原理
GD、SGD、mini batch GD的区别
偏差、方差
泛化误差可以分解成偏差的平方+方差+噪声; 偏差度量了学习算法的期望预测和真实结果的偏离程度,刻画了学习算法本身的拟合能力; 方差度量了同样大小的训练集的变动所导致的学习性能的变化,刻画了数据 扰动所造成的干扰; 噪声表达了当前任务上学习任何算法所能达到的期望泛化误差下界,刻画了问题本身的难度。 偏差和方差一般称为bias和variance,一般训练误差越强,偏差越小,方差越大,泛化误差在中间会有一个最小值。 如果偏差较大,方差较小,此时为欠拟合,而偏差较小,方差较大为过拟合。
为什么会梯度爆炸,如何防止
分布式训练,多卡训练
精确率和召回率以及PR曲线
空洞卷积
在DeepLabv3+中,最后的ASPP层,通过一个1x1卷积和3个3x3的空洞卷积,再concat上一个经过全局平均池化后双线性采样到同等维度的特征图。
数据不好怎么办,数据不均衡怎么处理、只有少量带标签怎么处理
训练过程中需要过拟合情况怎么办
深度学习-通用模型调试技巧 如何根据训练/验证损失曲线诊断我们的CNN 关于训练神经网路的诸多技巧Tricks(完全总结版) 深度学习中数据集很小是一种什么样的体验
https://lilianweng.github.io/lil-log/2019/03/14/are-deep-neural-networks-dramatically-overfitted.html
https://www.jianshu.com/p/97aafe479fa1 (重要)
正则化
BN层和L2正则化一起有什么后果
ROIPooling和ROIAlign的区别
SPPNet-引入空间金字塔池化改进RCNN
自己实现图像增强算法
图像分类的tricks
亚马逊:用CNN进行图像分类的Tricks(https://mp.weixin.qq.com/s/e4m_LhtqoUiGJMQfEZHcRA)
消融实验(Ablation experiment)
手撸NMS与soft-NMS
逻辑回归和线性回归
线性回归和逻辑回归都是广义线性回归模型的特例; 线性回归只能用于回归问题,逻辑回归用于分类问题(可由二分类推广至多分类); 线性回归无联系函数或不起作用,逻辑回归的联系函数是对数几率函数,属于Sigmoid函数; 线性回归使用最小二乘法作为参数估计方法,逻辑回归使用极大似然法作为参数估计方法; 两者都可以使用梯度下降法。
线性回归的梯度下降法其实和我们训练神经网络一直,首先需要对参数进行初始化,然后使用随机梯度下降的方式对参数进行更新:https://zhuanlan.zhihu.com/p/33992985 线性回归与最小二乘法:https://zhuanlan.zhihu.com/p/36910496 最大似然: https://zhuanlan.zhihu.com/p/33349381
https://segmentfault.com/a/1190000014807779
https://zhuanlan.zhihu.com/p/39363869
https://blog.csdn.net/hahaha_2017/article/details/81066673
什么是attention,有哪几种
深度学习的线性和非线性
卷积是线性的 激活函数是非线性的
梯度消失和梯度爆炸的问题
Batch-norm层的作用
BN跨卡训练怎么保证相同的mean和var
如何实现SyncBN
ResNet为什么好用
随着网络的加深,优化函数越来越陷入局部最优解; 随着网络层数的增加,梯度消失的问题更加严重,因为梯度在反向传播的时候会逐渐衰减。
Resnet的缺点
L1范数和L2范数 应用场景
网络初始化有哪些方式,他们的公式初始化过程
全置为0 - 几乎不会使用; 随机初始化(均匀随机、正态分布); Xavier 作者 Glorot 认为,优秀的初始化应该使得各层的激活值和状态梯度的方差在传播过程中保持一致。适合sigmoid,但是不适合Relu; He初始化适用于Relu。
https://prateekvjoshi.com/2016/03/29/understanding-xavier-initialization-in-deep-neural-networks/
resnet中权重的初始化
for m in self.modules():
if isinstance(m, nn.Conv2d):
nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
elif isinstance(m, nn.BatchNorm2d):
nn.init.constant_(m.weight, 1)
nn.init.constant_(m.bias, 0)
# Zero-initialize the last BN in each residual branch,
# so that the residual branch starts with zeros, and each residual block behaves like an identity.
# This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677
if zero_init_residual:
for m in self.modules():
if isinstance(m, Bottleneck):
nn.init.constant_(m.bn3.weight, 0)
elif isinstance(m, BasicBlock):
nn.init.constant_(m.bn2.weight, 0)
求解模型参数量
def model_info(model): # Plots a line-by-line description of a PyTorch model
n_p = sum(x.numel() for x in model.parameters()) # number parameters
n_g = sum(x.numel() for x in model.parameters() if x.requires_grad) # number gradients
print('\n%5s %50s %9s %12s %20s %12s %12s' % ('layer', 'name', 'gradient', 'parameters', 'shape', 'mu', 'sigma'))
for i, (name, p) in enumerate(model.named_parameters()):
name = name.replace('module_list.', '')
print('%5g %50s %9s %12g %20s %12.3g %12.3g' % (
i, name, p.requires_grad, p.numel(), list(p.shape), p.mean(), p.std()))
print('Model Summary: %d layers, %d parameters, %d gradients' % (i + 1, n_p, n_g))
print('Model Size: %f MB parameters, %f MB gradients\n' % (n_p*4/1e6, n_g*4/1e6))
卷积计算量
普通卷积 可分离卷积 全连接 点卷积
可以看老潘的这篇文章:
你的模型能跑多快???
http://mp.weixin.qq.com/s?__biz=MzI5MDUyMDIxNA==&mid=2247571225&idx=2&sn=eb3c7d0b20fcec934b497e53a53c64c6&chksm=ec1d3ae0db6ab3f62e6973ec18c6da291baf700782776cc09742f735c7ca6c1d10d94736a3b1&scene=21#wechat_redirect
多标签和多分类
数据的输入为什么要归一化
为什么说朴素贝叶斯是高偏差低方差?
Canny边缘检测,边界检测算法有哪些:
传统的目标检测
区域选择:一幅图像通过selective search的方法,首先对原图进行分割(聚类),然后通过计算相邻区域的相似度,最终找到2000个框,同样要与GT进行正例和负例的判断。 特征提取:通过SIFT或者其他的特征提取方法,将2000个转化为特征向量 分类器分类:将特征向量放入SVM中进行分类训练,同时将父类也放入分类器中进行训练。
HoG + SVM
基于滑窗的区域选择策略没有针对性,时间复杂度高,窗口冗余 手工设计的特征对环境多样性的变化并没有很好的鲁棒性
腐蚀膨胀、开运算闭运算
一些滤波器
https://blog.csdn.net/qq_22904277/article/details/53316415
https://www.jianshu.com/p/fbe8c24af108
https://blog.csdn.net/qq_22904277/article/details/53316415
https://blog.csdn.net/nima1994/article/details/79776802
https://blog.csdn.net/jiang_ming_/article/details/82594261
图像中的高频、低频信息以及高通滤波器、低通滤波器 在图像中,边缘信息等比较明显的变化比较剧烈的像素点就是图像中的高频信息。而除了边缘部分,比较平缓的像素点变化不是很剧烈的内容信息就是低频信息。 高通滤波器就是突出变化剧烈(边缘),去除低频部分,也就是当做边缘提取器。而低通滤波器主要是平滑该像素的亮度。主要用于去噪和模糊化,高斯模糊是最常用的模糊滤波器(平滑滤波器)之一,它是一个削弱高频信号强度的低通滤波器。
Resize双线性插值
需要注意的,最近邻插值的效果是最不好的。
align_corners=True align_corners=False
https://blog.csdn.net/qq_37577735/article/details/80041586
https://blog.csdn.net/love_image_xie/article/details/87969405 https://www.zhihu.com/question/328891283/answer/717113611 看这里的图像展示:https://discuss.pytorch.org/t/what-we-should-use-align-corners-false/22663
gradient clipping 梯度裁剪
https://wulc.me/2018/05/01/%E6%A2%AF%E5%BA%A6%E8%A3%81%E5%89%AA%E5%8F%8A%E5%85%B6%E4%BD%9C%E7%94%A8/
实现一个简单的卷积
`/*
输入:imput[IC][IH][IW]
IC = input.channels
IH = input.height
IW = input.width
卷积核: kernel[KC1][KC2][KH][KW]
KC1 = OC
KC2 = IC
KH = kernel.height
KW = kernel.width
输出:output[OC][OH][OW]
OC = output.channels
OH = output.height
OW = output.width
其中,padding = VALID,stride=1,
OH = IH - KH + 1
OW = IW - KW + 1
也就是先提前把Oh和Ow算出来,然后将卷积核和输入数据一一对应即可
*/
for(int ch=0;ch<output.channels;ch++)
{
for(int oh=0;oh<output.height;oh++)
{
for(int ow=0;ow<output.width;ow++)
{
float sum=0;
for(int kc=0;kc<kernel.channels;kc++)
{
for(int kh=0;kh<kernel.height;kh++)
{
for(int kw=0;kw<kernel.width;kw++)
{
sum += input[kc][oh+kh][ow+kw]*kernel[ch][kc][kh][kw];
}
}
}
//if(bias) sum +=bias[]
output[ch][oh][ow]=sum;
}
}
}
`
卷积的过程
转置卷积的计算过程
1*1的卷积核有什么用,3*3的卷积核和一个1*3加一个3*1的有什么区别
若提取横向纹理,则横向邻域信息密度比纵向信息密度高。 核扁横着最科学。若提纵向纹理,同理,瘦高竖着最好。 若你想提取的纹理种类丰富,那横向邻域信息密度的期望~=纵向信息密度期望
ResNet中bottlenet与mobilenetv2的inverted结构对比
卷积特征图大小的计算
Conv2D
动态图和静态图的区别
静态图是建立一次,然后不断复用;静态图可以在磁盘中序列化,可以保存整个网络的结构,可以重载,在部署中很实用,在tensorflow静态图中条件和循环需要特定的语法,pytorch只用python的语法就可以实现; 而动态图是每次使用的时候建立,不容易优化,需要重复之前的代码,但是动态图比静态图代码更简洁。
历年来所有的网络
https://ucbrise.github.io/cs294-ai-sys-sp19/assets/lectures/lec02/classic_neural_architectures.pdf
https://towardsdatascience.com/a-simple-guide-to-the-versions-of-the-inception-network-7fc52b863202
LeNet-5:第一个卷积,用来识别手写数组,使用的卷积大小为5x5,s=1,就是普通的卷积核池化层结合起来,最后加上全连接层。 AlexNet:在第一个卷积中使用了11x11卷积,第一次使用Relu,使用了NormLayer但不是我们经常说的BN。使用了dropout,在两个GPU上进行了训练,使用的训练方式是模型并行、 ZFNet:AlexNet的加强版,将11x11卷积改成了7x7,也在AlexNet的基础上将卷积的通道深度加深。所以在分类比赛中比之前的效果好了些。 VGGNet:只使用了小卷积3x3(s=1)以及常规的池化层,不过深度比上一个深了一些,最后几层也都是全连接层接一个softmax。为什么使用3x3卷积,是因为三个3x3卷积的有效感受野和7x7的感受野一致,而且更深、更加非线性,而且卷积层的参数也更加地少,所以速度更快也可以适当加深层数。 GoogleNet:没有使用FC层,参数量相比之前的大大减少,提出了Inception module结构,也就是NIN结构(network within a network)。但是原始的Inception module计算量非常大,所以在每一个分支加了1x1 conv "bottleneck"结构(具体细节看图)。googlenet网络结构中为了避免梯度消失,在中间的两个位置加了两个softmax损失,所以会有三个loss,整个网络的loss是通过三个loss乘上权重相加后得到 相关文章:https://zhuanlan.zhihu.com/p/42704781 inception结构的特点:1、增加了网络的宽度,同时也提高了对于不同尺度的适应程度。2、使用 1x1 卷积核对输入的特征图进行降维处理,这样就会极大地减少参数量,从而减少计算量。3、在V3中使用了多个小卷积核代替大卷积核的方法,除了规整的的正方形,我们还有分解版本的 3x3 = 3x1 + 1x3,这个效果在深度较深的情况下比规整的卷积核更好。4、发明了Bottleneck 的核心思想还是利用多个小卷积核替代一个大卷积核,利用 1x1 卷积核替代大的卷积核的一部分工作。也就是先1x1降低通道然后普通3x3然后再1x1回去。 Xception:改进了inception,提出的 depthwise Separable Conv 让人眼前一亮。https://www.jianshu.com/p/4708a09c4352 ResNet:越深的网络越难进行优化,有一个特点需要搞明白,越深的层最起码表现应该和浅层的一样,不能比浅层的还差。对于更深的Resnet(50+),这里采用bottleneck层(也就是两个1x1分别降维和升维)去提升网络的效率。更详细的描述可以看百面机器学习和ppt。相关讲解:https://zhuanlan.zhihu.com/p/42706477 DenseNet 不能简单说densenet更好,二者比较,ResNet是更一般的模型,DenseNet是更特化的模型。DenseNet用于图像处理可能比ResNet表现更好,本质是DenseNet更能和图像的信息分布特点匹配,是使用了多尺度的Kernel。但是也有缺点最直接的计算就是一次推断中所产生的所有feature map数目。有些框架会有优化,自动把比较靠前的层的feature map释放掉,所以显存就会减少,或者inplace操作通过重新计算的方法减少一部分显存,但是densenet因为需要重复利用比较靠前的feature map,所以无法释放,导致显存占用过大。正是这种_concat_造成densenet能更密集的连接。 SeNet:全称为Squeeze-and-Excitation Networks。属于注意力特征提取的范畴,加了GP(Global pooling)和两个FC再加上sigmoid和scale。也就是生成注意力掩膜,去乘以输入的x得到新的x。核心思想就是去学习每个特征通道的重要程度,然后根据这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征。这个给每一个特征层通道去乘以通过sigmoid得到的重要系数,其实和用bn层去观察哪个系数重要一样。缺点:由于在主干上存在 0~1 的 scale 操作,在网络较深 BP 优化时就会在靠近输入层容易出现梯度消散的情况,导致模型难以优化。http://www.sohu.com/a/161633191_465975 Wide Residual Networks ResNeXt:是resnet和inception的结合体,旁边的residual connection就是公式中的x直接连过来,然后剩下的是32组独立的同样结构的变换,最后再进行融合,符合split-transform-merge的模式。虽然分了32组,都是先点卷积降维,然后3x3普通卷积,然后1x1卷积升维(与Mobilenetv2中的相反) 相关介绍:https://zhuanlan.zhihu.com/p/51075096 Densely Connected Convolutional Networks:有利于减轻梯度消失的情况,增强了特征的流动。
一些统计知识
关于如何训练(训练过程中的一些问题)
全连接层的好伴侣:空间金字塔池化(SPP)
感受野计算
编辑:黄继彦
点个在看 paper不断!