岗位介绍
我是中科大在读硕士。投的是强化学习方向的实习。
说实话我的简历应该是被扔在在池子里。简历投了,过了三个月才来面试电话。
这个岗位肯定是调剂过后的,我只知道是offline-RL偏理论方向的,组内大方向不是强化学习的,但是有用强化学习进行智能决策的方向。
部门我就不具体说了。
据说以后工作的思路是:先用理论证明强化学习有好的性质,再用网络去近似tabular,争取在一些问题上有比较好的成绩,最后才是投入生产实践。
技术面 1.5h
不知道什么原因,直接是周五快下班的时间,mentor直接打电话和我约时间的(不是HR联系我的)。然后约了周一的面试。(事后得知面试只有一轮)
面试大概1.5h左右。介绍简历、概率论题目、强化学习基础(真的很基础,贝尔曼算子那个级别的)、代码coding(不是算法,而是手写一个梯度下降)。
介绍简历:主要就是项目经历。针对我强化学习的德州扑克项目问了一堆。
概率论题目:X~N(\miu, \sigma^2), 问 Y=2*X的概率分布,以及Y=X1+X2的概率分布。以及它们为什么会有区别。
强化学习基础:说出对贝尔曼算子的理解;说出对tabular和神经网络之间的异同的理解。感觉强调的都是自己的理解。
闲聊:问了一下凸优化、泛函有没有学过。我说没有学过,但是学过线性规划、矩阵分析等数学课且成绩都不错。
coding
说实话不难,没有很搞人,关注一下边界条件就ok。
给定函数f(x),定义在二维实数域[[a,c],[b,d]]这个长方形区域,定义域内是凸的。每次可以查询一个点,返回该点y值以及该点梯度,然后求出函数极小值点对应的x和y。
函数f(x)定义如下:
def f(x):
%% 一些不重要的步骤
return y,dy_dx
备注:因为f是定义在二维空间上的,这里dy_dx是一个向量
解决方法有很多,我交流了一下,决定用梯度下降的方式解决。
我个人总结的话,有这么几个注意点:
- 问题里面有一些条件是一开始没有说清楚的,要问了才能得到。比如收敛的判定条件有很多,选择哪一个(y值、x邻域、g的模长等)。
- 如果极值点在边缘,函数可以正确运行吗?
- 什么时候x会落在定义域之外?此时应该怎么办?
- 代码风格,函数,命名等。
- 对于代码可行性、正确性等的分析。
有这么几个我可能没有做的很好的点:
6. 我说完思路以后直接开始写,被面试官要求在纸上比划比划再写hhh。
7. x迭代是是往负梯度方向更新而不是梯度方向(这个真的是我忘记仔细考虑了)。
8. mentor说我的思路主要是在“算法”层面,而不是在“设计”层面。这个说实话我一开始也不是很懂啥意思,猜测是说我常常讲的都是细节,而不是整体的框架。然后越想说的越有道理,是我这次面试最大的收获。我放在本文最后讲。
写完以后稍微讨论了一下代码的内容。讨论完又开始闲聊,就是关于我的意愿、时间以及是否可以接受理论研究这类的了,我都表示没有问题以后,mentor就说OK了,“那我就提交上去了,以后实习期间我们还要磨合磨合”。
就凭这句话,我感觉我可以半场开香槟了。
总之面试圆满地结束了。面试结束后告知只有一轮面试,且mentor主动给了我微信,说基本没有问题,叫我等HR通知。
总结:整体感觉偏随意,题目也比较容易,而且开放式问题居多。
感觉面试官完全就是师兄,很不错hhh。
总结
面试最大的收获:我过多地注重了“术”的层面,应该多说一些“道”上的东西。这或许是初出茅庐的学生都会有的通病,因而我之前从未觉察这一点。想通了,去和导师们对比自己的言行,才深刻体会到确实存在这个问题。没有把宏观架构说明清楚,就急着往微观的算法上钻。
比如他问我项目内容,我不应该直接说项目具体的细节,我应该从更加宏观的层面来说明,比如问题设置、动作空间设计、算法宏观设计等。比如写代码,应该先有更加宏观的注意事项清单、伪代码逻辑,然后再去落笔完成内容。
以后向别人介绍自己内容的时候,要刻意地去重视“道”而不是“术”。