ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

滴滴校招CV笔试复盘:从数学基础到深度学习考点全解析

滴滴校招CV笔试复盘:从数学基础到深度学习考点全解析 这阵子后台收到不少私信都在问当年滴滴出行计算机视觉研发工程师校招笔试到底考了什么、难度如何、该怎么准备。前两天翻网盘正好翻到当时整理的第一批笔试题复盘笔记干脆把这些内容系统梳理一遍。我尽量还原当时笔试的真实体感包括题型分布、考点侧重、做题过程中的时间分配策略以及后来回看时发现的一些关键踩坑点。无论你是准备面试视觉算法岗还是想了解大厂CV笔试的底层筛选逻辑这篇内容应该都能给你一些参考。1. 笔试整体设计与考查逻辑1.1 岗位场景与能力要求先聊一个很多人容易忽略的问题同样是计算机视觉岗位在不同公司、不同业务线里笔试的侧重点是完全不一样的。滴滴的CV工程师岗位核心业务场景集中在智能出行领域包括行车记录仪视频分析、司乘安全监控、车载视觉感知、地图影像处理等方向。这些场景有一个共同特点算法必须跑在真实、复杂、动态的环境里而且要能处理大量边缘案例。这意味着岗位对候选人的要求是三层的首先是扎实的数学和图像处理基础这是做CV的底层能力其次是深度学习的模型理解能力不光是会调库还要懂原理、懂训练技巧最后是工程实现能力毕竟工业界不是发论文代码要能跑、能优化、能上线。笔试环节之所以存在本质上就是要在海量简历中用一套标准化题目快速筛出这三层能力都过关的人。我看到很多同学的误区是疯狂刷深度学习八股文把目标检测系列的论文背得滚瓜烂熟结果笔试里考到高斯滤波的核函数计算、特征值分解的几何意义这类基础题反而卡壳。这里要提醒一句校招笔试和面试不同笔试覆盖面广、单题深度有限它的核心目的是淘汰基础不扎实的人而不是选出最优秀的人。所以复习策略应该是广覆盖、抓基础、保正确率。1.2 笔试的题型结构与筛选策略滴滴2018校招的这场笔试整体时长为90分钟题量大致是20道选择题加上2道编程题偶尔会有1道简答题。从筛选策略来看这个结构设计得相当克制也很典型。选择题的部分覆盖了高等数学、线性代数、概率论、机器学习基础和计算机视觉专项知识难度是梯度上升的前面几道题属于送分题中间开始出现需要动笔计算的题目最后两三道往往是拉分题可能涉及一些冷门概念或者需要综合运用多个知识点。编程题则更偏向考察算法思维和代码基本功虽然名义上是CV岗位但编程题基本不会直接考图像处理算法的实现更多是LeetCode中等等级的通用算法题——这一点也让很多 CV 专项很强但算法基础偏弱的同学吃了亏。从出题人的角度看这套试卷的逻辑是先用数学和基础编程题过滤掉基本功不行的候选人再用CV专业知识题区分候选人的领域深度最后通过编程题大题的完成度判断候选人的工程能力天花板。换句话说单纯靠背面试题是过不了这一关的你需要的是一个完整的知识体系。2. 核心知识领域拆解与备考要点2.1 数学基础矩阵、概率与优化计算机视觉的底层是数学所以笔试第一关基本都会是数学题。这部分考点集中在三大块线性代数、概率论与最优化方法。线性代数里最常考的是矩阵运算、特征值分解和奇异值分解。有一道题印象很深是给出一个2x2矩阵要求计算它的特征值和特征向量并在四个选项中选出正确的特征向量方向。这道题表面考计算实际上考的是对特征向量几何意义的理解——特征向量是变换后方向不变的向量而特征值是对应的缩放倍数。如果你只是背公式换一个矩阵可能就做错了。SVD相关的题也出现过比如问SVD在图像压缩中的应用原理这类题需要你理解U、Σ、V三个矩阵的维度含义以及为什么可以截断奇异值实现近似重构。概率论的考试重点集中在条件概率、贝叶斯公式、常见分布正态分布、伯努利分布、泊松分布的期望方差以及最大似然估计的简单推导。高频率出现的题型是给一个具体的机器学习场景比如高斯朴素贝叶斯分类器根据训练数据估计参数。这种题难度不大但计算量不小需要你能够熟练处理对数似然函数求导的过程。最优化的考点相对基础主要是凸函数判断、梯度下降的变种批量梯度下降、随机梯度下降、小批量梯度下降的区别和损失函数收敛性分析。复习时至少要掌握梯度方向为什么是函数增长最快的方向、学习率过大或过小分别会发生什么、L1和L2正则化的区别以及对最优解的几何影响。我个人复习数学的策略是不建议从头到尾啃教材而是直接以真题和典型习题入手遇到不会的知识点再回去翻书这样可以节省大量时间。重点是把每个考点的为什么搞清楚而不是把怎么做背下来——这一点在后面应对变形题的时候会非常重要。2.2 传统视觉算法从像素到特征笔试里传统视觉算法的比重比大多数人想象得要大而且基本都在选择题中考察。这里说的传统视觉算法指的是深度学习流行之前的那套经典图像处理技术栈图像滤波、边缘检测、特征点提取、图像金字塔、光流法、相机模型与立体视觉。图像滤波是必考内容。你要清楚均值滤波、高斯滤波、中值滤波各自的原理和适用场景均值滤波对高斯噪声有效但会模糊边缘中值滤波对椒盐噪声效果极好而且能保留边缘高斯滤波通过核函数模拟高斯分布所以平滑效果更自然。笔试里常考的陷阱是高斯核的计算——给你一个3x3的高斯核标准差要求你填空各个位置的权重系数这需要你记住高斯函数公式并能正确归一化。边缘检测的考点集中在Sobel算子和Canny算子。Sobel算子的两个卷积核分别是横向和纵向的差分核可以用来计算梯度的幅值和方向。Canny算子的完整流程是高斯滤波去噪、Sobel算子计算梯度幅值与方向、非极大值抑制细化边缘、双阈值检测并连接边缘。这道题几乎每年都出现在各家公司的笔试题里值得反复理解。特别要注意非极大值抑制这一步的作用——不加这一步检测出的边缘会是一条宽带而真正需要的是一条像素宽度的细线。特征点提取方面SIFT、HOG、LBP等经典特征也是常客。SIFT的关键特性是对尺度变化、旋转变化具有不变性HOG则擅长描述图像的局部形状信息常用于行人检测。笔试的考法通常是给你一个具体场景问应该选择哪种特征或哪种特征在什么情况下表现最好。这类题没有标准答案需要你理解每种特征的本质再根据场景需求做推理。相机模型的内容在视觉岗位笔试中出现频率很高。你需要掌握针孔相机模型的投影公式理解内参矩阵和外参矩阵各自的含义需要知道畸变模型中的径向畸变和切向畸变分别是什么为什么广角镜头会产生明显的桶形畸变还需要了解双目视觉中视差与深度的关系——视差越大物体越近。这些概念虽然不深但如果你之前没有系统学过现场推导还是比较耗时的。2.3 深度学习与CNN笔试的重头戏深度学习部分的题目能占到整个笔试分数的三分之一以上毕竟视觉岗位的核心工作已经全面转向深度学习。这部分考察的方式很多样有些是概念理解有些是公式推导还有一些是需要你手算或者推演的小型计算题。CNN的基础组件是必考内容。卷积层参数量计算输出通道数乘以卷积核尺寸再乘以输入通道数、输出特征图尺寸计算公式(输入尺寸-核尺寸2×padding)/stride1、感受野的计算方法这些是必须烂熟于心的内容。有一道印象深刻的题目是计算一个三层卷积网络的感受野输入224x224第一层5x5卷积步长1第二层3x3卷积步长1第三层3x3卷积步长1问最后一层feature map上的一个像素对应输入图像的像素范围。这道题的关键是感受野计算公式RF_n RF_(n-1) (k_n - 1) × stride乘积。如果你只是机械地背公式而没有真正理解感受野的递推含义很容易在步长不为1的情况下算错。池化层的考点相对简单但要搞清楚最大池化和平均池化各自的作用以及为什么池化可以带来平移不变性——这个为什么是简答题的常客。全连接层和卷积层之间的转化关系、1x1卷积的作用降维、增加非线性、通道间信息交互这些也值得认真复习。目标检测系列是笔试中的高频内容。R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD的演进脉络和各自的核心创新点几乎是必考题目。R-CNN使用了选择性搜索生成候选区域再对每个候选框做CNN特征提取和SVM分类速度极慢。Fast R-CNN的改进是共享卷积特征并引入RoI Pooling层使得整张图只需一次前向传播。Faster R-CNN的突破性创新是引入区域建议网络RPN将候选区域生成的耗时从秒级降到毫秒级实现了端到端训练。YOLO的核心思想是直接回归目标框的坐标和类别概率将检测问题完全视为回归任务速度极快但小目标检测精度较差。SSD则结合了Faster R-CNN的多尺度思想和YOLO的回归思想在不同尺度的特征图上分别进行预测。值得注意的是考试会出现一些让你对比分析的问题比如为什么YOLO对小目标检测效果不好、SSD为什么比YOLO在小目标上表现更好、Faster R-CNN的RPN中anchor的大小和比例是如何设计的。这些问题没有标准答案但都有合理的分析思路你需要能够从特征图语义级别、目标尺寸分布、感受野匹配度等角度展开分析。2.4 编程与数据结构笔试的硬门槛CV岗位笔试的编程题不会直接考图像处理算法这其实是很多人的误判。滴滴这场笔试题目的编程题是一道二分搜索的变种题和一道二维矩阵搜索的题目。虽然表面是纯算法题但从选拔角度来看编程题的目的在于验证候选人的代码功底是否达到工业级标准。针对编程题备考我的建议是把LeetCode的热门分类过一遍重点放在数组、链表、二叉树、动态规划、字符串处理这五个模块。排名靠前的高频题目至少要刷两遍第一遍看思路第二遍要求白板手写、一次通过。对于CV岗位来说用C答题有加分效应因为视觉算法工程化最常用的语言是C。但如果你对C不熟用Python答题也完全可以关键是要保证代码风格规范、逻辑完整、边界条件处理得当。这里要专门说一个很多人会忽视的细节笔试平台上的代码是需要包含头文件、输入输出格式完全正确的。不少人平时在IDE里写代码习惯了自动补全和格式化到了笔试环境不适应导致编译错误、漏写头文件的情况比比皆是。我建议在准备阶段就搭建一个与真实笔试环境一致的本地模拟环境开启无自动补全、无语法提示模式每道题都用平台风格来写。这一点在后续实操总结中我还会展开聊。3. 实战复盘真题思路与解题示范3.1 选择题概念辨析与计算推理选择题的做题策略非常关键。我把当时遇到的典型题目整理成几类每类说一下解题思路。第一类是概念辨析题难度较低比如问下列哪种归一化方法对输入数据的均值和方差有假设——答案是Batch Normalization在训练时使用当前batch的均值和方差进行归一化而在推理时使用滑动平均统计量。这类题考查的是对细节的记忆平时看论文时注意积累就能答对。但有一个陷阱很常见把Layer Normalization和Batch Normalization的适用范围搞混。Batch Normalization在NLP任务中表现不佳的原因是因为不同样本之间的差异太大而Layer Normalization则更适合序列数据。视觉任务中Batch Normalization几乎是默认首选这一点在笔试中也会有所体现。第二类是计算题需要动笔算。举例来说题目问输入特征图尺寸64x64通道数256卷积核尺寸3x3stride1padding1输出通道数512参数量是多少计算过程是3x3卷积核空间尺寸× 256输入通道数× 512输出通道数最终结果是1179648参数。这里要注意偏置项要不要算进去很多同学只算卷积核权重而漏掉了偏置项虽然数值差距不大但在选择题里可能正好影响正确选项。另外如果题目提到深度可分离卷积参数量计算方式又不相同需要单独记忆。第三类是综合推理题这类题需要你熟悉多个知识点并能灵活组合。有一个例子是给定一张H×W大小的图像经过一个两分支的网络分支A是3x3卷积-步长2-通道翻倍分支B是2x2最大池化-通道不变最后将两个分支的输出沿通道维度拼接问拼接后的特征图尺寸。这道题的关键点是分支A因为是步长2输出尺寸是H/2×W/2分支B的池化输出同样也是H/2×W/2但两者的通道数不同拼接后通道数是分支A的通道数加上分支B的通道数。看似简单但如果不仔细分析每个分支对空间尺寸和通道数的独立影响就容易出错。3.2 编程题从读题到AC的完整思考流编程题部分是笔试中最容易拉开差距的地方也是决定能否进入面试的关键。我当时遇到的两道题一道是二分搜索变种另一道是二维矩阵中的路径查找整体难度在LeetCode Medium左右。第一道题是二分搜索的变种在一个经过旋转排序的数组中搜索目标值LeetCode 33题。拿到题目我的第一反应是直接遍历也能过但笔试的测试用例通常会包含大数据量直接遍历大概率超时。正确的思路是先找到旋转点或者更直接地利用二分搜索的变体——在每次二分时判断左半部分是否有序如果有序且目标值在左半部分范围内就收缩到左半部分否则去到右半部分。这里的关键逻辑是任何情况下至少有一半是有序的利用有序的那一半来判断目标值是否在其中。写代码时要特别注意边界条件数组为空、只有一个元素、目标值大于所有值等。第二道题是二维矩阵路径问题具体描述是给定一个二维矩阵和一个字符串判断矩阵中是否存在一条路径可以组成这个字符串路径不得重复经过同一单元格LeetCode 79题。这题的标准解法是回溯法DFS遍历每个起点然后向四个方向递归搜索。当时我做这道题的教训是一定要用一个visited数组记录已经访问过的位置否则会无限递归或者重复访问同时要在递归函数入口处做边界判断避免数组越界。从实战角度看编程题的做题顺序应该遵循先易后难原则。如果第一道题卡了超过15分钟还没思路果断跳过做第二道做完再回头补。笔试时一道编题一次性通过AC拿到满分远比两道题都写出部分案例、但都没有通过全部测试用例要划算得多。判断标准很简单系统会按通过的测试用例比例给分部分通过虽然能拿分但通常不超过一半而完整AC是满分。4. 备考节奏、复习资料与阶段策略4.1 三个月备考计划分阶段拆解校招笔试的备考需要有一个清晰的节奏不能想到什么看什么。我复盘了自己当时的时间线大概是三个月准备时间分三个阶段。第一阶段是基础补漏期时长约三周。这个阶段的重点是覆盖数学基础和传统视觉算法。具体做法是把线性代数和概率论的核心考点用思维导图的方式梳理一遍每天花两小时刷题从历年各家公司的笔试真题入手。视觉算法部分我把SIFT、HOG、LBP等经典特征各自用Opencv实现了一遍通过实际运行来加深理解这个过程中对很多概念有了真正落地的感知——比如SIFT特征点检测后如何通过对比描述子之间的距离来匹配两张图这个过程光看书是体会不到的。第二阶段是专项强化期时长约五周。重点是深度学习部分的系统复习和编程题训练。深度学习的复习以论文精读为主我选择的是目标检测领域最核心的五篇论文R-CNN、Fast R-CNN、Faster R-CNN、YOLO和SSD。每篇论文都要求自己写出300字左右的摘要包括这篇论文解决了什么问题、核心创新点是什么、实验结果如何、和我之前看过的论文相比有什么改进。这个过程非常耗时但效果很好——笔试中涉及目标检测的题目几乎都能覆盖到。编程题方面我每天固定刷3道LeetCode重点刷数组、链表、树、动态规划四个模块的高频题并建立了一个错题本记录每道题的思路坑点和更优解法。第三阶段是冲刺模拟期时长约两周。这个阶段的目标是模拟真实笔试环境让自己提前适应考试节奏。我找来了牛客网和赛码网上的模拟题严格按照90分钟的时间限制进行全真模拟题目做完后不看解析先自己复盘错题再对照解析查漏补缺。同时我也做了一些其他平台公司的视觉岗位笔试题作为补充——因为各家公司的考点分布和难度差异挺大多接触不同的题型有助于提高自己的适应性。4.2 复习资料的选取与使用心得在复习资料的选取上我的经验是重质不重量。网上的学习资料海量不加筛选地囤积反而会让自己焦虑。以下是我实际用过并对笔试真正有帮助的资料清单理论书籍《Computer Vision: Algorithms and Applications》(Szeliski) 的滤波与特征检测章节以及《深度学习》(花书) 的卷积网络章节。这两本用来建立完整的知识框架不需要逐页精读遇到不熟悉的概念当参考书查阅即可。经典论文目标检测五篇R-CNN、Fast R-CNN、Faster R-CNN、YOLO、SSD外加Batch Normalization、ResNet、VGG三篇用于理解基础网络演进。这些论文是深度学习部分出题的最高频来源。刷题平台LeetCodeHot 100 牛客网历年校招笔试真题。这里特别推荐牛客网笔试真题模块上面的题目虽然历史久远但考点分布非常接近真实笔试适合用来做摸底检测。工具书《剑指 Offer》用来准备编程题核心题型。虽然这本书里的题目难度偏低但胜在题目分类清晰、讲解详细适合在笔试前一周快速过一遍唤醒手感。使用资料的一个小技巧是每份资料都要带着问题去使用而不是从头到尾翻完。比如阅读目标检测论文时重点关注的是这篇文章相对前作做了什么改进、改进的具体实现方式是什么、在什么数据集上验证了效果、效果提升的幅度来自哪里把每个问题用一句话总结整理成笔记。到笔试前你只需要复习笔记即可不需要重新翻论文。5. 常见失分点与避坑指南5.1 知识点掌握的常见误区从我的复盘经验来看笔试失分的常见原因有几个反复出现一是概念混淆二是计算漏项三是知识迁移能力不足四是时间分配失误。概念混淆最典型的例子是池化层为什么能提供平移不变性——很多人直觉认为池化赋予模型平移不变性但严谨来说池化只是局部引入了微小平移的近似不变性并不是真正的数学意义上的不变性。另一个易混淆点是数据增强中随机裁剪为什么能提高泛化能力——这其实不是CNN特有的机制而是通过扩充训练样本分布来实现的。笔试中出现这类概念辨析选择题时往往就是用来筛掉没有深入思考过原理的人。计算漏项的问题主要出在参数量计算和感受野计算上。前面提到的偏置项漏算是最常见的问题此外还有很多人在计算感受野时会忽略步长在多层累积中的影响。这里提供一个框架从第一层开始初始化当前感受野大小为1当前步长乘积为1每次经过一个新层时先更新当前感受野大小加上核尺寸减1再乘以当前步长乘积随后再更新步长乘积。用这个框架做题基本不会错。知识迁移能力不足的表现是题目稍微变个形式就不会做。比如考过一道题目是给定一个视频序列要求设计一个算法用于检测一辆车是否发生抛锚。很多人看到这个题就懵了因为这不是一个标准的目标检测问题。其实拆解来看这个问题可以分解为车辆检测车辆运动状态分类两个子问题先通过目标检测模型定位车辆再利用光流或真实世界坐标下的运动轨迹来判断车辆状态。笔试不会要求你写出完整解决方案但需要展现出这种拆解问题的思维方式。你在复习过程中要有意识地训练把完整任务拆解为已知技术问题的能力而不是只会做已经定义好的题目。5.2 笔试做题节奏与时间分配技巧笔试时间只有90分钟如何分配时间直接影响最终得分。我的建议是选择题部分控制在45分钟内完成。遇到超过2分钟还没有思路的题立刻标记跳过不要恋战。选择题的分数性价比很高后面的编程题一道AC可能需要20分钟而一道选择题可能只需要30秒。编程题部分留出40分钟。按照第一题20分钟、第二题20分钟的时间预算来分配。如果第一题10分钟还没有头绪先跳到第二题把有思路的题先拿到手。第二题做完后有多余时间再回头攻克第一题。最后5分钟用于检查。重点检查姓名、考号是否正确选择题有没有涂错卡编程题的代码有没有编译错误有没有漏看题目条件的地方。这条经验是在真实笔试中总结出来的编程题千万不能死磕。我见过不少同学因为过度追求编程题的完美解法导致选择题仓促作答甚至没时间做最后总分反而不如那些编程题只做出一道但选择题全对的同学。从得分策略角度看选择题的分值虽然单题不如编程题但总量占比很大选择题的正确率对最终排名有决定性影响。5.3 笔试结束后的复盘方法笔试结束不等于万事大吉真正的提升发生在复盘阶段。我建议笔试结束后花一天时间做一次完整复盘复盘内容包括三个维度知识盲区、答题节奏、答题策略。知识盲区方面把每一道错题的知识点整理到自己的知识库中并标明错因是概念不熟计算失误还是完全不会。概念不熟的题目三天内重新复习对应知识模块计算失误的题目要总结自己计算中的易错点比如偏置项、边界条件完全不会的题目需要专门做一个专题学习把相关知识补齐。答题节奏方面记录自己在每个题型的实际耗时对比预计耗时找出耗时过长的环节。如果选择题平均每道超过3分钟说明基础还不牢固需要继续加强知识点掌握速度如果编程题时间严重超时需要进一步强化刷题精度在限定时间内进行专项训练。答题策略方面重点是评估自己的取舍决策是否合理。比如当时我跳过了一道完全不理解的选择题节省了3分钟时间最终编程题刚好在截止前完成这是一个合理的取舍。但如果一道题本来可以推导出来却因为时间紧张而放弃那就需要调整前期的做题顺序和节奏。从我个人体会而言笔试真正考验的只有两件事知识面是否足够宽、基础是否足够牢。很多初出校园的同学容易陷入死磕难题的误区为了准备一道可能永远不会考到的冷门论文而荒废了基础复习。实际上校招笔试的题目难度是有明确天花板的——它不会超过本科和研究生阶段的核心课程范围也不会要求你掌握最新发表的论文细节。把基础打牢、把经典内容弄懂、把代码写稳就已经能超过90%的竞争者了。最后再分享一个小技巧笔试前一周可以把目标岗位的职责描述打印出来逐条对照自己的知识储备做一轮匹配度自检。像是岗位要求里明确写了熟悉目标检测、图像分割等常见视觉任务的算法原理和实现那你就把这些内容过一遍写了扎实的C/Python编程能力那就确保自己能在白板上不借助任何工具写出一个类封装和接口调用。这种针对性的自检往往比漫无目的地刷题有效率得多毕竟校招笔试的最终目的从来不是考倒你而是帮你和岗位之间完成一次双向匹配。
返回列表