ARTICLE DETAIL

资讯详情

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

网易计算机视觉算法实习生笔试复盘:从数学原理到工程实战

网易计算机视觉算法实习生笔试复盘:从数学原理到工程实战 这份网易计算机视觉算法实习生笔试题我前前后后帮朋友做过两次复盘自己也认真刷过一遍最大的感受是它看起来是一张考查知识面的卷子但实际上考的是你把零散知识串成工程方案的能力。很多人挂在笔试环节不是因为他不懂反向传播也不是因为他不会写快排而是他没搞明白出题人想要什么样的实习生。下面我按照自己的复盘思路把这份卷子的考查逻辑、高频考点和实战技巧拆开讲。1. 先把这份卷子当成产品来拆解1.1 笔试定位不是竞赛是漏斗网易的实习生招聘笔试本质上是一个筛选漏斗。简历可以包装项目经历可以润色但笔试是限时、限环境、限工具的它能在很短时间内把你的真实水平暴露出来。尤其是计算机视觉算法这个岗位投递的人里既有科班出身、发过论文的硕士博士也有自学转行、凭几个课程项目就敢来的同学如果不通过一套标准化的题目先筛一轮面试官根本忙不过来。所以这张卷子不会出那种你刚好背过就会做的偏题怪题它更愿意考那些你平时天天在用、但未必想过底层原理的内容。比如卷积神经网络的输出尺寸怎么算、贝叶斯公式和朴素贝叶斯的关系、Sobel 算子和高斯核的区别这些都是做 CV 的人天天接触的东西但很多人在简历里写熟练使用 PyTorch一让他手推卷积参数他就开始卡壳。出题人正是用这种方式把调包侠和真正理解原理的人区分开。1.2 三种题型结构的应对顺序我根据市面上流传的题目回忆版大致把卷子分成三类一类是选择题和填空题覆盖数学基础、图像处理、机器学习基础一类是简答题和计算题重点在深度学习的网络结构、损失函数、训练技巧还有一类是开放性的算法设计题以及最后压轴的编程题。我的建议是拿到卷子先花两分钟浏览全卷把分值分布看懂然后优先做你最有把握的部分。编程题分值大但耗时长开放设计题分值中等但写起来容易凑字选择题看着简单但有时候会埋坑。一个很实用的策略是先把所有选择题快速过一遍不确定的先标记然后直接去写编程题再回头補剩下的简答题。不要在一道选择题上纠结超过三分钟尤其不要因为一道二分查找的边界条件没想清楚就耗掉二十分钟后面的大题你可能会哭着放弃。2. 数学基础命题人最隐蔽的拉分点2.1 贝叶斯与最大似然出现频率最高的两个模型数学部分里概率统计的出镜率异常高而贝叶斯公式几乎是必考的。为什么因为计算机视觉里的图像分类、目标检测、语义分割本质上都是在做条件概率估计。你训练一个分类模型其实就是在拟合 p(y|x) 这个后验概率。所以笔试里经常会出现类似这样的题已知某类缺陷在图片中出现的先验概率是 0.01检測模型的召回率是 0.9误检率是 0.05现在有一张图片被模型判为缺陷问它真实是缺陷的概率是多少。这道题考的就是贝叶斯公式的基本套用但很多人会栽在误检率和召回率这两个概念上把条件概率写反。我的经验是遇到这类题先画一张二乘二的表把真阳性、假阳性、真阴性、假阴性四个格子填好再套公式基本不会错。另一种高频题是最大似然估计。给出一个高斯分布的一组样本让你估计均值和方差或者给出一组伯努利试验的结果让你估计概率参数。这种题其实就是对似然函数取对数、求导、令导数为零属于送分题但一定要记得写完整步骤因为阅卷人可能只看你有没有求导过程和最终的估计表达式。2.2 矩阵求导与特征分解线代没有你想象的那么可怕线性代数部分我觉得备考性价比最高的是三块矩阵乘法、矩阵求导、特征值和奇异值分解。矩阵乘法是深度学习前向传播和反向传播的基础笔试可能直接让你手算两个低维矩阵相乘或者问你两个形状分别为 (3,4) 和 (4,5) 的矩阵相乘结果形状这种题基本是送分。但有时候会拐个弯问你如果批量输入 32 张图每张图是 224x224x3经过一个卷积层之后输出是多少这就涉及四维张量的维度变化如果对 NCHW 的维度顺序不敏感很容易算错。矩阵求导这几年出现得越来越多尤其是当题目涉及到岭回归、线性回归的闭式解时会要求你对 w^T X^T X w 这种形式求导然后令梯度为零解出 w。我记得有一道让我印象深刻的题是给了一个二次型 w^T A w问对 w 求梯度等于多少答案是 (A A^T) w我一度以为就是 2Aw后来发现自己忽略了 A 是否对称这个条件。特征值和 SVD 也是常客因为 PCA 降维、白化、人脸识别里的特征脸方法都建立在它们之上。题目可能会问你协方差矩阵的特征向量和 PCA 投影方向的关系或者让你解释奇异值分解在图像压缩里的意义。这类题不需要你现场算高维矩阵的特征值但一定要能把几何意义说清楚。2.3 优化问题梯度下降相关题目的熟练度要求优化理论部分最常见的是梯度下降、学习率调整和凸函数判断。有一类典型题是给定一个函数 f(x) x^2 2x 1初始点 x0 3学习率为 0.1用梯度下降迭代一步问 x 变成多少。这种题只要会求导就不会错但要注意学习率如果给得很大会不会出现发散。这说明出题人希望你理解学习率对收敛性的影响而不仅仅是套公式。还出现过一种变得更复杂的考法解释为什么在深度学习中通常使用随机梯度下降而不是全批量梯度下降。你在回答时不要只说因为数据量大、算不过来而要说到关键点——随机梯度下降的噪声有助于逃离局部极小值且计算代价明显降低同时配合学习率衰减可以在收敛速度和精度之间取得平衡。如果你还知道 Adam 结合了动量项和自适应学习率可以顺带提一句这会让阅卷人觉得你真的理解优化过程的本质而不是背了几个名词。3. 图像处理与特征工程基本功题有哪些坑3.1 滤波器与边缘检测从卷积定义到应用场景图像处理部分的重头戏是卷积操作和边缘检测。首先你要明确一点在 CV 笔试里卷积核和滤波器的概念经常混用但你心里要清楚严格意义上的卷积需要把核翻转一遍而图像处理里常用的相关操作是不翻转的。很多题目会直接给你一张 5x5 的图像和一个 3x3 的核让你计算某一点卷积后的值这考验的就是你对边界填充和滑动窗口的熟练度。我建议考试时一定先判断 padding 是 valid 还是 same再用公式 output (W - K 2P) / S 1 计算尺寸然后老老实实逐项相乘求和不要跳步。Sobel、Canny、高斯滤波这三者的区别是另一个高频考点。简单来说Sobel 是基于一阶微分的边缘检测算子对噪声敏感Canny 是先高斯平滑、再计算梯度幅值和方向、然后做非极大值抑制、最后用双阈值连接边缘它能在噪声抑制和边缘定位之间取得很好的平衡。笔试可能不会让你手写 Canny 全流程但会让你排序它的主要步骤或者问非极大值抑制的作用是什么。我的经验是这类题不要只背步骤要能解释每一步的目的。比如高斯滤波解决的是噪声导致的伪边缘问题非极大值抑制解决的是边缘线条过粗的问题双阈值解决的是边缘断裂和误检的矛盾。你把这些目的说清楚了哪怕题目换个形式问你也能应对。3.2 直方图均衡化与颜色空间填空选择题的常客直方图均衡化是图像增强里最经典的算法也是笔试选择题的常客。它的核心思想是把灰度直方图从集中在某个区间拉伸到整个灰度范围从而增大对比度。考题有两种常见问法一种是给你一组像素的灰度统计让你手算均衡化之后的灰度映射表另一种是问它为什么能增强图像这时要回答关键点——直方图均衡化通过累计分布函数重新分配灰度级使像素值分布更均匀视觉上明暗对比更强烈。手算的时候要注意把累积概率乘以灰度级范围后再四舍五入我见过很多人在四舍五入这一步出错。颜色空间也是一个容易丢分的地方。RGB、HSV、Lab、YUV 的区别和适用场景要能说清楚。比如 HSV 更符合人类对颜色的感知方式常用于颜色分割YUV 把亮度和色度分离适合图像压缩Lab 的 L 通道和人的亮度感知线性相关常用在图像增强和风格迁移里。题目可能会给你一张偏黄的图片问你在哪个颜色空间做白平衡处理更方便答案是 YUV 或 Lab因为可以在色度通道单独调整而不会影响亮度。这种题并不难但如果你只是知道 RGB 和 HSV 的转换公式就很难得分。3.3 特征点与特征描述子SIFT/HOG 的原理级理解2018 年的计算机视觉岗位笔试深度学习虽然已经占据统治地位但传统特征工程仍然会考。原因很简单我们经常需要和传统算法做对比而且很多落地场景数据量小SIFT 这类手工特征依然有使用价值。SIFT 的考点通常在它的流程上尺度空间极值检测、关键点定位、方向分配、生成描述子。试卷不太可能让你背全流程但会让你解释为什么 SIFT 具有尺度不变性这就必须提到高斯金字塔和 DoG差分高斯的作用。HOG 特征则多出现在行人检测相关的题目中比如问 HOG 特征的计算步骤或者比较 HOG 和 SIFT 的不同。记住一个朴素的理解HOG 统计的是图像局部区域的梯度方向直方图它抗光照变化、能捕捉形状轮廓信息而 SIFT 更倾向于在关键点周围提取稳定的局部特征用于匹配和识别。我这里有一个小建议复习时不要把特征工程和深度学习割裂开很多 CNN 结构比如 HOG 和卷积核提取的梯度信息本质上是在用学习的方式实现手工特征的设计逻辑。你能打通这个观念答简答题时视野会宽很多。4. 深度学习模型题会算参数只是入门4.1 手算卷积输出尺寸、感受野与参数量深度学习部分是整张卷子的核心区几乎必考的就是让你计算一个卷积神经网络的输出尺寸、感受野和参数量。输出尺寸的公式上文提过这里重点说感受野。感受野的定义是输出特征图上一个像素点对应输入图像上的区域大小它有一个递推公式RF_{l} RF_{l-1} (kernel_size - 1) × stride_{l-1} 的累计效果。更直接的办法是从最后一层往前推初始感受野为 1对于每一层新的感受野等于旧感受野乘以步长再加上卷积核尺寸减一。参数量计算是另一个容易出错的点。比如问一个输入通道为 3、输出通道为 64、卷积核大小为 3x3、带偏置的卷积层有多少参数答案是 3 × 64 × 3 × 3 64 1792。很多人只算了乘法部分忘记把 bias 加进去。还有一种变体是深度可分离卷积的参数量对比这部分如果没复习到建议花半小时弄明白普通卷积、逐深度卷积、逐点卷积三者的区别因为它考的不只是公式而是你对模型轻量化方向的理解。4.2 训练策略题过拟合、BN、学习率调整除了计算题训练策略题也经常出现。比如问当训练集准确率高而验证集准确率低时你应该怎么办。最直接的答案是数据增强、正则化、Dropout、early stopping、减小模型容量。但要注意笔试简答题的判分往往看你能写出几条、能不能说清理由。比如数据增强为什么能缓解过拟合因为它本质上扩大了训练样本的分布覆盖范围让模型见到更多形态的输入从而增强泛化能力。再比如 Dropout 为什么有效因为它迫使网络不能过分依赖某些神经元相当于训练了多个子网络的集成。Batch Normalization 也是高频问题。出题人可能问它解决了什么问题、在训练和推理时的行为有什么差异。你要说的关键点包括BN 将每层输入归一化为均值为 0、方差为 1 的分布可以缓解内部协变量偏移允许使用更大的学习率而且对梯度传播更友好。但训练时用的是当前 batch 的统计量推理时用的是训练阶段累积的全局统计量。这个训练和推理行为不同往往是容易忽略的细节也是阅卷人喜欢抓的点。4.3 开放设计题如何用 500 字给出可落地方案开放设计题是最能体现工程素养的部分常见的场景有设计一个手机照片自动分类系统、检测工业产品表面的划痕、识别拍照文档中的印刷体文字、做一个视频中的人流量统计方案。这类题没有标准答案但答题框架很重要我的建议是永远按五个部分来写问题定义、数据获取与标注、模型选型、训练与调优、评估与上线。举个例子如果题目是设计一个检测钢材表面缺陷的系统你可以这样展开首先明确缺陷类型有划伤、麻点、氧化铁皮等检测方式是在线实时检测数据方面需要收集生产线上不同光照、角度下的样本并做标注如果正负样本极度不平衡考虑用异常检测或者难例挖掘模型方面先建议用轻量级的目标检测网络比如 YOLOv3 或 Faster R-CNN用预训练权重做迁移学习或者用 U-Net 做像素级分割训练时采用在线数据增强处理类别不平衡用 focal loss评估指标要兼顾准确率和召回率因为漏检一个缺陷可能比误检一个正常样本代价更大。最后还要考虑部署环境比如算力有限时是否要做模型剪枝和量化。如果你能在回答里体现出对实时性和误报成本的分析哪怕没有给出具体的代码流程阅卷人也会觉得你是个有工程直觉的人。4.4 简答题的常见失分点根据我的复盘简答题最可惜的失分点有三个。第一个是只写结论不写推导过程。比如让你求交叉熵损失函数对 softmax 输入梯度的推导很多人直接写下最终形式的梯度公式完全不写中间步骤。阅卷时这种答案很容易被扣分因为判断不了你是真的会推还是背下来。第二个是概念混淆最常见的是把 L1 和 L2 正则化的作用说反或者把数据增强和迁移学习混为一谈。第三个是没有体现对不同场景的区分比如问为什么用 ReLU 而不是 Sigmoid只回答说ReLU 更快是远远不够的要提到 ReLU 能缓解梯度消失问题、计算简单、引入稀疏性同时也要指出它的缺点比如神经元死亡以及如何用 Leaky ReLU 缓解。能答到这一步才算是真正掌握了。5. 编程算法题决定能否进入面试的下半场5.1 高性价比题目类型数组、字符串、动态规划编程题在笔试里通常占 30 到 40 分是决定你能不能进面试的关键。根据网易这类公司一贯的出题风格题目难度大概在 LeetCode 的 Medium 偏下很少会出现 Hard 级别的压轴题但会出现一些需要两三个知识点组合的题目。高频类型我总结为数组操作、字符串处理、链表、二叉树和简单的动态规划。数组和字符串题里双指针技巧是必备技能比如有序数组去重、最长无重复字符子串、反转字符串里的单词。链表题往往会考链表的反转、合并两个有序链表、判断是否有环。二叉树则集中在层序遍历、最大深度、镜像反转这些相对基础的操作上。动态规划是很多人的噩梦但实际笔试里最常见的还是背包类、最长公共子序列、最长递增子序列这样的模板题。我的建议是考前不要追求把 LeetCode 所有题刷完而是把每类题型抽两三道吃透掌握状态定义和转移方程的思路。比如最长公共子序列如果你理解了 dp[i][j] 表示 s1 前 i 个字符和 s2 前 j 个字符的最长公共子序列长度那么后续变体题都只是在改转移条件而已。5.2 笔试编程的输入输出处理细节一个很多新手忽略的问题是输入输出处理。笔试系统不像本地 IDE 一样有交互式调试它通常要求你从标准输入读取数据然后按约定格式输出。比如第一行给一个整数 N第二行给 N 个整数你就要用 sys.stdin.readline 或者 input() 循环读取再 split 成列表。有些题目要求输出保留两位小数有些要求输出一行多个整数用空格分隔这些细节一旦出错即使核心算法完全正确也会被判 0 分。我个人的习惯是在写算法逻辑之前先把输入解析的代码写好并跑一个样例测试确保读进来的数据结构是对的。这道工序看着简单但在限时笔试里特别能稳定心态。还有一个细节是注意时间复杂度的预估。如果数据量是 10^5你的算法是 O(n^2)在 C 里可能勉强能过在 Python 里大概率超时所以如果看到数据范围很大要立刻想到用排序、二分、哈希表或动规优化。比如判断数组中是否存在两个数和为 target第一反应是用哈希表把时间复杂度控制在 O(n)而不是用双重循环。5.3 从暴力解到最优解的递进思路笔试判卷通常不会要求你只给出一个答案而是看你能否通过测试用例。但如果你在题目旁边用注释写出暴力解、优化解、复杂度和边界条件会给自己节省大量回溯时间。我常用的思考递进是先想暴力怎么做再想哪一步重复计算了最后想用什么数据结构可以去掉重复计算。以求最大子数组和为例暴力法是枚举所有子数组O(n^2)优化时发现每个位置的最优值只依赖于前一个位置的最优值所以可以写成 dp[i] max(dp[i-1] nums[i], nums[i])空间还可以压缩成 O(1)。这种递进式的思考不仅让你在笔试中更容易定位问题也方便你写完后快速自查。6. 考前一周能做什么我的复习优先级清单6.1 梳理概念而非背题我见过太多人拿着一沓面经开始背题目这在我看来是效率最低的复习方式。因为笔试题目每年都会变但考点和底层原理是稳定的。考前一周我建议按这条优先级来复习先保证数学基础题不丢分再巩固图像处理和经典特征工程接着把深度学习的计算题练熟最后留出两个晚上刷编程题。概念方面用一张纸画出每个主题的思维导图把公式和关键点写在一旁这样比反复看 PPT 有用得多。比如卷积神经网络这一块你可以从卷积干什么、池化干什么、全连接干什么这个最朴素的问题开始然后逐步扩展卷积为什么能处理图像局部连接和权值共享是什么意思为什么要多个卷积核池化为什么能降低分辨率为什么要在卷积层后面加激活函数当你能够把这些问题流畅地解释给一个完全不懂的人听的时候考试基本就能稳住了。6.2 模拟笔试时最容易忽略的三件事第一件事是计时。笔试是按真实时间限制给你倒计时的但平时练习的时候很多人根本不看表一道题卡住了就刷手机。模拟笔试一定要用整块时间开一个倒计时模拟真实环境。第二件事是手写代码。很多人在 IDE 里靠自动补全写得很顺一转到在线笔试的文本编辑器里就开始别扭。我的建议是平时用纯文本编辑器刷 LeetCode不开自动补全逼自己把函数名、变量名、括号匹配都打清楚。第三件事是处理好卡壳时的应急预案。如果在某一道题上卡住超过 15 分钟没有任何进展就果断放弃先跳过做后面的题。笔试的目标是总分最大化不是每道题都做出来。6.3 考后立即复盘的方法考完笔试大多数人会松一口气但我建议你趁记忆还热的时候把整张卷子的考点和你的答题情况记录下来。我当时列了一个表格左边写考点中间写我当时的答案要点右边写我认为正确的答案。这样做的价值不仅仅是为了准备下一家公司的笔试更是给自己做一个知识排查看看哪些地方是因为粗心哪些是真正的知识盲区。字节、腾讯、阿里的笔试风格虽然不同但底层考点高度重合你认真复一次盘后面几场笔试的通过率会肉眼可见地上升。以上说的这些都是我在反复复盘这套题的过程中得出的经验。网易 2018 年实习生招聘的计算机视觉算法笔试题本身并不是为了刁难人它真正希望筛选出的是那些既懂数学原理、又写过靠谱代码、还对工程落地方案有感觉的同学。如果你正在准备类似岗位的笔试建议不要抱着刷完题就完事的心态而是把每一道题当成一次和出题人的对话揣摩他为什么考这个点这样你会发现准备笔试的过程本身就已经让你比一天前的自己更接近一个真正的计算机视觉算法工程师。
返回列表