【大模型面试】腾讯混元大模型面试:11连夺命问题,你知道多少!

部署运行你感兴趣的模型镜像

本文记录网友“南门子”应聘腾讯混元大模型岗位的面试真题回顾,特别是那些考察基础理论、模型原理和经典知识的“八股”题目,并附上他的作答参考,希望能为后来者提供借鉴。

1、 简要介绍你了解的一两个大模型,并分析它们的区别?

答: 我了解的两个大模型是 Qwen 和 DeepSeek。

以下是二者的对比:

  • 开发商:Qwen 由阿里巴巴达摩院开发
  • DeepSeek 由深度求索科技(DeepSeek)开发

模型类型与效率:

  • DeepSeek 系列主打混合专家架构(MoE),通过在推理时动态选择子模块专家提升效率,且强调低训练成本设计,适合资源受限场景。
  • Qwen系列则采用传统的稠密模型架构,侧重于资源效率优化,尤其在小参数规模下(如32B)保持高性能,更适合端侧部署。

推理能力强化:

  • DeepSeek-R1 通过自我进化策略(如长链思维蒸馏)提升复杂逻辑推理能力,在数学、编程等任务中表现突出。
  • Qwen则通过领域知识蒸馏增强垂直领域适应性,例如在医学问答(Clinical Chemistry MCQs)中准确率超过人类专家。

模型规模:

  • DeepSeek 模型主打 671B 参数的混合专家架构,有 72B、32B、7B、8B 的蒸馏版本。
  • Qwen 模型规模较小且尺寸更为全面,原生支持 0.5B、1.5B、7B、14B、32B、72B 等版本,从 Qwen3 开始推出 235B 版本。

开源策略:

  • DeepSeek推行全栈开源,覆盖基础模型、蒸馏版本和部署工具链,且 API 调用成本仅为 GPT-4 的 1/30。
  • Qwen 采用部分开源策略,仅开放基础模型权重,高级功能(如领域适配模块)需商业授权。

2、 为什么大家都开始探索 MoE 架构?MoE 相比 Dense 有什么好处?

答: 核心原因是因为基于 MoE 架构的模型,如 Deepseek 等表现出先进的性能,具体来说:

动态计算分配机制:MoE 通过路由器网络(Router)动态选择每个输入 token 激活的专家集合,仅需激活部分参数(如 DeepSeek-V3 激活 37B 参数,占总量 671B 的 5.5%),实现计算效率与模型规模解耦。

相较密集模型全参数激活的模式,MoE 的 FLOPs 可降低至传统架构的 30% 以下。

细粒度专家分割:DeepSeekMoE 等创新架构将单个专家分割为多个细粒度子专家(如将 FFN 隐藏维度拆分),通过组合式激活提升知识表达的灵活性。实验显示,32 个子专家配置可使模型在数学推理任务中的准确率提升 18%。

共享专家隔离技术:保留部分专家作为共享知识库(如 DeepSeekMoE 隔离 15% 共享专家),既降低参数冗余度,又增强跨领域知识迁移能力。在医疗问答测试中,该技术使模型准确率从 91% 提升至 94%。

3、 Qwen LoRA 微调和全参微调的性能差距?

答: Qwen 模型的全参数微调与 LoRA 的性能差异呈现任务依赖性和参数规模敏感性特征。

img

在结构化生成任务(编程、翻译)中,LoRA 性能可达全参数微调的 92%-97%。

在非结构化逻辑推理(数学证明、临床诊断)中,LoRA 性能差距扩大至全参数的 70%-85%。

对于长文本连续理解(多轮对话、学术写作),LoRA 在主题一致性指标上落后全参数微调 10% 以上。

4、 大模型训练和推理的流程?SFT 和 RLHF 的作用分别是什么?

答: 训练流程:预训练+(有监督)微调+对齐。

预训练阶段:基于海量无标注数据(如互联网文本、多模态数据)进行自监督学习,通过语言建模(LM)、对比学习等任务建立通用表征能力。典型参数规模为千亿至万亿级别,需千卡级 GPU 集群训练数月。

监督微调(SFT)阶段:使用标注数据(如领域问答、指令遵循)调整模型参数,使其适配下游任务。SFT 阶段仅需 0.1%-1% 的预训练数据量即可显著提升特定任务性能。

强化学习对齐(RLHF)阶段:通过人类偏好数据训练奖励模型(Reward Model),指导大模型生成符合伦理和安全规范的内容。此阶段可将有害输出率降低 54%-78%。

5、 在 RLHF 中,目前主流的强化学习算法有哪几个?写一下损失函数表达式

直接偏好优化(DPO):

img

以下三个直接参考 DAPO 原文,文中都给出了总结:

近端偏好优化(PPO):

img

组相关偏好优化(GRPO):

img

解耦裁剪和动态采样策略优化(DAPO):

img

6、 Deepspeed ZeRO-1,ZeRO-2,ZeR0-3 三个模式的区别是什么?

Huggingface 贴出的这张图记住就 OK 了,地址在:

https://huggingface.co/docs/trl/deepspeed_integration

img

ZeRO-1: ,只把优化器参数平均分配到各个 GPU 上,每个 GPU 上仍然完整保存一份模型参数和梯度。

ZeRO-2: 把优化器参数和梯度平均分配到各个 GPU 上,但每个 GPU 上仍然完整保存一份模型参数。

ZeRO-3: 把优化器参数+梯度+模型参数都平均分配到各个 GPU 上。

7、 用 DeepSpeed ZeRO-3来微调 Qwen2-72B,每一张卡占用的显存大概是多少,估算一下为什么是占这么多的显存?

基本思路:大模型训练的显存开销主要用于存储模型参数、梯度,优化器状态,以及激活值,其中模型参数、梯度,以及激活值通常均为 fp16 格式,而优化器状态必须是 fp32 格式。

由于激活值与批大小、序列长度等因素有关,需要单独考虑。但是模型参数、梯度,以及优化器状态占用的显存是固定的,分别占用 2x、2x,以及 12x 模型参数量的显存。即训练的显存开销至少是 16x 模型参数量(以 GB 为单位)。

显存占用估算(8 卡场景):

img

总结:

模型参数占用显存 = 参数量 × 2 GB(fp 16)

梯度占用显存 = 参数量 × 2 GB(fp 16) - 优化器状态占用显存 = 参数量 × 12 GB(fp 32)

(Adam)优化器状态包括参数备份、动量、方差三个部分,均为 fp 32 格式

实际场景:若启用 CPU/NVMe 卸载(如 offload_optimizer=cpu),每卡显存可进一步降至 15–18 GB。

8、除了 DeepSpeed,还有什么其他的大模型训练优化方法?

混合精度训练:使用混合精度训练,保存 FP32 格式的权重副本,FP16 仅用于计算。

过程为:FP16 前向/反向计算 -> FP16 梯度 -> 转换为 FP32 -> 更新 FP32 权重副本 -> 同步至 FP16 副本。

模型并行、数据并行、混合并行(包括模型并行:(张量并行/流水线并行)+数据并行,3D 并行:数据并行+张量并行+流水线并行)

梯度累积:通过多次前向传播后再进行一次反向传播,减少显存占用。

激活检查点:激活值指神经网络中每一层输出的中间结果,即输入数据经权重计算后通过激活函数生成的输出值,计算梯度需基于前向传播的激活值。

梯度检查点(Gradient Checkpointing)核心思想:时间换空间,仅存储部分层的激活值(称为检查点),其余层在反向传播时临时重算。

激活检查点的实现步骤如下:

前向传播:

  • 正常计算所有层输出
  • 仅保存检查点层的输入和输出,其余激活值丢弃

反向传播:

  • 从最近检查点重新前向计算该区段激活值
  • 基于临时激活值计算局部梯度
  • 完成后丢弃临时数据

9、LoRA 微调的原理,A和B两个矩阵怎么初始化?

img

初始化方法:

img

10、 介绍 RLHF

人工反馈的强化学习(RLHF)一共 3 个步骤:

(1)有监督微调,通常是指令微调

(2)训练奖励模型:

生成候选回答:SFT 模型针对同一提示生成多个候选回答.

训练奖励模型:标注员对 K 候选回答(K=4 或 K=9)的质量进行排序,然后构造出交叉熵损失来训练奖励模型,每次给奖励模型两个候选回答,要求它对优质回答的打分要比劣质回答更高。

img

(3)强化学习: 虽然使用了 PPO 算法,但也不是标准的 PPO,做出了三点改进:

  • 将原版 PPO Token 级别的奖励替换为了句子级别的奖励
  • 引入了 KL 正则项,以防止奖励模型的过度优化
  • 加入有监督损失项,以确保模型在公开 NLP 数据集上的性能回归

img

11、 在做对齐的时候,为什么 SFT 之后还要做 RLHF,只用 SFT 可以吗?

**答:**SFT 之后接 RLHF 是因为 SFT 仅确保了模型的语言生成能力,却不能保证生成的内容符合人类的道德和价值观。

通常不能用 SFT 来实现对齐,主要有以下两方面的原因:

**学习目标不匹配:**SFT 的学习目标是(理想情况下)让模型以 100% 的概率生成正确答案,而我们对大模型输出的预期是生成人类偏好的回答,二者目标不一致。

SFT 的局限性:

  • SFT 只能让模型学会什么是好的回答(只知其然),但不能让模型学会辨别什么样的回答是好的回答(而不知其所以然)
  • SFT 是 token 级的学习方法,存在暴露偏差等问题,容易导致幻觉现象的产生
代码一:22.括号生成
思路:回溯法

def generateParenthesis(self, n: int) -> List[str]:
        def backtrack(s='', left=0, right=0):
            # 当前字符串s的长度达到2*n,说明一对完整的括号组合已经生成完毕
            if len(s) == 2 * n:
                result.append(s)
                return
            # 如果左括号的数量小于n,可以添加左括号
            if left < n:
                backtrack(s + '(', left + 1, right)
            # 如果右括号的数量小于左括号的数量,可以添加右括号
            if right < left:
                backtrack(s + ')', left, right + 1)
        result = []
        backtrack()
        return result
代码二:多头注意力

class MultiHeadAttention(nn.Module):
    """多头注意力机制实现
    参数:
        d_model: 输入/输出维度 (默认: 512)
        num_heads: 注意力头数量 (默认: 8)
        dropout: Dropout概率 (默认: 0.1)
    """
    def __init__(self, d_model=512, num_heads=8, dropout=0.1):
        super().__init__()
        assert d_model % num_heads == 0, "d_model 必须被 num_heads 整除"
        self.d_model = d_model
        self.num_heads = num_heads
        self.head_dim = d_model // num_heads  # 每个注意力头的维度
        # 线性变换层:Q,K,V的投影矩阵
        self.wq = nn.Linear(d_model, d_model)  # 查询向量变换
        self.wk = nn.Linear(d_model, d_model)  # 键向量变换
        self.wv = nn.Linear(d_model, d_model)  # 值向量变换
        # 输出线性层和Dropout
        self.fc_out = nn.Linear(d_model, d_model)
        self.dropout = nn.Dropout(dropout)
        # 缩放因子:1/sqrt(d_k)
        self.scale = torch.sqrt(torch.FloatTensor([self.head_dim]))
    def forward(self, query, key, value, mask=None):
        """
        前向传播
        参数:
            query: 查询张量 [batch_size, q_len, d_model]
            key: 键张量 [batch_size, k_len, d_model]
            value: 值张量 [batch_size, v_len, d_model]
            mask: 掩码张量 (可选) [batch_size, seq_len]
        返回:
            attention: 注意力输出 [batch_size, q_len, d_model]
            attention_weights: 注意力权重 [batch_size, num_heads, q_len, k_len]
        """
        batch_size = query.shape[0]
        # 1. 线性投影:将输入映射到Q,K,V空间
        Q = self.wq(query)  # [batch_size, q_len, d_model]
        K = self.wk(key)  # [batch_size, k_len, d_model]
        V = self.wv(value)  # [batch_size, v_len, d_model]
        # 2. 多头分割:将d_model维度分割为num_heads * head_dim
        # 维度变换: [batch_size, seq_len, d_model] ->
        #          [batch_size, seq_len, num_heads, head_dim] ->
        #          [batch_size, num_heads, seq_len, head_dim]
        Q = Q.view(batch_size, -1, self.num_heads, self.head_dim).permute(0, 2, 1, 3)
        K = K.view(batch_size, -1, self.num_heads, self.head_dim).permute(0, 2, 1, 3)
        V = V.view(batch_size, -1, self.num_heads, self.head_dim).permute(0, 2, 1, 3)
        # 3. 计算缩放点积注意力
        # Q @ K^T / sqrt(d_k)
        attention_scores = torch.matmul(Q, K.permute(0, 1, 3, 2)) / self.scale.to(Q.device)
        # 4. 应用掩码(如果提供)
        if mask is not None:
            # 将掩码扩展到注意力头的维度
            mask = mask.unsqueeze(1)  # [batch_size, 1, 1, k_len]
            print(attention_scores.shape, mask.shape)
            attention_scores = attention_scores.masked_fill(mask == 0, float('-inf'))
        # 5. 计算注意力权重 (softmax)
        attention_weights = F.softmax(attention_scores, dim=-1)
        attention_weights = self.dropout(attention_weights)
        # 6. 注意力加权值向量
        # [batch_size, num_heads, q_len, head_dim]
        attention_output = torch.matmul(attention_weights, V)
        # 7. 合并多个注意力头
        # [batch_size, q_len, num_heads, head_dim]
        attention_output = attention_output.permute(0, 2, 1, 3).contiguous()
        # [batch_size, q_len, d_model]
        attention_output = attention_output.view(batch_size, -1, self.d_model)
        # 8. 最终线性投影
        output = self.fc_out(attention_output)  # [batch_size, q_len, d_model]
        return output, attention_weights
代码三:无重复字符的最长子串

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        left = 0
        right = 0
        res = 0
        char_set = set()
        while right < len(s):
            if s[right] not in char_set:
                char_set.add(s[right])
                res = max(res, right - left + 1)
                right += 1
            else:
                char_set.remove(s[left])
                left += 1
        return res

那么,如何系统的去学习大模型LLM?

作为一名从业五年的资深大模型算法工程师,我经常会收到一些评论和私信,我是小白,学习大模型该从哪里入手呢?我自学没有方向怎么办?这个地方我不会啊。如果你也有类似的经历,一定要继续看下去!这些问题啊,也不是三言两语啊就能讲明白的。

所以我综合了大模型的所有知识点,给大家带来一套全网最全最细的大模型零基础教程。在做这套教程之前呢,我就曾放空大脑,以一个大模型小白的角度去重新解析它,采用基础知识和实战项目相结合的教学方式,历时3个月,终于完成了这样的课程,让你真正体会到什么是每一秒都在疯狂输出知识点。

由于篇幅有限,⚡️ 朋友们如果有需要全套 《2025全新制作的大模型全套资料》,扫码获取~
在这里插入图片描述

👉大模型学习指南+路线汇总👈

我们这套大模型资料呢,会从基础篇、进阶篇和项目实战篇等三大方面来讲解。
在这里插入图片描述
在这里插入图片描述

👉①.基础篇👈

基础篇里面包括了Python快速入门、AI开发环境搭建及提示词工程,带你学习大模型核心原理、prompt使用技巧、Transformer架构和预训练、SFT、RLHF等一些基础概念,用最易懂的方式带你入门大模型。
在这里插入图片描述

👉②.进阶篇👈

接下来是进阶篇,你将掌握RAG、Agent、Langchain、大模型微调和私有化部署,学习如何构建外挂知识库并和自己的企业相结合,学习如何使用langchain框架提高开发效率和代码质量、学习如何选择合适的基座模型并进行数据集的收集预处理以及具体的模型微调等等。
在这里插入图片描述

👉③.实战篇👈

实战篇会手把手带着大家练习企业级的落地项目(已脱敏),比如RAG医疗问答系统、Agent智能电商客服系统、数字人项目实战、教育行业智能助教等等,从而帮助大家更好的应对大模型时代的挑战。
在这里插入图片描述

👉④.福利篇👈

最后呢,会给大家一个小福利,课程视频中的所有素材,有搭建AI开发环境资料包,还有学习计划表,几十上百G素材、电子书和课件等等,只要你能想到的素材,我这里几乎都有。我已经全部上传到优快云,朋友们如果需要可以微信扫描下方优快云官方认证二维码免费领取【保证100%免费
在这里插入图片描述
相信我,这套大模型系统教程将会是全网最齐全 最易懂的小白专用课!!

您可能感兴趣的与本文相关的镜像

Qwen3-32B

Qwen3-32B

文本生成
Qwen3

Qwen3 是 Qwen 系列中的最新一代大型语言模型,提供了一整套密集型和专家混合(MoE)模型。基于广泛的训练,Qwen3 在推理、指令执行、代理能力和多语言支持方面取得了突破性进展

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值