高德 大模型算法开发 一面(暑期)

1. 自我介绍

2. 项目拷打

3. Perplexity 的定义、公式和真正的使用边界是什么

Perplexity 本质上是语言模型对测试序列平均不确定性的指数化表达。若测试集为(x1,…,xT),则

它等价于平均负对数似然的指数形式,值越低通常表示模型对数据分布拟合得越好。很多人只会背“越低越好”,但真正面试里要说明白:PPL 是训练分布拟合指标,不直接等价于问答质量、推理能力、事实性或者指令遵循能力。模型可能 PPL 更低,但在复杂推理或者对齐任务上不一定更强。

4. 为什么不同 tokenizer 下的 Perplexity 不能直接横向比较

因为 PPL 的分母是 token 数,而 token 的切分方式直接决定序列长度和条件概率分解路径。两个模型如果 tokenizer 不同,一个词可能被切成 1 个 token,也可能被切成 4 个 token,平均 log-likelihood 的统计单位已经变了,数值自然不可直接比较。更严谨的做法是比较同一 tokenizer 下的 PPL,或者把概率换算到统一的字符级、字节级甚至 bits-per-byte 指标上,否则“谁的 PPL 更低”这个结论很可能没有意义。

5. 多头注意力真正带来的表达增益是什么,为什么不是简单并行几次注意力

多头注意力的核心不在“并行”,而在“把表示投影到多个不同子空间里做关系建模”。单头注意力是在一个统一相似度空间里做匹配,多头则允许不同 head 学到不同尺度、不同方向、不同类型的相关性模式。有的 head 偏局部词法关联,有的偏长距离依赖,有的偏结构边界,有的偏位置关系。它的本质是一种子空间分解,而不是机械堆头数。

如果从线性代数角度讲,多头相当于把一个大的关系建模任务拆成多个低维投影后的关系建模,再把这些结果拼回去。这样提升的不是单次匹配能力,而是整体表示的可分解性和多样性。

6. 注意力分数为什么要除以\,不除会发生什么

如果 query 和 key 的每一维都近似独立且方差相近,那么它们点积的方差会随着维度 dk增大而线性变大。维度越大,未经缩放的点积数值就越容易变得很大,送进 softmax 后会迅速饱和,使得梯度集中在极少数位置上,训练不稳定。除以的作用就是把分数尺度拉回相对稳定的范围,避免 softmax 过早进入尖峰状态。

7. BERT 的掩码机制和 Decoder-only 的因果掩码机制本质差异是什么

BERT 的核心是双向建模,它通过 MLM 任务随机遮蔽部分 token,让模型在看到左右文的前提下恢复被 mask 的位置,因此训练目标是条件填空。Decoder-only 模型则使用严格的因果掩码,只允许当前位置看见自己之前的 token,训练目标是下一个 token 预测。这两种掩码差异带来的不是一点点实现区别,而是归纳偏置完全不同:前者擅长做编码、理解、匹配和判别,后者天然适合生成、续写和自回归推理。

import torch

def causal_mask(n):
    return torch.triu(torch.ones(n, n), diagonal=1).bool()

print(causal_mask(5).int())

8. RoPE 为什么能编码相对位置信息,长上下文外推时又为什么会失真

RoPE 的关键是把位置编码写进 query 和 key 的旋转变换里。旋转后两个位置向量的内积不仅依赖内容,还依赖相对位移,因此注意力天然带有相对位置信号。它的好处是无需显式学习一张绝对位置表,而且在一定范围内相对位置泛化不错。

但长上下文外推时会失真,因为训练中模型实际看到的位置频率范围是有限的,超过这个范围后旋转角度分布开始偏离训练分布,高频分量容易出现相位扭曲,最终导致远距离 token 的相似度结构被破坏。很多长上下文技巧本质上都在修这个频率外推问题,而不是简单把最大长度参数改大。

9. FlashAttention 为什么快,真正减少的是什么复杂度

FlashAttention 并没有改变标准注意力的理论算子结果,它主要减少的是 IO 复杂度 而不是算术复杂度。普通实现会显式构造巨大的 attention score 矩阵并频繁在 HBM 和 SRAM 之间搬运,显存读写代价极高。FlashAttention 的做法是分块计算,在片上内存中完成局部 softmax 统计和加权累积,避免中间大矩阵落到高带宽显存。GPU 上很多时候真正慢的不是 FLOPs 不够,而是搬数据太多,所以 IO-aware 才是它快的根本原因。

10. LoRA 的数学原理是什么,为什么低秩增量足以适配很多任务

LoRA 的核心是假设任务微调所需的权重更新 (\Delta W) 不需要满秩,而可以近似为两个低秩矩阵乘积:

于是原始权重变成

训练时冻结 W,只学 (A,B)。这样参数量和显存占用显著下降。它之所以有效,通常不是因为真实更新严格低秩,而是因为很多下游任务相对预训练模型只需要在少数主方向上做分布修正,低秩子空间已经足够表达这类偏移。

import torch

d, k, r = 8, 6, 2
W = torch.randn(d, k)
A = torch.randn(r, k, requires_grad=True)
B = torch.randn

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

AI-Agent面试实战专栏 文章被收录于专栏

本专栏聚焦 AI-Agent 面试高频考点,内容来自真实面试与项目实践。系统覆盖大模型基础、Prompt工程、RAG、Agent架构、工具调用、多Agent协作、记忆机制、评测、安全与部署优化等核心模块。以“原理+场景+实战”为主线,提供高频题解析、标准答题思路与工程落地方法,帮助你高效查漏补缺.

全部评论
这是问模型微调吗
点赞 回复 分享
发布于 昨天 22:05 辽宁
感觉问的还挺多的呢
点赞 回复 分享
发布于 昨天 18:45 北京

相关推荐

AI时代还有必要刷lee...
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务