👨💻作者简介: CSDN、阿里云人工智能领域博客专家,新星计划计算机视觉导师,百度飞桨PPDE,专注大数据与AI知识分享。✨公众号:GoAI的学习小屋 ,免费分享书籍、简历、导图等,更有交流群分享宝藏资料,关注公众号回复“加群”或➡️点击链接 加群。
🎉AI学习星球推荐: GoAI的学习社区 知识星球是一个致力于提供《机器学习 | 深度学习 | CV | NLP | 大模型 | 多模态 | AIGC 》各个最新AI方向综述、论文等成体系的学习资料,配有全面而有深度的专栏内容,包括不限于 前沿论文解读、资料共享、行业最新动态以、实践教程、求职相关(简历撰写技巧、面经资料与心得)多方面综合学习平台,强烈推荐AI小白及AI爱好者学习,性价比非常高!加入星球➡️点击链接
💚AI面经专栏总结: 本专栏主要为总结各小中大厂的面经系列总结,内容涵盖了多个热门技术领域,包括但不限于算法、机器学习、CV、NLP、大模型、测开、大数据、数分等,内容包括问题及详细答案,此外金邀请了行业内经验丰富的技术专家和面试官,分享面试经验和技巧,帮助求职者顺利通关各类技术面试。
算法工程师面经系列
面壁智能 大模型算法工程师 base北京
-
首先是自我介绍+实习项目介绍
因为我没有实际的大模型经验,所以问我的偏基础。 -
Adam优化器
自适应优化算法,可以根据历史梯度信息来调整学习率,对参数的更新进行了归一化处理,使得每个参数的更新都有一个相似的量级,从而提高训练效果。
Adam在动量SGD的基础上增加了二阶动量,通过其来自适应控制步长,当梯度较小时,整体的学习率就会增加,反之会缩小。 -
各种激活函数及其优缺点
一文读懂常见激活函数 - 知乎 -
Transformer的结构,其中解码器和编码器的attention有什么不同
其应用方式和关注的对象有所不同:
编码器的自注意力:
编码器的自注意力用于处理输入序列的元素,每个编码器层的自注意力机制关注输入序列中的不同位置,以学习各元素之间的关系。编码器的自注意力有助于将输入序列的信息编码为一种上下文感知的表示,以供解码器使用。
解码器的自注意力:
解码器的自注意力用于处理已生成的目标序列的部分或全部元素,以预测下一个目标元素。
在解码器中,为了避免信息泄露,自注意力机制通常会掩盖(Mask)当前时刻之后的信息,以确保在生成目标序列时不会使用未来信息。解码器的自注意力有助于将上下文信息与已生成的部分目标序列关联起来,以支持逐步生成目标语言的词语。
编码器-解码器注意力(Encoder-Decoder Attention):
在解码器中,除了自注意力,还使用编码器-解码器注意力来获取与源语言序列相关的信息。
编码器-解码器注意力关注源语言序列的各个元素,以帮助解码器理解输入序列与当前解码时刻的关系。
这种注意力机制用于将源语言的上下文信息引入到解码器中,以支持翻译或序列生成任务。
编码器和解码器中的自注意力和编码器-解码器注意力的作用分别是编码输入信息和生成输出信息,并在不同的上下文中使用。编码器的自注意力用于处理源语言序列,而解码器的自注意力用于处理目标语言序列。编码器-解码器注意力用于建立源语言和目标语言序列之间的关联,以便在翻译或序列生成任务中生成有意义的输出。
-
LN和BN的不同,为什么transformer用LN
LN和BN主要是作用的维度不同,LN是在特征这个维度,BN是在batch这个维度。
LN 在处理自注意力模型中更适合,因为它更能满足序列数据的特性,减小梯度问题,同时保持了输入特征的独立性。
用norm的目的是为了数值稳定 防止梯度出现异常 你将什么东西看作一个整体 就对这个整体进行norm 不同整体之间是分别进行norm的,一个句子里的token的意义和句子本身有关 而不是和不同句子有关 所以用LN。 -
distribute和non-distribute有什么区别?
distribute指分布式训练, 是在多个计算节点上并行训练模型的方法。通常,每个节点都包含一个或多个GPU,每个GPU都用于处理一部分数据,分布式训练通常用于处理大规模数据集或复杂的深度学习模型,以加快训练速度和提高性能。
Non-distributed 指非分布式训练,是在单个计算节点上训练模型的方法。在这种情况下,训练数据和模型参数都位于单个计算节点上。非分布式训练通常用于较小的数据集或简单的深度学习模型,或者是为了快速原型开发。在非分布式训练中,通常使用单个GPU或CPU来执行训练。 -
简述目前各种cv模型的发展趋势和方向
-
Codeing题目
现在有一个整数数组 ,请找出一个正整数满足以下两个条件:1)不在数组中;2)最小。
输入:array = [1,3,0]
输出:2
输入:array = [2,4,-1,1]
输出:3
输入:array = [4,8,9,11,12]
输出:1
思路:
哈希+二分
代码:
def func(nums):
n = len(nums)
d = {}
nums = sorted(list(set(nums)))
for i in range(n):
d[nums[i]] = i
if 1 not in d:
return 1
if d[nums[-1]] - d[1] == nums[-1] - 1:
return nums[-1] + 1
l, r = 1, nums[-1]
res = 0
while l <= r:
mid = (l + r) >> 1
if mid not in d:
res = mid
r = mid - 1
else:
if d[mid] - d[1] == mid - 1:
l = mid + 1
else:
r = mid - 1
res = r
return res
nums1 = [1,3,0]
print(func(nums1))
nums2 = [2,4,-1,1]
print(func(nums2))
nums3 = [4,8,9,11,12]
print(func(nums3))