快手AI lab
最近想出去实,快手是第一个发来的,所以就去了下。
第一
1. 介绍下NMS,并写出NMS的伪代码,和计算IOU的函数。
先介绍了一下NMS的做法,然后伪代码一时没写出来,计算IOU的函数没完全写对。当头一凉,其实之前在知乎上看到过说面试要准备的,所以大家快去写一遍。
2. 编写一个程序,找到两个单链表相交的起始节点。
这道题比较简单了,我先是说了一种让单链表的尾部指向一个链表的头部,这个问题就变成了求链表中环的起始点位置的问题了,这样用快慢指针就可以轻松做出来。但其实还有一种更简单的方法,就是分别让两个指针从两个链表的头部出发,每次走一步,如果A指针走到链表A的尾部后就让它从链表B的头部继续走,B指针走到尾部后也让它从链表A的头部继续走,两个指针就会在相交的地方相遇。
3. 逻辑斯蒂回归和softmax回归有什么区别,介绍下,写出softmax函数
这题也比较基础,逻辑斯蒂回归的先验分布是伯努利分布,softmax的先验分布是多项式分布。
4. SVM的损失函数是什么?具体形式?
合页损失函数,另外也可以通过原始/对偶方法求解最优化问题,最后用SMO算法得到解。面试官没展开,我也没细说。
5. 你说你熟悉目标检测算法,谈谈YOLO系列的改进?
我主要从YOLOv1的输出维度、正负样本是如何规定的、损失函数的设计详细介绍了下;然后YOLOv2相对于YOLOv1,采用了多尺度训练、还有多标签、将softmax函数换成了logistic函数,并且多了anchor box,但此处不同于Faster RCNN中,此处的anchor box是通过聚类得到的;然后YOLOv3先比于YOLOv2,最大的改进在于借鉴了SSD,在多个尺度的feature map上同时作检测(大特征图适合检测小目标,小特征图适合检测大目标),然后就是对于正样本的确定,YOLOv2同YOLOv1一样,是目标中心落在了哪个网格中,就由这个网格负责预测(具体就是该网格对应的anchor box中与真实ground truth的IOU最大的负责预测),而YOLOv3中是直接让IOU最大的负责预测。
6. 那你了解SSD吗?谈谈SSD中是如何确定正负样本的?
基于两个匹配原则,首先要确保每一个ground truth至少有一个bounding box和它匹配,所以先让与ground truth的IOU最大的bounding box作为正样本,考虑到正样本太少了,又有了第二个匹配原则,IOU大于一定阈值的都可以作为正样本,但要保证的是,第一个匹配原则在前。
7. 模型压缩的剪枝和量化?二值化、三值化、多bit(k位)量化是怎么做的,具体介绍下二值化?
感觉面试官不是很清楚量化的操作,我以二值化为例,说了下二值化就是将原来的32bit的权重约束到 {+1, -1},详细地推导了一下二值化中权重的缩放因子为什么是对应卷积核权重绝对值的平均值。
第一面就结束了,然后等了十几分钟来了第二个面试官。
第二面
1. 看你简历让有写熟悉轻量级网络,那你说说MobileNet里面的Depthwise Separable卷积是咋做的?然后对比下它和标准卷积的计算量。
深度分离卷积是将标准卷积拆分为了两个操作:深度卷积(depthwise convolution) 和 逐点卷积(pointwise convolution),Depthwise convolution和标准卷积不同,对于标准卷积其卷积核是用在所有的输入通道上(input channels),而depthwise convolution针对每个输入通道采用不同的卷积核,就是说一个卷积核对应一个输入通道,所以说depthwise convolution是depth级别的操作。而pointwise convolution其实就是普通的卷积,只不过其采用1x1的卷积核。
下面我们来分析一下两种卷积方式的计算量差异:
输入尺寸为 DF x DF x M,标准卷积核的尺寸为 DK x DK x M x N
采用标准卷积核进行卷积,步长为1且padding,那么输出尺寸应该为 DF x DF x N,计算量为 DK x DK x M x N x DF x DF;
采用depthwise separable convolution的方式进行卷积,先使用 M个Depthwise Convolutional Filter对输入的M个通道分别进行卷积得到尺寸为 DF x DF x M,这一步的计算量为 DK x DK x M x DF x DF;再使用N个 1 x 1 x M的卷积核进行逐点卷积得到输出尺寸为 DF x DF x N,这一步的计算量为 M x N x DF x DF;故总的计算量为 DK x DK x M x DF x DF + M x N x DF x DF。
2. CornetNet和传统的的目标检测方法差异型体现在哪?
我说最大的差异性是体现在anchor box上的,传统的目标检测是基于anchor box 的,而cornernet、centernet号称是anchor box-free的算法,cornernet直接预测的是边框的角点(左上角和右下角),同时候选框数量也会大大降低,centernet好像后面都不需要做NMS了。
3. 开始问项目了,让我介绍下第一个项目?你在其中负责了什么,最让你印象深刻的是什么?
将一个在CIFAR-10上训练好的分类网络移植到FPGA平台上,是以一个精度为93%的VGG-16为baseline网络,然后通过network slimming对模型进行剪枝(剪枝比例达到90%)、合并BN和ReLU层、k位量化得到一个激活值和权重均8位的网络;其相较于之前的baseline网络,精度下降不到2%,但内存占用和计算量大大降低了。具体谈了下量化和剪枝是怎么做的。
负责了模型的训练和压缩,同时利用C语言自己实现了一遍前向传播,印象最深刻的是开始每个feature map上的值赋初值(因为当时是零偏置的),导致结果不正确,我对比了代码运行时第一层的feature map值和vavido中仿真的第一层结果,发现大部分地方很相似,但是vavido中出现一些异常值,我一下子联想到了没有赋初值的情况下会自动赋值的,然后就对了。
4. 你在deecamp中的宠物健康状态检测项目里面负责了什么?对于两只狗重叠在一起的这种情况你怎么处理的?亮点在哪?
先谈谈了目标检测的地方,用的是YOLOv3,当时就是扩充了一下目标类别,添加了一个玩具狗类别,当判断为玩具狗时不做框狗的操作,其他的地方就是一些比较数据清洗,让两个数据集的类别对应上等等。重叠在一起的这种情况我没有具体研究,不过我觉得soft nms可能会对这种情况有所改善。我觉得项目最值得一提的是胖瘦识别的部分,将一个无监督学习转换成了监督学习任务,自己动手制作了胖瘦数据集,训练得到特征提取器,最后结果不太好时又用了arcface的设计(增加了类间距,缩小了类内间距),然后结果就很好了。
5. 出一道数学题吧!一个桶里有M个白球,一分钟从桶里拿出一个球,如果是白球,涂红放回去,如果是红球直接放回去。问将M个白球涂成红球的时间期望是多少?
呆若木鸡,经过提示,答对了,是1+M/(M-1)+M/(M-2)+...
6. 来个代码题吧!镜像二叉树。
也比较简单吧,然后面就完成了,最后谈谈了你想了解的地方等等