面经总结系列(九): Boss 直聘算法工程师

在这里插入图片描述

👨‍💻作者简介: CSDN、阿里云人工智能领域博客专家,新星计划计算机视觉导师,百度飞桨PPDE,专注大数据与AI知识分享。✨公众号:GoAI的学习小屋 ,免费分享书籍、简历、导图等,更有交流群分享宝藏资料,关注公众号回复“加群”或➡️点击链接 加群。

🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、资料共享、行业最新动态以、实践教程、求职相关(简历撰写技巧、面经资料与心得)多方面综合学习平台,强烈推荐AI小白及AI爱好者学习,性价比非常高!

扫码加入星球:
在这里插入图片描述

💚AI面经专栏总结: 本专栏主要为总结各小中大厂的面经系列总结,内容涵盖了多个热门技术领域,包括但不限于算法、机器学习、CV、NLP、大模型、测开、大数据、数分等,内容包括问题及详细答案,此外金邀请了行业内经验丰富的技术专家和面试官,分享面试经验和技巧,帮助求职者顺利通关各类技术面试。

算法工程师面经系列

boss 直聘 算法工程师 一面 60 min

最近参加校招,面试了多家公司,软件开发和算法岗都有投递。感觉最近算法岗的趋势越来越卷了,都要3-4轮面试,过了还有HR面试、主管面,泡池子,排序,难度系数在逐年可见的递增。然后基于自己想将面试的内容记录下来并且将文章传播出去的原因来和大家分享一下自己的其中几家公司面经,这篇文章介绍的是boss直聘公司的岗位面经。在boss直聘的官网上投递的校招岗位,岗位名称叫算法工程师,面试的时候才知道业务是做推广搜的,国庆前就做了笔试,笔试难度中等,编程题有4道,都做出来了,笔试考察的知识点主要是树+搜索+动态规划。但是面试开启的较晚,11月才开始收到面试通知。笔试时间是9.28,一面是11.06,二面是11.08,效率很快。一面自己答的不是很好,幸运的过了,总共3-4轮技术面。工作地点在北京。但是战线拉的比较长,投递这个公司可能需要做好一定的心理准备。以下是第一轮和第二轮技术面的内容。答案是我自己的想法和面试后自己查的资料的结合,不保证100%准确,可以参考看看。

  1. 项目介绍 20min
    我有4段算法岗相关的实习,两家自动驾驶独角兽,两家互联网,最近的暑期实习在某中厂实习,但是我做的时间都不够长,基本都是两个月多,偏工程,大部分时间在处理数据,模型层面深入的有限。但是也只能如实相告,面试官大部分都会理解的,因为实习时间短暂,一般很难有高质量的产出,哪怕是在大厂。
  2. 画出Lstm的结构图,并进行说明
    在这里插入图片描述

从左到右依次是遗忘门、输入门、输出门。
遗忘门决定了哪些内容与前面的时间步相关。
输入门决定了从当前时间步添加哪些信息。
输出门决定下一个隐藏状态应该是什么。

  1. Lstm用的激活函数是什么?相比sigmoid有什么优势?
    Tanh激活函数。
    (1) tanh函数是0均值,值域是[-1, 1],与Sigmoid函数相比,它的输出范围更广,能够提供更强的梯度,从而有助于缓解梯度消失问题。
    (2) 与Sigmoid相比,tanh激活函数在处理序列数据时通常能够更好地捕捉梯度信息。这对于LSTM等递归神经网络(RNN)来说尤其重要,因为它们需要在长序列上有效地传播梯度。

  2. 介绍Rcnn。为什么它速率较慢。
    (1) 候选区域提取的计算成本高: 选择性搜索等传统方法用于生成候选区域的过程相对较慢,这限制了整体速度。
    (2) 多次前向传播: RCNN需要对每个候选区域进行单独的前向传播,这增加了计算开销。

  3. C++内存泄露的原因
    (1) 未释放动态分配的内存;
    (2) 释放内存的顺序错误;
    (3) 未释放动态数组;
    (4) 指针丢失, 在后续的代码中修改了该指针的值,导致无法再释放对应的内存
    (5) 异常处理不当, 在发生异常的情况下没有正确地释放分配的内存

  4. Python哪些对象是可变的,哪些是不可变的,怎么判断
    可变: list set dict
    不可变: int float str tuple
    判断对象的可变性:
    (1) 可以使用id()函数来获取对象的标识符,然后通过改变对象的值,再次检查标识符是否发生变化,从而判断对象是否可变,如果标识符发生变化,说明对象是不可变的。
    (2) 判断是否可以作为dict的键,可以就是不可变的

  5. Coding
    y = np.array([1, 1, 1, 1, 0, 1, 0, 0, 0, 0])
    pred = np.array([0.9, 0.8, 0.7, 0.6, 0.6, 0.4, 0.4, 0.3, 0.2, 0.1])
    计算auc
    参考:
    AUC的三种计算方法及代码_auc计算-CSDN博客
    AUC详解与Python实现 - 知乎

import numpy as np

y = np.array([1, 1, 1, 1, 0, 1, 0, 0, 0, 0])
pred = np.array([0.9, 0.8, 0.7, 0.6, 0.6, 0.4, 0.4, 0.3, 0.2, 0.1])

def get_roc_auc(y_true, y_score):
    gt_pred = list(zip(y_true, y_score))
    probs = []
    pos_samples = [x for x in gt_pred if x[0]==1]
    neg_samples = [x for x in gt_pred if x[0]==0]

    # 计算正样本大于负样本的概率
    for pos in pos_samples:
        for neg in neg_samples:
            if pos[1]>neg[1]:
                probs.append(1)
            elif pos[1]==neg[1]:
                probs.append(0.5)
            else:
                probs.append(0)
    return np.mean(probs)
print(get_roc_auc(y,  pred))
  1. Coding
    判断一个数是不是回文数
def check(x):
    # x = str(x)
    # t = x[::-1]
    # if t == x:
    #     return True
    # return False
    if x < 0:
        return False
    t = x
    p = 0
    while t != 0:
        p *= 10
        p += t % 10
        t //= 10
    if p == x:
        return True
    return False

a = 0
print(check(a))

boss 直聘 算法工程师 二面 40min

  1. 详细介绍实习项目 20min

  2. 介绍 transformer

  3. 位置编码有哪些方法
    (1) 绝对位置编码
    正弦余弦编码: 这是Transformer模型中使用的一种常见方法。给定序列中的每个位置 pos 和每个维度i,正弦和余弦函数的值用于计算位置编码。
    其中,pos 是位置,i 是维度索引,d 是位置编码的维度。
    (2) 相对位置编码
    相对位置嵌入: 通过引入与相对位置相关的参数,相对位置嵌入考虑了元素之间的相对距离。这使得模型能够更好地捕捉序列中不同元素之间的相对关系。
    (1) 自适应位置编码
    学习性位置编码: 将位置编码作为模型的可学习参数,允许模型在训练过程中学习适合特定任务的位置信息。
    (2) 基于卷积的位置编码
    卷积位置编码: 使用卷积神经网络学习位置编码,通过卷积操作捕捉序列中不同位置的信息。
    (3) 非线性位置编码
    非线性位置编码方法: 使用非线性函数(如激活函数)来编码位置信息,以提供更复杂的位置表示。

  4. Coding
    从起点左上角出发,只能向右向下行走,遇到障碍物不可走,到右下角的时候有多少种走法。

def func(g):
    m, n = len(g), len(g[0])
    dp = [[0 for j in range(n + 1)] for i in range(m + 1)]
    dp[0][0] = 1
    for i in range(1, m):
        if g[i][0] != 1:
            dp[i][0] = dp[i - 1][0]
        else:
            break
    for j in range(1, n):
        if g[0][j] != 1:
            dp[0][j] = dp[0][j - 1]
        else:
            break
    for i in range(1, m):
        for j in range(1, n):
            if g[i][j] != 1:
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
            else:
                dp[i][j] = 0
    return dp[m - 1][n - 1]

grid = [[0, 0, 0], [0, 1, 0], [0, 0, 0]]
print(func(grid))

整体感受总结

Boss直聘校招面试效率很高,但是笔试到面试之间的时间距离较长,总体而已难度不是特别大,主要我是做计算机视觉的,而岗位是推荐相关的,不是特别匹配,但是也有机会。要针对岗位的业务、技术栈复习,保持coding能力,还有加强语言表达能力。最后对transformer的了解要透彻,现在这个是不管任何岗位都必问的。

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GoAI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值