分享

算法工程师面试,独孤九剑秘籍(第十二式)

 mynotebook 2023-01-21 发布于湖南

作者:Rocky Ding

链接:https://mp.weixin.qq.com/s/kJXyFSRRfLw_LV6EJ3u2Zg

本文仅用于学术分享,如有侵权,请联系台作删文处理

图片
导读
本文详细的阐述了工作和面试过程中,常常会遇到的各种基础知识点和各种组件,帮助大家温故知新,值得收藏观看!


文章目录
1 深度学习基础
2 经典模型&&热门模型
3 机器学习基础
4 数据结构&&算法
5 Python/C/C++知识
6 模型部署
7 图像处理基础
8 计算机基础
9 开放性问题

【深度学习基础】

【一】什么是转置卷积的棋盘效应?

图片
造成棋盘效应的原因是转置卷积的不均匀重叠(uneven overlap)。这种重叠会造成图像中某个部位的颜色比其他部位更深。
在下图展示了棋盘效应的形成过程,深色部分代表了不均匀重叠:
图片
棋盘效应

接下来我们将卷积步长改为2,可以看到输出图像上的所有像素从输入图像中接收到同样多的信息,它们都从输入图像中接收到一个像素的信息,这样就不存在转置卷带来的重叠区域。

图片

我们也可以直接进行插值Resize操作,然后再进行卷积操作来消除棋盘效应。这种方式在超分辨率重建场景中比较常见。例如使用双线性插值和近邻插值等方法来进行上采样。

【二】Instance Normalization的作用?

Instance Normalization(IN)和Batch Normalization(BN)一样,也是Normalization的一种方法,只是IN是作用于单张图片,而BN作用于一个Batch

BN对Batch中的每一张图片的同一个通道一起进行Normalization操作,而IN是指单张图片的单个通道单独进行Normalization操作。如下图所示,其中C代表通道数,N代表图片数量(Batch)。

图片

IN适用于生成模型中,比如图片风格迁移。因为图片生成的结果主要依赖于某个图像实例,所以对整个Batch进行Normalization操作并不适合图像风格化的任务,在风格迁移中使用IN不仅可以加速模型收敛,并且可以保持每个图像实例之间的独立性。

下面是IN的公式:

图片

其中t代表图片的index,i代表的是feature map的index。

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

【一】Focal Loss的作用?

Focal Loss是解决了分类问题中类别不均衡、分类难度差异的一个损失函数,使得模型在训练过程中更加聚焦在困难样本上。
Focal Loss是从二分类问题出发,同样的思想可以迁移到多分类问题上。
我们知道二分类问题的标准loss是交叉熵
图片
对于二分类问题我们也几乎适用sigmoid激活函数,所以上面的式子可以转化成:
图片
这里有
Focal Loss论文中给出的式子如下:
图片

其中是真实标签,是预测概率。

我们再定义

图片

那么,上面的交叉熵的式子可以转换成:

图片

有了上面的铺垫,最初Focal Loss论文中接着引入了均衡交叉熵函数

图片

针对类别不均衡问题,在Loss里加入一个控制权重,对于属于少数类别的样本,增大即可。但这样有一个问题,它仅仅解决了正负样本之间的平衡问题,并没有区分易分/难分样本

为什么上述公式只解决正负样本不均衡问题呢?

因为增加了一个系数,跟的定义类似,当的时候 ;当的时候,的范围也是。因此可以通过设定的值(如果这个类别的样本数比这个类别的样本数少很多,那么可以取来增加这个类的样本的权重)来控制正负样本对整体Loss的贡献。

Focal Loss

为了可以区分难/易样本,Focal Loss雏形就出现了:

图片

用于平衡难易样本的比例不均,起到了对的放大作用。减少易分样本的损失,使模型更关注于困难易错分的样本。例如当时,模型对于某正样本预测置信度,这时,也就是FL值变得很小;而当模型对于某正样本预测置信度为0.3时,,此时它对Loss的贡献就变大了。当时变成交叉熵损失。

为了应对正负样本不均衡的问题,在上面的式子中再加入平衡交叉熵的因子,用来平衡正负样本的比例不均,最终得到Focal Loss:

图片

Focal Loss论文中给出的实验最佳取值为

图片

【二】YOLO系列的面试问题

Rocky之前总结了YOLOv1-v7全系列的解析文章,帮助大家应对可能出现的与YOLO相关的面试问题,大家可按需取用:
【Make YOLO Great Again】YOLOv1-v7全系列大解析(汇总篇)

【机器学习基础】

【一】机器学习有哪些种类?

机器学习中通常根据数据是否有标签可以分为监督学习(supervised learning)、非监督学习(unsupervised learning),半监督学习(semi-supervised learning)以及弱监督学习(weakly supervised learning)。
监督学习
机器学习模型在训练过程中的所有数据都有标签,就是监督学习的逻辑。
监督学习是最常见的学习种类,常见场景为分类和回归问题。
深度学习模型大都数都遵从监督学习的流程,并且支持向量机(Support Vector Machine, SVM),朴素贝叶斯(Naive Bayes),逻辑回归(Logistic Regression),K近邻(K-Nearest Neighborhood, KNN),决策树(Decision Tree),随机森林(Random Forest),AdaBoost以及线性判别分析(Linear Discriminant Analysis, LDA)等也属于监督学习算法的范畴。
非监督学习
非监督学习与监督学习完全相反,机器学习模型在训练过程中的所有数据都是没有标签的,主要学习数据本身的一些特性。
比如想象一个人从来没有见过猫和狗,如果给他看了大量的猫和狗,虽然他还是没有猫和狗的概念,但是他是能够观察出每个物种的共性和两个物种间的区别的,并对这个两种动物予以区分。
半监督学习
半监督学习的逻辑是机器学习模型在训练过程中,部分数据有标签,与此同时另外一部分数据没有标签,并把这两种数据都利用起来用于训练。
弱监督学习
弱监督学习的逻辑是机器学习模型在训练过程中使用的数据的标签存在不可靠的情况。这里的不可靠可以是标注不正确,多重标记,标记不充分,局部标记,包含噪声等情况。一个直观的例子是相对于分割的标签来说,分类的标签就是弱标签。

【二】L1正则为什么比L2正则更容易产生稀疏解?

我们首先可以设目标函数为,目标函数中的权值参数为,那么目标函数和权值参数的关系如下所示:
图片
如上图所示,最优的在绿色的点处,而且非零。
我们首先可以使用L2正则进行优化,新的目标函数:,示意图如下蓝线所示:
图片
我们可以看到,最优的出现在黄点处,的绝对值减小了,更靠近横坐标轴,但是依然是非零的。
为什么是非零的呢?
我们可以对L2正则下的目标函数求导:
图片
我们发现,权重每次乘上的是小于1的倍数进行收敛,而且其导数在时没有办法做到左右两边导数异号,所以L2正则使得整个训练过程稳定平滑,但是没有产生稀疏性。
接下来我们使用L1正则,新的目标函数:,示意图如下粉线所示:
图片
这里最优的就变成了0。因为保证使用L1正则后处左右两个导数异号,就能满足极小值点形成的条件。
我们来看看这次目标函数求导的式子:
图片

可以看出L1正则的惩罚很大,每次都是减去一个常数的线性收敛,所以L1比L2更容易收敛到比较小的值,而如果,就能保证处取得极小值。

上面只是一个权值参数。在深层网路中,L1会使得大量的最优值变成0,从而使得整个模型有了稀疏性。

【Python/C/C++知识】

【一】Python中assert的作用?

Python中assert(断言)用于判断一个表达式,在表达式条件为的时候触发异常。
断言可以在条件不满足程序运行的情况下直接返回错误,而不必等待程序运行后出现崩溃的情况。
Rocky直接举一些例子:
>>> assert True 
>>> assert False
Traceback (most recent call last):
  File '<stdin>', line 1in <module>
AssertionError
>>> assert 1 == 1
>>> assert 1 == 2
Traceback (most recent call last):
  File '<stdin>', line 1in <module>
AssertionError
>>> assert 1 != 2

【二】Python中互换变量有不用创建临时变量的方法吗?

在Python中,当我们想要互换两个变量的值或将列表中的两个值交换时,我们可以使用如下的格式进行,不需要创建临时变量:
x, y = y, x
这么做的原理是什么呢?
首先一般情况下Python是从左到右解析一个语句的,但在赋值操作的时候,因为是右值具有更高的计算优先级,所以需要从右向左解析。
对于上面的代码,它的执行顺序如下:
先计算右值(这里是简单的原值,但可能会有表达式或者函数调用的计算过程), 在内存中创建元组(tuple),存储分别对应的值;计算左边的标识符,元组被分别分配给左值,通过解包(unpacking),元组中第一个标示符对应的值,分配给左边第一个标示符,元组中第二个标示符对应的值,分配给左边第二个标示符,完成了的值交换。

【三】C/C++中野指针的概念?

野指针也叫空悬指针,不是指向null的指针,是未初始化或者未清零的指针。
产生原因:
    <><>

    指针变量未及时初始化。

    ction>< font=""><>i>
<><>

指针free或delete之后没有及时置空。

ction>< font=""><>i>
解决办法:
    <><>

    定义指针变量及时初始化活着置空。

    ction>< font=""><>i>
<><>

释放操作后立即置空。

ction>< font=""><>i>

【模型部署】

【一】什么是异构计算?

首先,异构现象是指不同计算平台之间,由于硬件结构(包括计算核心和内存),指令集和底层软件实现等方面的不同而有着不同的特性。
异构计算是指联合使用两个或者多个不同的计算平台,并进行协同运算。比如CPU和GPU的异构计算,TPU和GPU的异构计算以及TPU/GPU/CPU的异构计算等等。

【二】端侧部署时整个解决方案的核心指标?

    <><>ction>精度< font=""><>i>
<><>ction>耗时< font=""><>i>
<><>ction>内存占用< font=""><>i>
<><>ction>功耗< font=""><>i>

【图像处理基础】

【一】有哪些常用的图像质量评价指标?

    <><> Ratio,PSNR)isection>峰值信噪比(Peak-Signal to No< font=""><>i>
<><>ction>均方误差(Mean Square Error,MSE)< font=""><>i>
<><>ction>MAE(Mean Absolute Error,MSE)< font=""><>i>
<><> Ratio,SNR)isection>信噪比SNR(Signal to No< font=""><>i>

<><>ction>信息保真度准则(Information Fidelity Criterion,IFC)< font=""><>i>
<><><>

深度学习发展至今,工业界,学术界,投资界都对其优势和局限有所判断了,基于此,各个公司的AI Lab也进入了全新的阶段,如何调整架构,如何改变定位,如何转变认知,是一件需要思考的事情。

【二】新时期的AI Lab该如何搭建?

这是一个非常有价值的问题,随着AI技术进入全面的落地阶段,如何将AI技术与公司定位相适配,利用好AI技术并产生更多现金流闭环,成为未来各个公司重点考虑的问题。

【一】不同性质的公司如何使用好AI技术?

这些问题基于Rocky的思考提出,希望除了能给大家带来面试的思考,也能给大家带来面试以外的思考。这些问题没有标准答案,我相信每个人心中都有自己灵光一现的创造,你的呢?

【开放性问题】

使用摄像头时,可能会出现图像边缘线条弯曲的情况,尤其是边缘部分是直线时,这种现象更为明显。比如摄像头显示画面中的门框、电线杆、墙面棱角、吊顶线等出现在边缘时,可能会有比较明显的弯曲现象,这种现象就叫做畸变。
畸变是指光学系统对物体所成的像相对于物体本身而言的失真程度,是光学透镜的固有特性,其直接原因是因为镜头的边缘部分和中心部分的放大倍率不一样导致。畸变并不影响像的清晰程度,只改变物体的成像形状,畸变是一种普遍存在的光学现象。
图片

【二】什么是图像畸变?

ction>结构相似度(Structure Similaruty,SSIM)< font=""><>i><>ction>视觉信息保真度(Visual Information Fidelity,VIF)< font=""><>i>

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多