节前,我们组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂同学、参加社招和校招面试的同学,针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。
今天我整理一下算法岗方向面试题,分享给大家,希望对后续找工作的有所帮助。喜欢记得点赞、收藏、关注。更多技术交流&面经学习,可以文末加入我们交流群。
问题1:描述下 Transformer 的结构
Transformer是一种深度学习模型架构,特别适用于序列到序列的任务,如机器翻译。其主要结构包括以下几个部分:
-
编码器(Encoder):由多个相同的层组成,每个层包含两个子层,即多头自注意力机制(Multi-Head Self-Attention)和前馈神经网络(Feedforward Neural Network)。
-
解码器(Decoder):同样由多个相同的层组成,每个层包含三个子层,分别是多头自注意力机制、多头注意力机制(用于处理编码器输出的信息)和前馈神经网络。
-
嵌入层(Embedding):将输入序列的词嵌入到连续的向量空间中。
-
位置编码(Positional Encoding):为输入序列的每个位置添加一个表示其位置的向量,以保留序列的顺序信息。
-
Layer Normalization和残差连接:在每个子层的输出上应用Layer Normalization,并使用残差连接将输入添加到子层的输出。
问题2:描述为什么 Transformer 可以处理多种模态,它是怎么处理的
Transformer之所以能够处理多种模态的数据,是因为其核心操作——自注意力机制(Attention Mechanism)是通用的,不依赖于数据的特定结构。自注意力机制能够在输入序列中动态地关注不同位置的信息,从而适应不同模态的输入。
对于多模态数据,例如图像和文本,可以通过将每个模态的数据分别表示为输入序列,然后将这些序列送入Transformer模型。这样,模型可以通过自注意力机制在不同模态之间建立关联,捕捉模态间的复杂关系。
问题3:BN的作用和好处
-
作用:BN主要用于加速神经网络的训练过程。它在每个批次的数据上进行标准化,即将输入数据减去均值并除以标准差,然后通过缩放和平移进行线性变换。这有助于维持每个神经元激活的分布稳定,防止梯度消失或爆炸问题。
-
好处:
-
加速训练:BN有助于减小训练过程中的内部协变量转移(Internal Covariate Shift),从而提高网络训练的稳定性和速度。
-
降低对初始参数的敏感性:BN使网络对初始权重的选择不那么敏感,减少了需要进行精细调整的依赖。
-
正则化效果:BN在一定程度上具有正则化效果,可以减轻过拟合问题。
问题4:Dropout 的好处
Dropout通过随机地将一部分神经元的输出置零,强制模型去学习更健壮和泛化的特征,从而降低过拟合风险。
问题5:梯度消失的原因
梯度消失是指在深度神经网络中,梯度逐渐变得极小,导致底层网络参数几乎无法更新。主要原因包括:
-
链式法则:在链式法则中,每个乘法项都会缩小梯度,多层网络中这些项的连续相乘导致梯度指数级地减小。
-
激活函数的选择:一些传统的激活函数,如sigmoid和tanh,具有饱和区域,梯度在这些区域非常小,使得反向传播时梯度减小。
-
深度网络结构:随着网络深度增加,梯度经过多次连续的权重矩阵相乘,导致梯度逐渐衰减。
问题6:Resnet 为什么能减缓梯度消失的原因
ResNet采用了残差连接(Residual Connection),通过将输入直接添加到网络层的输出,形成了一个“跳跃连接”。这种结构有助于缓解梯度消失问题的原因有:
-
梯度直达:在反向传播中,由于有了跳跃连接,梯度能够直接通过残差块传播到较早的层,减轻了梯度逐层衰减的问题。
-
易于学习恒等映射:残差连接使得网络可以更容易地学习恒等映射,即将输入直接映射到输出,这有助于减轻梯度消失问题。
问题7:在 nums 寻找最小的连续子数组使得它们的和大于所给的targets
方法:前缀和+二分
def search(s, k, n, t):
t > s[n]:
return -1
l, r = k, n
res = n
while l < r:
mid = (l + r) >> 1
if s[mid] >= t:
res = mid
r = mid - 1
else:
l = mid + 1
return res
def func(targets, nums):
if targets < sum(nums):
return 0
n = len(nums)
s = [0] * (n + 1)
for i in range(1, n+1):
s[i] = s[i - 1] + nums[i]
res = n
for i in range(1, n+1):
t = targets + s[i - 1]
d = search(s, i, n, t)
if d > i and d - i + 1 < res:
res = d - i + 1
return res
target = 7
nums = [2,3,1,2,4,3]
print(func(target, nums))
问题8:求一个数的N次幂
def pow(k, n):
if k == 0 and n == 0:
return None
flag = 1
if n < 0:
flag = 0
res = 1
while n > 0:
if (n & 1) == 1:
res = res * k
k *= k
n >>= 2
if flag == 1:
return res
return 1.0 / res
问题9:全排列
输入: 5,3
输出: [(1,2,3),(1,2,4),(1,2,5),(2,3,4),(2,3,5),(3,4,5),…]
import copy
def dfs(l, res, n, m, index, level, tmp):
if level > m:
return
if index > n:
return
if level == m:
t = copy.deepcopy(tmp)
res.append(tuple(t))
return
# print("index ", index, " n - m + level + 1 ", n - m + level + 1)
for i in range(index, n - m + level + 1):
# print("i ", i, " l[i] ", l[i])
tmp.append(l[i])
dfs(l, res, n, m, i+1, level+1, tmp)
tmp.pop()
def pailie(n, m):
l = range(1, n+1)
res = []
tmp = []
dfs(l, res, n, m, 0, 0, tmp)
return res
print(pailie(5, 3))
技术交流
前沿技术资讯、算法交流、求职内推、算法竞赛、面试交流(校招、社招、实习)等、与 10000+来自港科大、北大、清华、中科院、CMU、腾讯、百度等名校名企开发者互动交流~
我们建了算法岗面试与技术交流群, 想要进交流群、需要源码&资料、提升技术的同学,可以直接加微信号:mlc2060。加的时候备注一下:研究方向 +学校/公司+CSDN,即可。然后就可以拉你进群了。
方式①、微信搜索公众号:机器学习社区,后台回复:技术交流
方式②、添加微信号:mlc2060,备注:技术交流
用通俗易懂的方式讲解系列
- 用通俗易懂的方式讲解:不用再找了,这是大模型最全的面试题库
- 用通俗易懂的方式讲解:这是我见过的最适合大模型小白的 PyTorch 中文课程
- 用通俗易懂的方式讲解:一文讲透最热的大模型开发框架 LangChain
- 用通俗易懂的方式讲解:基于 LangChain + ChatGLM搭建知识本地库
- 用通俗易懂的方式讲解:基于大模型的知识问答系统全面总结
- 用通俗易懂的方式讲解:ChatGLM3 基础模型多轮对话微调
- 用通俗易懂的方式讲解:最火的大模型训练框架 DeepSpeed 详解来了
- 用通俗易懂的方式讲解:这应该是最全的大模型训练与微调关键技术梳理
- 用通俗易懂的方式讲解:Stable Diffusion 微调及推理优化实践指南
- 用通俗易懂的方式讲解:大模型训练过程概述
- 用通俗易懂的方式讲解:专补大模型短板的RAG
- 用通俗易懂的方式讲解:大模型LLM Agent在 Text2SQL 应用上的实践
- 用通俗易懂的方式讲解:大模型 LLM RAG在 Text2SQL 上的应用实践
- 用通俗易懂的方式讲解:大模型微调方法总结
- 用通俗易懂的方式讲解:涨知识了,这篇大模型 LangChain 框架与使用示例太棒了
- 用通俗易懂的方式讲解:掌握大模型这些优化技术,优雅地进行大模型的训练和推理!
- 用通俗易懂的方式讲解:九大最热门的开源大模型 Agent 框架来了