本文主要是介绍【面试】商汤研究院-游戏AI见习算法研究员面试总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 岗位介绍
- 一面,技术面,1h,8.10
- 二面,技术面,40min,8.16
- 总结
岗位介绍
直接贴JD吧。
面试用的是“小鱼易连”。这算是我硕士阶段第一次正式的面试。
面试前都有电话、短信通知,很贴心,反应也很快。
HR告诉我这是一个偏科研的岗位,但是一面二面的面试官告诉我,可能更多做的是技术落地。
一面,技术面,1h,8.10
问的很广(相比二面)。
首先自我介绍+聊项目。项目聊了一个最相关的,聊得非常非常细致。
聊到卷积,计算40 * 60的矩阵,经过kernel=5*5,padding=1,stride=2的卷积后的参数数量。
然后叫我用pytorch手写代码来验证我计算结果的正确性。
问我优化算子,我直接说Adam,然后给他讲了SGD等其它我知道的算子和特点。
然后聊到了BatchNormal,我说了一下作用,以及为什么强化学习用这个效果不好。
答完以后面试官嘴漂了,似乎说漏嘴,说我深度学习这块掌握的不错。
“看起来你深度学习这块学得不错,再来看看线性代数这方面”
然后是矩阵,求解3*3实对称矩阵的100次。
这个用特征值分解就行。
“如果实矩阵不对称呢?”
这个我不记得了。面试官告知用约当标准型后,我回忆起来了。
顺带一提,面试官还说用计算机的快速幂算法也是一种做法。
接下来是概率论。说实话我感觉这个甚至算不上概率题。
如何在单位圆内均匀采样1000个点。这个题目的“均匀”其实有点歧义。
我一开始理解成均匀采样是指采样成一个均匀的点阵,说了半天方法,结果面试官说我这个不是概率意义上的均匀。
后来才明白面试官的意思是,random(0,1),然后重复运行1000次。
那就有两种方法了,一种是拒绝法,在框住圆的正方形内采样,如果点不在圆内就将其抛弃;一种是将圆转化为(r,θ)的极坐标形式,θ使用均匀采样,而r则是在(0,1)内均匀采样后开根号(要开根号原因是rdr采样其实等价1/2dr2采样,具体为什么这么做就不证明了)。
算法题很简单,简单得不可思议。写代码求解x=cos(x)的数值解,精度小于0.001。第一反应是要考察我牛顿迭代。说实话这个牛顿迭代法就五年前用c语言写过一次,真没有把握能一次写对。
突然灵机一动说可以用中值定理+二分查找解决。
代码我没有保存。用递归的话不难。
我没有答好的地方在于我没有看出这个方程只有一个实数根(因为它单调)。所以我说我算法的缺点是找不出所有的实数根……
反问环节:
我如果顺利入职,工作内容偏科研还是偏落地。
偏应用落地。如果想发文章的话需要自己课外再做一些努力,计算资源很足。
介绍一下组里最近的项目。
面试官说了一些项目内容及大致完成的工作。
请吐槽一下在商汤工作的感受。
工作任务完成就行,对时长没有硬性要求,整体组间学习氛围还不错。
二面,技术面,40min,8.16
我本来以为会问一些强化学习的内容,结果完全没有提到。从我为什么选择做强化学习开始,就像闲聊一样。
甚至问我喜不喜欢打游戏,水平怎么样。(因为是游戏AI这个方向的嘛)
算法题做完后,直接问我能实习多久,为什么不再多实习一会儿……
感觉就像是关系户走流程一样……
算法题还是问了的,不难,4个状态的马尔可夫随机游走。
初始在中间两个状态,左右转移概率都是1/2。到最左边节点终止且reawrd为0,最右边节点终止且reward为1,其他情况则继续游走,
叫我说一下怎么求。
强化学习的话就是值迭代、MC算法,数学的话就是二元一次方程组。答案是1/3,2/3.
如果节点变成5个怎样快速求解……(1/4,2/4,3/4。面试官的意思好像是根据对称性,中间节点的价值一定是1/2,从而快速确定。)
算法题就是用蒙特卡洛算法,写一个agent和env来验证结果的正确性。
# 假设env,agent给定
# env.step(action)
# 返回值 state'(下一个状态),reward(回报函数),done(是否结束)
# agent.step(state)
# 返回值 action (agent内置策略生成动作)def solve(node_num = 3):result = np.zeros(node_num)result[node_num-1] = 1for episode in range(10000):state = env.reset()index = statedone = Falsesum = 0while not done:action = agent.step(state)state,reward,done = env.step(action)result[index] += reward/10000return result
这里面的思想就是随机玩10000场,然后各个位置的回报取均值。我这里面其实是有bug的,在最后reward/10000那里,被除的应该是该状态被随机到的次数而不是10000,不过面试官没有指出就放我过了。
反问环节:
上个环节问了项目,这个环节就问那些项目用到什么技术。
在强化学习算法层面,用的都是PPO、SAC这些老算法,工作中更多要思考的内容是reward的表征、游戏信息特征的提取等功能。
做侵入式AI比较多还是非侵入式AI比较多?
侵入式比较多。非侵入式也尝试过,不过后来就不做了。
怎么看待上述两者?
侵入式的AI特征提取困难,算力需求大。是未来的方向,但是现阶段不准备尝试。
总结
商汤面试到此为止了。之前本来是想等三面或者HR面之后再发,结果过了一个多月还没有结果。因为手头有了新的事情,还听说被拒会有感谢信,我也没去找HR确认。现在时间过了那么久,想起这茬事,就默认凉了。
总体来说面试官水平还是很不错的,在面试过程中我也学到了不少知识。今天偶然看到这篇文章堆在我的草稿箱,加上这最后一段总结,我也就发出来了。希望可以作为大家的参考。
这篇关于【面试】商汤研究院-游戏AI见习算法研究员面试总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!