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_{i+1} | x_i),再通过链式法则把联合分布展开,并利用条件独立性化简,就能比较顺畅地推出来。
这种题给我们的启示是:不要只盯着深度学习那点内容,概率图模型、信息论、数值优化这些“老数学”,也是研究员的基本功。面试官会通过这样的题来判断,你是否有能力理解论文里那些复杂的数学符号。
5.3 关于分数和面试门槛的观察
商汤的校招流程通常是笔试通过后才能进入面试。笔试成绩并不是只看总分,有些环节有隐性权重,比如编程题和推导题的权重可能更高。这意味着你即使前面的选择题蒙对了许多,但编程题几乎没动,也可能无法进入面试。
从我了解的情况看,笔试通过率并不高,竞争比较激烈。但这并不意味着你必须每道题都答对。更重要的是让阅卷人看到你在核心能力上的表现:数学推导是否严谨、编程实现是否清晰、开放题是否有思路。只要这几个维度里有几个达到较好的水平,就有机会。
关于分数线,不同年份、不同岗位的差异很大,而且官方不会公布具体标准。与其花时间去猜分数线,不如把精力放在“如何最大化展示自己的能力”上。
6. 笔试之外的几点额外建议
6.1 准备PPT式的模型推导笔记
我在准备这次笔试时,养成了一个习惯:每一个重要的模型,都用一页纸把“损失函数、梯度、更新规则、优缺点”写下来。这不是给老师看的作业,而是给自己看的速查卡。笔试前翻这些速查卡,比重新翻书要高效得多。
这种笔记的格式建议统一,每页包含四个部分:核心思想、数学推导、关键代码片段、易错点。比如Batch Normalization那页,我会写上训练时用batch统计量、推理时用滑动平均统计量,以及为什么会这样设计。这样就算笔试不考,面试也大概率能用上。
6.2 线上笔试的设备与网络准备
虽然看起来是老生常谈,但每年都有人因为设备问题翻车。提前确认摄像头能正常打开,因为很多在线笔试有防作弊监控。网络要稳定,最好是有线网络加手机热点双重备份。如果家里网络不稳,建议提前去学校机房或者租一个安静的共享空间。
浏览器也要提前测试。部分在线笔试平台对浏览器版本有要求,如果你用的浏览器不兼容,可能无法正常显示题目或无法提交代码。一般平台会提供环境测试入口,一定要提前进去走一遍流程。
6.3 心态调整:把笔试当成一次研究训练
最后说一点心态上的问题。很多同学在笔试前特别焦虑,觉得自己这里不会那里不会。但你要明白,校招笔试本质上是一次筛选,不是要把你考倒,而是要找到适合做研究的人。遇到不会的题很正常,关键是你如何应对。
我的做法是:把每个不会的题都当作一次“研究机会”。它暴露了你在哪个知识点上有缺口,这个缺口往往也是你未来学习的方向。笔试结束后,我会把每道错题重新整理一遍,寻找它的知识源头,再把相关的内容全部过一遍。这样即使没有通过笔试,这场考试也变成了有效学习。
另外,别把一家的笔试失败看得太重。AI领域的校招选择很多,商汤只是其中之一。笔试挂了不代表你能力不行,只是双方的匹配度不够。保持稳定的复习节奏,一场一场打下去,总会遇到适合你的机会。
我在实际参与和复盘这类笔试时的最大感受是:商汤研究员笔试考察的不是“你会不会某个模型”,而是“你能否像一个研究者一样思考和推导”。你可以不知道最新论文里的所有细节,但你必须能推推导出经典模型的原理,必须能把一个模糊的问题拆解成可执行的方案。这份能力不是临时抱佛脚能获得的,而是长期刻意练习的结果。
最后再分享一个小技巧:平时读论文时,别只看实验部分,看到公式就手推一遍,看到图表就分析一下作者为什么这么设计实验。这种习惯养成了,你应对的不只是笔试,而是整个AI研究这条路。