算法八股总结
算法八股总结
1.交叉熵和最大似然的区别:
- 最大似然估计(MLE)是一种参数估计方法,思想是找到让观测数据最可能出现的模型参数。
- 交叉熵(Cross-Entropy)是一种衡量两个概率分布差异的指标,目标是最小化两个概率分布的差异。
- MLE目标:最大化似然函数(在给定参数和输入条件下,输出概率最大),交叉熵目标,极小化交叉熵损失。
- 当交叉熵损失的网络用softmax输出概率分布,交叉熵损失等价于负对数似然。
2.梯度爆炸和梯度消失:
- 反向传播时,梯度累乘导致靠近输入层的参数梯度过大,参数更新幅度大。
- 常见原因有:参数初始化值较大、循环神经网络的长期依赖、某些激活函数(ReLU)输出值过大。
- 导致:参数更新不稳定、模型loss剧烈波动或者NaN,模型无法收敛。
- 解决办法:梯度裁剪、合适的初始化方法(Xavier(tanh/sigmoid)、He初始化(ReLU))
- 反向传播时,梯度累乘导致靠近输入层的参数梯度很小,参数几乎无法更新,浅层特征难以学习。
- 常见原因有:参数初始值过小、激活函数导数较小(sigmoid、tanh大部分区间导数接近0)。
- 导致:浅层参数无法更新,数据浅层特征无法被学习,模型收敛极慢。
- 解决办法:批归一化、残差连接等。
3.正则化:
- 用于防止模型过拟合。
- 在模型的损失函数中增加一个惩罚项,限制模型的参数大小,从而限制模型复杂度(参数量与维度、网络深度与宽度)。
- 参数正则化:L1正则化(对参数的绝对值求和)和L2正则化(对参数的平方求和)。
- 结构正则化:Dropout、早停、权重共享、决策树剪枝。
- Dropout:训练时让部分神经元输出为0,防止神经元过度依赖特定输入。测试时不使用Dropout,而是将所有神经元输出按失活概率缩放,如输出乘以0.5。
- 早停:模型在验证集上连续多轮不再提升性能,提前结束训练。
- 权重共享:CNN、RNN、Transformer等,强制不同位置的参数使用相同的值,大幅减少参数量,降低模型复杂度,利用数据的局部相关性。
- 决策树剪枝:预剪枝(限制树的深度)、后剪枝(删除冗余分支)。
4.Softmax和Sigmoid的区别:
- Sigmoid常用于二分类任务和激活函数,将数值映射到0-1区间,x=0时,值为0.5。不改变数据分布,所以可以用来作为激活函数,但是输入较大或较小时,梯度接近零,容易导致梯度消失。
- Softmax常用于多分类任务,将数值映射到0-1区间,同时所有输出得和为1,改变了数据的分布,因此不能作为激活函数。
- 中间层的目标是学习数据的特征表示,需要保留足够的信息(正负值,相对大小),Softmax会改变数据分布,可能丢失了数值的原始特征差异。如,两个相差较大的输入经过Softmax后可能变得接近,掩盖了原始差异。
5.LayerNorm和BatchNorm的区别:
- LayerNorm是对单个样本的所有特征在同一层内进行归一化。
- 例如对于一个N x C x H x W的图像,对于每个样本n,计算该样本在所有通道、空间位置上的均值和方差,然后进行归一化操作(x减去均值除以根号方差+系数)。
- 对单个样本的所有特征做标准化,消除同一样本内不同特征的分布差异。
- BatchNorm是对同一批次内所有样本在每个特征维度上进行归一化。
- 例如对于一个N x C x H x W的图像,对于每个通道c,计算批次内所有样本在该通道上的均值和方差,然后进行归一化操作。
- 对同一批样本的同一特征做标准化,消除不同样本在该特征上的分布差异。
- BatchNorm对批次大小强依赖,大小越小,效果越差,等于1时失效,LayerNorm不依赖。
- BatchNorm适合CNN等空间特征固定、批次稳定的模型,LayerNorm适合RNN/LSTM/Transformer等序列长度可变,样本独立性强的模型。
- BatchNorm可能会引入跨样本噪声,LayerNorm不会引入跨样本干扰。
- 可以根据批次内各样本特征之间的“相关性”来区分使用。
6.DIN(Deep interest Network) 阿里18年提出的推荐系统:
主要思想是用注意力机制来融合用户变长的特征数量。例如有的用户可能浏览5个商品,有个用户可能浏览3个商品,传统方法是通过求和或者平均的方式,将商品向量融合,然后使用MLP和Sigmoid输出点击概率,预测用户点击推荐商品的概率。
使用注意力机制,更能在融合特征向量的时候,自动关注不同商品间的重要性。
框架图如下:

代码为:DIN代码
7.NCE(Noise Contrastive Estimation Loss,噪声对比估计损失)
为了解决传统分类任务中,类别数过大 C > 10^5,softmax计算开销太大的问题。
核心思想:在“噪声分布中”采样 K 个负样本,来与真实样本进行二分类任务。相当于采样几个代表样本,来与真实样本进行区分,这样就不用将所有样本来拿比对。
使用逻辑回归来构建损失函数。
损失不是标准的交叉熵损失,因为负样本只是挑选的 K个 “噪声样本”,不是全体负样本的概率分布。单个样本的正负类别概率和不为1,因此不能用标准的交叉熵损失,正是因为这种特性,避免了高额的“归一化”计算开销。
优化目标是让正例分数尽可能高,负例分数尽可能低。

8.AUC(Area Under the ROC Curve,ROC 曲线下面积)
- AUC 的取值范围在 [0, 1],其数值大小反映模型的 “区分能力”,数值越靠近1模型区分能力越强,数值靠近0.5,模型区分能力与随机猜测相同。
- 本质上模型随机抽取一个正样本和一个负样本,对正样本输出分数大于负样本输出分数的概率。
- ROC曲线以假正例率(FPR)为横轴,真正例率(TPR)为纵轴,描述不同分类阈值下模型的表现能力。
- 真正例率(TPR)本质是:正样本中被正确预测为正的比例。
- 假正例率(FPR)本质是:负样本中被错误预测为正的比例。

9.F1-score
适用于正负样本不均衡的场景,综合了精确率(Precision)和召回率(Recall),通过调和平均的方式平衡二者的权重,适用于需要同时关注 “减少误报” 和 “避免漏报” 的场景。
精确率:衡量模型预测为正例的样本中,实际为正例的比例,如在垃圾邮件识别中,精确率高表示为被标记为垃圾邮件的邮件中,真正为垃圾邮件的比例高。
召回率:衡量实际为正例的样本中,被模型预测为正例的比例,例如在癌症筛查中,召回率高表示为所有真正患癌症的人中,被检测出的比例高。
混淆矩阵:
| 实际标签/预测标签 | 预测为正例 | 预测为负例 |
| :———————-: | :—————————————: | :—————————————: |
| 实际为正例 | TP(True Positive,真正例) | FN(False Negative,假负例) |
| 实际为负例 | FP(False Positive,假正例) | TN(True Negative,真负例) |计算公式:

- 调和平均性质: 对较小值更敏感。只有当 P 和 R 都较高时,F1 才会较高;若其中一个很低,即使另一个很高,F1 也会偏低。
10.BCE(Binary Cross-Entropy,二元交叉熵)
计算公式如下:
-

(y_i) 是第 i 个样本的真实标签(0 或 1);
y^_i 是模型对第 i 个样本的预测概率(属于正例的概率)

11.infoNCE Loss(Information Noise Contrastive Estimation Loss,信息噪声对比估计损失)
- infoNCE是自监督学习领域的核心损失函数之一,专门用于从无标签数据中学习有效特征表示。
- 核心思想:对比相似样本和不相似样本来最大化“正样本对”之间的互信息,最小化“负样本对”之间的互信息。
- 互信息衡量两个变量之间的“共享信息量”,两个样本相似互信息较大,不相似,互信息较低。
- 公式:

- 温度系数相当于是缩放了相似度分数,这种缩放通过指数函数之后,会把数值差异放大。核心作用是调节模型对“相似度差异的敏感程度”。

- 温度系数越小,分布越尖锐,模型对相似度的微小差异越敏感,要求正例会负例的区分更加严格。系数接近0时,效果接近one-hot分类(正例分数特别大接近1,负例分数特别小,接近0)。
- 温度系数越大,分布越平缓,模型对差异的容忍度越高,避免过度关注噪声。系数接近无穷大时,效果接近均匀分布(所有样例的分数都相同)。
- 代码:

12.Transformer
Transformer 是2017年《Attention is all you need》中提出的一种基于自注意力机制的序列神经网络模型。是 BERT、GPT 等预训练模型的核心架构。
主要解决的问题是传统序列模型中的两个缺陷:并行性差,无法有效利用GPU并行加速;长距离依赖捕捉弱,长序列中的信息容易衰减,难以捕捉远距离词之间的关系。
Transformer 通过多头自注意力实现高效并行,通过注意力权重对全局信息进行建模,不受序列长度限制。
主要结构:由编码器 (Encoder) 和解码器 (Decoder) 组成。编码器主要用于将输入序列转换为包含全局上下文信息的向量表示;解码器主要用于基于向量表示和已生成的部分输出,逐步生成目标序列。
编码器细节:自注意力机制、多头注意力、前馈神经网络、残差连接和层归一化。
自注意力机制:核心思想是加权求和,具体实现是 Q、K、V 三个向量之间的运算。其中,Q 是查询向量,主要用来表示当前处理到的”元素“;K 是键向量,主要用来代表其他元素,相当于每个元素的”自我介绍“;V 是值向量,是真正的元素信息内容。加权求和由下式计算得出:
除以根号 d 可以缩放数值,防止数值过大导致梯度爆炸。Q、K、V 是由序列嵌入通过线性变换计算出来的,因为都是通过同一个序列变换而来,所以叫做自注意力。
多头注意力:计算出不同的 Q、K、V 就可以得到不同的头,每个头并行计算自注意力,最后将所有头的结果拼接,并线性变换,得到最终输出。不同的头可以捕捉不同类型的依赖(语法依赖、语意依赖),提升模型表达能力。
残差连接和层归一化:每个子层(多头自注意力、前馈网络)的输出都会经过残差连接和层归一化。残差连接子层输入和子层输出,可以缓解梯度消失,保留原始信息。层归一化会对每个样本的特征维度进行归一化(均值为0,方差为1),稳定训练过程,加速收敛。
解码器细节:掩码多头注意力、编码-解码器注意力、前馈神经网络、残差连接和层归一化。
掩码多头注意力:与编码器的自注意力类似,但是增加了掩码(Mask)。在计算 Softmax 前,将序列中“未来位置”的注意力权重设置为负无穷(Softmax 后为0)。确保解码器生成序列时,只能依赖已生成的内容,避免“偷看”未来信息。
编码-解码器注意力:让解码器关注编码器的输出和目标序列(已生成部分)的关系。Q 来自于解码器的掩码自注意力输出(目标序列已生成的部分),K 和 V 来自编码器的最终输出。
位置编码:因为Transformer没有循环结构,无法天然捕捉序列的顺序信息,因此需要手动添加位置编码。从位置0开始,计算出一个位置向量,与嵌入向量相加。
13.BERT(Bidirectional Encoder Representations from Transformers)
- 是Google在2018年提出的预训练语言模型,基于 Transformer 的编码器结构,通过双向预训练,让模型学习通用的语言表示。主要创新点在于“双向性”,模型能够同时利用上下文的信息(左到右和右到左)。
- BERT的输入由三部分组成:词嵌入、句子信息、位置信息。

- 词嵌入:对句子进行分词,分词后构建词向量表,将词转换为向量。使用Word Piece 分词,对于未登录词还会拆分为子词,如:playing = play + ing。还会在初始位置加上[CLS]标签,该标签用于表示整个句子的语义,每个句子结尾加上[SEP]结尾标签。
- 句子信息:用于区分该词位于哪个句子。例如,第一个句子的词(包括[CLS]和[SEP])的 Segment Embedding 都是0,第二个句子的 Segment Embedding 都是1。
- 位置信息:与 Transformer 的三角函数固定编码不同,BERT的位置编码采用可学习矩阵,例如 BERT 的最大序列长度为512,BERT-Base的向量维度为768,学习一个(512,768)的位置编码矩阵,每个序列位置对应矩阵的每一行。
- [CLS]标签:[CLS]标签相较于其他词而言,它本身不带有任何信息,而其他词虽然会通过注意力机制融入所有词的信息,但是本身的词嵌入信息仍是最多的。[CLS]标签融入其他词信息,且本身不带有信息,所以更能代表整个句子。
- BERT-base使用了12层Transformer的Encoder,12个注意力头,768的隐层维度;BERT-large使用了24层的Transformer Encoder,16个注意力头,1024的隐层维度。
- BERT的预训练任务:BERT通过两个无监督预训练任务,在大规模语料库上学习语言规律。第一个任务是掩码语言模型(Masked Language Model, MLM),第二个任务是下一句预测(Next Sentence Prediction, NSP)。
- 掩码语言模型:具体任务设计是随机选择输入序列中15%的 token 进行掩码(替换),让模型预测被掩码的 token 。替换规则为:80%概率被替换为特殊符号 [MASK] ,10%概率被替换为随机 token,10%概率保持原token不变。该任务可以使得模型学习双向上下文信息(需要结合左右文预测被掩码的词),是BERT双向性的核心来源。
- 设计原因:不用100%MASK,是因为如果把 Token 全部 MASK 的话,这个位置就没有该词的信息,导致在微调阶段,模型没有见过这个词;使用10%随机 Token 是因为,可以增加当前位置的噪声信息,让模型不要过分关注当前词的信息(即记住当前词),而是要多利用上下文信息来推理当前位置的词;使用10%保持原 Token 不变是因为微调的时候,输入的是完整的句子,词没有被 MASK,预训练中使用的是 MASK,可以降低预训练和微调中的输入不匹配问题。
- 下一句预测:具体任务设计是输入一队句子(A和B),让模型判断 B 是否是 A 在原文中的下一句(50% 概率为真,50% 概率为假,假样本由随机句子组成)。该任务可以让模型学习句子之间的逻辑关系(如因果、转折、并列等),增强对句级语义的理解。
- BERT微调:BERT 可以在预训练之后,通过微调适配具体NLP任务。例如:文本分类(在
[CLS]token 的输出后加全连接层,预测类别)、句对匹配(同文本分类,利用[CLS]输出判断句对关系)、命名实体识别等(对每个 token 的输出加分类层,预测实体标签(如人名、地名))。 - 优点:使用双向 Transformer 实现了双向预训练,显著提升上下文理解能力;通过统一的微调模式适配几乎所有的NLP任务,简化模型设计。
- 缺点:参数量大,预训练和微调需要大量计算资源;原始 BERT 支持的最大序列长度是 512 token,对超长文本处理不便;NSP 任务效果不好,mask 任务可能和下游任务不匹配。
14.分组 AUC(Grouped Area Under Curve, GAUC)
核心思想是对每个用户的正负样本单独计算AUC值,并根据用户的行为数据量进行加权平均。
计算公式为:
N_u 代表第 u 名用户的交互数量,AUC_u代表每个用户的AUC值。
优点:可以解决”样本分布偏差“,更加关注”个体公平性”。广告/推荐场景的核心目标是为每个用户都提供精准推荐,而非对全局样本的平均精确度高。GAUC比全局AUC更能真实反应模型推荐效果。全局AUC最大缺陷是:受用户活跃度、正负样本比例等分布偏差影响极大。全局AUC会被活跃用户的预测结果“主导”,无法区分“高正例率的用户精确度”和“低正例率用户的精确度”。
15. 多臂老虎机(Multi-Armed Bandit, MAB)
- 多臂老虎机是一种经典的“探索-利用”问题模型。假设面前有 K 台老虎机,每台老虎机的奖励分布不同且未知,你需要通过多次拉动不同机器的拉杆,在“利用已知最优机器(最大化短期奖励)”和”探索其他机器(发现更优选择,最大化长期奖励)“之间找到平衡,最终实现总奖励最大化。
- 多臂老虎机解决方法有三个核心组成部分:臂、奖励分布、探索-利用策略。
- 臂:对应老虎机的拉杆,在实际应用中一个臂代表一个可选择的决策选项。如推荐系统中,3个臂代表3个候选商品;广告投放中,4个臂代表4个广告文案。
- 奖励分布:每个臂对应有一个未知的奖励概率分布,拉动该臂后会从这个分布中随机产生一个奖励值。常见有两种奖励分布:伯努利分布(0-1奖励),奖励只有两种,0和1,例如用户点击广告或用户不点击广告,此时奖励期望就是该广告的点击概率;高斯分布(连续奖励), 奖励是连续值,例如用户点击商品后的购买金额,此时奖励期望就是该广告的平均购买金额。关键在于:每个臂的奖励期望是固定的,但初始未知,这也是 “探索” 的必要性(需要通过尝试估计期望)。
- 探索-利用策略:探索和利用是MAB的核心矛盾,也是所有算法要解决的核心问题。
- 利用: 选择当前已知”奖励期望最高“的臂,最大化当前奖励。风险是:可能存在其他未探索的臂,其真实期望更高,长期会损失总损失。
- 探索:选择当前已知“奖励期望不高”的其他臂,通过更多尝试来更准确估计其真实期望。风险是:短期会获得较低的奖励,甚至一直探索“差”臂。
- ε- 贪心算法(ε-Greedy):核心思想是利用固定概率 ε 进行探索,以 1 - ε 概率进行利用。参数 ε 控制探索强度,通常取较小值如(0.1或0.05)。通常初期应该用较大的 ε 鼓励探索,后期应该用较小的 ε 鼓励利用。
- 上限置信区间(Upper Confidence Bound, UCB):核心思想是通过“置信区间”量化“估计值的不确定性”,选择估计期望 + 不确定性上限最大的臂,优先探索不确定性高且估计期望不低的臂。霍夫丁不等式规定,真实期望大于(估计期望 + 不确定性)的概率不大于 1 - p,若给定的 p 很小,则真实期望有很大概率不大于(估计期望 + 不确定性),因此(估计期望 + 不确定性)就是期望上限。

- 优点:探索有明确导向,不浪费在已知差臂上,性能好。缺点:计算稍复杂(要维护每个臂的拉动次数和估计期望)。
- 汤普森采样(Thompson Sampling, TS):核心思想是基于贝叶斯概率,通过后验分布描述对每个臂奖励期望的信念,每次选择前,从每个臂的后验分布中随机采样一个可能的奖励期望,选择采样值最大的臂。

- 优点:天然适合贝叶斯框架,能利用先验知识,对“非平稳环境适应性强”,实际业务中常优于UCB(尤其数据量大时)是工业界推荐系统、广告投放的主流算法。
- 缺点:要理解贝叶斯概率和共轭先验 ,对“高维奖励分布”(非Beta/高斯)计算成本高。
16. Pointwise/Pairwise Loss:
在排序任务中,Pointwise Loss(逐点损失)和 Pairwise Loss(成对损失)是两类核心的损失函数设计思路,二者的核心区别在于优化目标的粒度:Pointwise 针对单个样本的预测结果优化,Pairwise 针对样本对的相对顺序优化。
Pointwise Loss(逐点损失):核心思想是把排序问题转换为“单个样本的标签预测问题”,对每个样本独立计算损失。不考虑样本间的相对关系。
原理:每个样本有一个绝对相关性标签(如 0 = 不相关、1 = 一般相关、2 = 高度相关),模型的目标是让单个样本的预测得分(如模型输出的 logits)尽可能接近其真实标签。
典型损失函数:若标签是离散级(如0-5的相关性评分),常使用交叉熵损失。把排序转换为多分类任务(预测样本属于哪个相关性等级);若标签是连续值(如用户点击概率的连续估计):常使用均方误差或平滑L1损失,把排序转换为“回归任务”(预测样本的相关性分数)。
示例:假设样本 A 的真实相关性标签是 2(高度相关),样本 B 的标签是 0(不相关)。Pointwise Loss 会分别计算 “模型对 A 的预测分与 2 的差距” 和 “模型对 B 的预测分与 0 的差距”,总和即为总损失。即使模型预测 A 得 1、B 得 1.5(A 的预测分低于 B,违背排序逻辑),Pointwise 仍会仅关注 “1 与 2 的差距” 和 “1.5 与 0 的差距”,不会直接惩罚 “A 排在 B 后面” 的错误。
优点:计算简单高效,只需要对单个样本计算损失即可,无需构建样本对;兼容性强,可以直接复用分类/回归模型的架构,无需专门设计排序模型结构;对标签要求低**,仅需单个样本的绝对标签,无需标注样本间的相对关系,标签获取成本低。
缺点:仅优化单个样本的绝对得分,不考虑样本间的相对顺序 ,可能出现 “模型预测分符合绝对标签,但相对顺序错误” 的情况(如 A 得 1、B 得 1 的例子),最终排序效果不佳;对标签分布敏感,如果相关性标签分布不均,Pointwise 会偏向于优化多数类样本的损失,导致少数高相关样本评分被打低。
适用场景:数据量极大、训练速度要求高的场景(推荐系统的召回层、需要快速筛选出万级候选集)、标签只能获取单个样本绝对相关性的场景(无法标注样本对)、排序任务的初步优化。
Pairwise Loss(成对损失):核心思想是直接优化样本对的相对顺序,针对 “正样本(更相关)应排在负样本(更不相关)前面” 这一规则设计损失,不关注单个样本的绝对得分。
原理:对于任意一个 “正样本((x+), 相关性更高)” 和 “负样本((x-, 相关性更低))”,模型对(x+)的预测得分(s+)必须大于对(x-)的预测得分(s-);若(s+ <= s-),则产生损失。
典型损失函数:铰链损失(Hinge Loss)、逻辑损失(Logistic Loss)、贝叶斯个性化排序损失(BPR Loss)。
铰链损失(Hinge Loss):最经典的Pairwise损失,常用于SVM排序模型, 公式为:
若 $ s+ - s- \gt 1
s+ - s- \le 1 1 - (s+ - s-) $,强制模型拉大两者得分差距。 逻辑损失(Logistic Loss):基于逻辑回归的思想,将$s+ \gt s-$转换为概率问题,公式为:
若$s+\gts-,(s+-s-)\gt0
s+\lts-,(s+-s-)\lt0$,损失趋近正无穷,惩罚力度更加平滑(相比于Hinge Loss不容易受到异常值影响)。 贝叶斯个性化排序损失(BPR Loss):专为推荐系统设计的Pairwise损失(基于用户偏好的个性化排序),公式为:
核心是最大化用户偏好x+而非x-的概率,与Logistic Loss类似,但更强调个性化场景(如同一商品对不同用户的相关性不同)。
优点:更加贴合排序核心目标,直接优化样本对的相对顺序,避免了Pointwise绝对得分正确但是顺序错误的问题,排序效果通常优于Pointwise(尤其在精排阶段);对标签分布的鲁棒性更强,无需依赖绝对标签的分布,仅关注样本对的相对关系,即使高相关性样本极少,也能有优化其排序位置。
缺点:计算成本高,需要构建大量样本对(如 N 个样本,理论上可以构建 N(N - 1) / 2 对),训练时数据会急剧膨胀;样本对构建容易引入噪声,若样本对构建不合理(如把轻微相关和高度相关样本强行作为正负对),会导致模型优化方向偏差,反而降低排序效果;对标签要求高,需要明确样本间的相对相关性。



