type
status
date
slug
summary
tags
category
icon
password
Hi there, 俺又来记录面经了。回想起来去年8月的时候,几乎天天都在面试和笔试,然后走在走廊上看到一个弯折的树枝,第一反应居然是RELU!它有什么缺陷呢,它可能会“死”,也会带来梯度消失。可恶的RELU!最近好忙…
一面
1.聊项目,首先是23年的一篇会议论文。介绍持续学习背景,提出新的序列标注方式的动机。
持续学习确实在CV里面比较多,在NLP中的用途是类似的,动机是基于一个预先的观察实验。来源于对非相干优化带来的CF问题的观察。
2.知识蒸馏有哪些范式,为什么在你的项目中要采用这样的范式。
主要了解特征蒸馏,输出蒸馏以及关系蒸馏。这里采用输出蒸馏的原因是由任务特性所决定的。在持续学习过程中,新任务的引入会导致模型对旧任务知识的遗忘,即CF问题。教师模型是在旧任务上有较好性能的模型,能够体现旧任务的模式和规律。学生模型在学习新任务的同时,通过模仿教师模型的输出,就可以学习到旧任务的特征,从而在一定程度上避免 CF 问题。学生模型在学习新任务的过程中,通过模仿教师模型的输出等方式来更新自身的参数和结构,实现对旧知识的保留和新知识的学习,而不是直接对教师模型的特征和关系进行修改来更新模型。
3.你的已有工作中利用强化学习结合了很多场景,使用强化学习解决这些问题的动机是什么
其实主要利用强化学习解决过参数调优,决策问题这些场景,但其实并不是一开始就选择使用RL来解决这些问题的。拿参数调优这个点来讲的话,在知识蒸馏这个任务中,我们当时最先考虑到的参数调优方法是课程学习,然而在实际过程中课程学习并不work,最大的困难在于持续学习任务中我们很难定义训练任务的难易程度。后来考虑到RL的试错机制,尝试使用了RL解决问题。而各种各样的决策问题会采用RL,一是目前这是决策问题的普遍范式,二是在有一个良好的仿真模型的前提下,RL是我们做过所有的优化方法尝试中性能最优秀的。
4.了解DPO、PPO算法吗,简要介绍一下
DPO直接基于人类偏好对进行优化,避免单独训练奖励模型。通过最小化模型输出分布与基于人类反馈确定的目标分布之间的KL散度,使语言模型输出更符合人类偏好。优势在于简化了训练流程,无需训练单独的奖励模型,但是DPO需要偏好数据,收集这些数据成本较高,且其最优解可能会受限。
PPO是一种近端策略优化算法,属于策略梯度方法。通过与环境交互收集样本数据,更新策略以最大化长期累积奖励。PPO的核心在于使用代理目标函数限制新旧策略之间的差异,保证策略更新的稳定性。我在一些任务中使用过PPO,使用感受下来,PPO的计算成本较高,且对超参数的选择较为敏感。
5.介绍一下RLHF的流程
首先收集用户对不同回答的偏好数据,比如让用户挑出好和不好的回答。然后利用这些数据训练一个奖励模型,好的回答得分高,差的回答得分低。有了奖励模型后,通过强化学习的方式,让策略模型和环境交互,不断调整策略,通过不断试错和学习,找到满足用户偏好且能实现目标的最优策略。
话不多说,开撕
手撕MHA
电话号的字母组合
二面
1.让介绍一下自己的其中一篇论文,然后聊了很久细节
投屏开始讲,询问细节包括实验动机,以及解决问题的思路,遇到的困难
2.Transformer架构、decoder-only架构的变化
Transformer是用自注意力机制处理序列数据的模型。分两个部分:编码器负责理解输入(比如英文句子),解码器负责生成输出(比如中文翻译)。例如GPT就是典型的decoder-only架构,这种架构主要在生成式任务上表现很好,去掉了编码器后,模型关注一下一token的生成。这种架构在训练过程中只需要进行一次前向传播,而encoder-decoder架构需要两次前向传播,所以decoder-only架构的训练效率更高,但是这样的结构也降低了模型的理解能力,目前也有一些工作在这方向进行一些探索。
3.当模型需要处理超出训练时所见的长文本序列时,怎么办
我想到的一个方法是NTK外推,核心思想是“高频外推,低频内插”。当模型需要处理超出训练时所见的长文本序列时,直接外推会导致性能大幅下降,通过NTK-aware插值等方法能在一定程度上解决这个问题。具体来说,这种方法通过调整频率,让高频部分保持不变以捕捉短距离的细节特征,低频部分进行缩放以适应长距离的位置关系,从而实现免训练外推,提升长文本建模能力。不过其外推长度有限,而且对模型结构和训练方法有一定要求。可以通过对不同维度进行非均匀缩放来实现,比如在NTK-aware RoPE中,对高频(低维)部分缩放程度小一点,对低频(高维)部分缩放程度大一点,这样既能保留高频信息,又能扩展模型的上下文窗口长度。
4.讲一下进程、线程、锁
进程是独立的个体,线程是进程内部的更小单位,锁是管理线程对共享资源访问的工具。
进程是程序的一次执行实例。进程之间的切换需要操作系统来协调。进程之间相互独立,稳定性高。线程是进程中的一个执行单元,多个线程共享所属进程的资源,如内存和文件句柄等,这使得线程之间的通信和协作相对容易。线程能提高程序的执行效率,让程序能同时做很多事情,但这也带来了线程安全问题,比如多个线程同时去修改同一个数据,可能会导致数据混乱。锁就是一种机制,用来解决线程安全问题,保证同一时刻只有一个线程可以访问共享资源。常见的锁有互斥锁(Mutex)、自旋锁。但使用锁要注意死锁问题。
撕,同时希望你能用Cpp解决
1.最长递增子数组,并输出字典序最大,要求nlogn
三面
这一轮没有太大参考意义,具体看遇到的GM,主要是考察思维和规划的
总结:总体面下来感觉面试官比较友善,整体推进速度一般,整体而言重项目,重思维,八股考察范围比较广,不局限于NLP的算法八股。