| layout | default |
|---|
记录从2025年上半年找实习以来的面试被拷打经历,有我自己的有同学的,按时间排序。
长大后,我要当面试官,狠狠拷打每一个人
transfromers和RNN, LSTM的区别
解释一下梯度爆炸和解决方法
BN和LN的区别
讲讲了解的激活函数
怎么识别 / 解决过拟合问题
XGBoost和随机森林的区别
一次KPI面,我投递的腾讯地图,不知道为什么分到了游戏。人生第一次面试,大败而归。
- 八股和论文:合在一起问的,看我论文上都是PPO,问PPO的原理,KL散度的作用,PPO截断原理,我的PPO如何实现的。
- 代码:没写代码,所以说是KPI
- 最后一个问题:你平时玩什么游戏啊,哦我们做的游戏可能和你不匹配,就这样吧,感谢你的时间。
先问项目和八股,八股里有两个没答好:
- 简要说明stacking和bagging的区别和联系
答案是bagging并行训练N个同构的分类器然后进行加权投票;Stacking算是bagging的升级,算法分为2层,第一层是用不同的算法形成T个弱分类器,同时产生一个与原数据集大小相同的新数据集,利用这个新数据集和一个新算法构成第二层的分类器。
- 补充:Boosting是另外一种集成学习方法,它是串行训练N个同构的分类器,每个分类器都在尝试修正前一个分类器的错误,具体为提高错误分类样本的权重,boosting的代表算法是Adaboost和Xgboost。
- 说说常见的torch里的优化器有哪些,他们的区别是什么 只说了一个adam,没说出来其他的,其实还有SGD,RMSprop,Adadelta,Adamax,Adagrad,AdamW,Momentum等等,他们的区别在于更新参数的方式不同。Adam是SGD的变种,它在SGD的基础上加入了动量和自适应学习率,Adam的优点是收敛速度快,但是可能会过拟合,所以在训练的时候需要调整学习率。
Stacking 就像是 Bagging的升级版,Bagging中的融合各个基础分类器是相同权重,而Stacking中则不同,Stacking中第二层学习的过程就是为了寻找合适的权重或者合适的组合方式。 周四阿里面试,除了八股和项目之外,问了如下四个问题:
- 在圆中随机取一个点,到圆心的距离的期望是多少?(贝特郎悖论)
解决方法:正常做法:记半径为r,取点到圆心的距离为随机变量X,那么X的分布函数$F(x)=P(X<=x)=x^2/r^2$,求导得到概率密度函数$f(x)=2x/r^2$,然后求期望$E(X)=\int_0^r2x^2/r^2dx=2r/3$。我回答:随机取点等于随机取一个角度和一个距离,这两个是独立的,所以是0.5r。经过提醒我算出了2/3r。 - 一个均匀的六面骰子,如何用它模拟一个均匀的七面骰子?
解决方法,投两次,去掉[6,6]的情况,剩余35种情况分配到7个面上。 - N盏灯,第一次开关全部打开,第二次每两盏灯关掉一盏,第三次每三盏灯开关一次,以此类推,第N次每N盏灯开关一次,问最后有多少盏灯是开着的?
解决方法:每盏灯的操作次数是它的因子个数,只有平方数的因子个数是奇数个,所以最后开着的灯是平方数的个数。 leetcode319. 灯泡开关 - 1,5,11元的银币进行支付,问支付n元有多少种方法?
解决方法:动态规划,这是leetcode322,零钱兑换问题。
class Solution:
def coinChange(self, coins: List[int], amount: int) -> int:
f = [0] + [inf] * amount
for x in coins:
for c in range(x, amount + 1):
f[c] = min(f[c], f[c - x] + 1)
ans = f[amount]
return ans if ans < inf else -1两道编程都没写出来,第一道找到了灯开关次数是因子个数,但是没想到是平方数,第二道一眼动态规划,被压力就写不出了。吃完饭看果然被挂。
- 拷打项目和八股,项目问论文做什么的,问华社实习。八股问:
- 回归和分类的损失函数都有什么,怎么保证不会过拟合?(这个比较常规,背诵即可)
- (又问)了解优化器吗?常见的优化器有哪些,区别是什么? (momenta,adam,SGD,区别是更新参数的方式不同,adam是SGD的变种,它在SGD的基础上加入了动量和自适应学习率,Adam的优点是收敛速度快,但是可能会过拟合,所以在训练的时候需要调整学习率。)
- 强化学习分哪两个大类?说说经典的Q学习中SARSA和q-learning区别? (都很基础,后来问大哥,他说他也不知道问啥,我简历写强化学习多,就问问吧)
- (又问)了不了解集成方法?基于树的集成方法?了不了解XGB和LightGBM?(重点问题,业务模型就是这个,需要经常看,当时临时突击直接吟唱的)
- 代码,HOT100,从二叉树的前序遍历和中序遍历重建二叉树。递归解了,也没写没开ide,说了一下思路
- 反问环节:招我进去干什么,做强化学习的派单。
主要是介绍项目,无八股无算法,对滴滴的经历拷打。
手撕sqrt(x),先用牛顿法实现,然后面试官说我的意思是二分写,然后二分实现
编程题
照明灯安装问题:给定一个整数数组表示一排位置,以及一个整数 k,表示要安装的照明灯数量。要求在这些位置上放置 k 个照明灯,使得任意两个照明灯之间的最小距离尽可能大,输出这个最大的最小距离。
黑白块路径问题:给定一个由 0 和 1 组成的二维网格,0 表示白色块,1 表示黑色块。从左上角 (0,0) 走到右下角 (n - 1, m - 1),每次只能向右或向下移动,求经过黑色块数量最少的路径中黑色块的数量。
小青蛙走迷宫:给定一个迷宫地图,用二维数组表示,其中 0 表示可通行的路径,1 表示障碍物。小青蛙位于迷宫的起点,要走到终点,求小青蛙能否走出迷宫,如果能,输出最短路径长度;如果不能,输出 - 11。
末尾 0 的个数:给定一个正整数 n,计算 n!(n 的阶乘)结果中末尾 0 的个数1。
数据结构题
实现一个函数,计算二叉树中某一层的节点个数。
给定一个整数数组,使用快速排序算法对其进行排序。
设计一个数据结构,实现对字符串的插入、查找和删除操作,要求时间复杂度尽可能低。
描述并实现 Dijkstra 算法,用于计算图中从一个顶点到其他所有顶点的最短路径。
概率
10 个人相互握手,每个人都与其他人握一遍,总共握手多少次?
A、B 打乒乓球五局三胜,A 赢得每局概率为 0.6,B 赢的概率为 0.4,A 已经赢了前 2 局,问 A 最终获胜的概率是多少?
有 12 个黑球和若干个白球,随机取球,数到 13 时取出的为白球的取法有多少种?
业务
假设你负责优化滴滴的某一地区的派单算法,你会从哪些方面入手?请详细阐述思路和可能用到的算法。
滴滴的订单数据中包含出发地、目的地、订单时间等信息,设计一个算法,根据历史订单数据预测某个区域在未来一段时间内的订单需求趋势。
考虑到滴滴司机和乘客的位置分布、车辆类型、路况等因素,设计一个算法来计算最优的拼车方案,以提高拼车成功率和乘客满意度。
- 手撕代码:判断对称二叉树, 二分法实现log(x)
- 滴滴出行项目拷打
- 八股拷打:过拟合怎么办,L1和L2区别
- 大模型拷打,说一下RLHF ,SFT, PPO, GRPO
- 手撕代码:找到字符串中所有的指定单词
- 滴滴出行项目拷打,单调网络如何实现的,单调网络
- 说一说transformer结构,自注意力机制,为什么注意力softmax(QK^T/sqrt(dk)),为什么要除以sqrt(dk)
- 说一说大模型了解吗,知不知道大模型微调,RLHF, SFT, PPO, GRPO,知不知道LoRA
- 反问环节:为什么这么多大模型,组里业务有吗? - 答:有的,你在滴滴的技术栈太老了,我们现在搜广推都是大模型了。
因为广告算法挂了,所以又投了智能营销。做因果推断相关
- 手撕代码: 找零钱问题,动态规划
- 项目拷打:滴滴出行项目
- 八股拷打:讲讲单调性网络如何实现的,dptimes指标和其他特征分开后,是否需要单独embedding(注意这里是个陷阱,其实是不要embedding,根本不是单独不单独的问题)
- 因果推断拷打:你参考了DESCN,说说DESCN的思路
- 40min戛然而止,后面发现挂了。
没怎么问强化学习和大模型,说明业务起步期,估计比较原始的模型就够了,面试官气色不好像大猛子,估计加班多。
- 手撕代码:10min,给定一个字符串,返回其全排列的个数。思考了一下套回溯的模板,无调试一遍过,过完发现好像可以数学解,n!/(n1!n2!...)
- 项目拷打:强化学习路径匹配,滴滴的单调网络如何实现,滴滴的autodis如何实现
- 项目拷打:关于DESCN的结构,说说DESCN的思路,DESCN中倾向性网络为什么可以学到倾向性分数,计算伪效应为什么$\mu_1$ 和$\mu_0$要一个加一个减?
- 项目拷打:为什么滴滴干了三个月又去下一家了: 答:量化给的太多。
- 反问:组内业务是什么? - 答:我也不知道,途虎招了算法工程师后根据业务需求再定。
没听说过的小厂,也不知道为什么我投递了,就当为第二天快手面试练练手。面试官不开摄像头
- 简历自我介绍,介绍三段实习。
- 拷打华设的实习,问为什么要用强化学习的方法,回答说因为数据稀疏有偏,监督学习不好做
- 拷打滴滴实习,为什么多任务网络需要用可变参数损失,如何设置可变参数损失,平衡两个子任务的损失?$loss = 1/(2*{a}^2)L_cr + 1/(2{b}^2)*L_ecr + log(a) +log(b)$
- 八股:过拟合怎么办,L1和L2区别, 这已经是第三次被问这个问题了
- 拷打量化实习,但是他好像不太了解,问了一下后没有反问。
- 八股:说一下PPO算法? PPO是在TRPO基础做了什么改进?(优化了计算流程,TRPO需要计算Hessian矩阵,PPO不需要)PPO中算KL散度的作用?(KL散度衡量新旧策略差异,限制新旧策略的变化幅度,防止策略更新过大)PPO截断原理?(通过限制概率比值在一定范围内,防止策略更新过大)PPO如何实现的?(clip方法和penalty方法)
- 八股:说一说transformer的ffn结构,为什么要有ffn,了解flash attn吗?(了解,flash attn是对标准attention的优化,减少内存占用和计算时间,提高计算效率)
- 了解LLM吗,什么是提示词工程?什么是上下文工程? 答:提示词工程是设计和优化输入给大模型的文本,以引导模型生成所需的输出。上下文工程是通过提供相关的背景信息,帮助模型更好地理解和生成内容。
- 反问环节:你们组的业务是什么? - 答:我们组主要做安全相关的业务,比如反欺诈,风控;现在也在做大模型垂直小领域微调和agent,可以赚到钱。
- 简单的自我介绍,拷打简历滴滴实习 - 发现一个问题,基本上互联网大厂只看滴滴这段实习经历,其他两段都不问
- 没有八股,直接手撕:只用numpy实现二分类神经网络,以及测试和训练流程,需要支持自定义激活函数,损失函数,L1,L2正则化,早断。总体代码量还是很大,偏工程化。梯度反向更新没写出来,L2没写出来,记录在下面:
import numpy as np
# gradient update,需要定义损失函数的梯度
def gradient_update(params, grads, learning_rate):
for i in range(len(params)):
params[i] -= learning_rate * grads[i]
# L2 regularization,写在loss中
def l2_regularization(params, lambda_):
l2_loss = 0
for param in params:
l2_loss += np.sum(param ** 2)
return lambda_ * l2_loss决策树、GBDT、XGBoost 等机器学习方法
L1、L2正则化、过拟合等讲解
transformer 的结构、传统(标准)的transformer有多少层
特征交叉: FM、Wide&Deep、DeepFM、DCN、SeNet 等
序列建模: DIN、DIEN、DISN、MIMN、SIM、ETA、TWIN 等
召回、粗排、精排主要的方法演进
大模型在搜广推上的应用、生成式推荐大模型
CTR、CVR 高低估问题
模型离线、线上收益不一致问题
推荐联合建模:ESMM、MMOE 等