算法工程师面试基础题目及答案

本文详述了深度学习与计算机视觉领域的面试关键知识点,涵盖卷积神经网络(CNN)的各类卷积操作,深度学习基础,机器学习,计算机视觉,图像处理,数学基础,算法基础,语言基础,模型部署以及面试策略。讨论了梯度消失和爆炸的解决方案,激活函数的作用,以及如何改善训练模型效果,如正则化、数据增强等。此外,还涉及了模型优化器的选择,如SGD、Adam等,并探讨了模型不收敛的原因及解决方法,以及面试中常见的问题和策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

深度学习

卷积类

  • 卷积神经网络的特点
    权值共享 稀疏连接 局部感知

  • 有哪些卷积
    常规卷积 3*3等
    单通道卷积 channel
    多通道卷积
    3D卷积
    转置卷积
    1 x1 卷积
    深度可分离卷积
    空洞卷积/膨胀卷积

  • 深度可分离卷积
    一些轻量级的网络,如MobileNet中,会有深度可分离卷积depthwise separable convolution 由depthwise(DW)和pointwise(PW)两个部分结合起来,用来提取特征feature map。相比常规的卷积操作,参数数量和运算成本低。
    主要包含两步:
    1,逐通道卷积 Depthwise Convolution
    一个卷积核负责一个通道,一个通道只被一个卷积核卷积
    在这里插入图片描述
    完全在二维平面内进行。卷积核的数量和上一层的通道数相同。所以一个三通道的图像经过运算后生成了3个Feature map,Depthwise Convolution完成后的Feature map数量与输入层的通道数相同,无法扩展Feature map。而且这种运算对输入层的每个通道独立进行卷积运算,没有有效的利用不同通道在相同空间位置上的feature信息。
    2,逐点卷积
    升维的作用。卷积核尺寸为1x1xM,M为上一层的通道数。
    所以这里的卷积运算会将上一步的map在深度方向上进行加权组合,生成新的Feature map。有几个卷积核就有几个输出Feature map

  • 1*1卷积的作用
    1),增加非线性,增加网络的表达能力
    2), 降维升维
    3),跨通道信息交互(channel的变换)

  • 深度学习为什么要深层?
    1.模型复杂度提升,学习能力提升
    2.层次更深,特征不变性强,类别分类能力越强,要学习复杂的任务需要更深的网络。

  • 如何改善训练模型的效果?
    1,通过提升数据,获取良好数据,对数据预处理,零均值1方差化,数据扩充或者增强
    2,诊断去哪个罗是否过拟合欠拟合。通过偏差方差。正则化,早停等解决过拟合。
    3,通过学习率,激活函数的选择,改善网络全连接层个数层数,优化算法,BN层
    4,权值初始化,Xavier初始化,

  • 如何解决梯度爆炸与消失?
    1.使用预训练加微调 梯度剪切 权重正则(针对梯度爆炸)
    2,使用不同的激活函数
    3,使用bn层
    4,使用残差结构
    5,使用LSTM网络

  • CNN池化层有什么作用?
    1,减少图像尺寸,数据降维
    2,缓解过拟合
    3,保持一定程度的旋转和平移不变性,maxpooling能保证卷积神经网络在一定范围内平移特征能得到同样的激励,具有平移不变性。

  • 卷积神经网络中空洞卷积的作用是什么?
    空洞卷积页脚扩张卷积,在保持采纳数个数不变的情况下增大卷积核的感受野,同时可以保证输出的特征映射的大小保持不变。一个扩张率为2的3X3卷积核,感受野与5X5的卷积核相同,但是参数数量仅为9个。

  • 常用的分割算法有哪些?
    1,基于阈值的分割方法:比较常用的阈值法有大律法和最小误差法
    2,基于边缘的分割方法:常见的微分算子包括Robert算子、Sobel算子,Canny算子等。
    3,基于区域的分割方法:主要包括种子区域生长法、区域分裂合并法和分水岭法等
    4,基于图论的分方法:Graph Cut方法
    5,深度学习:语义分割等。

深度学习基础

  • BN的原理,作用和实现细节
    优点
    1)加快训练速度,这样我们就可以使用较大的学习率来训练网络。
    2)提高网络的泛化能力。解决过拟合
    3)BN层本质上是一个归一化网络层,可以替代局部响应归一化层(LRN层)。
    4)可以打乱样本训练顺序(这样就不可能出现同一张照片被多次选择用来训练)论文中提到可以提高1%的精度。
    BN层的输出Y与输入X之间的关系是:Y = (X - running_mean) / sqrt(running_var + eps) * gamma + beta,此不赘言。其中gamma、beta为可学习参数(在pytorch中分别改叫weight和bias),训练时通过反向传播更新;而running_mean、running_var则是在前向时先由X计算出mean和var,再由mean和var以动量momentum来更新running_mean和running_var。所以在训练阶段,running_mean和running_var在每次前向时更新一次;在测试阶段,则通过net.eval()固定该BN层的running_mean和running_var,此时这两个值即为训练阶段最后一次前向时确定的值,并在整个测试阶段保持不变。
    BN层的位置:可以在激活函数之前也可以之后,使用relu可以放后面,而sigmoid和tanh放激活函数前面,避免破坏非线性特征的分布。

  • 激活函数,哪些和特点
    激活函数作用:加入激活函数可以给模型加入非线性因素,提升模型表达能力。
    激活函数的类型
    1)sigmod函数
    区间在【0,1】之间,不受欢迎主要是因为梯消失问题,输出不是以0 为中心,梯度更新的不同的方向走太远。sigmoid收敛缓慢。
    在这里插入图片描述
    2)tanh函数 双曲正切函数
    输出范围【-1,1】,以0为中心,优化更容易些,但是仍存在梯度消失的问题
    3)Relu函数
    4)Leaky ReLu
    它的收敛性提高了6倍
    它可以避免和纠正梯度消失问题。现如今,几乎所有深度学习模型现在都使用ReLu函数。
    但它的局限性在于它只能在神经网络模型的隐藏层中使用。
    ReLu函数的另一个问题是,一些梯度在训练过程中可能很脆弱,甚至可能会死亡。它可以导致权重更新,这将使其永远不会在任何数据点上激活。简单地说ReLu可能会导致死亡神经元。
    为了解决这个问题,我们引进了另一个被称为Leaky ReLu的修改函数,让它来解决死亡神经元的问题。它引入了一个小斜坡从而保持更新值具有活力。在0上不可导,可以使用二阶导值,或者一个梯度的定值。
    然后,我们还有另一个变体,它形成于ReLu函数和Leaky ReLu函数的结合,我们称之为Maxout函数。
    5)Mish激活函数
    怎么解决梯度消失和梯度爆炸?
    用ReLU、Leaky ReLU、PReLU、RReLU、Maxout等替代sigmoid函数。
    用Batch Normalization。
    可以通过添加正则项,避免梯度爆炸,压缩wi权重大小。
    LSTM的结构设计也可以改善RNN中的梯度消失问题。
    使用残差结构,主要是解决网络退化
    使用更有的初始化方式,或者采用pre_train,fine_tuning模式

  • 损失函数哪些,作用
    1)l1范数误差,计算预测值与标签差值的绝对值:torch.nn.L1Loss(reduction=‘mean’)
    2)均方误差损失函数
    3)交叉熵损失函数
    4)KL散度torch.nn.KLDivLoss(reduction=‘mean’)
    5)二进制交叉熵损失BCELoss 二分类任务时的交叉熵计算函数。用于测量重构的误差, 例如自动编码机. 注意目标的值 t[i] 的范围为0到1之间.
    6)BCEWithLogitsLoss 把sigmoid集合进BCELoss中
    7)MarginRankingLoss torch.nn.MarginRankingLoss(margin=0.0, reduction=‘mean’)
    对于batch中的每个实例的损失如下 m a x ( 0 , − y ∗ ( x 1 − x 2 ) + m a r g i n ) max(0,-y*(x_1-x_2)+margin) max(0,y(x1x2)+margin)
    8)三元组损失函数:TripletMarginLoss
    torch.nn.TripletMarginLoss(margin=1.0, p=2.0, eps=1e-06, swap=False, reduction=‘mean’)
    具体例子:给一个A,然后再给B、C,看看B、C谁和A更像。
    L(a,p,n)=max{d(a,p)-d(a,n)+margin,0}

  • 过拟合/欠拟合的预防方法
    过拟合
    方差大,偏差小
    解决办法:
    1),重新清洗数据,导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据。
    2),增大数据的训练量,还有一个原因就是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小。
    3),采用正则化方法。正则化方法包括L0正则、L1正则和L2正则,而正则一般是在目标函数之后加上对于的范数。但是在机器学习中一般使用L2正则,下面看具体的原因。
    4),采用dropout方法。这个方法在神经网络里面很常用。dropout方法是ImageNet中提出的一种方法,通俗一点讲就是dropout方法在训练的时候让神经元以一定的概率不工作。降低网络训练时的网络复杂度
    欠拟合
    1)添加其他特征项
    2)减小正则化参数
    3)添加多项式特征,增加网络复杂度

  • 梯度消失和梯度爆炸,现象、原因和解决方法
    原因:梯度的累乘,激活函数的特性决定。比如sigmiod在饱和区梯度很小,累乘后消失,在0处梯度很大,累乘会变成很大的值。
    解决方案: bn relu 正则化 resnet模块

  • 网络退化的现象、原因和解决方法
    参考文章:https://blog.csdn.net/cristiano20/article/details/104309948
    在这里插入图片描述
    理论上网络深度越深,特征的提取能力越强。但是实际并非如此,上图所示拥有56层数的网络结构明显差于拥有20层数的网络结构,造成这一现象的原因的大概有:过拟合、梯度消失/爆炸和深度网络的退化(信息损失)。
    解决方法:ResNet,引入残差结构
    ResNet的初衷,就是让网络拥有这种恒等映射的能力,能够在加深网络的时候,至少能保证深层网络的表现至少和浅层网络持平。

  • 各种优化器,特点和公式
    1) SGD
    SGD就是每一次迭代计算mini-batch的梯度,然后对参数进行更新,是最常见的优化方法了
    缺点:1,学习率难以选择,2,容易产生局部最优
    2)Momentum
    参考文献:https://blog.csdn.net/fengchao03/article/details/78208414?utm_source=blogxgwz5
    momentum是模拟物理里动量的概念,积累之前的动量来替代真正的梯度,动量的大小和梯度有关。
    adam
    经验
    对于稀疏数据,尽量使用学习率可自适应的优化方法,不用手动调节,而且最好采用默认值
    SGD通常训练时间更长,但是在好的初始化和学习率调度方案的情况下,结果更可靠
    如果在意更快的收敛,并且需要训练较深较复杂的网络时,推荐使用学习率自适应的优化方法。
    Adadelta,RMSprop,Adam是比较相近的算法,在相似的情况下表现差不多。
    在想使用带动量的RMSprop,或者Adam的地方,大多可以使用Nadam取得更好的效果

  • 调参技巧,调参顺序
    在这里插入图片描述
    1)实现是搭建模型:

  • 有源码将源码跑通,没有的话考虑自己搭建模型;

  • 主干网络可以直接考虑resnet,(后续网络优化部分再考虑裁剪或者其他网络结构)

  • loss根据任务考虑,分类多试交叉熵,回归是最小二乘法;

  • 优化函数,采用Adam或者SGD都可以。

  • 学习率可以从0.1或者0.01开始

  • batchsize:32 或者64
    2)准备小规模样本
    比如存在100w数据,可以先打包1w数据或者几千样本,可以暂时先不考虑数据增强,正常打包后直接训练网络,用小批量样本来测试网络搭建中可能存在的bug,直到网络可以收敛,确保网络搭建的准确性,方便后续出现问题时,问题的定位。
    3)小规模样本训练收敛之后,则可以确定模型框架没有问题。开始加大样本规模到100W,使用大规模样本训练;
    4)训练后,分析训练集和测试集LOSS的变化情况,考虑上述过拟合、欠拟合、收敛不稳定不同情况,优化相应的参数;
    5,在Loss出现较为理想的结果后,基本上网络训练也趋于稳定。接下来则是重点排查难点问题,尝试创新性的调整网络架构,尝试新的loss,调整数据增强策略,不同优化函数,不同学习率,不同batchsize等等,通过各种手段,来提高准确度。

  1. softmax原理
    计算将 x i x_i xi归属类别j的概率为:
    p ( y i = j ∣ x i ; θ ) = e θ j T x i ∑ l = 1 k e θ l T x i p(y_i=j|x_i;\theta)=\frac{e^{\theta_{j}^Tx_i}}{\sum_{l=1}^ke^{\theta_l^Tx_i}} p(y

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值