ARTICLE DETAIL

资讯详情

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

AI工程师校招笔试真题复盘:迅雷B卷考点与解题思路

AI工程师校招笔试真题复盘:迅雷B卷考点与解题思路 我还记得2018年那个秋天的下午收到迅雷的在线笔试通知投的是AI工程师岗点开之后是“校园招聘AI工程师在线笔试B卷”。当时周围同学都在讨论各大厂的笔试题反而像迅雷这种以下载、CDN为核心业务的公司笔试内容一直有点神秘。真正做下来才发现这张卷子的出题风格非常“务实”数学底子比想象中考得重机器学习经典算法占了大头最后的综合题还真的贴合了迅雷自己的业务场景。这篇文章我结合当时多位参加笔试的同学回忆把B卷的模块、典型考点和一些解题思路做一次完整复盘给正在准备AI工程师校招的读者一个参考。虽然过去几年但这类笔试的底层逻辑其实没怎么变基础概念、数学推导、算法编程、业务思维依然是核心。1. 先看清这卷子到底在考什么B卷的模块组成与命题逻辑1.1 模块占比和时间分配2018年的在线笔试大多采用牛客网或者赛码网的系统迅雷这张B卷也是在线上完成总时长我记得是90分钟题量不算小。根据大家考后拼凑的信息整张卷子大致分为四块选择题单选加多选覆盖机器学习、深度学习、数据结构和操作系统单题分值不高但数量多很耗时间。数学基础题以填空和简答为主行列式计算、特征值、条件概率、最大似然估计都出现过。编程题通常一到两道要求用Python、C或Java在线编写环境没有本地IDE的补全提示写完直接编译运行。综合题给一个业务场景让你设计AI解决方案一般没有唯一标准答案主要看分析框架和落地细节。从时间分配上看最容易翻车的其实是前面选择题。很多同学为了求稳在单选多选上反复纠结等最后看到编程题的时候只剩二十分钟结果编程题只写了一部分。我的建议是先把整张卷子扫一遍优先做自己最有把握的题数学和编程的大分值题目一定要留足时间。在线笔试不像平时练习你可以先跳过题目但系统倒计时不会等你。1.2 迅雷的AI岗为什么这样出题迅雷的核心业务是下载加速、CDN分发和视频相关的服务AI部门需要解决的不是单纯刷榜的CV任务而是实实在在的工程问题做下载内容推荐、识别违规资源、优化节点调度、预测带宽波动。这些业务场景决定了笔试的出题取向——不会考特别偏门的前沿论文但会把机器学习基础、数学功底和工程思维放在很高的优先级。2018年那会儿深度学习框架已经很好上手很多候选人简历里写“熟练使用TensorFlow”但一旦闭卷考反向传播推导、特征值计算马上就露馅。所以B卷的命题逻辑很清晰框架和工具可以速成数学和经典模型不行。换句话说这张卷子想筛选的是那些即使换一个框架也能快速上手且能理解模型内部发生了什么的人。这个筛选标准放到今天同样成立甚至更关键。现在各种自动机器学习工具越来越成熟反而更需要候选人理解模型原理和业务场景之间的匹配关系而不是只会调用现成函数。2. 数学与机器学习基础那些不看容易翻车的送分题2.1 线性代数与概率题本质是看清计算的底层逻辑数学题在B卷里占比不低但考的并不偏。线性代数比较高频的是矩阵特征值和特征向量。表面上是计算题实际上是在引导你理解特征向量表示矩阵线性变换后方向不变的向量特征值表示这个方向的缩放倍数。为什么要考这个因为PCA降维、LDA降维、谱聚类全都建立在特征分解的基础上甚至在推荐系统的矩阵分解里也离不开这个思想。考试时如果只背公式题目稍微换一个问法比如“为什么协方差矩阵的最小特征值对应的特征向量是主方向之一”就容易懵。建议复习时把特征值、特征向量、矩阵乘法、矩阵求导这几个点放在一起打通。矩阵求导在机器学习里是绕不开的比如最小二乘法损失函数对参数求导求导结果等于0能得到闭式解。这种题只要把矩阵导数的基本法则写清楚基本就是送分。概率题常考条件概率、贝叶斯公式、最大似然估计。我记得B卷有一道题类似朴素贝叶斯分类器中的先验概率估计给定一组已标注的样本估算某个类别的先验概率和条件概率。这道题其实不是考你会不会用朴素贝叶斯而是考你知不知道“先验概率”和“后验概率”的含义和差别。这里有一个笔试常见的坑贝叶斯公式里分子是“先验概率乘以似然”分母是“全概率”。不少同学会把先验概率和后验概率搞混。一个简单的记忆方法是先验是看到数据之前你对某个类别的信任程度后验是观察到数据之后修正过的信任程度。朴素贝叶斯之所以“朴素”是因为它假设特征之间条件独立这个假设让概率计算变得可行代价是可能丢失特征之间的相关性信息。在下载场景里判断一个资源是不是用户想要的文件名、文件大小、下载速度这些特征之间其实并不完全独立但为了计算方便朴素贝叶斯仍然是一个有效的baseline。2.2 LR、SVM、GBDT出现频率最高2018年机器学习经典模型的出镜率前三名基本就是逻辑回归、支持向量机和梯度提升树。笔试不要求你训练一个高精度模型但一定会考原理。高频问题有这几个为什么LR用交叉熵做损失函数而不用均方误差因为在线性回归里均方误差配合线性模型可以解析求解但在逻辑回归里模型输出经过了sigmoid变换如果继续用均方误差损失函数关于参数是非凸的梯度下降容易陷入局部最优。而交叉熵是一个凸函数优化过程更稳定同时交叉熵对应的是概率分布的KL散度和LR的统计解释一脉相承。这个理由要能写清楚不能只说“常规操作”。SVM的核函数是怎么起作用的SVM的目标是寻找最大间隔超平面。原始样本在低维空间可能线性不可分通过核函数把样本映射到高维空间再找超平面。这里的K(x,z)φ(x)·φ(z)核函数可以隐式计算高维空间的内积避免显式构造高维特征。常见的核有线性核、多项式核、RBF径向基核。RBF对应无限维映射所以是默认的热门选择但也容易过拟合需要调好参数C和gamma。GBDT和随机森林的区别是什么两者都是树模型的集成但逻辑完全不同。随机森林是Bagging每棵树独立抽样训练最后投票或平均目的是降低方差。GBDT是Boosting每一棵树都在拟合前一棵树的负梯度残差目的是降低偏差。这个区别在面试里几乎必问笔试也喜欢用多选题来考。比如问“下列哪些属于Boosting方法”选项里混进随机森林和GBDT。2.3 评估指标的弯弯绕B卷的选择题里几乎必有一道评估指标题最常见的是给一个混淆矩阵让我算精确率、召回率、F1值。公式本身不难精确率 Precision TP / (TP FP)召回率 Recall TP / (TP FN)F1 2 * Precision * Recall / (Precision Recall)。但笔试不只是考公式更爱考“在什么场景下更看重哪个指标”。比如在迅雷的违规资源识别里违规样本可能只占全部资源的1%如果全部判为正常准确率有99%但这个模型没有任何意义。这时要更关注召回率希望把违规资源尽可能抓出来宁可误报一部分正常内容也不能放跑违规资源。这种业务场景型考点比单纯的公式计算更能拉开差距。另一个高频考点是AUC。AUC表示随机抽一个正样本和一个负样本正样本得分大于负样本得分的概率。它的一大优势是对样本类别不平衡不敏感所以很多推荐和风控场景都用AUC评估。考试时一般不会让手算真实数据集的AUC但会问它的取值范围和含义。AUC等于0.5说明模型没有区分能力等于1是完美模型实际中0.85以上已经算不错。3. 深度学习考点复盘反向传播与网络设计3.1 从softmax到交叉熵一道热门推导题2018年深度学习笔试最常出现的要求就是推导softmax交叉熵的梯度。B卷里我记得有一道简答题让写出多分类交叉熵损失下的参数更新公式。这类题看起来吓人实际推导起来有很强的规律性。假设网络输出的最后一个全连接层是 logits z经过softmax得到预测概率 p_j exp(z_j) / Σ_k exp(z_k)真实标签是one-hot向量 yy_i1表示属于第i类交叉熵损失 L -Σ_j y_j log p_j。我们需要求 ∂L/∂z_i。拆开看当 j i 时p_j 既在分子又有分母当 j ≠ i 时只有分母里有 exp(z_i)。分情况求导之后最后得到的梯度形式非常简洁∂L/∂z_i p_i - y_i。也就是说softmax和交叉熵配合梯度直接就是预测概率减去真实标签。这个结果不只是笔试里展示计算能力在代码层面也解释了为什么在现代深度学习框架里只需要把 logits 传入一个组合损失函数不用手动算反向传播。我看到不少同学在备考的时候只记住了“梯度等于预测减真实”这个结论但没有自己推一遍所以一旦题目要求写出推导过程就卡壳。那种感觉很难受明明知道答案但写不出中间几步。建议现在备考的朋友把链式法则的每一步都写熟练从z到p再从p到L拆成两种情况最后合并整个过程十分钟就能完成。3.2 手算感受野和参数量的例子B卷里有一类题非常实在给定一个卷积神经网络的结构让计算某一层输出的尺寸、参数量和感受野。这种题只要记住公式就不难但在笔试环境里容易因为紧张算错尤其是层数一多很多人会绕晕。常见的输出尺寸公式是n_out floor((n_in 2p - k) / s) 1其中k是卷积核大小p是paddings是stride。比如输入是224×224×3卷积层用3×3卷积核、padding1、stride1则输出尺寸就是 (224 2 - 3)/1 1 224保持不变。如果是stride2那输出就是112。这种计算在笔试里是实打实的分但很多人在padding和stride上容易混淆建议自己列一张小表反复练。感受野的计算稍微绕一点。从最深层往浅层回溯核心公式RF_l RF_{l1} (k_l - 1) * stride_accumulated其中stride_accumulated是当前层之后所有stride的乘积。简单来说感受野不是简单的卷积核大小相加而是受层数和步长影响的。这类题当年考得不多但面试时偶尔也会问提前理解原理总没错。参数量的计算更简单卷积核权重加偏置。一个输入通道为C_in、输出通道为C_out、卷积核大小为k×k的卷积层参数量是C_out * (C_in * k * k 1)。比如3×3卷积输入256通道输出512通道参数量就是512 * (256*9 1)约117万。笔试出现这种题本质上就是考你有没有真正搭过网络而不只是看论文。3.3 当年的框架题不会写TensorFlow也没事2018年的时候TensorFlow还是主流PyTorch正在快速起来但B卷里直接让写框架代码的题很少。相比框架API考官更想考训练环节里那些“看不见摸不着”的经验问题。有一种典型题是给出一条训练曲线问如何处理。比如loss前期快速下降但到某一步之后震荡不收敛可能原因包括学习率太大、batch size太小、数据打乱不充分。相反训练集准确率持续上升但验证集准确率停滞就是过拟合的典型信号手段无非是降低模型复杂度、加正则、加dropout、做数据增强、早停。这些内容教科书上都会写但笔试不会直接问“什么是过拟合”而是会包装成一个场景看你是否真的理解怎么做。比如“训练一个图片分类器训练集准确率98%测试集准确率87%请说出至少三种改进方案”这种题拿到手一定要分条写清楚而不是只写“数据增强”四个字。框架题还会考对常用优化器的理解比如Adam和SGD的区别。Adam自适应调整每个参数的学习率训练前期收敛快但某些情况下泛化性能可能不如调好学习率周期的SGD所以不少实际项目会用SGD余弦退火做微调。笔试阶段不会要求你写出Adam的完整公式但至少要知道m和v两个动量是怎么更新的。4. 编程题实战在线问答里的算法与边界处理4.1 典型题目字符串压缩/展开B卷编程题虽然量不大但非常讲究边界情况。我记得一道常见的题目是字符串压缩如果字符串中出现连续相同的字符就把它们压缩成“字符出现次数”的格式比如“aaabbc”压缩成“a3b2c1”如果压缩后字符串没有变短则返回原字符串。这道题放在平时很简单但在线笔试里很容易漏掉几类用例空字符串、全部是同一个字符、字符连续出现了两位数以上的次数。下面给一个Python实现可以直接在在线环境里跑通def compress(s: str) - str: if not s: return res [] count 1 for i in range(1, len(s)): if s[i] s[i-1]: count 1 else: res.append(s[i-1] str(count)) count 1 res.append(s[-1] str(count)) compressed .join(res) return compressed if len(compressed) len(s) else s这个写法每个字符后面都带一个次数哪怕次数是1也会带上。所以“aabbcc”会变成“a2b2c2”长度是6和原串一样按照题目要求返回原串。这种细节很值得注意判断返回条件不能漏否则两个用例都过不了。在线笔试的编程题代码格式要求也很严格。函数名、缩进、主函数入口都要在规定的地方写。有些人喜欢在本地IDE里写好再粘贴结果忘记把keyboard input的代码注释掉导致线上运行时卡住白白丢分。4.2 动态规划跳台阶的变形动态规划也是编程题常客B卷里出现过一个“机器人寻路”的变形题一个m行n列的网格机器人从左上角走到右下角每次只能向下或向右走但有些格子有障碍物不能进入问有多少条不同的路径。这类题的思路是定义dp[i][j]表示走到第i行第j列的路径数量。状态转移方程如下def unique_paths_with_obstacles(grid) - int: if not grid or not grid[0] or grid[0][0] 1: return 0 m, n len(grid), len(grid[0]) dp [[0] * n for _ in range(m)] dp[0][0] 1 for i in range(m): for j in range(n): if grid[i][j] 1: dp[i][j] 0 continue if i 0: dp[i][j] dp[i-1][j] if j 0: dp[i][j] dp[i][j-1] return dp[m-1][n-1]边界条件非常关键第一行和第一列只要中间某个格子是障碍物后面的路径就不通了起点本身是障碍物时路径数直接为0。很多同学在纸上写逻辑是对的但一敲成代码就忘了初始化dp[0][0]导致结果全是0。这类题要多练到不经思考就能写出框架才能给后面的综合题留出时间。4.3 在线笔试的输入输出陷阱在线笔试环境里最栽跟头的不是算法本身而是输入输出。很多公司用的平台不是LeetCode那种函数封装式而是要求自己写完整程序从标准输入读数据再把结果打印出来。有的同学在本地写了很漂亮的函数但不会处理输入直接0分。常见的模板是import sys def main(): data sys.stdin.read().strip().split() # 根据题意解析 n int(data[0]) arr list(map(int, data[1:1n])) print(solution(arr)) if __name__ __main__: main()如果题目可能有多组输入就使用 while True 循环加 try-except 处理EOFimport sys for line in sys.stdin: line line.strip() if not line: continue # 处理每一行这里有个血泪教训有的平台要求输出末尾不能有多余空格但print默认会换行只要print一个结果没问题如果要求输出一行空格分隔的数组用 .join(map(str, res))更安全而不是一边遍历一边print否则末尾多一个空格也会报格式错误。在线笔试看不到“格式错误”这种细节往往只会告诉你“通过率0%”很多人就在这种地方浪费了大量时间。5. 综合题AI怎么在迅雷的业务场景里落地5.1 内容推荐从下载行为挖掘用户偏好B卷的综合题基本是开放式的给一段业务描述让你设计方案。迅雷天然和下载行为强相关所以内容推荐是一个非常顺理成章的场景。题目可能这么出假设我们要为迅雷用户推荐可能感兴趣的下载资源用户有历史下载记录、搜索关键词、资源停留时间、下载完成率等行为数据。请设计一个推荐系统的整体方案包括特征、模型、评估方式。这类题考的不是模型结构多先进而是逻辑是否完整。我一般会分四步回答明确目标根据历史行为预测用户对资源的点击率或者下载概率。特征工程用户侧特征如历史下载类目分布、下载时长偏好、活跃时间段资源侧特征如资源类目、文件大小、上传者信誉、资源热度交叉特征如用户历史下载过的类目与当前资源类目的匹配度。模型选择线下用GBDT或逻辑回归做CTR预估。逻辑回归可解释性强适合上线初期的baselineGBDT能处理非线性关系效果通常更好。评估与迭代离线用AUC、GAUC线上做AB实验。如果推荐列表的点击率提升显著再逐步放量。5.2 智能调度预测下载速度与分发优化迅雷做CDN和P2P加速核心是资源分发。2018年的B卷里有一道综合题我们几个同学考完交流后发现大家的理解差异很大但得分高的回答都有共性先拆问题再给方案。题目大意是下载高峰时段部分节点带宽被打满用户下载速度下降如何用AI手段优化调度并说明数据来源和效果评估方式。我当时给出的思路是把这个问题建模成带宽预测和节点调度联合优化问题。数据来源包括节点历史带宽、资源热度、用户地理位置分布、每日不同时段的流量曲线。模型可以先做一个回归模型预测未来短时间窗口内各个节点的带宽压力预测结果用于提前把热点资源预热到边缘节点或者把用户请求调度到负载较低的节点。评估方式不能只看预测误差还要看调度之后的业务指标用户平均下载速度、节点带宽利用率、P2P命中率、卡顿率。这个题目比较考验工程思维因为市面上很多算法题只考模型精度但这里的难点是线上系统里模型预测之后如何做决策以及预测错了怎么兜底。提到“兜底”是加分项比如当预测模型失效、节点异常挂掉时应该有一个规则引擎或队列保护机制。5.3 内容安全识别垃圾资源和安全问题迅雷平台上每天会新增大量下载资源其中不可避免有违规内容、盗版资源、捆绑恶意软件的文件。综合题考这部分是想看候选人能不能结合计算机视觉、文本挖掘和文件静态分析等多种手段设计一个自动化识别方案。方案可以从三层来写第一层基于规则和文件特征的过滤。比如文件名包含特定关键词、文件大小异常、压缩包中含可执行文件等先并行过滤掉一批明显违规的样本。第二层基于内容分析的分类模型。如果资源是图片或视频文件可以用预训练的图像分类模型识别其中的违规内容如果是文本可以用文本分类模型判断标题和描述是否违规。第三层用户反馈闭环。举报和下载完成率可以作为信号回流到模型训练集不断更新分类器。这题还有个隐藏考点负样本太少。违规样本可能只占全量资源的极小比例所以需要用数据增强、半监督学习、或者引入人工复核后的数据来扩充负样本。评估指标上要关注召回率也就是尽可能把违规内容拦截下来即使牺牲一定的误报率。综合题如果能把这些问题点出来面试官会觉得你确实想过落地而不是只会背模型。6. 复盘与备考清单从这场笔试延伸到AI工程师面试6.1 知识点排查清单笔试结束后我习惯把做过的题按知识点整理成一个清单不确定的地方全部标红然后集中突破。这里把B卷涉及的考点整理成表格大家可以对照自查模块高频考点优先级数学基础特征值特征向量、矩阵求导、贝叶斯公式、最大似然估计高机器学习逻辑回归、SVM、决策树/GBDT、朴素贝叶斯、过拟合、评估指标高深度学习反向传播、交叉熵梯度、卷积输出尺寸、感受野、训练策略高数据结构与算法字符串处理、动态规划、二分查找、常见排序中高业务场景推荐系统、内容安全、调度优化、AB实验设计中语言与工程Python输入输出、常用库、代码规范中如果复习时间有限建议优先保证前两模块。因为编程题和综合题可以靠临场分析但数学和机器学习选择题如果不熟练很容易被“多选多选、少选不得分”这种规则坑掉。6.2 时间分配的教训在线笔试的倒计时带来的压迫感比想象中强很多。B卷整体的题量设计正常情况下很难所有题目都完美作答。我当时先做数学填空再做大分值的编程题最后赶选择题结果选择题里有几道多选来不及细想只能凭感觉选。后来复盘发现如果一开始先快速判断每道题的值不值得做情况会好很多。一个比较稳妥的策略是拿到卷子后花两分钟浏览所有题目给题目打上“稳拿分”“需要时间”“随缘”三个标签。优先把稳拿分的题做完再做需要时间题目最后有时间再回去抠那些模棱两可的选择题。编程题如果思路清楚但代码写一半至少要保证核心逻辑写出来哪怕边界条件没覆盖完整判题时也能得一部分分总比完全空白强。6.3 笔试之后还有一面怎么接很多人以为笔试提交之后就万事大吉其实有些公司的一面面试官会直接针对笔试试卷提问。比如“你当时这道题选了B为什么没选C”如果笔试时只是蒙的面试就有可能露馅。所以每次笔试结束后趁记忆还热尽量把题目和你的答案复现出来。我当时专门建了一个文档记录每场笔试的复盘一道题一道题地重新推演过程不会的题赶紧查资料弄懂。很多知识点在后面的面试中被反复问到这些复盘成了最有效的面试弹药。还有一种常见情况笔试时编程题没写出来但面试时面试官可能会换一个类似的题目让你现场写。如果你笔试结束后真的理解了那道题现场写出来会非常加分。反面情况是笔试结束就不再管面试时遇到同类型题继续卡壳这就很可惜。根据我个人经验2018年迅雷这次笔试给我的最大价值不是拿到offer而是让我重新校准了AI工程师的能力坐标系。那些框架和工具都是表层数学基础、经典模型理解和业务推导能力才是校招笔试真正会层层筛选的东西。每次笔试后我都把错题和卡住的知识点整理成册后来发现不同公司的题目虽然形式不同核心考点却高度重合。如果你现在也在准备AI工程师的校招笔试不妨把线性代数、概率论、机器学习的经典模型好好过一遍每天练一两道编程题找几套不同公司的真题掐时间模拟这个过程省不了。基础打牢了后面面试也会顺很多。
返回列表