ARTICLE DETAIL

资讯详情

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

商汤科技2018校招研究员笔试复盘:数学推导与代码实战全解析

商汤科技2018校招研究员笔试复盘:数学推导与代码实战全解析 商汤科技2018校招研究员笔试第一场提到商汤很多人第一反应就是“人脸识别”“AI四小龙”“CV顶会收割机”。2018年那会儿商汤在计算机视觉领域正是势头最猛的时候校招笔试的含金量也直接拉满。我身边不少同学、包括我自己当时都把商汤研究员岗当成投递清单里的“必选项”之一。说实话那场笔试跟我后来参加的其他大厂算法岗笔试比起来风格差异还挺明显的——它不搞那种“八股文式”的背诵题而是真的在考你数学功底、模型理解和代码落地之间的平衡。这篇文章就来完整复盘一下商汤科技2018校招研究员笔试第一场。内容会覆盖试卷结构、典型考点、我做题时的思路以及考完以后跟一起面试的同学交流得出的经验教训。不管你是准备CV方向算法岗还是对AI研究员笔试的出题逻辑好奇这都值得你花几分钟看完。我尽量把题目还原得细一点但毕竟过去挺久了部分细节会有记忆偏差不过核心考点和解题思路是没问题的。1. 笔试试卷概况与题型分布1.1 整体模块与分值侧重那一场笔试下来最大的感觉是商汤的出题风格非常“重理论、重推导、重动手”。整张卷子大约两个半小时题量不算特别大但每道题都需要你想清楚才敢下笔。大致模块我整理了一下单选题约10道主要覆盖机器学习基础、深度学习基础、概率统计。多选题约5道这类题风险最高多选少选都扣分考点集中在模型对比、损失函数性质、网络结构细节。简答与推导题3道涉及反向传播手推、SVM对偶推导、概率模型求解等。编程题2道一道是纯数据结构/算法题另一道是模型训练流程相关的代码填空题或手写实现。从分值上看单选和数学推导题占比最高编程题单题分值大但数量少。这其实已经透露出一个信息商汤研究员岗的笔试重点不是看你会不会调包而是看你能不能把模型背后“为什么有效”讲清楚。当年有不少同学复习时只顾着刷LeetCode结果在推导题上栽了跟头挺可惜的。1.2 不同模块的备考权重如果按照“投入产出比”来排优先级我个人建议是这样数学基础与推导题优先级最高因为往往一道题就是20分以上而且考官能从你的推导步骤里一眼看出你是真懂还是背答案。机器学习经典模型优先级次之尤其是SVM、逻辑回归、决策树、贝叶斯这些基础模型的推导与对比几乎是每年必考。深度学习理论包括反向传播、梯度消失与爆炸、激活函数性质、Batch Normalization原理等这些是区分候选人是否真正做过模型训练的关键。编程题虽然分值不低但对于研究员岗编程题难度通常不会高到竞赛级别扎实掌握常见数据结构就能应付。我当时复习策略是“先补数学推导再刷少量编程题”。事后复盘这个方向基本是对的。如果你现在也在准备类似岗位的笔试建议别把时间全部堆在“刷题数”上多花点时间理解每个公式的来龙去脉回报会大得多。2. 核心考点详解机器学习与深度学习理论2.1 机器学习基础偏差方差、正则化与模型选择选择题里考得最多的就是偏差-方差分解和正则化。比如有一道题大致是当模型在训练集上表现很好但验证集误差较大时以下哪种方法最有可能改善选项里包括了增加模型复杂度、减小正则化系数、增大训练数据量、使用更复杂的特征。答案显然是增大训练数据量和适当增大正则化系数因为这是典型的高方差过拟合场景。这类题本身不难但有个容易踩坑的地方是“正则化系数增大”和“正则化项系数减小”的关系。很多人会把L1和L2正则的作用搞混。L1趋向于产生稀疏权重L2趋向于让权重整体变小但不会归零。笔试里如果考到“哪些正则化手段可以防止过拟合”这两个都要选上但要能说出区别。还有一个高频考点是交叉验证。2018年那场笔试虽然没有专门考K折交叉验证的计算但有一道多选问“以下哪些做法可以更可靠地评估模型泛化能力”选项包括分层采样、K折交叉验证、直接用测试集调参、独立测试集多次评测取平均。这里一定要注意“用测试集调参”是绝对的大忌一旦选了这道题就废了。后来我跟别人交流才知道这道题很多人就是因为手快选了“直接在测试集上调参”白白丢分。2.2 深度学习理论BN层、Dropout与激活函数深度学习部分的单选题记忆最深的一道问的是Batch Normalization的作用。选项有加速收敛、缓解梯度消失、缓解过拟合、减少对初始化权重的敏感度。正确的应该是前三个第四个是常见误区。BN虽然对初始化有一定容忍度但它的设计初衷不是为了“减少对初始化的敏感”而是通过标准化层输入来稳定训练分布。这里我想多说一句面试官和出题人其实很希望看到你能把BN阶段性的行为讲清楚训练时用batch内的均值方差推理时用全局统计量有时还需要注意batch size太小会导致BN效果变差。当时笔试题目只考了选择题但如果你面试大概率会被追问到这些细节。Dropout也考了一道问训练和测试时的行为差异。训练时随机失活神经元并进行比例缩放测试时保留全部神经元、不缩放。选项里有一个“测试时也要随机失活”的干扰项选上去就错了。这种题就是考察你有没有真正写过训练代码而不是只看过论文。激活函数方面的题比较基础考了ReLU在负半轴导数恒为0、以及它可能导致神经元死亡的问题。还顺带考了sigmoid函数的数值范围是0到1、导数最大值是0.25。从考点上讲深度学习基础部分并不超纲但覆盖面很广需要你对常见结构都有比较扎实的记忆。2.3 卷积网络与目标检测常识商汤毕竟是以CV立身笔试里不可能不考卷积网络。有一道选择题问在一个尺寸为H×W、通道数为C的特征图上做3×3卷积输出通道数为C不算bias这层有多少个参数答案很直接3 × 3 × C × C。但如果选项里混入了“3 × 3 × C”或者“3 × 3 × C”你还真得多留个心眼。这就是典型的“送分题”但每年都有人因为粗心算错。目标检测部分考了一道概念题问Faster R-CNN中RPN的作用。选项设计得很阴险有一个说法是“直接对全图进行像素级分类”另一个是“在特征图上生成候选区域并给出初步的类别和位置回归”。正确答案是后者。RPN的本质是“提候选框”不是做最终分类。如果你只了解检测算法的名字不了解流程这种题很容易翻车。不过说实话那场笔试对CV前沿算法的直接考察并没有我想象中那么深更多还是在考基础。这可能反映了商汤的选人思路基础扎实的人进来以后上手新方向更快如果只会背几个新模型名字反而很难深入下去。3. 数学推导与理论题实战3.1 SVM对偶推导与KKT条件简答题第一道就是经典中的经典写出线性可分SVM的原始优化问题并通过拉格朗日乘子法推导其对偶形式。这题只要你认真准备过基本就是送分但如果你只是“听过”没自己推过现场很容易卡壳。我当时的推导思路大致是这样的。原始问题为min 1/2 ||w||^2 s.t. y_i(w · x_i b) 1引入拉格朗日乘子 α_i ≥ 0构造拉格朗日函数L(w, b, α) 1/2 ||w||^2 - Σ α_i [y_i(w · x_i b) - 1]对 w 和 b 求偏导并令其为0得到w Σ α_i y_i x_i Σ α_i y_i 0代回拉格朗日函数得到对偶问题max Σ α_i - 1/2 Σ_i Σ_j α_i α_j y_i y_j (x_i · x_j) s.t. α_i ≥ 0, Σ α_i y_i 0最后再用KKT条件来说明支持向量的性质α_i 0 对应的样本就是支持向量它们满足 y_i(w · x_i b) 1。这一步很重要因为后面如果面试官追问“支持向量机为什么只依赖支持向量”就得靠KKT条件来解释。这道题我的建议是写推导过程时每步的“为什么”都要标注清楚比如为什么偏导为0、为什么对偶问题一定是凸优化。阅卷人看推导题的时候看得不是你答案对不对而是你的思路是否连贯、是否理解每一步的数学含义。3.2 反向传播的手工推导第二道推导题是给了一个简单的全连接网络输入是2维向量经过一个隐藏层激活函数是sigmoid再加一个输出层无激活函数损失函数是均方误差。要求推导每个参数的梯度更新公式。说实话这种题在纸上写起来很繁琐但思路很清楚。核心就是链式法则。我当时先把计算图画出来然后从损失函数往前倒着推。这里分享一个技巧不要试图“心算”梯度而是每一步都明确写出“当前层的误差项δ”。比如输出层误差项就是 (预测值 - 真实值)隐藏层误差项就是输出层误差项乘上权重再乘上激活函数导数。只要把中间量都写清楚最后参数梯度就是输入乘以对应误差项非常规整。这种题有另外一个容易出错的地方符号混乱。建议用上标表示层号下标表示神经元编号公式一长就不容易看错。还有一点如果题目要求“写出梯度更新公式”别忘了加学习率η我当时就见过有同学推了半天忘记乘学习率最后一步扣分很不值。3.3 概率统计与信息论问题概率统计部分考了一道题题干给了两个高斯分布的参数求两个分布之间的KL散度。这种题本身有公式可以直接套两个一维高斯 N(μ1, σ1²) 和 N(μ2, σ2²) 之间的KL散度是KL log(σ2/σ1) (σ1² (μ1 - μ2)²) / (2σ2²) - 1/2但更关键的是要理解KL散度不对称所以题目如果问“反向KL散度”是多少结果就不一样。2018年笔试里没有专门挖这个坑但选择题里有一道问“以下哪个不是概率分布之间的距离度量”有人会选“余弦相似度”因为它的取值范围是[-1, 1]且不满足距离的公理。这题不难但概念不清晰的话就会犹豫。信息论考了熵、交叉熵和相对熵之间的关系。选择题问的是对于同一个随机变量交叉熵是否总是大于等于其信息熵答案是肯定的。原因是交叉熵 信息熵 KL散度KL散度非负。这道题背后的逻辑其实就是分类任务里用交叉熵作为损失函数的合理性来源。笔试不会直接问“为什么用交叉熵”但你理解了这个不等式就能答对这道题。4. 算法与代码题实战4.1 编程题二叉树的层序遍历变体编程题第一道是二叉树相关但不是单纯的层序遍历而是要求“按层输出并且奇数层从左到右、偶数层从右到左”。也就是Zigzag层序遍历。这道题在LeetCode上有原题难度中等。笔试时可以选Python我直接用deque加层数标志位来写思路是用队列维护当前层节点。每次先取当前队列长度size然后循环size次取出节点把下一层节点入队。如果当前层是偶数层就把结果反转再append。这题不涉及特别难的技巧主要考察队列使用和边界处理。笔试环境里没有自动补全所以建议平时练习时就别依赖IDE提示尽量手写。还有个小细节处理空树的情况如果根节点为空直接返回空列表。4.2 编程题手写一个简单的SGD训练流程第二道编程题很有意思给了一个非常简单的线性回归模型要求补全训练代码片段。题目给出的框架包括前向计算、损失计算、反向传播和参数更新几个函数中间留了几个空让你填。虽然我在训练模型时完全理解这部分逻辑但换成笔试环境手写还是要有一定熟悉度的。当时需要填的空一个是“如何计算均方误差损失”另一个是“参数更新公式”。核心逻辑不复杂# 前向 y_pred X w b # 损失 loss np.mean((y_pred - y) ** 2) # 梯度 dw (2 / N) * (X.T (y_pred - y)) db (2 / N) * np.sum(y_pred - y) # 更新 w - lr * dw b - lr * db你可能会说这种代码谁不会写但笔试的坑在于它可能会把矩阵形状“稍微改一下”比如X的shape是(样本数, 特征数)w是(特征数, 1)b是标量。如果广播和转置搞错了结果就会出问题。考场上一旦出现维度不匹配又没法立刻调试心态很容易崩。我印象里还有一个填空题是“每次迭代前是否需要重新打乱数据”这与SGD的性质有关。如果每个epoch都按同样的顺序训练模型可能会学到样本顺序带来的伪信息。所以补全的代码里应该包含shuffle的操作。这个考点不太显眼但能区分出你是只会调框架还是真的理解训练流程。4.3 代码题的输出规范与边界条件编程题除了算法本身输出格式也很重要。有的题要求函数返回特定结构有的题要求直接打印。当时第一道层序遍历题要求返回List[List[int]]我就直接在函数里返回了Python的list嵌套结构没问题。第二道题要求输出训练后的权重题目提示可以打印小数但没指定精度。稳妥起见我用了格式化输出保留4位小数。这种细节虽然不会扣大分但能体现工程素养。说到边界条件再提醒一个常见坑min-max归一化时如果某个特征的max等于min也就是常数特征分母为0。笔试里虽然没考这个但做填空题时如果代码里涉及归一化操作一定要记得加一个epsilon或者判断。这种细节在平时训练里不会出问题但在笔试环境下很容易被忽略。5. 时间分配与考场策略5.1 两个半小时的时间预算表我根据实际做题顺序和大约用时整理了一个参考时间分配大家可以做个对照单选题约15分钟先做正常情况下一分钟一题。多选题约15分钟这类题容易纠结单题可以多花一点但总时间要控住。推导题约60分钟这是整场笔试的重头建议留足时间宁可通过减少选择题检查时间也不要压缩推导题的书写时间。编程题约40分钟两题一难一易如果第一题卡了很久果断先做第二题。剩余时间约20分钟用来检查选择题有没有看错选项或者推导题有没有漏掉符号。这个时间表是我后来复盘时估计的实际上我在选择题部分比预计多花了5分钟导致推导题最后有一小问写得比较仓促。考场上一定要戴着“手表”——不是看手机笔试系统通常不让退出。提前心里有数才能不受外部干扰。5.2 做题顺序先守分再攻坚一个实用的做题顺序建议是“先做有把握的再做没把握的。”听起来是废话但很多人一进考场就按顺序往下写结果在一道偏题上耗了15分钟后面该拿分的基础题反而没时间写了。我当时是先做完全部选择题因为选择题再怎么纠结也就是一两分钟的事全部扫完一遍心里对整套卷子的难度就有数了。然后我跳到推导题先把SVM的推导框架写了因为这类题只要框架对即使最后结果算错步骤分也能拿不少。最后再回头做编程题。编程题如果在笔试系统里支持多次提交就先写一个朴素解法确保有分再慢慢优化。不要一上来就写最优解写错了连暴力分都拿不到。5.3 遇到不会的题目怎么办那场笔试我也有不会的题。有一道多选考了“以下哪些是核函数”选项里有一个是字符串核一个是图核。这两个我确实只在论文里见过不算常见核函数当时犹豫了很久。这种情况我建议第一直觉选“常见且确定正确”的拿不准的不要选因为多选少选还有部分分选错了可能整题清零。推导题如果某一小问卡住也别空着。把自己的思路写上去比如“这里我尝试用拉格朗日乘子法但到了某一步不确定怎么处理约束”。阅卷大概率是人工他们能看到你的思路即使没有完全推导出来也可能给一半分。我当时在概率题的一小问也是这样处理的最后成绩出来虽然没有特别高但整体影响不大。6. 常见问题与经验复盘6.1 考生常见丢分点我旁边一起考的同学出来时都在吐槽我把丢分点归纳成三类第一类公式记混了。比如把L1正则和L2正则的梯度更新形式写反或者把sigmoid的导数公式记错。这些都是可以靠考前默写来避免的强烈建议大家在笔试前一晚把常用公式默写一遍包括SVM对偶、LR梯度、Softmax交叉熵梯度、BN前向反向公式。第二类选择题想太多。有些题其实考的就是字面概念但有人总觉得出题人会在暗处挖坑结果把一个本来正确的选项排除了。印象最深的是那道“以下哪些操作可以防止过拟合”有人觉得“增大数据量”在现实中很难实现就不敢选实际上这题考的就是理论上可行的方法不应该从工程成本角度去否定它。第三类代码题没有考虑输入为空或维度为0的情况。基本功不扎实平时在Jupyter Notebook里跑得通到了笔试环境就暴露了。建议平时练习时多写防御性代码对输入数据做shape断言这对自己理解代码也很有帮助。6.2 复习方向与重点建议如果你现在准备的是商汤或同类AI公司研究员岗的笔试我建议复习时抓住这几个方向数学推导SVM、逻辑回归、朴素贝叶斯、EM算法、PCA的推导过程至少各推一遍。深度学习反向传播手推、常见激活函数/损失函数性质、BN和Dropout的原理与差异。机器学习基础偏差方差、正则化、交叉验证、类别不平衡处理、ROC与AUC。CV方向卷积计算、感受野、常见目标检测框架的流程不用太深但基本概念要清楚。编码能力二叉树、链表、动态规划入门题以及numpy实现简单模型的前向与反向。另外一个容易被忽略的点是“手写能力”。笔试的时候你在纸上或纯文本框里写代码没有IDE的自动补全和调试工具。现在开始练习手写在纸/文本编辑器上写完整代码而不是依赖IDE真的很重要。6.3 关于第一场笔试的后续流程通过笔试之后商汤的流程一般会进入面试环节。我当时是从笔试结束后大概一周收到了面试通知。面试里会继续追问题笔试里的一些推导内容比如面试官看了我的SVM推导就追问了核函数的选择依据和“为什么高斯核可以把数据映射到无穷维”。这说明笔试不是终点笔试暴露出来的薄弱点面试官很可能还会继续考察。所以如果你打算投递商汤这类公司笔试过程中凡是遇到自己不确定的知识点考完一定要回去补。笔试可以蒙混过关面试不行。这也是我后来给学弟学妹的建议笔试题目其实是一份非常精准的“考点地图”把上面的每个知识点都吃透你收获的远不止一次笔试通过而是对整个算法岗位核心能力的一次系统性补强。回到现实层面现在AI行业对研究员的考察重心可能和2018年有所变化更强调大模型、多模态训练等新方向但数学基础、模型理解和代码能力这些底层素质依然是所有技术面试绕不开的环节。希望这篇复盘能给你带来一些参考祝准备笔试的同学都能顺利进入心仪的公司。
返回列表