锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

【三年面试五年模拟】算法工程师的独孤九剑秘籍(前六式汇总篇)V1版

时间:2022-09-22 07:30:01 挖机手动式快速连接器挖掘机工作台旋转角度传感器u型光式传感器系列id压缩型传感器amic单点式传感器3255通用型单轴加速度传感器

Rocky Ding

公众号:WeThinkIn

写在前面

【五年模拟三年面试】栏目重点分享CV与机器学习相关的算法经典&&必备&&高价值的面试知识点,并向着更实战,更真实,更从容的方向不断优化迭代。也欢迎大家提出宝贵的意见或优化ideas,一起交流学习,一起交流学习????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

大家好,我是Rocky。

本文是独孤九剑的秘籍,三年面试五年模拟特别系列,我们将独孤九剑秘籍的前六种类型汇总整理成汇总,制作成pdf版本,可以在微信官方账号后台取用。因为这篇文章和pdf版本都是Rocky下班后整理总结难免会出现疏漏和错误。欢迎纠正可优化部分,我会在后续的优化迭代版中及时纠正。

Rocky操作也是一致的技术交流群(WeThinkIn-技术交流小组),该小组的初衷主要集中在技术话题的讨论和学习上,包括但不限于CV算法、算法、开发、IT技术等。群里有很多人工智能行业的大牛。欢迎加入群学习交流~(请关注微信官方账号,在后台扫描二维码进入群;如果二维码失效,请加我微信,我拉你进群~)

在算法工程师三年面试五年模拟的独孤九剑秘籍(先行版)中,我们阐述了这一点program愿景与规划。

希望独孤九剑秘籍的每一种风格都能让江湖英雄受益。

So,enjoy:

干货篇

----【目录先】----

深度学习基础:

  1. 卷积的特点是什么?

  2. 不同层次的卷积提取了哪些特征?

  3. 如何选择卷积核的大小?

  4. 卷积感受野生相关概念

  5. 网络网络只能使用一个尺寸的卷积核吗?

  6. 1 ? 1 1*1 1?1 卷积的作用?

  7. 转移卷积的作用?

  8. 空洞卷积的作用?

  9. 全连接层的作用?

  10. CNN中池化的作用?

  11. 改进的方法有哪些?CNN模型的泛化能力?

  12. BN总结高频面试问题

经典模型&&热门模型:

  1. 目标检测中IOU相关概念及计算

  2. 目标检测中NMS相关概念及计算

  3. One-stage目标检测与Two-stage目标检测的区别?

  4. 哪些方法可以提高小目标检测的效果?

  5. ResNet模型的特点和解决的问题?

  6. ResNeXt模型的结构和特点?

  7. MobileNet系列模型的结构和特点?

  8. ViT(Vision Transformer)模型的结构和特点?

  9. MobileNet系列模型的结构和特点?

  10. EfficientNet系列模型的结构和特点?

  11. 经典模面试模型?

机器学习基础:

  1. 模型的偏差和方差是多少?

  2. 如何处理数据类别不平衡?

  3. 什么是过拟合,解决过拟合的方法是什么?

  4. 什么是欠拟合,解决欠拟合的方法有哪些?

  5. 常用的距离测量方法

  6. 正则化的本质和常用的正则化手段?

  7. L范数的作用?

  8. Dropout的作用?

  9. Softmax定义和作用

  10. 交叉熵的定义和作用

  11. 训练集/验证集/测试集划分

  12. 如何找到让F最高分类阈值1?

数据结构&&算法:

  1. 常用数据结构的相关知识

  2. 二叉树遍历(递归)模板

  3. 不同排序算法的异同?

  4. 树有哪些遍历模式?

Python/C/C 知识:

  1. Python中迭代器的概念?

  2. Python中生成器的相关知识

  3. Python装饰相关知识

  4. Python深拷贝和浅拷贝?

  5. Python是解释语言还是编译语言?

  6. Python垃圾回收机制

  7. Python有多线程吗?

  8. Python中range和xrange的区别?

  9. Python中列表和元组的区别?

  10. Python中dict(字典)(字典)?

  11. 哪家公司开发了常用的深度学习框架?

  12. PyTorch动态图和TensorFlow静态图的区别?

  13. C/C 面向对象的相关知识

  14. C/C 中struct的内存对齐与内存占用计算?

  15. C/C 智能指针的定义和作用?

  16. C/C 中程序的开发过程?

  17. C/C 中数组和链表的优缺点?

  18. C/C 中的new和malloc有什么区别?

模型部署:

  1. 模型压缩的必要性和可行性?

  2. X86和ARM深度学习侧结构的区别?

  3. FP32,FP16以及Int8的区别?

  4. GPU显存占用和GPU定义利用率

  5. 神经网络的显存占用分析

  6. 算法模型部署逻辑?

  7. 影响模型inference速度的因素?

  8. 为何在AI传统的图像算法一般不用于端侧设备?

  9. 减少模型内存占用的方法有哪些?

  10. 经典的轻量化网络有哪些?

  11. 计算模型参数?

  12. 模型FLOPs怎么算?

图像处理基础:

  1. 图像二值化的相关概念

  2. 图像膨胀腐蚀的相关概念

  3. 高斯滤波器p

  4. 边缘检测的相关概念

  5. 图像高/低通滤波的相关概念

  6. 图像中低频信息和高频信息的定义

  7. 色深的概念

  8. 常用空间平滑技术

  9. RAW图像和RGB图像的区别?

  10. 常用的色彩空间格式

  11. 模型训练时常用的插值算法?

  12. 常用图像增强的方法?

计算机基础:

  1. 深度学习中常用的Linux命令汇总

  2. 计算机多线程和多进程的区别?

  3. TCP/IP四层模型的相关概念

  4. OSI七层模型的相关概念

开放性问题:

  1. 如何给一个完全没有接触过机器学习的人介绍机器学习?

  2. Transformer会完全替代CNN吗?

  3. AI算法如何赋能电商业务?

  4. AI算法如何赋能传统工业?

  5. 黑盒系统如何去强约束与强优化?

  6. 非标场景如何沉淀?

  7. 如何对已有业务进行优化?

  8. 工作中业务侧/竞赛侧/研究侧的配比

  9. 你能想到哪些新的AI产品形式?

  10. 如何提高AI业务中各部门之间的沟通/合作的效率?

  11. 竞赛侧与研究侧的成果如何沉淀到业务中?

  12. 如何扩展已有业务?

----【深度学习基础】----

【一】卷积有什么特点?

卷积主要有三大特点

  1. 局部连接。比起全连接,局部连接会大大减少网络的参数。在二维图像中,局部像素的关联性很强,设计局部连接保证了卷积网络对图像局部特征的强响应能力。

  2. 权值共享。参数共享也能减少整体参数量,增强了网络训练的效率。一个卷积核的参数权重被整张图片共享,不会因为图像内位置的不同而改变卷积核内的参数权重。

  3. 下采样。下采样能逐渐降低图像分辨率,实现了数据的降维,并使浅层的局部特征组合成为深层的特征。下采样还能使计算资源耗费变少,加速模型训练,也能有效控制过拟合。

【二】不同层次的卷积都提取什么类型的特征?

  1. 浅层卷积 → \rightarrow 提取边缘特征

  2. 中层卷积 → \rightarrow 提取局部特征

  3. 深层卷积 → \rightarrow 提取全局特征

【三】卷积核大小如何选取?

最常用的是 3 × 3 3\times3 3×3大小的卷积核,两个 3 × 3 3 \times 3 3×3卷积核和一个 5 × 5 5 \times 5 5×5卷积核的感受野相同,但是减少了参数量和计算量,加快了模型训练。与此同时由于卷积核的增加,模型的非线性表达能力大大增强。

不过大卷积核( 7 × 7 , 9 × 9 7 \times 7,9 \times 9 7×79×9)也有使用的空间,在GAN,图像超分辨率,图像融合等领域依然有较多的应用,大家可按需切入感兴趣的领域查看相关论文。

【四】卷积感受野的相关概念

目标检测和目标跟踪很多模型都会用到RPN层,anchor是RPN层的基础,而感受野(receptive field,RF)是anchor的基础。

感受野的作用:

  1. 一般来说感受野越大越好,比如分类任务中最后卷积层的感受野要大于输入图像。

  2. 感受野足够大时,被忽略的信息就较少。

  3. 目标检测任务中设置anchor要对齐感受野,anchor太大或者偏离感受野会对性能产生一定的影响。

感受野计算:

增大感受野的方法:

  1. 使用空洞卷积

  2. 使用池化层

  3. 增大卷积核

【五】网络每一层是否只能用一种尺寸的卷积核?

常规的神经网络一般每层仅用一个尺寸的卷积核,但同一层的特征图可以分别使用多个不同尺寸的卷积核,以获得不同尺度的特征,再把这些特征结合起来,得到的特征往往比使用单一尺寸卷积核的要好,如GoogLeNet 、Inception系列的网络,均是每层使用了多个不同的卷积核结构。如下图所示,输入的特征图在同一层分别经过 1 × 1 1\times 1 1×1 3 × 3 3\times3 3×3 5 × 5 5\times5 5×5三种不同尺寸的卷积核,再将各自的特征图进行整合,得到的新特征可以看作不同感受野提取的特征组合,相比于单一尺寸卷积核会有更强的表达能力。

【六】 1 ∗ 1 1*1 11 卷积的作用?

1 ∗ 1 1 * 1 11卷积的作用主要有以下几点:

  1. 实现特征信息的交互与整合。

  2. 对特征图通道数进行升维和降维,降维时可以减少参数量。

  3. 1 ∗ 1 1*1 11卷积+ 激活函数 → \rightarrow 增加非线性,提升网络表达能力。

1 ∗ 1 1 * 1 11卷积首发于NIN(Network in Network),后续也在GoogLeNet和ResNet等网络中使用。感兴趣的朋友可追踪这些论文研读细节。

【七】转置卷积的作用?

转置卷积通过训练过程学习到最优的上采样方式,来代替传统的插值上采样方法,以提升图像分割,图像融合,GAN等特定任务的性能。

转置卷积并不是卷积的反向操作,从信息论的角度看,卷积运算是不可逆的。转置卷积可以将输出的特征图尺寸恢复卷积前的特征图尺寸,但不恢复原始数值。

转置卷积的计算公式:

我们设卷积核尺寸为 K × K K\times K K×K,输入特征图为 i × i i \times i i×i

(1)当 s t r i d e = 1 , p a d d i n g = 0 stride = 1,padding = 0 stride=1padding=0时:

输入特征图在进行转置卷积操作时相当于进行了 p a d d i n g = K − 1 padding = K - 1 padding=K1的填充,接着再进行正常卷积转置之后的标准卷积运算。

输出特征图的尺寸 = i + ( K − 1 ) i + (K - 1) i+(K1)

(2)当 s t r i d e > 1 , p a d d i n g = 0 stride > 1,padding = 0 stride>1padding=0时:

输入特征图在进行转置卷积操作时相当于进行了 p a d d i n g = K − 1 padding = K - 1 padding=K1的填充,相邻元素间的空洞大小为 s t r i d e − 1 stride - 1 stride1,接着再进行正常卷积转置之后的标准卷积运算。

输出特征图的尺寸 = s t r i d e ∗ ( i − 1 ) + K stride * (i - 1) + K stride(i1)+K

【八】空洞卷积的作用?

空洞卷积的作用是在不进行池化操作损失信息的情况下,增大感受野,让每个卷积输出都包含较大范围的信息

空洞卷积有一个参数可以设置dilation rate,其在卷积核中填充dilation rate个0,因此,当设置不同dilation rate时,感受野就会不一样,也获取了多尺度信息。

(a) 图对应3x3的1-dilated conv,和普通的卷积操作一样。(b)图对应 3 × 3 3\times3 3×3的2-dilated conv,实际的卷积kernel size还是 3 × 3 3\times3 3×3,但是空洞为 1 1 1,也就是对于一个 7 × 7 7\times7 7×7的图像patch,只有 9 9 9个红色的点和 3 × 3 3\times3 3×3的kernel发生卷积操作,其余的点的权重为 0 0 0。©图是4-dilated conv操作。

【九】全连接层的作用?

全连接层将卷积学习到的高维特征映射到label空间,可以作为整个网络的分类器模块。

虽然全连接层参数存在冗余的情况,但是在模型进行迁移学习时,其能保持较大的模型capacity。

目前很多模型使用全局平均池化(GAP)取代全连接层以减小模型参数,并且依然能达到SOTA的性能。

【十】CNN中池化的作用?

池化层的作用是对感受野内的特征进行选择,提取区域内最具代表性的特征,能够有效地减少输出特征数量,进而减少模型参数量。按操作类型通常分为最大池化(Max Pooling)、平均池化(Average Pooling)和求和池化(Sum Pooling),它们分别提取感受野内最大、平均与总和的特征值作为输出,最常用的是最大池化和平均池化。

【十一】有哪些方法能提升CNN模型的泛化能力?

  1. 采集更多数据:数据决定算法的上限。

  2. 优化数据分布:数据类别均衡。

  3. 选用合适的目标函数。

  4. 设计合适的网络结构。

  5. 数据增强。

  6. 权值正则化。

  7. 使用合适的优化器等。

【十二】BN层面试高频问题大汇总

BN层解决了什么问题?

统计机器学习中的一个经典假设是“源空间(source domain)和目标空间(target domain)的数据分布(distribution)是一致的”。如果不一致,那么就出现了新的机器学习问题,如transfer learning/domain adaptation等。而covariate shift就是分布不一致假设之下的一个分支问题,它是指源空间和目标空间的条件概率是一致的,但是其边缘概率不同。对于神经网络的各层输出,由于它们经过了层内卷积操作,其分布显然与各层对应的输入信号分布不同,而且差异会随着网络深度增大而增大,但是它们所能代表的label仍然是不变的,这便符合了covariate shift的定义。

因为神经网络在做非线性变换前的激活输入值随着网络深度加深,其分布逐渐发生偏移或者变动(即上述的covariate shift)。之所以训练收敛慢,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(比如sigmoid),所以这导致反向传播时低层神经网络的梯度消失,这是训练深层神经网络收敛越来越慢的本质原因。而BN就是通过一定的正则化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,避免因为激活函数导致的梯度弥散问题。所以与其说BN的作用是缓解covariate shift,也可以说BN可缓解梯度弥散问题。

BN的公式

其中scale和shift是两个可学的参数,因为减去均值除方差未必是最好的分布。比如数据本身就很不对称,或者激活函数未必是对方差为1的数据有最好的效果。所以要加入缩放及平移变量来完善数据分布以达到比较好的效果。

BN层训练和测试的不同

在训练阶段,BN层是对每个batch的训练数据进行标准化,即用每一批数据的均值和方差。(每一批数据的方差和标准差不同)

而在测试阶段,我们一般只输入一个测试样本,并没有batch的概念。因此这个时候用的均值和方差是整个数据集训练后的均值和方差,可以通过滑动平均法求得:

上面式子简单理解就是:对于均值来说直接计算所有batch u u u值的平均值;然后对于标准偏差采用每个batch σ B σ_B σB的无偏估计。

在测试时,BN使用的公式是:

BN训练时为什么不用整个训练集的均值和方差?

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

BN层用在哪里?

在CNN中,BN层应该用在非线性激活函数前面。由于神经网络隐藏层的输入是上一层非线性激活函数的输出,在训练初期其分布还在剧烈改变,此时约束其一阶矩和二阶矩无法很好地缓解 Covariate Shift;而BN的分布更接近正态分布,限制其一阶矩和二阶矩能使输入到激活函数的值分布更加稳定。

BN层的参数量

我们知道 γ γ γ β β β是需要学习的参数,而BN的本质就是利用优化学习改变方差和均值的大小。在CNN中,因为网络的特征是对应到一整张特征图上的,所以做BN的时候也是以特征图为单位而不是按照各个维度。比如在某一层,Batch大小为 m m m,那么做BN的参数量为 m ∗ 2 m * 2 m2

BN的优缺点

优点:

  1. 可以选择较大的初始学习率。因为这个算法收敛很快。

  2. 可以不用dropout,L2正则化。

  3. 不需要使用局部响应归一化。

  4. 可以把数据集彻底打乱。

  5. 模型更加健壮。

缺点:

  1. Batch Normalization非常依赖Batch的大小,当Batch值很小时,计算的均值和方差不稳定。

  2. 所以BN不适用于以下几个场景:小Batch,RNN等。

----【经典模型&&热门模型】----

【一】目标检测中IOU的相关概念与计算

IoU(Intersection over Union)即交并比,是目标检测任务中一个重要的模块,其是GT bbox与pred bbox交集的面积 / 二者并集的面积

下面我们用坐标(top,left,bottom,right),即左上角坐标,右下角坐标。从而可以在给定的两个矩形中计算IOU值。

def compute_iou(rect1,rect2):
  # (y0,x0,y1,x1) = (top,left,bottom,right)
  S_rect1 = (rect1[2] - rect1[0]) * (rect1[3] - rect1[1])
  S_rect2 = (rect2[2] - rect2[0]) * (rect2[3] - rect1[1])

  sum_all = S_rect1 + S_rect2
  left_line = max(rect1[1],rect2[1])
  right_line = min(rect1[3],rect2[3])
  top_line = max(rect1[0],rect2[0])
  bottom_line = min(rect1[2],rect2[2])

  if left_line >= right_line or top_line >= bottom_line:
    return 0
  else:
    intersect = (right_line - left_line) * (bottom_line - top_line)
    return (intersect / (sum_area - intersect)) * 1.0

【二】目标检测中NMS的相关概念与计算

在目标检测中,我们可以利用非极大值抑制(NMS)对生成的大量候选框进行后处理,去除冗余的候选框,得到最具代表性的结果,以加快目标检测的效率。

如下图所示,消除多余的候选框,找到最佳的bbox:

非极大值抑制(NMS)流程:

  1. 首先我们需要设置两个值:一个Score的阈值,一个IOU的阈值。

  2. 对于每类对象,遍历该类的所有候选框,过滤掉Score值低于Score阈值的候选框,并根据候选框的类别分类概率进行排序: A < B < C < D < E < F A < B < C < D < E < F A<B<C<D<E<F

  3. 先标记最大概率矩形框F是我们要保留下来的候选框。

  4. 从最大概率矩形框F开始,分别判断A~E与F的交并比(IOU)是否大于IOU的阈值,假设B、D与F的重叠度超过IOU阈值,那么就去除B、D。

  5. 从剩下的矩形框A、C、E中,选择概率最大的E,标记为要保留下来的候选框,然后判断E与A、C的重叠度,去除重叠度超过设定阈值的矩形框。

  6. 就这样重复下去,直到剩下的矩形框没有了,并标记所有要保留下来的矩形框。

  7. 每一类处理完毕后,返回步骤二重新处理下一类对象。

import numpy as np

def py_cpu_nms(dets, thresh):
  #x1、y1(左下角坐标)、x2、y2(右上角坐标)以及score的值
  x1 = dets[:, 0]
  y1 = dets[:, 1]
  x2 = dets[:, 2]
  y2 = dets[:, 3]
  scores = dets[:, 4]

  #每一个候选框的面积
  areas = (x2 - x1 + 1) * (y2 - y1 + 1)
  #按照score降序排序(保存的是索引)
  order = scores.argsort()[::-1]

  keep = []
  while order.size > 0:
    i = order[0]
    keep.append(i)
    #计算当前概率最大矩形框与其他矩形框的相交框的坐标,会用到numpy的broadcast机制,得到向量
    xx1 = np.maximum(x1[i], x1[order[1:]])
    yy1 = np.maximum(y1[i], y1[order[1:]])
    xx2 = np.minimum(x2[i], x2[order[1:]])
    yy2 = np.minimum(y2[i], y2[order[1:]])

    #计算相交框的面积,注意矩形框不相交时w或h算出来会是负数,用0代替
    w = np.maximum(0.0, xx2 - xx1 + 1)
    h = np.maximum(0.0, yy2 - yy1 + 1)
    inter = w * h
    #计算重叠度IOU:重叠面积 / (面积1 + 面积2 - 重叠面积)
    ovr = inter / (areas[i] + areas[order[1:]] - inter)

    #找到重叠度不高于阈值的矩形框索引
    inds = np.where(ovr < thresh)[0]
    # 将order序列更新,由于前面得到的矩形框索引要比矩形框在原order序列中的索引小1,所以要加1操作
    order = order[inds + 1]

  return keep

【三】One-stage目标检测与Two-stage目标检测的区别?

Two-stage目标检测算法:先进行区域生成(region proposal,RP)(一个有可能包含待检物体的预选框),再通过卷积神经网络进行样本分类。其精度较高,速度较慢。

主要逻辑:特征提取—>生成RP—>分类/定位回归。

常见的Two-stage目标检测算法有:Faster R-CNN系列和R-FCN等。

One-stage目标检测算法:不用RP,直接在网络中提取特征来预测物体分类和位置。其速度较快,精度比起Two-stage算法稍低。

主要逻辑:特征提取—>分类/定位回归。

常见的One-stage目标检测算法有:YOLO系列、SSD和RetinaNet等。

【四】哪些方法可以提升小目标检测的效果?

  1. 提高图像分辨率。小目标在边界框中可能只包含几个像素,那么能通过提高图像的分辨率以增加小目标的特征的丰富度。

  2. 提高模型的输入分辨率。这是一个效果较好的通用方法,但是会带来模型inference速度变慢的问题。

  3. 平铺图像。

  1. 数据增强。小目标检测增强包括随机裁剪、随机旋转和镶嵌增强等。

  2. 自动学习anchor。

  3. 类别优化。

【五】ResNet模型的特点以及解决的问题?

每次回答这个问题的时候,都会包含我的私心,我喜欢从电气自动化的角度去阐述,而非计算机角度,因为这会让我想起大学时代的青葱岁月。

ResNet就是一个差分放大器。ResNet的结构设计,思想逻辑,就是在机器学习中抽象出了一个差分放大器,其能让深层网络的梯度的相关性增强,在进行梯度反传时突出微小的变化。

模型的特点则是设计了残差结构,其对模型输出的微小变化非常敏感。

为什么加入残差模块会有效果呢?

假设:如果不使用残差模块,输出为 F 1 ( x ) = 5.1 F_{1} (x)= 5.1 F1(x)=5.1,期望输出为 H 1 ( x ) = 5 H_{1} (x)= 5 H1(x)=5,如果想要学习H函数,使得 F 1 ( x ) = H 1 ( x ) = 5 F_{1} (x) = H_{1} (x) = 5 F1(x)=H1(x)=5,这个变化率比较低,学习起来是比较困难的。

但是如果设计为 H 1 ( x ) = F 1 ( x ) + 5 = 5.1 H_{1} (x) = F_{1} (x) + 5 = 5.1 H1(x)=F1(x)+5=5.1,进行一种拆分,使得 F 1 ( x ) = 0.1 F_{1} (x)= 0.1 F1(x)=0.1,那么学习目标就变为让 F 1 ( x ) = 0 F_{1} (x)= 0 F1(x)=0,一个映射函数学习使得它输出由0.1变为0,这个是比较简单的。也就是说引入残差模块后的映射对输出变化更加敏感了。

进一步理解:如果 F 1 ( x ) = 5.1 F_{1} (x)= 5.

相关文章