
2018年那阵商汤科技的校招笔试在圈子里的热度不亚于任何一家头部互联网公司。尤其是研究员岗位笔试不是随便刷两道LeetCode就能过的它考的是你数学和机器学习的地基稳不稳。我印象里“商汤科技2018校招研究员笔试第二场”这套题整体风格非常偏“推导”和“建模”少了很多套路性的记忆题多了不少需要现场推公式、现场设计方案的硬核内容。这篇文章不打算复述具体的题目原文而是把这类笔试背后的考察逻辑、题型结构、准备方法一次性说透。如果你正准备投递AI研究类岗位或者想看看大厂研究院到底在筛什么样的人这篇内容值得认真看两遍。1. 为什么这场笔试值得复盘1.1 商汤校招研究员笔试的定位先说一个基本判断商汤的研究员笔试不是用来考“你会不会写代码”的而是用来考“你有没有研究潜力”的。这个定位很重要直接决定了复习方向。很多同学拿着《剑指Offer》和《程序员代码面试指南》去准备结果上了考场发现编程题只占一部分剩下的大量篇幅都在考矩阵求导、概率建模、优化理论、模型推导整个人是懵的。商汤的AI业务以计算机视觉为核心研究员需要跟检测、分割、跟踪、人脸识别、OCR等方向打交道。日常的工作内容不是调包训练模型那么简单而是需要分析问题、设计损失函数、改进网络结构、解释模型行为。这要求你必须具备扎实的数学功底和从第一性原理推导问题的能力。所以笔试里出现“手推SVM对偶”、“计算多元高斯分布的条件概率”这类题目一点都不意外。1.2 第二场和其它场次的差异校招笔试通常不止一场商汤2018年的研究员笔试也分成了若干场次。根据当时参与的同学反馈第二场在题型比例上有一个明显特点更偏重对“深度学习理论基础”的考察而不是简单的机器学习算法罗列。比如会考反向传播中的梯度流动、Batch Normalization在训练和推理时的差异、常见的激活函数为什么有效等等。另外第二场的编程题不像互联网公司那样只考链表、二叉树而是更偏向“用代码实现一个算法流程”或“把某个数学模型落到代码里”。比如给你一个简化的逻辑回归模型要求你实现梯度下降并输出每一轮的损失变化或者给你一个卷积计算的手写实现要求处理边界填充和步长。这类题目考验的是你把数学公式翻译成工程代码的能力而不是纯粹的算法竞赛技巧。1.3 适合哪些人参考这篇文章适合三类人。第一类是正在准备AI算法岗、研究员岗校招的同学你可以把它当作战术参考明确复习重点。第二类是刚读研、打算以后进入工业界做研究的低年级学生提前了解行业筛选标准可以帮你少走弯路。第三类是纯粹想看看AI研究岗笔试长什么样的人你可以通过这篇内容理解“AI研究”这件事在公司里到底意味着什么。如果你已经工作几年可能觉得校招笔试离你很远。但这类笔试的考察范围其实也是很多公司内部晋升答辩、技术评级考核的底层逻辑。把地基重新打牢对任何人来说都不是坏事。2. 笔试整体结构与题型拆解2.1 数学基础与算法题商汤研究员笔试的数学题不是考研数学那种风格它更贴近“你以后读论文时需要用到的数学”。线性代数方面矩阵乘法、特征分解、奇异值分解、矩阵求导是绝对重点。概率统计方面常见分布高斯、伯努利、多项式、最大似然估计、贝叶斯公式、期望和方差的变形计算都会涉及。我记得当时有一类题目特别有代表性给你一个带约束的优化问题让你用拉格朗日乘子法求解然后问你KKT条件是什么。这本质上是SVM推导的前置知识考察的不是你会不会背KKT而是你能不能理解约束优化在机器学习里的意义。这里有一个容易忽略的点很多同学把数学复习当作“看一遍书就行”但笔试里数学题的分值占比并不低而且计算量大、时间紧。你必须在看到题目的瞬间就反应出用什么工具否则根本来不及。建议复习时多用纸笔推导不要只盯着屏幕看视频。2.2 机器学习与深度学习理论这一块是第二场的重头戏。机器学习的考察范围包括线性回归、逻辑回归、朴素贝叶斯、决策树、随机森林、SVM、聚类、降维等等。但注意它很少考“你知道哪个模型的准确率更高”这类问题更多是考“为什么这个模型有效”和“如果某个条件变了模型会发生什么变化”。深度学习方面商汤作为视觉公司对卷积神经网络的理解要求特别高。卷积层、池化层、全连接层、感受野、权值共享、梯度消失和梯度爆炸、常见激活函数、Dropout、Batch Normalization都是高频考点。有一类题目我当时印象很深给定一个输入尺寸和卷积核参数让你计算输出特征图的尺寸。看似简单但很多人会在padding和stride的组合上算错。不要小看这些基础题。我在实际面试中发现很多候选人简历上写着“熟练掌握CNN”但你问他感受野怎么算、梯度在某个BatchNorm层是怎么流动的他答不清楚。笔试就是要把这类“简历型选手”筛掉。2.3 编程实现与手推公式编程题通常是两到三道时间占比大约在三分之一左右。和互联网公司的在线笔试不同商汤的编程题更灵活有时候不允许你直接用现成的库。比如不会让你import sklearn然后调LogisticRegression而是要求你手写核心的更新过程。手推公式的题目也很常见。比如给一个简单的前馈神经网络要求你写出反向传播的每一层梯度表达式或者给一个softmax损失函数让你求对输入特征的梯度。这些题看起来基础但如果平时只调框架、从不手推现场推导会非常痛苦。我建议在复习阶段养成一个习惯凡是接触到一个模型都要能独立推导出它的前向计算、损失函数和反向传播过程。不需要追求和论文里完全一致的符号体系但至少自己心里有数。这样上考场就不会慌。2.4 综合推理与场景设计第二场还有一部分容易被忽略的题型场景设计题。它通常不长但很考验你对真实业务的理解。比如给你一个“在监控视频中检测小目标”的需求问你如何设计一个算法方案包括数据怎么处理、模型怎么选、怎么评估效果。这种题没有标准答案阅卷人看的是思维框架。你要体现出“问题定义、数据分析、方法选型、实验设计、指标评估”这条完整链路。很多人拿到这类题就开始堆模型名词把YOLO、Faster R-CNN、SSD全部列一遍其实意义不大。更好的做法是解释清楚小目标为什么难检测是分辨率不足还是锚点设计不合理你的方案是改数据还是改网络还是改损失函数为什么。这种思维层面的考察恰恰是研究员和普通开发的重要区别。工程师关心功能上线研究员关心问题能否被更本质地解决。商汤的笔试把这个要求前置到了校招环节说明他们对候选人的思考深度是有要求的。3. 核心考点的深度拆解与准备路径3.1 线性代数与矩阵求导研究员的数学基本功如果让我排序线性代数和矩阵求导是商汤研究员笔试里性价比最高的复习方向。它不仅在笔试里直接出题而且几乎贯穿所有现代机器学习模型。比如神经网络的反向传播本质就是链式法则加矩阵求导SVM的推导本质是约束优化和矩阵运算注意力机制里的Q、K、V本质是矩阵乘法和缩放。我当时复习矩阵求导时把常见的形式整理成了一张表标量对向量求导、标量对矩阵求导、向量对向量求导、二次型求导以及它们之间的换算关系。比如d(x^T A x) / dx (A A^T)x这类公式一定要熟到肌肉记忆。不要依赖参考资料到了笔试现场你是没有时间查表的。另一个重点是Jacobian矩阵和梯度传播的关系。很多深度学习面试题会让你写“某个张量对另一个张量的梯度”很多人一遇到多维就脑子转不过来。有个技巧先把所有符号写成标量形式逐一求偏导再还原成矩阵形式。虽然慢但正确率有保证。在考场上正确比速度重要。3.2 概率论与最优化模型背后的不确定性思维概率论在研究员日常工作中的地位比大多数人想象的高得多。训练数据有噪声模型预测有不确定性评估指标有随机波动这些都需要用概率语言来描述。笔试中常见的概率题包括条件概率、贝叶斯更新、常见分布的期望和方差、最大似然估计、最大后验估计、朴素贝叶斯分类原理。我当时的复习方法是把“生成式模型”和“判别式模型”的区别彻底吃透。比如朴素贝叶斯是生成式逻辑回归是判别式这两个模型在同一个数据集上会有什么不同的表现为什么这类问题比单纯写公式更能考察理解深度。优化理论同样重要。梯度下降、随机梯度下降、动量法、Adam、学习率调度这些不仅是深度学习训练的工具也是笔试中的常客。有一类题会让你比较不同优化器的收敛行为或者问“鞍点为什么对梯度下降有影响”。这需要你真正理解损失曲面和优化轨迹的关系而不是只会“遇事不决用Adam”。3.3 经典模型背后的推导细节商汤研究员笔试对经典模型的考察深度超过一般公司。SVM、逻辑回归、线性回归这些模型如果你只记得结论不知道推导过程遇到变体题很容易卡住。举个例逻辑回归的损失函数为什么可以用交叉熵如果标签从0/1变成了-1/1损失函数会怎么变梯度表达式会怎么变这类题考察的是你对模型本质的理解而不是背诵。我当时准备时把线性回归的闭式解、逻辑回归的梯度下降、SVM的拉格朗日对偶、softmax分类器的梯度每一个都从头推了一遍推完再合上书复现一遍直到能默写出来。深度学习方面我强烈建议亲自推导一遍多层感知机的反向传播。别用PyTorch的自动求导纯粹用纸笔把每一层的输入、输出、梯度表达式写清楚。这个过程虽然耗时但它能帮你建立对“梯度流动”的直觉。之后的卷积、BatchNorm、RNN本质上都是同一套思路在不同结构上的延伸。3.4 开放题如何回答才不丢分开放题是很多人的失分重灾区倒不是不会做而是不知道以什么标准被评判。我个人的经验是这类题别急着写方法先花两分钟把问题拆清楚。比如题目问“如何提升小目标检测的精度”你可以分几个层面回答。数据层面是否可以通过过采样、拼接、复制粘贴来增加小目标的样本量模型层面是否可以采用特征金字塔、更高分辨率的输入、anchor尺寸重设计训练层面是否可以使用针对小目标的损失函数比如调整回归损失权重评估层面是否需要单独统计小目标的AP而不是整体AP。每一步说清楚动机和预期收益比直接抛一个网络名要扎实得多。另外开放题的答案里要体现出“权衡”的意识。任何方案都有成本和收益研究员的价值在于能理性判断。你在笔试里写“我选择某种方案因为它带来了什么改进同时付出了什么代价”这样的表达会显得成熟很多。4. 实操过程从接到笔试到提交答案4.1 考前查漏补缺清单我建议在笔试前一周不要再看新的内容而是把已经学过的核心知识点过一遍。以下清单是我总结的高频检查项也可以当作最终的复习索引矩阵求导常见公式特别是二次型和交叉熵的梯度。SVM的优化目标、拉格朗日对偶、KKT条件。逻辑回归、softmax回归的损失函数和梯度推导。感受野计算、卷积输出尺寸计算、转置卷积的原理。Batch Normalization在训练和推理时的不同行为。常见激活函数ReLU、Leaky ReLU、ELU等的优缺点。一维和二维高斯分布的性质条件分布与边缘分布。梯度下降变体的更新公式Momentum、RMSProp、Adam。反向传播中的链式法则特别是跨层梯度传播。聚类算法K-Means、GMM的原理以及它们和分类模型的区别。不要贪多。把这些核心点反复钻研到位比囫囵吞枣看三十个知识点更有效。我当时吃了亏花了很多时间看一些冷门模型结果笔试考的恰恰是那些我“感觉很简单但没细推”的内容。4.2 答题时间分配策略商汤研究员笔试的题量不算少时间分配很关键。我的建议是不要在前面的数学题上恋战。如果一道题看了两分钟还没有思路先跳过把后面能拿的分拿到手。大致分配可以这样参考数学题和理论题约占50%的时间编程题约占40%开放题和检查占10%。当然这个比例会因个人情况浮动但核心原则是“先易后难保底争优”。编程题通常分值较大如果你因为在一道数学题上卡太久导致编程题没时间写会非常可惜。还有一个小技巧在线笔试的编辑器通常没有自动补全不要先写完整代码再测试。建议先用注释把所有功能块标出来再逐步填充代码。这样即使最后没写完阅卷人也能看到你的思路。4.3 编程题环境与调试方法2018年那会儿很多在线笔试平台不支持本地IDE调试只有网页编辑器。这意味着你需要习惯在没有断点调试的环境下写代码。我的建议是写代码时多用print输出中间变量尤其是在实现矩阵运算的时候要经常打印维度。比如让你手写一个卷积层的实现你每完成一个关键步骤就打印一下当前输出张量的形状确保和预期的[batch, channel, height, width]一致。如果发现维度对不上赶紧回头检查padding、stride或者卷积核的初始化。另一个容易出问题的地方是边界处理。手写卷积时很多人默认padding为0但题目可能要求的是“same”模式。一旦边界条件理解错整个输出都是错的。所以拿到题第一步不是急着写循环而是先把输入、输出尺寸公式列出来明确padding和stride再动手。4.4 检查清单与提交前确认在提交前至少留出10分钟做整体检查。第一步是检查代码里有没有语法错误特别是括号、冒号、缩进这类低级问题。第二步是检查有没有“无意的全局变量”在函数内部修改全局变量而不声明会导致结果出乎意料。第三步是跑一遍边界测试用例。如果你实现了某个模型可以用全零输入或极小输入跑一下看输出是否符合预期。比如手写逻辑回归时把权重初始化为0第一轮梯度应该能被计算出来损失也应该是一个合理的值。如果出现NaN多半是数值稳定性问题可以考虑在softmax里减去最大值。最后检查自己的答案是否都保存了。在线笔试平台偶尔会有网络波动重要答案最好先复制到本地临时文件备份。虽然是校招笔试但细节决定成败。我身边有同学因为最后没点提交白白浪费了一次机会。5. 常见问题与避坑经验5.1 被刷掉的人通常差在哪我复盘过不少同学的失败经历发现最常见的不是知识储备不够而是答题习惯不好。第一数学题写到最后一步算错导致结果全错丢分可惜。第二编程题不注释逻辑混乱即使写对了也很难拿到全部分数。第三遇到不会的题就直接放弃空白交卷其实从题干的已知条件出发写几步也能拿过程分。另一个隐性问题是审题不仔细。有些题让你“用伪代码描述”你非要写完整的可运行代码有些题让你“说明思路”你直接上公式不解释。这种不匹配会让阅卷人觉得你理解能力有限非常吃亏。研究员的笔试重点不是“你记住了多少”而是“你能不能把不懂的东西用已有知识推导出来”。所以在平时练习时要有意识地训练自己在有限时间内“现推”的能力而不仅仅是看答案。5.2 一道题的现场还原与复盘我印象里有一道题和概率图模型里的马尔可夫性质有关。题目大意是给定一个简单的高斯马尔可夫链要求你写出相邻节点之间的条件分布并推导联合分布。大多数人第一反应是写公式但真正卡住的地方是“如何把条件独立性质用数学表达式呈现”。如果你对概率图模型的理解停留在“画图”阶段这道题基本拿不到分。但如果你能写出p(x_{i1} | x_i)再通过链式法则把联合分布展开并利用条件独立性化简就能比较顺畅地推出来。这种题给我们的启示是不要只盯着深度学习那点内容概率图模型、信息论、数值优化这些“老数学”也是研究员的基本功。面试官会通过这样的题来判断你是否有能力理解论文里那些复杂的数学符号。5.3 关于分数和面试门槛的观察商汤的校招流程通常是笔试通过后才能进入面试。笔试成绩并不是只看总分有些环节有隐性权重比如编程题和推导题的权重可能更高。这意味着你即使前面的选择题蒙对了许多但编程题几乎没动也可能无法进入面试。从我了解的情况看笔试通过率并不高竞争比较激烈。但这并不意味着你必须每道题都答对。更重要的是让阅卷人看到你在核心能力上的表现数学推导是否严谨、编程实现是否清晰、开放题是否有思路。只要这几个维度里有几个达到较好的水平就有机会。关于分数线不同年份、不同岗位的差异很大而且官方不会公布具体标准。与其花时间去猜分数线不如把精力放在“如何最大化展示自己的能力”上。6. 笔试之外的几点额外建议6.1 准备PPT式的模型推导笔记我在准备这次笔试时养成了一个习惯每一个重要的模型都用一页纸把“损失函数、梯度、更新规则、优缺点”写下来。这不是给老师看的作业而是给自己看的速查卡。笔试前翻这些速查卡比重新翻书要高效得多。这种笔记的格式建议统一每页包含四个部分核心思想、数学推导、关键代码片段、易错点。比如Batch Normalization那页我会写上训练时用batch统计量、推理时用滑动平均统计量以及为什么会这样设计。这样就算笔试不考面试也大概率能用上。6.2 线上笔试的设备与网络准备虽然看起来是老生常谈但每年都有人因为设备问题翻车。提前确认摄像头能正常打开因为很多在线笔试有防作弊监控。网络要稳定最好是有线网络加手机热点双重备份。如果家里网络不稳建议提前去学校机房或者租一个安静的共享空间。浏览器也要提前测试。部分在线笔试平台对浏览器版本有要求如果你用的浏览器不兼容可能无法正常显示题目或无法提交代码。一般平台会提供环境测试入口一定要提前进去走一遍流程。6.3 心态调整把笔试当成一次研究训练最后说一点心态上的问题。很多同学在笔试前特别焦虑觉得自己这里不会那里不会。但你要明白校招笔试本质上是一次筛选不是要把你考倒而是要找到适合做研究的人。遇到不会的题很正常关键是你如何应对。我的做法是把每个不会的题都当作一次“研究机会”。它暴露了你在哪个知识点上有缺口这个缺口往往也是你未来学习的方向。笔试结束后我会把每道错题重新整理一遍寻找它的知识源头再把相关的内容全部过一遍。这样即使没有通过笔试这场考试也变成了有效学习。另外别把一家的笔试失败看得太重。AI领域的校招选择很多商汤只是其中之一。笔试挂了不代表你能力不行只是双方的匹配度不够。保持稳定的复习节奏一场一场打下去总会遇到适合你的机会。我在实际参与和复盘这类笔试时的最大感受是商汤研究员笔试考察的不是“你会不会某个模型”而是“你能否像一个研究者一样思考和推导”。你可以不知道最新论文里的所有细节但你必须能推推导出经典模型的原理必须能把一个模糊的问题拆解成可执行的方案。这份能力不是临时抱佛脚能获得的而是长期刻意练习的结果。最后再分享一个小技巧平时读论文时别只看实验部分看到公式就手推一遍看到图表就分析一下作者为什么这么设计实验。这种习惯养成了你应对的不只是笔试而是整个AI研究这条路。