字节提2023届提前批算法岗一面面经

博主分享了一次算法岗位的面试经历,包括自我介绍、项目讨论和Python基础知识问答。面试涉及SVD原理、LGBM模型、注意力机制、Python语法等,最后进行了手写代码环节,包括sigmoid函数及其导数、求和为k的最长子序列问题。博主在面试过程中发现一些基础知识掌握不够扎实,并表示面试官对其无实习经验表达了轻微不满。
摘要由CSDN通过智能技术生成

通过内推投递,约了7月20号下午3点一面,算法岗。简单复盘一下一面内容

        首先是自我介绍,简单介绍了一下学校背景,项目和科研背景,一句话概括了一下个人性格,over。

        接下来是根据简历针对项目的提问环节。面试官让我介绍项目当中遇到的挑战和解决方案。我就挑了梧桐杯的算法赛介绍一下特征构造的难点和思路。面试官接着根据我提到的技术追问细节,细锁如下:

1、为什么用SVD做降维?SVD的原理是什么?SVD的加速运算有哪些?(因为我嘴欠说现在的SVD算法底层都有加速运算的实现。。)

答:首先我们只了解PCA和SVD,其次SVD有底层加速,所以为了节约时间就用了SVD。SVD主要是为了解决非方阵无法求逆的问题,用A\times A^TA^T\times A的特征向量来构造左/右乘矩阵的。这里面试官又追问了为什么大多数方法矩阵分解时都要求得到一个半正定的矩阵,我就扯了一下因为半正定矩阵保证变换的方向是一致的,拿二次函数的系数矩阵举了个例子。。(以前看过类似的解释,但是实在忘了)SVD的加速运算我直接说没了解过,只是知道有这个事实

2、既然分类器用了LGBM,那解释一下树模型是怎么处理类型特征的?

答:(其实我复习的时候直接把这个知识点跳过了,只能瞎掰)常规模型是把类型特征进行one-hot编码,这样很容易让模型过拟合到没意义的特征。以国籍为例,假设cart树每次按照是否是某国国籍的人为分类结点,模型很容易把样本分类成(不是中国人,不是美国人,不是日本人,不是韩国人)这样的类别,但是我们依旧不知道这个人到底是哪国人。LGBM针对这一点做了优化,但具体怎么优化的我忘了。。。

3、有没有针对数据集分布不均衡做出优化?树模型能解决数据不均衡吗?

答:这个比赛中没有,因为效果已经很好了(其实可以再补充一下,指标用的是AUC和F1,一定程度能克服数据不均衡)。树模型应该不能解决数据不均衡(语气很不坚定。。。)

        接下来针对我的科研经历提问。首先发出了灵魂提问:“你的论文还在审稿中吗?”是的没错,还在审稿,我也没办法。接下来根据我简历中提炼出来的关键技术进行提问(这里很重要,提前提炼出关键技术可以方便面试官有针对性提问)。这里开始对attention提问

1、RNN中的attention和Transformer中的attention有什么区别?(因为不晓得他说的RNN中的attention具体指什么,就让面试官给我解释了一下,大概就是拿当前时间步的隐层状态与过去所有时间步的隐层状态求attention)

答:首先解释了一下attention机制的目的是什么,本质上就是求某种相似度来权衡给定信息中哪些与我们感兴趣的信息最相关,最需要保留,通过attention这样一个概率值来对目标信息进行加权,相当于一种对信息的放缩(这里没有直接用KQV矩阵距离,因为不是所有attention都有KQV的说法)。RNN中的attention是为了筛选历史哪些信息需要被保留,哪些被削弱。Transformer则要看是self-attention还是mutual-attention,然后背了一下transformer的八股

2、transformer为什么要加位置编码?

答:因为self-attention本身没有位置信息,调换矩阵中行的顺序不会影响结果,或者说矩阵乘法这个操作就是位置不敏感的,所以需要显式地建模位置信息,transformer就利用了正余弦函数的线性组合给每个单词、每个向量维度进行编码。但其实后续工作中证明,直接把位置编码设置成可学习的也能成功,甚至在数据量足够大的情况下效果会更好。

        以上是项目八股,接下来居然开始问我python语法知识,超出了我的准备范围

1、了解过python全局锁吗?

答:没有。然后面试官就给我解释了一下它的作用。。。(感谢科普)

2、解释一下list和tuple的区别?如果要作为字典的key,该用list还是tuple?为什么?

答:list可修改,tuple不可修改。应该用tuple作为字典的key,因为字典的key不可修改(这里其实也不是很确定,推测了一下,不过面试官还是认同了我的结论)

3、解释一下lambda和yield关键字

答:lambda相当于其他语言里的匿名函数,可以将临时的函数作为变量传给其他类或者方法,一般在排序时常用。yield与return类似,只不过在返回值之后还能返回原先程序段继续运行,在构建迭代器的时候会用到。

        项目介绍到此完毕。接下来是手撕代码阶段。

1、手写sigmoid函数,以及它的求导函数。

直接(1 + np.eps(z)) ** (-1)。这里面试官指出来应该是-z,遂改过来

2、给定一个整数序列,求和为k的最长子序列。

前缀和数组+哈希。思路很快就有了,实现的时候下标运算一直搞错,导致结果一直差1,找了快10分钟的bug在解决,紧张到一半大脑都快一片空白,还好最后解决了。

        以上是全部内容,第二天收到二面通知。总而言之还是有很多基础知识没有复习到位,写题也容易紧张,好在面试官真的人很nice了。另外,面试官似乎对我没有实习经历有一点不满意,我决定下次自我介绍的时候说明一下这是导师的锅。。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值