当前位置:   article > 正文

面了搜狐 NLP 算法工程师,这次收获满满。。。

面了搜狐 NLP 算法工程师,这次收获满满。。。

节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂同学、参加社招和校招面试的同学,针对大模型技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何备战、面试常考点分享等热门话题进行了深入的讨论。

今天整理我们社群一个同学面试 NLP 算法方向的面试题,分享给大家,希望对后续找工作的有所帮助。喜欢记得点赞、收藏、关注。更多技术交流&面经学习,可以加入我们。

1. 自我介绍

在自我介绍环节,我清晰地阐述了个人基本信息、教育背景、工作经历和技能特长,展示了自信和沟通能力。

2. 技术问题回答

2.1 介绍一下 rouge,bleu,他们两个之间有什么区别?

在机器翻译任务中,BLEU 和 ROUGE 是两个常用的评价指标:

  • BLEU(Bilingual Evaluation Understudy): BLEU是一种用于评估机器翻译结果质量的指标。它主要侧重于衡量机器翻译输出与参考翻译之间的相似程度,着重于句子的准确性和精确匹配。BLEU通过计算N-gram(连续N个词)的匹配程度,来评估机器翻译的精确率(Precision)。

  • ROUGE(Recall-Oriented Understudy for Gisting Evaluation): ROUGE是一种用于评估文本摘要(或其他自然语言处理任务)质量的指标。与BLEU不同,ROUGE主要关注机器生成的摘要中是否捕捉到了参考摘要的信息,着重于涵盖参考摘要的内容和信息的完整性。ROUGE通过计算N-gram的共现情况,来评估机器生成的摘要的召回率(Recall)。

  • 区别:

  • BLEU侧重于衡量翻译的准确性和精确匹配程度,更偏向于Precision;

  • ROUGE侧重于衡量摘要的信息完整性和涵盖程度,更偏向于Recall。

这两个指标在不同的任务和应用场景中都有其重要性,因此在评估自然语言处理模型时,经常会同时使用它们来综合考虑模型的表现。

2.2 介绍一下 常见大模型结构(llama2,glm)?

  • BART (bi Encoder+casual Decoder,类bert的方法预训练)

  • T5 (Encoder+Decoder,text2text预训练)

  • GPT(Decoder主打zero-shot)

  • GLM (mask的输入部分是双向注意力,在生成预测的是单向注意力)

2.3 介绍一下 ptuning,lora tune?

2.4 为什么transformer有长度限制(太长了性能下降)?

transformer论文中提出了一种基于自注意力机制(self-attention)的新型神经网络结构,它可以处理序列到序列(sequence-to-sequence)的任务,如机器翻译、文本摘要、语音识别等。transformer模型由编码器(encoder)和解码器(decoder)组成,编码器将输入序列映射为一组隐藏向量,解码器根据这些向量生成输出序列。

transformer模型的一个限制是,它的自注意力机制需要计算输入序列中每个token与其他所有token之间的相关性,这个计算的时间和空间复杂度都是输入序列长度的平方。因此,当输入序列过长时,transformer模型会消耗过多的计算资源和存储空间,导致效率降低和性能下降。

3. Leetcode 题

具体题意记不清了,但是类似 【215. 数组中的第K个最大元素】

  • 题目内容

给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。

请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例 1:

输入: [3,2,1,5,6,4], k = 2
输出: 5
示例 2:

输入: [3,2,3,1,2,4,5,5,6], k = 4
输出: 4
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 提示:

  • 1 <= k <= nums.length <= 105

  • -104 <= nums[i] <= 104

  • 题目解答

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        nums_len = len(nums)
        # 1.构建大顶堆
        for i in range(math.floor(nums_len/2),-1,-1):
            # 从第一个非叶子结点从下至上,从右至左调整结构
            self.adjustHeap(nums,i,nums_len)
        # 2.调整堆结构+交换堆顶元素与末尾元素
        for i in range(nums_len-1,nums_len-1-k,-1):
            # 将堆顶元素与末尾元素进行交换
            self.swap(nums,0,i)
            # 重新对堆进行调整
            self.adjustHeap(nums,0,i)
        return nums[-k]
    
    def adjustHeap(self,nums,i,nums_len):
        '''
            功能:交调整大顶堆(仅是调整过程,建立在大顶堆已构建的基础上)
            @param nums        List 数组
            @param i           int  索引1
            @param nums_len    int  长度 
            @retusn
        '''
        left = 2*i+1    # i 的 左节点
        right = 2*i+2   # i 的 右节点
        largest = i     # 用于标记当前最大的节点值得索引,先取出当前元素i
        # 比较 左节点 和 当前节点 的值
        if left < nums_len and nums[left] > nums[largest]:
            largest = left
        # 比较 左节点 和 当前节点 的值
        if right<nums_len and nums[right]>nums[largest]:
            largest = right
        # 将 当前节点 和 最大节点 交换,然后重新构建 堆
        if largest!=i:
            self.swap(nums,i,largest)
            self.adjustHeap(nums,largest,nums_len)
        
    def swap(self,nums,a,b):
        '''
            功能:交换元素
            @param nums List 数组
            @param a    int  索引1
            @param b    int  索引2 
            @retusn
        '''
        nums[a],nums[b] = nums[b],nums[a]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

技术交流群

前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~

我们建了算法岗技术与面试交流群, 想要进交流群、需要源码&资料、提升技术的同学,可以直接加微信号:mlc2060。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。

方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2060,备注:技术交流

用通俗易懂方式讲解系列

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/419767
推荐阅读
相关标签
  

闽ICP备14008679号