尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

旷视实习生笔试复盘:计算机视觉与深度学习核心考点解析

旷视实习生笔试复盘:计算机视觉与深度学习核心考点解析 1. 笔试整体概览与备考思路先说结论2019年旷视科技实习生春招研发工程师笔试整体风格偏向“基础扎实思维灵活”和很多互联网公司上来就怼LeetCode hard的风格不太一样旷视的笔试题更看重你对计算机视觉、深度学习和底层工程能力的综合掌握。整场笔试大约2小时题量不大但每一道题都值得认真对待因为它的分值分布非常不均匀——编程题只占一小部分反而是数学推导和概念辨析占了大头。如果你只是闷头刷题备考很容易在选择题和手推题上栽跟头。我当年参加的是研发工程师方向笔试环境是牛客网选择题和编程题混在一起不能回头修改已提交的答案所以时间分配很关键。这里有个经验可以直接给后来人先把所有题目快速浏览一遍标记出自己完全没思路的题优先解决有把握的再做需要推导的最后才去啃硬骨头。因为旷视的笔试选择题里经常埋“坑题”一道看似简单的概念题可能藏着两三个易错点一旦陷进去就很容易挤占后面手推题的时间。再说备考方向。网上很多人把旷视的笔试等同于“刷一遍西瓜书李航统计学习”这方向没错但不够全面。从2019年春季这次笔试来看题目覆盖面大致是图像处理基础、深度学习理论、模型训练细节、C或Python工程能力、数学推导。其中图像处理和深度学习理论的占比最高估计超过60%。而且旷视非常喜欢考“细节中的魔鬼”比如卷积核尺寸计算公式、感受野变化、BatchNorm在训练和推理时的区别这类很多人知道个大概但说不精确的知识点。还有一个很重要的背景旷视是做计算机视觉起家的公司人脸识别、物体检测、OCR这些都是他们的核心业务。所以笔试里频繁出现目标检测相关的概念题mAP怎么算、IoU怎么理解、NMS的原理就非常合理了。如果你准备投旷视的研发岗目标检测这一块儿的知识点必须烂熟于心这是和其他公司笔试拉开差距的关键。另外要提醒的一点是研发工程师这个岗位笔试并不区分前端后端而是统一的算法/工程混合卷。也就是说你不仅要会写Python调模型还得会C基础语法、内存管理、STL容器这类偏工程的东西。我印象里选择题里至少有三四道是C相关的比如虚函数、智能指针、lambda表达式都是很基础但需要实际写过代码才能答利索的题目。纯算法选手如果C底子薄建议提前一周每天写点C小题练手尤其是STL的常用容器底层原理考的频次很高。综合来看这场笔试的通过门槛并不在于题目有多难而在于你是否“体系化”地学过计算机视觉和深度学习。碎片化知识在选择题里会暴露得很彻底这是我复盘后最大的感受。2. 计算机视觉基础题公式、概念与“坑”2.1 图像卷积与特征图尺寸计算旷视笔试里卷积相关的题几乎是必考的而且考查方式非常直接——给你输入尺寸、卷积核大小、步长、Padding让你算输出特征图的尺寸。这个公式本身不难输出尺寸 (输入尺寸 - 卷积核尺寸 2×Padding) / 步长 1但难的是它会在题目里叠加条件比如“空洞卷积”的卷积核尺寸要先转换成等效尺寸等效卷积核 原始卷积核 (原始卷积核 - 1) × (空洞率 - 1)再比如“转置卷积”的输出尺寸计算公式和普通卷积是不同的转置卷积输出 (输入尺寸 - 1) × 步长 - 2×Padding 卷积核尺寸我笔试的时候就在一道转置卷积的题上卡了快五分钟因为它把输出尺寸算出来之后还问你“感受野是多少”。这就不是套公式能解决的了你需要真正理解卷积操作是在做什么。这里说一个我的土办法也是建议你掌握的技巧遇到特征图尺寸计算的题不要只背公式而是用最简单的例子在纸上画一遍。比如1×1卷积、3×3卷积、步长为2、Padding为1这几个典型配置的组合你如果每个都能手画出来什么花样的卷积题都难不倒你。这种基本功看似简单但很多人在笔试时手忙脚乱就是因为平时没有养成手推的习惯。2.2 感受野与权值共享的深层理解感受野这个概念旷视笔试里考查得比一般公司深。它问你一个两层3×3卷积堆叠后的感受野是多少这就牵扯到公式当前层感受野 上一层感受野 (卷积核尺寸 - 1) × 之前所有步长的乘积两层3×3卷积等效于一层5×5卷积的感受野但参数量是18对25这就是VGG为什么用小卷积核堆叠的原因。这类题不仅考计算还考你“是否理解为什么小卷积核堆叠更优”——参数更少、非线性更强、感受野不变。如果只背结论不理解原理遇到变体题就会慌。权值共享这个点旷视的考法也很刁钻。它不直接问“什么是权值共享”而是给一个具体场景输入是32×32×3的图像卷积层有16个3×3的卷积核让你算出这一层的参数量。这里有三个易错点第一每个卷积核是三维的3×3×3因为要覆盖输入的三个通道第二偏置项每个卷积核有一个不能漏第三参数量跟输入图像的分辨率无关很多人会把32×32乘进去这就是典型的陷阱。我个人的理解方式是“权值共享”的本质是在假设图像特征具有平移不变性——一个3×3的纹理滤波器在图像左上角检测到有用的边缘在右下角应该同样有效。这个假设是CNN比全连接层高效的根本原因。理解到这一层权值共享相关的题目就不会再错。因为笔试考的不只是你能不能算出参数数量更是你对这个设计背后逻辑的把握。2.3 目标检测中的IoU、mAP与NMS这个板块几乎可以说是旷视笔试题的“灵魂”。毕竟目标检测是旷视的核心技术方向笔试里出现相关题目几乎是必然的。IoU的计算题很简单就是两个框的交集面积除以并集面积但旷视不会只考这个它会让你计算两个框没有交集时的IoU是多少——答案是0而不是负数很多人会在这里丢分。mAP的题相对复杂一些。笔试里常见的考法有两种一种是给你一系列预测框及其置信度、真实标签让你计算某个IoU阈值下的Precision和Recall另一种是直接问你mAP的计算流程和AP的含义。前一种考法是硬功夫需要你理解“排过序的预测框依次计算累积TP/FP再绘制PR曲线曲线下的面积就是AP”。后一种考法相对简单考察你对定义的记忆。这里有个很实用的应试技巧把目标检测中常见的指标定义整理成一张速查表包括Accuracy、Precision、Recall、F1-Score、AP、mAP、IoU、NMS、Soft-NMS每个都写清楚公式和适用场景。笔试前过一遍这张表基本就能应对绝大多数选择题。NMS在旷视笔试中也出现过主要是问它的流程和缺点——NMS的缺点很明显那就是两个高度重叠的同类目标会被误删一个这在密集场景下经常出问题所以后来才有Soft-NMS、Adaptive NMS等改进算法。2.4 传统图像处理滤波、边缘检测与特征点虽然现在深度学习是主流但旷视的笔试里还是会有传统图像处理的题这可能是因为研发工程师日常工作里还需要用OpenCV做预处理、图像增强等操作。我印象里考了高斯滤波的原理——它本质上是一个加权平均的过程权重由二维高斯函数决定越靠近中心的像素权重越大这种滤波能有效去除高斯噪声而保留边缘信息。还有Sobel算子——它是一组离散的差分算子通过卷积计算图像的梯度幅值和方向是边缘检测的基础。考法上倾向于概念理解而非代码实现。比如给一张含有椒盐噪声的图片问你哪种滤波效果最好——答案是中值滤波因为椒盐噪声是极端值排序取中值能有效去除异常点而均值滤波反而会让噪声扩散影响周围像素。这类题是典型的“生活经验理论理解”题如果你平时真的用OpenCV处理过图像基本不会答错。特征点方面SIFT、SURF、ORB这些是高频考点主要考它们的特性对比SIFT是尺度不变、旋转不变的但计算量很大ORB是效率和尺度不变性的折中。我记得有道题问在实时SLAM场景下选择哪个特征点算法答案是ORB因为它兼顾了速度和旋转不变性。这类题的逻辑其实就是在考你对算法特性的理解不深但要求面广。如果你从来没有接触过传统图像处理建议花一天时间把OpenCV官方的图像处理教程过一遍至少要知道每个常见操作是干什么用的笔试里基本不会让你手写SIFT的源码但会考你它的思想和应用场景。3. 深度学习理论从BP推导到训练技巧3.1 反向传播的手推题千万别只背结论旷视笔试里有一道经典手推题给定一个简单的两层神经网络输入x隐藏层有若干个神经元激活函数是sigmoid损失函数是均方误差让你推导出参数更新的梯度公式。这道题看起来基础但实际操作时很多人写到手就乱。我当时的做法是先把计算图画出来明确每一个变量的依赖关系再逐层反向求导。核心逻辑是链式法则损失函数对某个参数的梯度等于损失函数对该参数输出值的导数乘以该输出值对参数的导数。这个“乘积”你需要拆解清楚是矩阵乘法还是逐元素乘法是转置还是不需要转置这是最容易出错的地方。另一个高频手推点是Softmax交叉熵的梯度推导。这个推导的优雅之处在于结果极其简洁损失对Softmax输入logits的梯度等于预测概率减去真实标签的One-Hot向量。这个结论如果理解透彻写代码的时候会非常省事因为你不必在损失函数里单独计算softmax再做反向传播而是直接把梯度算好传给前一层。我在笔试时遇到过一道变体三分类的Softmax交叉熵真实标签是[0, 1, 0]模型预测概率是[0.3, 0.6, 0.1]问你损失对logits的梯度是多少。这里答案是[0.3, -0.4, 0.1]也就是预测概率减去真实标签。如果你能把这个公式记牢并且理解为什么会得到这个结果这类题就能直接秒杀。要注意的是这里的负号问题——有些人会习惯写成真实标签减预测概率这在数值上符号相反方向就变了。一个记忆技巧是梯度方向是让损失减小的方向而Softmax交叉熵的梯度是预测-真实梯度下降时参数会沿着负梯度方向更新。3.2 BatchNorm训练与推理的差异旷视笔试里出现了一道非常细的题BatchNorm在训练阶段和推理阶段的行为有什么不同这题看似简单实际上是区分“调包侠”和“真懂原理”的分水岭。训练阶段BatchNorm使用当前Batch的均值和方差来归一化并且维护一个全局的移动平均均值和移动平均方差推理阶段不能依赖当前Batch的统计信息尤其是Batch Size为1的时候所以必须使用训练阶段积累的全局统计量。但这里还有一个更细的坑如果Batch Size特别小比如只有2或4训练时用Batch内的统计量会导致噪声很大而推理时用全局统计量两者之间会有统计偏差。这也是很多人在小Batch Size下训练模型结果推理性能骤降的原因之一。笔试里这道题考的就是有没有踩过这个坑。BatchNorm还有两个值得关注的性质第一它让网络对权重初始化不那么敏感因为归一化会把激活值拉到一个标准范围内第二它在训练时引入的随机噪声由于Batch统计量的波动实际上有一定的正则化效果但这个效果在推理时不复存在。这些理解层面的东西平时只有亲手训练过模型、反复调参后才会深有体会光看文档是记不牢的。我在笔试题里见过的BatchNorm考法还有一个给你一个形状为N, C, H, W的特征图问BatchNorm在哪个维度上计算均值方差。正确答案是在N、H、W维度上也就是对每个通道分别计算均值和方差最后得到C个统计量。很多人会误以为是在C维度上计算这就是没有真正理解BatchNorm的处理对象。3.3 常见的激活函数与梯度消失激活函数这块儿旷视笔试考得比较常规但依然有值得注意的点。首先是Sigmoid的缺点——它饱和区的梯度几乎为0容易导致梯度消失它输出的均值不为0这会导致后一层的输入全部为正或全部为负影响梯度更新效率。然后是ReLU——它在正区间梯度为1一定程度上缓解了梯度消失但存在Dead ReLU问题即神经元一旦输出为负梯度就变成0之后永远不会被激活。题目一般会这样考有一个使用Sigmoid激活的深层网络训练时发现梯度消失严重你应该怎么做选项一般包括改用ReLU、加BatchNorm、使用残差连接、增大学习率等。正确答案是前三个增大学习率反而会加剧梯度消失因为Sigmoid饱和区在大梯度下更快进入梯度反而变小。这类题考察的就是对深度学习训练“玄学”的经验积累。关于激活函数我印象里还考了Leaky ReLU和ELU的区别。Leaky ReLU在负区间给了一个很小的斜率如0.01解决Dead ReLU问题但引入了超参数ELU在负区间是渐近饱和的指数函数对噪声更鲁棒但计算量更大。笔试不会问很深的数学性质但会考你“什么场景下选什么激活函数”这种实际的工程经验。3.4 过拟合与正则化策略过拟合这个知识点在旷视笔试里也出现过但考法比较综合。它不单独问“什么是过拟合”而是给你一个训练场景——训练Loss下降很快但验证Loss不降反升问你采取哪种措施。选项包括增加数据增强、加Dropout、加正则项、减小模型复杂度、增加训练数据。这些措施本身都对但还需要你判断哪些是“优先考虑”的。我当时的判断标准是先看数据再看模型最后调超参。如果数据量本身很小优先增加数据增强和数据量这是最有效的抗过拟合手段如果模型结构明显过大精简结构或加Dropout如果都不是再加L2正则或Early Stopping。笔试里有一个容易忽略的选项是“增大Batch Size”——这实际上是加剧过拟合的因为更大的Batch Size会让梯度估计更准确模型更容易收敛到尖锐的极小值泛化能力反而下降。这道题如果没经验真的容易被误导。另外数据增强的选择也是一个考点。对图像分类任务常用的增强有随机裁剪、水平翻转、色彩抖动、旋转、缩放等。笔试可能会问“哪种增强策略对行人检测最合适”——这里没有标准答案但你要会分析行人检测中行人通常是竖直的水平翻转可以增加样本多样性而垂直翻转就不太合适因为现实场景中几乎没有倒立行走的行人。这种“结合场景做判断”的题考察的是你对领域任务的理解深度值得重视。4. 编程题实战复盘思路与细节4.1 高频编程题数组、字符串与链表旷视的编程题和其他算法岗笔试类似主要集中在数组、字符串、链表这些基础数据结构上很少出特别冷门的题目但会在基础题上稍微变体增加一点思考难度。我这次笔试遇到了一道数组题——给定一个整数数组和一个目标值返回两个数的索引使它们的和等于目标值。这题是LeetCode的Two Sum非常经典但如果直接暴力双重循环时间复杂度是O(n²)在笔试环境的大数据量测试用例下可能会超时。正确的做法是用哈希表以空间换时间遍历数组对每个元素计算目标值减当前元素的差值如果差值在哈希表中直接返回结果否则把当前元素和它的索引存入哈希表。时间复杂度降为O(n)空间复杂度为O(n)。这道题的重点在于哈希表键存储的是元素的值值存储的是它的索引查找时是通过值找索引。我见过不少人在这个细节上写反导致结果错误。链表题也是笔试的常客。我记得有一道题是反转链表很多人觉得它简单但面试和笔试中它出现频率极高。迭代法的思路很清晰设置三个指针prev、curr、next每次把curr的next指向前一个节点prev然后三个指针整体向后移动直到curr为空最后返回prev作为新的头节点。这道题特别容易出错的地方在于循环终止条件和指针移动顺序建议笔试前手写一遍确认没有边界问题。字符串相关的题我遇到了一道是“判断一个字符串是否是回文串忽略大小写和非字母数字字符”。这题的难点在于“忽略非字母数字字符”这个条件很多人会在预处理时出问题。最简单的方法是先用双指针从两端扫描跳过错字符再比较对应位置的字符是否相等忽略大小写。C里可以用isalnum()函数判断字符是否是字母或数字tolower()统一转小写。Python里也有isalnum()和lower()方法实现比较直接。4.2 动态规划与图论思维灵活性的试金石动态规划的题在旷视笔试里出现过一道非常典型的——最长上升子序列的长度。这道题有两种解法第一种是动态规划dp[i]表示以第i个元素结尾的最长上升子序列长度状态转移方程为dp[i] max(dp[j] 1)其中j i且nums[j] nums[i]时间复杂度O(n²)第二种是贪心二分用tails数组维护当前最长上升子序列的末尾元素的最小值遍历每个元素时在tails里二分查找它应该插入的位置如果插入到末尾则长度加1否则替换之前的某个元素时间复杂度O(n log n)。笔试时我更推荐第二种写法因为它的时间复杂度和代码量在笔试环境中更占优势。不过如果你对二分查找的边界条件不熟悉建议老老实实写O(n²)的DP解法至少保证正确性毕竟笔试的测试用例数据量一般不会太大O(n²)也能通过大部分用例。图论的题在笔试中出现不多但一旦出现就是关键得分点。我记得有同学遇到一道“判断是否有环”的题——对无向图可以用并查集对有向图可以用拓扑排序BFS。拓扑排序的思路是统计每个节点的入度将入度为0的节点入队依次弹出并更新邻居节点的入度如果最终弹出的节点数等于图中节点总数说明无环否则有环。这种题考的不只是算法本身还有你对不同数据结构适用场景的判断建议考前一定要把并查集、DFS、BFS、拓扑排序这四类常见图算法过一遍。4.3 边界条件与代码风格笔试中的隐形分编程题除了算法思路本身代码风格和边界条件处理也是评分的重要一环。笔试环境里通常没有编译器提示代码是一股脑写上去的所以逻辑是否缜密直接决定了能否通过隐藏测试用例。我见过很多人在“输入为空”“数组长度为1”“目标值不存在”这类边界条件下出错导致一个思路完全正确的解法只得了部分分数非常可惜。这里分享一个我自己的习惯每写一道题就用三个测试用例自测——正常用例、边界用例、空用例。比如Two Sum正常用例是数组有多个元素且存在解边界用例是数组长度为2且只有一个解空用例是数组长度小于2或没有解。这种自测习惯在笔试中非常管用因为提交前的编译错误和运行错误会浪费大量时间而这些错误大多可以通过自测提前发现。代码风格的另一个要点是变量命名。笔试时虽然不要求写出生产级代码但清晰的命名能让你在检查逻辑时省很多事。我习惯用left、right而不是l、r用curr而不是c这样即使思路中途卡壳重新梳理时也不会被晦涩的命名干扰。还有人喜欢在代码里写一堆注释这在笔试里是可以的但不要过多因为会挤占做题时间。4.4 编程语言选择C还是Python这次笔试支持C和Python我在考场上用了C原因是C在算法竞赛和面试中更贴近旷视这类底层AI公司的工程语言。旷视的核心产品是用C部署的很多推理引擎和SDK都是C写的所以如果笔试卷子里的代码题用C作答能给面试官留下“这个人的工程底子不会差”的印象。当然如果你对Python更熟练用Python也完全可行只要思路清晰、语法正确笔试并不会因为你选了Python而扣分。但要注意一个细节C的标准库容器在笔试中很常用但一定要记得包含对应的头文件。比如用vector要包含 用unordered_map要包含unordered_map笔试环境里没有自动补全忘记包含头文件会导致编译错误。Python则要注意缩进和导入库的路径牛客网的环境有时候不支持某些第三方库比如numpy所以在笔试前最好确认一下环境支持情况或者尽量用标准库完成算法题。5. 备考路线与踩坑经验5.1 时间分配考前一个月的复习计划如果你现在距离旷视笔试还有一个月左右的时间我建议你按下面的节奏复习前两周以“系统性过基础知识”为主每天花2~3小时把图像处理、深度学习理论、目标检测指标这些核心知识点过一遍边看边写笔记用自己的话把每个概念重新解释一遍这才是真正掌握第三周开始写编程题每天至少3道优先刷LeetCode的Top 100高频题尤其是数组、链表、二叉树、动态规划这几个类型最后一周做模拟题和往年真题限时2小时完成一套卷子重点是训练时间分配和心理素质。这里有个很重要的建议不要只看面经不看原理解析。市面上的面经很多但大部分只是“题目答案”没有推导过程。如果你的目标是做对而不是背对一定要找到每道题的原理和推导过程最好能自己推一遍。尤其是手推反向传播、Softmax交叉熵这类题只看答案和真正手写一遍是完全不同的体验后者才能让知识点在脑子里生根。5.2 常见失分点我在笔试中踩过的坑我在这次笔试中踩了几个坑写出来给后来人提个醒。第一个坑是审题不清。有一道选择题问“以下哪些措施可以缓解过拟合”我以为是单选选了第一个我认为正确的选项就提交了后来才发现是多选题。笔试中很多题目会在题干里写明“多选”或在选项前面加方块但如果你没仔细看当成单选题来做就会白白丢分。建议拿到卷子后先花一分钟浏览所有题目的题型和分值分布做到心中有数。第二个坑是时间分配不均。我在一道手推反向传播的题上花了太多时间导致后面的编程题只有不到20分钟草草写完没有测试。笔试的经验教训是手推题如果3分钟内没有思路先跳过把有把握的分拿到再回过头来啃硬骨头。笔试不是做研究而是得分的策略游戏时间分配比单题正确率更重要。第三个坑是编程题没有处理极端输入。我的编程题虽然思路正确但没考虑空输入和极大数值溢出的情况结果有一两个测试用例没通过。如果你在笔试中遇到“没通过的测试用例”可以从以下几个方向排查输入是否可能为空、数值是否溢出、数组索引是否越界、判断条件是否取反。这几个方向的检查基本能覆盖90%的边界问题。5.3 笔试之外面试环节的准备笔试通过之后旷视还有一轮甚至多轮技术面试。笔试和面试的侧重点不太一样——笔试更多是考察知识储备和算法思路面试则更看重你如何思考问题、如何设计解决方案、如何用工程手段落地。经过笔试的筛选后面试官通常默认你有扎实的基础知识所以面试题会更贴近旷视的实际业务比如人脸识别、物体检测、模型压缩、推理优化等。如果笔试后你有把握进入面试建议提前熟悉旷视的技术栈和开源项目比如他们的检测框架、人脸识别算法等。你可以不深入了解每一行代码但至少要知道它的整体架构、核心思路和与主流方案的差异。面试官可能会问“如果你来做一个人脸检测系统你会怎么设计”这时你需要展示的不仅是对算法本身的理解更是对工程落地问题的思考——如何处理算力开销、如何优化模型大小、如何应对不同光照条件下的识别精度。我当时准备面试时做了三件事第一件是把常用深度学习框架PyTorch、Caffe等的原理和特点过了一遍尤其是数据加载、模型定义、训练循环这些基础组件的生命周期第二件是选择一个自己做过的项目把里面的每一个技术细节都梳理清楚做到“随便问哪个点都能展开聊”第三件是准备了几道算法高频题的边界条件确保在面试官追问时不会卡壳。事实证明这些准备是有效的面试官确实问到了项目细节和工程落地相关的问题而不是单纯问算法推导。5.4 最后的提醒笔试心态与临场发挥笔试不仅考知识也考心态。我见过平时刷题很猛、但一到笔试就因为紧张而发挥失常的人。考前可以这样调整心态把笔试当成一次“技术交流”而不是“生死裁决”你不会因为一次笔试失败就否定自己反之一次通过也不代表万事大吉——这只是一次检验自己水平的机会而已。还有一个临场技巧是遇到完全不会的题目不要空着。选择题可以基于已有知识做排除法往往能排除一两个明显错误的选项剩下的二选一也有50%的正确率编程题即使没有完整思路也写上暴力解或部分思路笔试系统通常按通过的测试用例数目给部分分多拿一分是一分。最后提醒一点笔试结束后不管自我感觉如何都可以把题目记录下来整理成自己的错题本。这场笔试的经验对下一次面试和笔试都是有价值的财富很多知识点是相通的你在旷视笔试里遇到的卷积计算、反向传播推导、目标检测指标在别家AI公司的笔试题里大概率也会出现。把这些题目吃透比你盲刷十套卷子都管用。我的个人体会是旷视这场笔试的难度不比一线互联网大厂的算法岗笔试低但它更聚焦在计算机视觉和深度学习这个细分领域所以针对性备考非常重要。如果你认真把基础知识过一遍编程题刷足量笔试前再模拟一两套卷子练手通过的机会非常大。希望这篇复盘对你有所帮助祝笔试顺利。
返回列表