一面

2022.03.30 晚 19:00

自我介绍

上来先做算法题:(拼多多的编辑器只能面试官点运行)

  1. 给定一个序列,长为 n,移动其中的元素(每个点可以移动到任意位置),使得变为升序序列。求最少移动次数
  • 示例:序列 2, 1, 1,最少需移动一次,即把 2 移动到序列最后面
  • 解答:我想的是求最大升序序列的长度 m,然后 n - m 就是最少移动次数。但是面试官问为什么这样就是最少的移动次数,想了会没想出来,面试官让先写代码。求最长升序序列长度,用动态规划做([中等] 300. 最长递增子序列
  • 做完了,给面试官解释了下写的代码,应该没啥问题,然后面试官说做的很快,那再来一道。。。
  1. [中等] 253. 会议室 II,hot 100 唯一一道会员题。。。
  • 面试官貌似没看懂我的做法,让我解释后还是有点疑惑,但是试了几组样例没问题就过了

问简历:

  1. 实习的业务场景、目标
  • 介绍了下实习做的第一个任务
  1. 为什么要重训打平?
  2. 样本数?
  3. 整体的模型结构?
  • MTL,底部是 share-bottom(包含几个结构)
  1. 用的损失函数?
  2. 多任务是哪些任务?
  3. 所以原来基线模型可能是过拟合了?
  4. 哪些特征比较重要
  5. 介绍第二个任务,关于 MTL 模型结构的优化
  • share bottom->MMOE->PLE->实习时用的结构

反问环节:

  1. 那边都做什么工作,实习生都做什么?
  • 交叉面,实际过去可能不是他那边的部门,他做的是比价的算法,不是推荐的
  1. 转正机制和时间节点
  • 具体要问 hr 更合适
  1. 面试结果什么时候能通知
  • 联系 hr

二面

2022.04.13 晚 20:00。面麻了,问啥啥不会,而且面试官态度很差很不耐烦,你说的东西他都不太耐烦听,然后要么拖着脸眯着眼睡觉,要么手里玩着玩具,要么玩手机。。。。。。

一、自我介绍

二、项目

  1. 介绍一下实习的工作
  2. 特征交叉项的选择是怎么做的?
  3. 为什么特征 embedding L2 范数的大小能代表重要性,越大的对 Loss 的影响不一定更大吧,比如先乘上一个系数后续再归一化……
  4. 其他特征选择方法?
  • 讲了下 NAS 的做法
  1. 多任务优化这个每个任务私有的这部分会不会出现过拟合呢?因为多任务就是有的任务的数据量比较少
  • 应该输入的还是所有任务的样本,并且私有部分参数增加量也不多

三、场景题

  1. 如果离线 AUC 提升,但是上线后没效果,可能有什么原因?
    1. 可以看一下 GAUC
    2. 也可能是离线存在过拟合现象——面试官说离线也是在测试集上的结果有提升,所以不应该是过拟合
    3. 可能线上和线下分布存在差异——怎么证实是数据分布存在差异
  2. 假设你在调研一个想法,给基线模型加了一个子结构(本来预期应该是有效果的),但是实际 AUC 没涨,可能有什么原因,怎么分析?或者怎么调参 or 改动让它可能变得有效果?
    1. 可以关注一下其它指标,比如 GAUC 是否有增长
    2. 确认一下加的结构的代码有没有问题——怎么判断代码是否有问题呢
  3. 接上面的问题,给一个具体的场景,比如说 CTR 预估的模型,原本是将候选物品对历史点击序列的各个物品的名称词汇做一个相似性,现在改为用 attention 求相似性,但是没效果,怎么分析
    1. 可以查看各个历史点击物品的 attention 权重是否符合预期,比如说确实很相关的物品但权重并不高,和实际不匹配——那不匹配可能的原因是什么?不匹配就一定不好吗?
  4. 召回是要从大量的候选物品中召回可能的候选集,存在特别大量的负样本,召回存在巨大 softmax 问题,应该怎么解决?
  1. BERT 了解吧?
  2. 上线如果遇到性能超时,怎么分析解决

四、算法题

  1. Mix up 数组增强方法,大概方法如下,就是对于一个样本 k,从所有样本中随机选择一个样本 idx,将这两个样本的特征进行随机融合,得到新的样本 ```cpp struct Sample { // 样本 vector features; // 特征 int label; // 标签 };

// 对于样本 k,从所有样本中随机选择第 idx 个样本和样本 k 进行融合,得到新的样本 Sample mixUp(vector data, int k, double ratio) { Sample sample1 = data[k]; int idx = rand() % data.size(); Sample sample2 = data[idx]; Sample newSample; for(int i = 0; i < sample1.features.size(); ++i) { if(随机几率小于 ratio) newSample.features[i] = sample2.features[i]; else newSample.features[i] = sample1.features[i]; }

  1. return newSample;

}

  1. - 但是,数据量很大,给你的是数据流,只提供了两个接口,即,取下一个样本 `next()` 和判断数据流是否还存在下一个样本 `hasNext()` 这两个函数,要求对每个样本,都随机选择一个样本进行融合,怎么尽可能地做到和上面给定所有样本一样的随机性呢?可以用数组保存一定数量的样本
  2. ```cpp
  3. class Stream {
  4. Sample next();
  5. bool hasNext();
  6. }
  7. // 输入一个数据流,返回 mixUp 后的数据流
  8. Stream* mixUp(Stream* in, double ratio)
  9. {
  10. /* write your code */
  11. }
  • 解法:我的想法是,设置一个数组(比如 len=100),先用样本填充满这个数组,然后遍历数组,假设当前遍历到 i,那么
    • 样本 i 有概率 p ,从数组中随机挑选一个样本 sample2,进行融合,然后从数据流中取下一个样本填充数组地位置 i
    • 否则,跳过样本 i,等下一轮循环,再来判断要不要对样本 i 进行融合
  • 面试官问:你这个概率 p 是固定的,那么样本 i 还是最有可能和当前数组中的某个样本混合,因为越往后概率累乘就会越小?
  • 解法:从数据流中随机选取一个样本

三面(技术主管面)

2022.4.18 下午 14:00。二面面的稀烂,结果竟然还是约了三面,三面就问了问项目,问的也比较简单,没咋深入,也没做算法题,就半个钟头

一、自我介绍

二、项目经历

  1. 你在字节实习了挺久的呀,为什么没有继续在那里实习呢?
  2. 是可以来上海实习吗?
  3. 介绍一些你实习的工作
  • 介绍了实习做的第一项工作
  1. 原本基线的参数量多大呀?
  2. 特征选择怎么分析选择哪些特征?
  3. 如果要删的更多呢,怎么确定删多少效果最好呢?
  • NAS 选择的就是最优的结构,选择的结果是确定的(包括阈值的设定也是选择相似度最高的,也是确定的)
  1. 那有没有办法让模型变得更小,如果能接受一部分性能损失
  • 如果还是做特征选择,可能不是很好做,因为已经是 emb size 级别的选择了(或者可以将维度小的特征去掉)
  • 可以压缩参数精度,比如变为 INT8
  1. 实验室有什么项目吗?
  • 天池的这个比赛
  1. 有多少参赛队伍?是组队参加的吗?做了多长时间?
  2. 介绍一下这个比赛做的是什么?
  3. 这个类别人眼能区分吗?人眼都不能区分那怎么分?
  • 专家标的
  1. 数据增强都做了哪些操作?
  2. 投票机制融合的哪些模型的结果?投票具体怎么做的?
  3. 如果三个模型分别预测为 A、B、C 怎么处理呢?这种情况多吗?
  4. 用投票和不用指标差别大吗?

  5. 你对实习工作方向有什么想法吗?是还想继续做推荐这块还是换个新的方向?

  • 反问了下面试官那边做的工作,那边是做商品同款识别,通过图像、NLP 等算法识别同款
  • 面试官说拼多多这边招聘是不确定具体方向的,当然大概率还是去面试官的组,但是也有比较小的几率去别的方向的组。如果坚定的就像做某个方向,可以备注,看 hr 怎么处理

三、反问环节:

  1. 实习转正机制/要求/时间节点?
  • 50% 以上的转正率,转正时间应该在秋招校园招聘开始前,看实习表现、产出等
  1. 面试结果多久能反馈?
  • 技术面三轮就结束了,他会在 2h 内提交面试结果,但后面是 hr 处理,hr 人比较少,处理的时间可能会长一些

HR 面

2022.04.22 晚 19:00,聊了几分钟拒掉了

  1. 你现在在北京,毕业之后会考虑来上海工作吗?
  2. 父母现在在做什么工作,有没有从事电商相关的?
  3. 这次为什么会投拼多多?
  4. 岗位方向这块?
  5. 最近找实习进展怎么样?
  6. 在这写实习 offer 里选择你会怎么选呢?
  • 考虑到上海的疫情,我可能暑期就不去拼多多了
  • 然后就结束了。。。。。。