节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。
汇总合集:《大模型面试宝典》(2024版) 发布!
最近一位星球成员面试商汤 NLP 算法岗,被疯狂拷打的经历。
今天我把他的面经题和答案整理总结一下,希望可以对大家找工作有帮助,喜欢点赞、收藏、关注。
技术交流群
前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~
我们建了算法岗技术与面试交流群, 想要获取最新面试题、了解最新面试动态的、需要源码&资料、提升技术的同学,可以直接加微信号:mlc2040。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。
方式①、微信搜索公众号:机器学习社区,后台回复:加群
方式②、添加微信号:mlc2040,备注:技术交流
问题1、Transformer结构和LSTM的区别和优势,Transformer怎么体现时序信息
区别:
-
Transformer是基于注意力机制(self-attention)的模型,通过同时处理整个序列的信息,而LSTM(长短时记忆网络)则是基于递归的循环神经网络。
-
LSTM依赖于序列上的递归计算,而Transformer使用注意力机制进行全局性的关联。
优势:
-
Transformer并行计算更有效,因为每个位置的计算独立于其他位置,而LSTM需要按顺序计算。
-
Transformer更易于训练,不容易出现梯度消失或爆炸的问题。
-
Transformer能够学习长距离依赖关系,而LSTM的这个能力在序列很长时受到限制。
时序信息:
- Transformer通过引入位置编码(Positional Encoding)来处理时序信息。这是通过为输入序列的每个位置添加一个特定的向量表示其在序列中的位置,从而使模型能够感知到输入的时序结构。
问题2、Transformer Encoder和Decoder的输入输出和结构
Encoder:
-
输入:序列的嵌入表示或者经过了位置编码的输入。
-
输出:对输入序列的编码表示。
-
结构:多头自注意力层(Multi-Head Self-Attention)和前馈神经网络层(Feedforward Neural Network)的堆叠。
Decoder:
-
输入:编码器的输出以及目标序列的嵌入表示。
-
输出:对目标序列的解码表示。
-
结构:多头自注意力层、多头编码-解码注意力层(Multi-Head Encoder-Decoder Attention)和前馈神经网络层的堆叠。
问题3、介绍下BERT模型
-
BERT(Bidirectional Encoder Representations from Transformers)是一种预训练的自然语言处理模型,基于Transformer架构。
-
BERT的核心思想是通过在大规模语料库上进行无监督训练,从而学习丰富的语言表示。
-
BERT采用双向(bidirectional)的注意力机制,能够更好地理解上下文信息。
-
在预训练之后,BERT可以通过微调应用于各种下游任务,如文本分类、命名实体识别等。
问题4、LayerNorm & BatchNorm的作用以及区别****
作用:
-
BatchNorm(批归一化):在训练时通过归一化每个小批次的输入,加速训练并有正则化效果。
-
LayerNorm(层归一化):在每个层的输入上进行归一化,通常应用于逐层的归一化处理。
区别:
-
BatchNorm:对每个批次的数据进行归一化,考虑了批次内的样本间关系。
-
LayerNorm:对每个样本的所有特征进行归一化,独立于批次。
-
BatchNorm适用于全连接和卷积层,而LayerNorm更适用于循环神经网络(RNN)和Transformer等序列模型。
问题5、BatchNorm更多用在视觉上,LayerNorm更多用在语言上,为什么
原因:
-
BatchNorm:在图像处理中,数据通常以批次的形式输入,BatchNorm可以充分利用批次内的数据分布进行归一化,有助于训练深层的视觉模型。
-
LayerNorm:在自然语言处理中,序列数据(如语言)的长度可能会变化,而LayerNorm独立于批次,更适用于处理变长序列,保持对每个样本的归一化一致性。
问题6、编程题:跳跃游戏(LeetCode 55)
解题思路:
尽可能到达最远位置(贪心)。
如果能到达某个位置,那一定能到达它前面的所有位置。
方法:
初始化最远位置为 0,然后遍历数组,如果当前位置能到达,并且当前位置+跳数>最远位置,就更新最远位置。最后比较最远位置和数组长度。
时间复杂度 O(n),空间复杂度 O(1)。
代码:
class Solution:
def canJump(self, nums) :
max_i = 0 #初始化当前能到达最远的位置
for i, jump in enumerate(nums): #i为当前位置,jump是当前位置的跳数
if max_i>=i and i+jump>max_i: #如果当前位置能到达,并且当前位置+跳数>最远位置
max_i = i+jump #更新最远能到达位置
return max_i>=i
问题7、编程题:跳跃游戏2(leetcode45)
思路:
从前往后先找如果到达最后一步,那么前一步最早能落在那里,找到前一步后,再把该步的下标当作目标,直到目标下标为0。
代码:
class Solution:
def jump(self, nums: List[int]) -> int:
n = len(nums)
aim = n
t = 0
while aim > 1:
for i in range(aim):
if i + nums[i] >= aim-1:
aim = i +1
t += 1
break
return t