互联网大厂算法工程师面试题汇总与核心原理解析
本文整理了科大讯飞、小米、百度等互联网大厂的算法工程师面试真题,涵盖自然语言处理、大模型架构、深度学习框架及经典算法题。内容旨在帮助求职者深入理解技术原理,提升面试通过率。
一、科大讯飞 NLP 方向 AI 算法工程师
问题 1:jieba 分词的原理
jieba 分词是一款流行的中文文本分词工具,其核心基于词频统计和词典匹配。主要实现机制包含以下几点:
- 前缀词典与 DAG 构建:利用前缀词典对句子进行扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)。这避免了暴力穷举,提高了效率。
- 动态规划查找最大概率路径:在 DAG 上采用动态规划算法,找出基于词频的最大概率切分组合,确保分词结果最符合语言习惯。
- 未登录词处理:对于词典中不存在的词,采用基于汉字成词能力的 HMM(隐马尔可夫)模型,结合 Viterbi 算法进行识别,有效解决新词发现问题。
问题 2:word2vec 的原理及训练方式
word2vec 是一种将词语映射为稠密向量表示的模型,核心思想是通过预测上下文或目标词来学习词向量。它包含两种主要训练架构:
- CBOW(Continuous Bag-of-Words):给定一个窗口大小,将目标词的上下文词作为输入,预测目标词本身。输入是上下文词向量的累加,通过浅层神经网络训练得到词向量。
- Skip-gram:给定一个目标词,将其作为输入,预测其上下文词。相比 CBOW,Skip-gram 在处理低频词时表现更好。
训练细节:通常使用大规模语料库迭代训练,采用梯度下降优化参数。为了加速训练,常引入负采样(Negative Sampling)或层次 Softmax 替代全连接层输出计算。
问题 3:ChatGPT 是怎么训练出来的
ChatGPT 基于 GPT-3.5 架构,训练过程分为两个关键阶段:
- 预训练(Pre-training):使用海量互联网文本数据(网页、书籍、维基百科等),通过自监督学习让模型掌握语言模式。任务包括掩码语言建模(MLM)或下一词预测(Next Token Prediction),使模型具备基础的语言理解和生成能力。
- 微调(Fine-tuning):
- 有监督微调(SFT):使用人工编写的对话数据集,由人类操作员扮演用户与模型交互,生成高质量问答对,调整模型参数以适应对话场景。
- 强化学习(RLHF):虽然文中未详述,但 ChatGPT 实际还引入了人类反馈强化学习,通过奖励模型对齐人类价值观,进一步提升回答质量。
问题 4:BERT 模型简述
BERT(Bidirectional Encoder Representations from Transformers)是基于 Transformer 编码器架构的预训练模型。与传统单向语言模型不同,BERT 采用双向编码器,同时利用左侧和右侧上下文信息。
- 预训练任务:
- 掩码语言建模(MLM):随机掩盖部分词,要求模型根据上下文预测被掩盖的词。
- 下一句预测(NSP):判断两个句子是否连续(注:Bert 后续版本如 RoBERTa 已移除 NSP)。
- 下游应用:通过微调,BERT 可广泛应用于文本分类、命名实体识别、问答系统等 NLP 任务。
问题 5:PyTorch 中的 train 和 eval 模块
在 PyTorch 中,train() 和 eval() 用于切换模型的训练与评估状态:
- train() 模式:启用 Dropout 和 BatchNorm 的训练行为。每次迭代计算损失,执行反向传播更新参数。需配合优化器和学习率调度器使用。
- eval() 模式:关闭 Dropout 和 BatchNorm 的动态特性,固定权重。用于验证集或测试集推理,通常配合
torch.no_grad() 上下文管理器以节省显存并加速计算。
问题 6:Python 中字典的结构及实现方式
Python 字典(Dictionary)是可变数据结构,存储键值对(key-value pairs)。
- 底层实现:基于哈希表(Hash Table)。键经过哈希函数转换为固定整数索引,直接定位内部数组位置。
- 特性:键唯一且不可变,值可重复。支持 O(1) 平均时间复杂度的查找、插入和删除操作。
- 冲突处理:Python 字典采用开放寻址法处理哈希冲突,当发生碰撞时寻找下一个可用槽位。
问题 7:无序数组取前 10 个最大的数
针对无序数组取 Top K 最大值,有两种常见策略:
- 全排序:使用快速排序或堆排序,时间复杂度 O(n log n)。代码示例:
nums = [3, 1, 9, 5, 8, 2, 7]
sorted_nums = sorted(nums, reverse=True)
top_10 = sorted_nums[:10]
- 最小堆优化:维护一个大小为 K 的最小堆,遍历数组,若当前元素大于堆顶则替换并调整堆。时间复杂度 O(n log k),适合 K 远小于 n 的场景。
二、小米 AIGC 大模型岗位
问题 1:Transformer 的原理
Transformer 是序列建模的基石,主要组件包括:
- 自注意力机制(Self-Attention):计算序列中每个位置与其他所有位置的相关性得分,捕捉长距离依赖关系。
- 位置编码(Positional Encoding):由于 Transformer 并行处理无循环结构,需注入位置信息以区分词语顺序。
- 多头注意力(Multi-Head Attention):并行运行多个注意力头,关注不同子空间特征,增强模型表征能力。
- 前馈神经网络(FFN):每个注意力层后接全连接网络,进一步变换特征。
- 残差连接与层归一化:每层后添加残差连接防止梯度消失,并使用 LayerNorm 稳定训练。
问题 2:微调方法 P-Tuning V2 的原理
P-Tuning V2 是对 P-Tuning V1 的改进,旨在更高效的参数微调:
- 深层 Prompt 注入:在每一层都加入可学习的 Prompt tokens,而非仅输入层,使深层结构能更直接影响预测。
- 去除重参数化编码器:实验表明重参数化对小模型效果有限且影响性能,故移除。
- 动态提示长度:针对不同任务搜索最佳提示长度,适应不同语义需求。
- 多任务学习:支持先在多任务 Prompt 上预训练,再适配下游任务,缓解连续提示的随机惯性问题。
问题 3:什么是 BiLSTM-CRF
BiLSTM-CRF 是序列标注任务的经典模型,结合了 BiLSTM 的特征提取能力和 CRF 的全局约束。
- BiLSTM:双向长短期记忆网络,同时捕捉正向和反向语境信息,提取序列特征。
- CRF:条件随机场,对标签序列进行全局建模,利用标签间的转移约束(如不能出现非法标签组合),提高标注一致性。
- 流程:BiLSTM 输出发射分数,CRF 计算转移分数,联合解码最优路径。
问题 4:代码题——两数之和
给定整数数组 nums 和目标值 target,返回和为目标值的两个整数的下标。
解法:使用哈希表存储遍历过的数字及其下标,一次遍历即可找到配对。
def two_sum(nums, target):
seen = {}
for i, num in enumerate(nums):
complement = target - num
if complement in seen:
return [seen[complement], i]
seen[num] = i
return []
时间复杂度 O(n),空间复杂度 O(n)。
三、百度算法工程师
问题 1:LoRA 的原理
LoRA(Low-Rank Adaptation)是一种参数高效微调方法。
- 核心思想:在原始预训练模型参数 $W$ 旁增加旁路,分解为低秩矩阵 $A$ 和 $B$,即 $ ilde{W} = W + BA$。
- 训练策略:冻结原始 PLM 参数,仅训练降维矩阵 $A$ 与升维矩阵 $B$。
- 初始化:$A$ 用随机高斯分布初始化,$B$ 用零矩阵初始化,保证初始状态不变。
- 优势:大幅减少可训练参数量,降低显存占用,适用于大模型部署。
问题 2:GBDT 的原理
GBDT(Gradient Boosting Decision Tree)是集成学习算法。
- 迭代修正:通过迭代训练决策树,每一轮拟合前一轮的残差(目标值与预测值之差)。
- 加法模型:最终模型是所有树的线性组合,逐步减小损失函数。
- 扩展:XGBoost、LightGBM 等是其工程优化版本,引入正则化和二阶导数优化。
问题 3:翻译任务一般用什么架构
机器翻译主要采用 Seq2Seq(Sequence-to-Sequence)架构。
- 主流方案:基于 Transformer 的 Encoder-Decoder 结构。
- 机制:Encoder 将源语言编码为上下文向量,Decoder 利用自注意力机制和交叉注意力机制生成目标语言序列。
- 演进:从 RNN-LSTM 到 Transformer,再到带稀疏注意力的架构,显著提升了翻译质量和速度。
问题 4:Encoder-only, Decoder-only, Encoder-decoder 的区别
- Encoder-only:仅编码器,输出固定维度表示,用于分类、检索等判别式任务(如 BERT)。
- Decoder-only:仅解码器,自回归生成输出,用于文本生成任务(如 GPT 系列)。
- Encoder-decoder:双结构,用于序列到序列任务,如机器翻译、摘要生成。
问题 5:Transformer 的结构详解
Transformer 由编码器和解码器堆叠而成,核心是自注意力机制。
- 层结构:每层包含多头自注意力子层和前馈网络子层,均配有残差连接和层归一化。
- 连接方式:编码器与解码器之间通过交叉注意力(Cross-Attention)连接,解码器接收编码器的输出作为 Key/Value。
- 并行性:除自回归生成外,大部分计算可并行,训练效率高。
问题 6:Flash Attention 的原理
Flash Attention 旨在优化 Attention 计算的 GPU 内存 IO。
- 核心思想:通过分块(Tiling)技术,将矩阵运算切分为小块,减少 GPU HBM(高带宽内存)与 SRAM 之间的读写次数。
- IO 感知:避免中间激活值的显存溢出,直接在片上内存完成 softmax 计算,显著提升训练速度和显存利用率。
问题 7:FP32 和 FP16 的区别,混合精度原理
- FP32:32 位浮点数,精度高,占用 4 字节,标准训练格式。
- FP16:16 位浮点数,占用 2 字节,精度较低但计算快,显存占用减半。
- 混合精度训练:同时使用 FP16 和 FP32。参数和梯度主副本用 FP16 计算,累积值用 FP32 保持精度,通过 Loss Scaling 防止梯度下溢。此法可加速训练并减少显存消耗。
问题 8:Beam Search 的原理
Beam Search 是序列生成中的搜索算法。
- 工作机制:每一步保留概率最高的 K 个候选序列(Beam Width),扩展这些候选直到生成结束。
- 剪枝:局部剪枝搜索空间,平衡广度与深度,比贪婪搜索(Greedy Search)更能找到全局较优解。
- 温度系数:常配合 Temperature 参数调整概率分布的平滑度,控制生成的多样性。
总结
以上题目涵盖了算法工程师面试的核心知识体系。建议求职者不仅背诵答案,更要理解背后的数学推导与工程实现细节。持续跟进大模型前沿技术(如 MoE、RAG 等),并结合实际项目经验,方能在面试中脱颖而出。