【入门】搜索

一、评估指标体系

评估指标是面试中必考的基础,需要彻底理解其含义和局限性。

1.1 基础混淆矩阵

对于一个搜索查询,每篇文档可以归为四类:

  • TP (True Positive):相关且被检索到
  • FP (False Positive):不相关但被检索到
  • TN (True Negative):不相关且未被检索到
  • FN (False Negative):相关但未被检索到

精确率(Precision)------检索到的文档中,真正相关的比例:

P=TPTP+FPP = \frac{TP}{TP + FP}P=TP+FPTP

召回率(Recall)------所有相关文档中,被检索到的比例:

R=TPTP+FNR = \frac{TP}{TP + FN}R=TP+FNTP

F1 Score------P 和 R 的调和平均(调和平均对极端值惩罚更重):

F1=2⋅P⋅RP+R=2TP2TP+FP+FNF_1 = \frac{2 \cdot P \cdot R}{P + R} = \frac{2TP}{2TP + FP + FN}F1=P+R2⋅P⋅R=2TP+FP+FN2TP

Fβ Score ------允许调整对精确率和召回率的偏重,β>1\beta > 1β>1 更重视召回,β<1\beta < 1β<1 更重视精确率:

Fβ=(1+β2)⋅P⋅Rβ2⋅P+RF_\beta = (1 + \beta^2) \cdot \frac{P \cdot R}{\beta^2 \cdot P + R}Fβ=(1+β2)⋅β2⋅P+RP⋅R

注意精确率与召回率的权衡:一般情况下二者存在 trade-off,提高召回率会降低精确率。比如把所有文档都返回,召回率为1但精确率很低。搜索场景往往更关注 Top-K 精确率(用户只看前几个结果),推荐场景有时更关注召回率(不遗漏好内容)。


1.2 排序专用指标

搜索不只是"找到相关文档",还需要"把最相关的放在最前面",所以需要考虑位置因素的指标。

MRR(Mean Reciprocal Rank)

适用于只有一个正确答案的场景(如问答、实体检索)。rankirank_iranki 是第 iii 个查询中第一个相关结果的位置:

MRR=1∣Q∣∑i=1∣Q∣1rankiMRR = \frac{1}{|Q|} \sum_{i=1}^{|Q|} \frac{1}{rank_i}MRR=∣Q∣1i=1∑∣Q∣ranki1

例子 :三个查询,相关结果分别在位置 1、2、4,则 MRR=13(11+12+14)=712≈0.583MRR = \frac{1}{3}(\frac{1}{1} + \frac{1}{2} + \frac{1}{4}) = \frac{7}{12} \approx 0.583MRR=31(11+21+41)=127≈0.583。

AP(Average Precision)

AP 考虑了多个相关文档的情况,P(k)P(k)P(k) 是前 kkk 个结果的精确率,rel(k)∈{0,1}rel(k) \in \{0,1\}rel(k)∈{0,1} 表示第 kkk 位是否相关:

AP=∑k=1nP(k)⋅rel(k)∣相关文档总数∣AP = \frac{\sum_{k=1}^{n} P(k) \cdot rel(k)}{|\text{相关文档总数}|}AP=∣相关文档总数∣∑k=1nP(k)⋅rel(k)

MAP(Mean Average Precision)------对所有查询求平均:

MAP=1∣Q∣∑q=1∣Q∣AP(q)MAP = \frac{1}{|Q|} \sum_{q=1}^{|Q|} AP(q)MAP=∣Q∣1q=1∑∣Q∣AP(q)

DCG / NDCG(重点,工业界最常用)

前面指标只考虑相关/不相关(二值),而 NDCG 支持多级相关度(如 0=不相关, 1=一般相关, 2=高度相关, 3=完美匹配),且对位置有折扣。

DCG(Discounted Cumulative Gain)

DCG@k=∑i=1k2reli−1log⁡2(i+1)DCG@k = \sum_{i=1}^{k} \frac{2^{rel_i} - 1}{\log_2(i+1)}DCG@k=i=1∑klog2(i+1)2reli−1

其中 relirel_ireli 是第 iii 位文档的相关度分数。分子 2reli−12^{rel_i}-12reli−1 是指数增益(强调高相关度),分母 log⁡2(i+1)\log_2(i+1)log2(i+1) 是位置折扣(越靠后折扣越大)。

IDCG(Ideal DCG):将文档按相关度从高到低排列后的 DCG,代表理论最优值。

NDCG(Normalized DCG)

NDCG@k=DCG@kIDCG@kNDCG@k = \frac{DCG@k}{IDCG@k}NDCG@k=IDCG@kDCG@k

NDCG 的值域是 [0,1][0,1][0,1],1 表示排序完美,便于在不同查询之间比较。

计算示例 :查询 q,前5个结果的相关度为 [3,2,3,0,1][3, 2, 3, 0, 1][3,2,3,0,1],理想排序应为 [3,3,2,1,0][3, 3, 2, 1, 0][3,3,2,1,0]:

DCG@5=7log⁡22+3log⁡23+7log⁡24+0log⁡25+1log⁡26≈7+1.89+3.5+0+0.39=12.78DCG@5 = \frac{7}{\log_2 2} + \frac{3}{\log_2 3} + \frac{7}{\log_2 4} + \frac{0}{\log_2 5} + \frac{1}{\log_2 6} \approx 7 + 1.89 + 3.5 + 0 + 0.39 = 12.78DCG@5=log227+log233+log247+log250+log261≈7+1.89+3.5+0+0.39=12.78

IDCG@5=7log⁡22+7log⁡23+3log⁡24+1log⁡25+0log⁡26≈7+4.42+1.5+0.43+0=13.35IDCG@5 = \frac{7}{\log_2 2} + \frac{7}{\log_2 3} + \frac{3}{\log_2 4} + \frac{1}{\log_2 5} + \frac{0}{\log_2 6} \approx 7 + 4.42 + 1.5 + 0.43 + 0 = 13.35IDCG@5=log227+log237+log243+log251+log260≈7+4.42+1.5+0.43+0=13.35

NDCG@5=12.7813.35≈0.957NDCG@5 = \frac{12.78}{13.35} \approx 0.957NDCG@5=13.3512.78≈0.957


1.3 AUC 与 ROC

ROC 曲线:以假正率(FPR)为横轴,真正率(TPR)为纵轴,绘制在不同阈值下的曲线:

TPR=TPTP+FN(即召回率)TPR = \frac{TP}{TP + FN} \quad (\text{即召回率})TPR=TP+FNTP(即召回率)

FPR=FPFP+TNFPR = \frac{FP}{FP + TN}FPR=FP+TNFP

AUC(Area Under ROC Curve) :ROC 曲线下面积,值域 [0,1][0,1][0,1],0.5 代表随机,1 代表完美。

AUC 的物理含义(面试重点):随机选取一个正样本和一个负样本,模型对正样本打分高于负样本的概率:

AUC=P(scorepos>scoreneg)AUC = P(score_{pos} > score_{neg})AUC=P(scorepos>scoreneg)

离散计算公式:

AUC=∑i∈pos,j∈neg1[si>sj]∣pos∣⋅∣neg∣AUC = \frac{\sum_{i \in pos, j \in neg} \mathbf{1}[s_i > s_j]}{|pos| \cdot |neg|}AUC=∣pos∣⋅∣neg∣∑i∈pos,j∈neg1[si>sj]

AUC 对样本不平衡不敏感,搜索和推荐中 CTR 任务经常用它评估模型区分度。


二、文本相关性经典算法

2.1 TF-IDF

这是最基础的词权重计算方法,也是很多更复杂方法的基础。

词频 TF(Term Frequency)

TF(t,d)=词 t 在文档 d 中出现次数文档 d 的总词数TF(t, d) = \frac{\text{词 } t \text{ 在文档 } d \text{ 中出现次数}}{\text{文档 } d \text{ 的总词数}}TF(t,d)=文档 d 的总词数词 t 在文档 d 中出现次数

逆文档频率 IDF(Inverse Document Frequency) :NNN 是总文档数,df(t)df(t)df(t) 是包含词 ttt 的文档数,分母加 1 是平滑:

IDF(t)=log⁡Ndf(t)+1IDF(t) = \log\frac{N}{df(t) + 1}IDF(t)=logdf(t)+1N

TF-IDF

TFIDF(t,d)=TF(t,d)×IDF(t)TFIDF(t, d) = TF(t, d) \times IDF(t)TFIDF(t,d)=TF(t,d)×IDF(t)

查询-文档相关度

Score(q,d)=∑t∈qTFIDF(t,d)Score(q, d) = \sum_{t \in q} TFIDF(t, d)Score(q,d)=t∈q∑TFIDF(t,d)

直觉理解:TF 衡量词在文档中有多重要,IDF 衡量词在整个语料中有多稀有。一个词出现在很多文档中(如"的"、"是"),IDF 接近 0,权重很低;出现在少数文档中的专业词汇,IDF 高,权重大。


2.2 BM25(面试必考)

BM25 是对 TF-IDF 的关键改进,是目前工业界稀疏检索的主流算法(Elasticsearch 默认使用 BM25)。

BM25(q,d)=∑t∈qIDF(t)⋅TF(t,d)⋅(k1+1)TF(t,d)+k1⋅(1−b+b⋅∣d∣avgdl)BM25(q, d) = \sum_{t \in q} IDF(t) \cdot \frac{TF(t,d) \cdot (k_1 + 1)}{TF(t,d) + k_1 \cdot \left(1 - b + b \cdot \frac{|d|}{avgdl}\right)}BM25(q,d)=t∈q∑IDF(t)⋅TF(t,d)+k1⋅(1−b+b⋅avgdl∣d∣)TF(t,d)⋅(k1+1)

参数说明:

  • k1∈[1.2,2.0]k_1 \in [1.2, 2.0]k1∈[1.2,2.0]:控制词频饱和度,值越大词频影响越强
  • b∈[0,1]b \in [0, 1]b∈[0,1],通常取 0.750.750.75:控制文档长度归一化程度,b=0b=0b=0 不考虑长度,b=1b=1b=1 完全归一化
  • ∣d∣|d|∣d∣:文档长度
  • avgdlavgdlavgdl:语料库平均文档长度

IDF 的改进版本(Robertson-Spärck Jones)

IDF(t)=log⁡N−df(t)+0.5df(t)+0.5IDF(t) = \log\frac{N - df(t) + 0.5}{df(t) + 0.5}IDF(t)=logdf(t)+0.5N−df(t)+0.5

BM25 与 TF-IDF 的核心区别

TF-IDF 中,词频对分数的贡献是线性的;而 BM25 中,词频有饱和效应------当 TF→∞TF \to \inftyTF→∞ 时,BM25 的词频贡献趋于 k1+1k_1 + 1k1+1,这更符合实际语言规律(一个词出现100次和1000次,对相关性的增益差不多)。用公式看:

lim⁡TF→∞TF⋅(k1+1)TF+k1=k1+1\lim_{TF \to \infty} \frac{TF \cdot (k_1+1)}{TF + k_1} = k_1 + 1TF→∞limTF+k1TF⋅(k1+1)=k1+1


2.3 编辑距离(Levenshtein Distance)

主要用于拼写纠错、Query 改写等场景。定义为将字符串 s1s_1s1 变换为 s2s_2s2 所需的最少操作数(插入、删除、替换)。

设 dp[i][j]dp[i][j]dp[i][j] 为 s1[1..i]s_1[1..i]s1[1..i] 与 s2[1..j]s_2[1..j]s2[1..j] 的编辑距离:

dp[i][j]={ij=0ji=0dp[i−1][j−1]s1[i]=s2[j]1+min⁡(dp[i−1][j], dp[i][j−1], dp[i−1][j−1])s1[i]≠s2[j]dp[i][j] = \begin{cases} i & j = 0 \\ j & i = 0 \\ dp[i-1][j-1] & s_1[i] = s_2[j] \\ 1 + \min(dp[i-1][j],\ dp[i][j-1],\ dp[i-1][j-1]) & s_1[i] \neq s_2[j] \end{cases}dp[i][j]=⎩ ⎨ ⎧ijdp[i−1][j−1]1+min(dp[i−1][j], dp[i][j−1], dp[i−1][j−1])j=0i=0s1[i]=s2[j]s1[i]=s2[j]

三种操作分别对应:删除 s1[i]s_1[i]s1[i]、删除 s2[j]s_2[j]s2[j](即向 s1s_1s1 插入)、替换。时间复杂度 O(mn)O(mn)O(mn)。


2.4 Jaccard 相似度

常用于集合相似度计算(文档去重、SimHash 等):

Jaccard(A,B)=∣A∩B∣∣A∪B∣Jaccard(A, B) = \frac{|A \cap B|}{|A \cup B|}Jaccard(A,B)=∣A∪B∣∣A∩B∣

MinHash 原理:Jaccard 相似度等于两个集合的最小哈希值相等的概率:

P[hmin(A)=hmin(B)]=Jaccard(A,B)P[h_{min}(A) = h_{min}(B)] = Jaccard(A, B)P[hmin(A)=hmin(B)]=Jaccard(A,B)

用多个独立哈希函数估计 Jaccard,可以将集合相似度计算转化为签名比较,大幅提升效率,是 LSH(局部敏感哈希)的基础。


三、向量检索

随着深度学习的发展,基于向量的语义检索已经成为搜索系统的核心组件。

3.1 相似度度量

余弦相似度(衡量方向相似,与幅度无关):

cos(u,v)=u⋅v∣∣u∣∣2⋅∣∣v∣∣2=∑i=1nuivi∑i=1nui2⋅∑i=1nvi2cos(u, v) = \frac{u \cdot v}{||u||2 \cdot ||v||2} = \frac{\sum{i=1}^n u_i v_i}{\sqrt{\sum{i=1}^n u_i^2} \cdot \sqrt{\sum_{i=1}^n v_i^2}}cos(u,v)=∣∣u∣∣2⋅∣∣v∣∣2u⋅v=∑i=1nui2 ⋅∑i=1nvi2 ∑i=1nuivi

内积相似度(向量归一化后等价于余弦相似度):

sim(u,v)=u⋅v=∑i=1nuivisim(u, v) = u \cdot v = \sum_{i=1}^n u_i v_isim(u,v)=u⋅v=i=1∑nuivi

欧氏距离(L2 距离):

d(u,v)=∣∣u−v∣∣2=∑i=1n(ui−vi)2d(u, v) = ||u - v||2 = \sqrt{\sum{i=1}^n (u_i - v_i)^2}d(u,v)=∣∣u−v∣∣2=i=1∑n(ui−vi)2

归一化向量下,欧氏距离与余弦距离的关系:

∣∣u−v∣∣22=2(1−cos(u,v))||u - v||_2^2 = 2(1 - cos(u, v))∣∣u−v∣∣22=2(1−cos(u,v))

所以对于 L2 归一化的向量,最大化余弦相似度等价于最小化欧氏距离,而 FAISS 等库中最大内积搜索(MIPS)也因此与最近邻搜索等价。


3.2 ANN(近似最近邻搜索)

精确最近邻搜索在 nnn 个 ddd 维向量中的暴力搜索复杂度为 O(nd)O(nd)O(nd),亿级向量库完全不可接受。常用近似算法:

多层图结构,高层图稀疏(快速定位),低层图稠密(精确搜索)。节点出现在第 lll 层及以上的概率呈指数衰减:

P(节点在第 l 层)∝e−l⋅mLP(\text{节点在第 } l \text{ 层}) \propto e^{-l \cdot m_L}P(节点在第 l 层)∝e−l⋅mL

其中 mL=1ln⁡Mm_L = \frac{1}{\ln M}mL=lnM1,MMM 是每层最大邻居数。查询时从最高层贪心搜索,逐层下降,时间复杂度约 O(log⁡n)O(\log n)O(logn),是目前精度和速度综合最优的 ANN 算法。

IVF(Inverted File Index)

先用 K-Means 将所有向量聚类为 CCC 个簇,建倒排索引。查询时找最近的 nprobenprobenprobe 个簇,在簇内做精确搜索,复杂度约 O(nprobe⋅n/C⋅d)O(nprobe \cdot n/C \cdot d)O(nprobe⋅n/C⋅d)。nprobenprobenprobe 是精度与速度的权衡参数。

PQ(Product Quantization,乘积量化)

将 ddd 维向量分成 MMM 个子向量,每个子向量用 kkk 个码字表示,将向量压缩为 M⋅log⁡2kM \cdot \log_2 kM⋅log2k bits。

近似内积:

x⋅y≈∑m=1Mx(m)⋅qm(y(m))x \cdot y \approx \sum_{m=1}^M x^{(m)} \cdot q_m(y^{(m)})x⋅y≈m=1∑Mx(m)⋅qm(y(m))

其中 qmq_mqm 是第 mmm 个子空间的量化器。PQ 可以大幅降低内存占用(128 维 float32 向量从 512 bytes 压缩到 8-16 bytes),常与 IVF 结合(IVFPQ)使用。


四、单塔与双塔模型(核心架构)

这是搜索召回阶段最重要的两类模型架构,面试必问。

4.1 双塔模型(Bi-Encoder / Two-Tower)

双塔模型用两个(可共享参数或不共享)编码器分别对 Query 和 Document 进行独立编码:

eq=EncoderQ(q)∈Rde_q = Encoder_Q(q) \in \mathbb{R}^deq=EncoderQ(q)∈Rd

ed=EncoderD(d)∈Rde_d = Encoder_D(d) \in \mathbb{R}^ded=EncoderD(d)∈Rd

score(q,d)=sim(eq,ed)score(q, d) = sim(e_q, e_d)score(q,d)=sim(eq,ed)

核心优势 :Document 向量可以离线预计算并存入向量数据库(FAISS / Milvus),在线时只需编码 Query,再做 ANN 检索,延迟极低(毫秒级),可以支撑亿级文档库的实时召回。

核心缺点:Query 和 Document 之间没有交互,无法捕捉细粒度的匹配信号(如词汇对齐、否定词处理等)。

双塔模型训练:对比学习

In-batch Negative(批内负采样) :同一批次中其他 Query 的正例文档作为当前 Query 的负例,τ\tauτ 是温度系数:

L=−1N∑i=1Nlog⁡esim(qi,di+)/τ∑j=1Nesim(qi,dj)/τ\mathcal{L} = -\frac{1}{N}\sum_{i=1}^N \log \frac{e^{sim(q_i, d_i^+)/\tau}}{\sum_{j=1}^N e^{sim(q_i, d_j)/\tau}}L=−N1i=1∑Nlog∑j=1Nesim(qi,dj)/τesim(qi,di+)/τ

温度系数的作用:τ\tauτ 越小,分布越集中,对困难负样本的惩罚越重;τ\tauτ 越大,梯度越平缓。

Triplet Loss :要求正样本分数高于负样本分数至少 mmm(margin):

L=max⁡(0, m+d(q,d−)−d(q,d+))\mathcal{L} = \max(0,\ m + d(q, d^-) - d(q, d^+))L=max(0, m+d(q,d−)−d(q,d+))

其中 d+d^+d+ 是正样本,d−d^-d− 是负样本,d(⋅)d(\cdot)d(⋅) 是距离函数。

难负样本挖掘(Hard Negative Mining):随机负样本太容易,模型学不到精细区分。从 BM25 高分但非相关的文档中选负样本,显著提升双塔效果:

L=−log⁡esim(q,d+)/τesim(q,d+)/τ+∑k=1Kesim(q,dk−)/τ\mathcal{L} = -\log \frac{e^{sim(q, d^+)/\tau}}{e^{sim(q, d^+)/\tau} + \sum_{k=1}^K e^{sim(q, d_k^-)/\tau}}L=−logesim(q,d+)/τ+∑k=1Kesim(q,dk−)/τesim(q,d+)/τ


4.2 单塔模型(Cross-Encoder)

单塔将 Query 和 Document 拼接后输入同一个模型(如 BERT),允许 Query 和 Document 在每一层进行充分交互:

score(q,d)=MLP(BERT([q; [SEP]; d])[CLS])score(q, d) = MLP\left(BERT([q;\ [SEP];\ d])[CLS]\right)score(q,d)=MLP(BERT([q; [SEP]; d])[CLS])

核心优势 :Query-Document 全交互,精度远高于双塔,适合精排阶段

核心缺点 :无法预计算 Document 向量,每条查询必须对所有 (q, d) 对重新计算,计算量为 O(∣候选文档∣)O(|\text{候选文档}|)O(∣候选文档∣),只能处理几百到几千的候选集,不能用于大规模召回


4.3 ColBERT(Late Interaction,延迟交互)

介于单塔和双塔之间,Document 可以离线计算 Token 级别的向量并存储,查询时计算 Token-level 的最大相似度:

score(q,d)=∑i∈qmax⁡j∈d(Eq[i]⋅Ed[j]T)score(q, d) = \sum_{i \in q} \max_{j \in d} \left(E_q[i] \cdot E_d[j]^T\right)score(q,d)=i∈q∑j∈dmax(Eq[i]⋅Ed[j]T)

即:对 Query 的每个 Token,找 Document 中最匹配的 Token,然后求和(MaxSim 操作)。比单塔快(可以预计算 EdE_dEd),比双塔精度更高(保留 Token 交互)。


4.4 三种架构对比

架构 典型应用阶段 索引结构 延迟 精度 备注
双塔(Bi-Encoder) 召回 ANN(FAISS/HNSW) 极低(<10ms) 可支持亿级文档
ColBERT 粗排 Token 向量倒排 中高 存储开销大
单塔(Cross-Encoder) 精排 无(逐一计算) 高(~100ms) 只能处理小候选集

五、Learning to Rank(排序学习)

LTR 是搜索排序的核心技术,分为三个流派,面试必问其区别。

5.1 Pointwise(逐点法)

将排序问题转化为回归或分类 问题。对每个 (q,d)(q, d)(q,d) 对独立预测相关度分数,忽略文档间的相对顺序关系。

MSE 回归损失

L=1N∑i=1N(yi−y^i)2\mathcal{L} = \frac{1}{N}\sum_{i=1}^N (y_i - \hat{y}_i)^2L=N1i=1∑N(yi−y^i)2

问题:同一查询下,文档之间的排序关系被忽略;且不同查询的绝对分数没有可比性。


5.2 Pairwise(成对法)

把排序问题转化为二分类 问题:预测文档对 (di,dj)(d_i, d_j)(di,dj) 中哪个更相关。

RankNet Loss(微软,面试高频):

对于 did_idi 比 djd_jdj 更相关的文档对,模型预测概率为:

Pij=P(di≻dj)=11+e−σ(si−sj)P_{ij} = P(d_i \succ d_j) = \frac{1}{1 + e^{-\sigma(s_i - s_j)}}Pij=P(di≻dj)=1+e−σ(si−sj)1

其中 si,sjs_i, s_jsi,sj 是模型对两个文档的打分,σ\sigmaσ 是缩放参数。用交叉熵损失(did_idi 比 djd_jdj 相关时目标概率 Pˉij=1\bar{P}_{ij} = 1Pˉij=1):

L=−log⁡Pij=log⁡(1+e−σ(si−sj))\mathcal{L} = -\log P_{ij} = \log(1 + e^{-\sigma(s_i - s_j)})L=−logPij=log(1+e−σ(si−sj))

梯度形式简洁,且可以并行计算。


5.3 Listwise(列表法)

直接优化整个排序列表的质量,最符合实际搜索场景。

LambdaRank / LambdaMART(工业界主流)

LambdaRank 的核心思想是:直接定义梯度(而不是损失函数),用 ∣ΔNDCG∣|\Delta NDCG|∣ΔNDCG∣ 作为权重调整 RankNet 梯度:

λij=−σ1+eσ(si−sj)⋅∣ΔNDCGij∣\lambda_{ij} = -\frac{\sigma}{1 + e^{\sigma(s_i - s_j)}} \cdot |\Delta NDCG_{ij}|λij=−1+eσ(si−sj)σ⋅∣ΔNDCGij∣

其中 ∣ΔNDCGij∣|\Delta NDCG_{ij}|∣ΔNDCGij∣ 是将 did_idi 和 djd_jdj 互换位置后 NDCG 的变化量。这使得模型更关注交换后 NDCG 变化大的文档对(即关键排序位置的错误)。

LambdaMART = LambdaRank + MART(Multiple Additive Regression Trees,即 GBDT),是搜索排序领域最经典、在工业界沿用至今的方法。

ListNet Loss:把文档分数转为 Top-1 概率分布,最小化预测分布与真实相关度分布的 KL 散度:

Ps(di)=esi∑jesj,Py(di)=eyi∑jeyjP_s(d_i) = \frac{e^{s_i}}{\sum_j e^{s_j}}, \quad P_y(d_i) = \frac{e^{y_i}}{\sum_j e^{y_j}}Ps(di)=∑jesjesi,Py(di)=∑jeyjeyi

L=−∑iPy(di)log⁡Ps(di)\mathcal{L} = -\sum_i P_y(d_i) \log P_s(d_i)L=−i∑Py(di)logPs(di)


六、深度排序模型

6.1 DSSM(Deep Structured Semantic Model)

微软 2013 年提出的经典双塔模型,先驱性地将深度学习引入搜索。

Word Hashing:将词切分为字符 n-gram(letter trigrams),缓解词表爆炸问题,并对 OOV 词有一定鲁棒性。例如 "#good#" → "#go", "goo", "ood", "od#"。

训练目标

P(D+∣Q)=eγ⋅cos(Qvec,Dvec+)∑D′∈{D+,D1−,...,DK−}eγ⋅cos(Qvec,Dvec′)P(D^+|Q) = \frac{e^{\gamma \cdot cos(Q_{vec}, D^+{vec})}}{\sum{D' \in \{D^+, D_1^-, ..., D_K^-\}} e^{\gamma \cdot cos(Q_{vec}, D'_{vec})}}P(D+∣Q)=∑D′∈{D+,D1−,...,DK−}eγ⋅cos(Qvec,Dvec′)eγ⋅cos(Qvec,Dvec+)

其中 γ\gammaγ 是平滑因子,KKK 是负样本数(通常随机采样4个)。


6.2 Transformer 与 BERT(精排核心)

自注意力机制

Attention(Q,K,V)=softmax(QKTdk)VAttention(Q, K, V) = softmax\left(\frac{QK^T}{\sqrt{d_k}}\right)VAttention(Q,K,V)=softmax(dk QKT)V

除以 dk\sqrt{d_k}dk 是为了防止内积过大导致 softmax 梯度消失(方差缩放)。

多头注意力

MultiHead(Q,K,V)=Concat(head1,...,headh)WOMultiHead(Q, K, V) = Concat(head_1, ..., head_h)W^OMultiHead(Q,K,V)=Concat(head1,...,headh)WO

headi=Attention(QWiQ, KWiK, VWiV)head_i = Attention(QW_i^Q,\ KW_i^K,\ VW_i^V)headi=Attention(QWiQ, KWiK, VWiV)

多头允许模型在不同子空间同时关注不同类型的信息(语法、语义、指代等)。

位置编码

PE(pos,2i)=sin⁡(pos100002i/dmodel)PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{model}}}\right)PE(pos,2i)=sin(100002i/dmodelpos)

PE(pos,2i+1)=cos⁡(pos100002i/dmodel)PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{model}}}\right)PE(pos,2i+1)=cos(100002i/dmodelpos)

BERT 用于精排:将 Query 和 Document 用 [SEP] 拼接,取 [CLS] 的表示经 MLP 输出相关度分数:

score=W⋅h[CLS]+bscore = W \cdot h_{[CLS]} + bscore=W⋅h[CLS]+b


6.3 知识蒸馏(大模型→小模型)

工业界常用大 Cross-Encoder 模型蒸馏小双塔模型,让双塔学到精排的知识:

LKD=(1−α)LCE(yhard, pstudent)+αT2LCE(softmax(zteacherT), softmax(zstudentT))\mathcal{L}{KD} = (1 - \alpha) \mathcal{L}{CE}(y_{hard},\ p_{student}) + \alpha T^2 \mathcal{L}{CE}\left(\text{softmax}\left(\frac{z{teacher}}{T}\right),\ \text{softmax}\left(\frac{z_{student}}{T}\right)\right)LKD=(1−α)LCE(yhard, pstudent)+αT2LCE(softmax(Tzteacher), softmax(Tzstudent))

  • TTT:温度系数,T>1T > 1T>1 使 Teacher 的软标签分布更平滑,包含更多"暗知识"
  • α\alphaα:平衡硬标签损失和蒸馏损失
  • 硬标签来自人工标注,软标签来自 Teacher 模型的分数分布

七、CTR 预估(排序特征建模)

搜索排序往往需要预估用户对文档的点击/转化概率。

7.1 逻辑回归(LR)

CTR=σ(wTx+b)=11+e−(wTx+b)CTR = \sigma(\mathbf{w}^T \mathbf{x} + b) = \frac{1}{1 + e^{-(\mathbf{w}^T \mathbf{x} + b)}}CTR=σ(wTx+b)=1+e−(wTx+b)1

Binary Cross-Entropy Loss

L=−1N∑i=1N[yilog⁡y^i+(1−yi)log⁡(1−y^i)]\mathcal{L} = -\frac{1}{N}\sum_{i=1}^N \left[y_i \log \hat{y}_i + (1 - y_i)\log(1 - \hat{y}_i)\right]L=−N1i=1∑N[yilogy^i+(1−yi)log(1−y^i)]

LR 不能自动捕捉特征交叉,需要人工特征工程。


7.2 FM(Factorization Machines)

FM 自动学习二阶特征交叉,用向量内积替代枚举所有特征对:

y^=w0+∑i=1nwixi+∑i=1n∑j=i+1n⟨vi,vj⟩xixj\hat{y} = w_0 + \sum_{i=1}^n w_i x_i + \sum_{i=1}^n \sum_{j=i+1}^n \langle v_i, v_j \rangle x_i x_jy^=w0+i=1∑nwixi+i=1∑nj=i+1∑n⟨vi,vj⟩xixj

其中 ⟨vi,vj⟩=∑f=1kvifvjf\langle v_i, v_j \rangle = \sum_{f=1}^k v_{if} v_{jf}⟨vi,vj⟩=∑f=1kvifvjf 是两个特征的隐向量内积。

关键优化 (将 O(n2k)O(n^2 k)O(n2k) 降至 O(nk)O(nk)O(nk)):

∑i=1n∑j=i+1n⟨vi,vj⟩xixj=12∑f=1k[(∑i=1nvifxi)2−∑i=1nvif2xi2]\sum_{i=1}^n \sum_{j=i+1}^n \langle v_i, v_j \rangle x_i x_j = \frac{1}{2}\sum_{f=1}^k \left[\left(\sum_{i=1}^n v_{if} x_i\right)^2 - \sum_{i=1}^n v_{if}^2 x_i^2\right]i=1∑nj=i+1∑n⟨vi,vj⟩xixj=21f=1∑k (i=1∑nvifxi)2−i=1∑nvif2xi2


7.3 DeepFM / Wide & Deep

DeepFM:FM 捕捉低阶交叉 + DNN 捕捉高阶交叉,共享 Embedding:

y^=σ(yFM+yDNN)\hat{y} = \sigma(y_{FM} + y_{DNN})y^=σ(yFM+yDNN)

Wide & Deep(Google):Wide 部分是记忆(LR,记住高频模式),Deep 部分是泛化(DNN,泛化到新组合):

y^=σ(wwideT[x,ϕ(x)]+wdeepTafinal+b)\hat{y} = \sigma\left(\mathbf{w}{wide}^T[\mathbf{x}, \phi(\mathbf{x})] + \mathbf{w}{deep}^T a_{final} + b\right)y^=σ(wwideT[x,ϕ(x)]+wdeepTafinal+b)


7.4 预测校准(Calibration)

模型输出的分数可能不是真实概率(如一个模型预测 0.7 的样本,实际点击率可能只有 0.3),需要校准。

Platt Scaling :用 Sigmoid 函数将模型分数 sss 映射为校准概率:

P(y=1∣s)=11+eAs+BP(y=1|s) = \frac{1}{1 + e^{As + B}}P(y=1∣s)=1+eAs+B1

A,BA, BA,B 通过最大化验证集的对数似然学习。

等频分桶校准(Isotonic Regression):将样本按分数排序后分桶,用桶内实际点击率作为预测值,单调保序。


八、搜索系统整体架构

8.1 经典搜索流程(漏斗结构)

搜索系统是一个从粗到精的逐步过滤流程,目标是在延迟约束内最大化相关性:

复制代码
Query
  ↓
[Query 理解] 分词 / 意图识别 / NER / 改写 / 扩展
  ↓
[多路召回] BM25召回 + 向量召回 + 知识图谱召回 + 协同过滤召回
  ↓ 数千~万级候选
[粗排] 轻量模型快速打分
  ↓ 数百级候选
[精排] 复杂深度模型精细打分
  ↓ 数十~百级候选
[重排] 多样性 / 去重 / 个性化 / 业务规则
  ↓ 最终结果
[展示] 摘要 / 高亮 / 广告融合

每个阶段都是延迟与精度的 trade-off,越往后候选集越小,模型越复杂。


8.2 多路召回融合

不同召回路的分数量纲不同,不能直接相加。常用融合方法:

RRF(Reciprocal Rank Fusion) :只利用排名信息,不依赖原始分数,对分数归一化问题鲁棒,k=60k=60k=60 是经验值:

RRF(d)=∑r∈召回路1k+rankr(d)RRF(d) = \sum_{r \in \text{召回路}} \frac{1}{k + rank_r(d)}RRF(d)=r∈召回路∑k+rankr(d)1

加权线性融合(需要分数在同一量纲或归一化后):

score=∑iwi⋅scorei(normalized)score = \sum_i w_i \cdot score_i^{(normalized)}score=i∑wi⋅scorei(normalized)

常见归一化方法:Min-Max 归一化 s−sminsmax−smin\frac{s - s_{min}}{s_{max} - s_{min}}smax−smins−smin,或转换为百分位排名。


九、Query 理解

9.1 分词与 N-gram

中文搜索中分词是基础,常用最大匹配、CRF、BERT。

N-gram 语言模型(基础):

P(w1,w2,...,wT)=∏t=1TP(wt∣wt−n+1,...,wt−1)P(w_1, w_2, ..., w_T) = \prod_{t=1}^T P(w_t | w_{t-n+1}, ..., w_{t-1})P(w1,w2,...,wT)=t=1∏TP(wt∣wt−n+1,...,wt−1)

Bigram 模型:P(wt∣wt−1)P(w_t | w_{t-1})P(wt∣wt−1),数据稀疏问题常用加法平滑(Laplace Smoothing):

P(wi∣wi−1)=count(wi−1,wi)+αcount(wi−1)+α∣V∣P(w_i | w_{i-1}) = \frac{count(w_{i-1}, w_i) + \alpha}{count(w_{i-1}) + \alpha |V|}P(wi∣wi−1)=count(wi−1)+α∣V∣count(wi−1,wi)+α


9.2 意图识别与文本分类

Softmax 分类器

P(c∣q)=eWc⋅hq+bc∑c′eWc′⋅hq+bc′P(c | q) = \frac{e^{W_c \cdot h_q + b_c}}{\sum_{c'} e^{W_{c'} \cdot h_q + b_{c'}}}P(c∣q)=∑c′eWc′⋅hq+bc′eWc⋅hq+bc

TextCNN:通过不同大小的卷积核(模拟 n-gram)提取特征,再 Max Pooling:

hi=ReLU(W⋅xi:i+h−1+b)h_i = \text{ReLU}(W \cdot x_{i:i+h-1} + b)hi=ReLU(W⋅xi:i+h−1+b)

y^=softmax(Wout⋅[max(h11,...,hn−h+11),...,max(h1k,...)])\hat{y} = \text{softmax}(W_{out} \cdot [\text{max}(h_1^1, ..., h_{n-h+1}^1), ..., \text{max}(h_1^k, ...)])y^=softmax(Wout⋅[max(h11,...,hn−h+11),...,max(h1k,...)])


9.3 命名实体识别(NER)

使用 BIOES 序列标注方案(Begin, Inside, Outside, End, Single),常用 BERT-CRF。

CRF(条件随机场)层:在 BERT 输出的 emission 分数基础上,加入 transition 分数,用 Viterbi 解码全局最优序列:

P(y∣x)=1Z(x)exp⁡(∑i=1n[e(yi,xi)+t(yi−1,yi)])P(y|x) = \frac{1}{Z(x)} \exp\left(\sum_{i=1}^n [e(y_i, x_i) + t(y_{i-1}, y_i)]\right)P(y∣x)=Z(x)1exp(i=1∑n[e(yi,xi)+t(yi−1,yi)])

其中 e(yi,xi)e(y_i, x_i)e(yi,xi) 是 emission 分数(BERT 输出),t(yi−1,yi)t(y_{i-1}, y_i)t(yi−1,yi) 是 transition 分数(可学习矩阵),Z(x)Z(x)Z(x) 是归一化因子。

Viterbi 解码

δt(j)=max⁡i[δt−1(i)+t(i,j)]+e(j,xt)\delta_t(j) = \max_i \left[\delta_{t-1}(i) + t(i, j)\right] + e(j, x_t)δt(j)=imax[δt−1(i)+t(i,j)]+e(j,xt)


9.4 Query 改写与 Rocchio 反馈

Rocchio 算法(伪相关反馈 PRF) :先检索一次,取前 kkk 篇文档作为相关反馈,更新 Query 向量:

qnew=α⋅q+β∣D+∣∑d∈D+d−γ∣D−∣∑d∈D−dq_{new} = \alpha \cdot q + \frac{\beta}{|D^+|}\sum_{d \in D^+} d - \frac{\gamma}{|D^-|}\sum_{d \in D^-} dqnew=α⋅q+∣D+∣βd∈D+∑d−∣D−∣γd∈D−∑d

其中 D+D^+D+ 是正例文档,D−D^-D− 是负例文档,α,β,γ\alpha, \beta, \gammaα,β,γ 是权重参数。


十、词向量与预训练语言模型

10.1 Word2Vec

CBOW(用上下文预测中心词):

v^=12c∑−c≤j≤c, j≠0vwt+j\hat{v} = \frac{1}{2c}\sum_{-c \le j \le c,\ j \neq 0} v_{w_{t+j}}v^=2c1−c≤j≤c, j=0∑vwt+j

P(wt∣context)=evwtTv^∑w∈VevwTv^P(w_t | context) = \frac{e^{v_{w_t}^T \hat{v}}}{\sum_{w \in V} e^{v_w^T \hat{v}}}P(wt∣context)=∑w∈VevwTv^evwtTv^

Skip-gram(用中心词预测上下文词):

L=1T∑t=1T∑−c≤j≤c, j≠0log⁡P(wt+j∣wt)\mathcal{L} = \frac{1}{T}\sum_{t=1}^T \sum_{-c \le j \le c,\ j \neq 0} \log P(w_{t+j} | w_t)L=T1t=1∑T−c≤j≤c, j=0∑logP(wt+j∣wt)

负采样(Negative Sampling)------解决 Softmax 分母计算整个词表的效率问题:

L=log⁡σ(vwoTvwi)+∑k=1KEwk∼Pn[log⁡σ(−vwkTvwi)]\mathcal{L} = \log \sigma(v_{w_o}^T v_{w_i}) + \sum_{k=1}^K \mathbb{E}{w_k \sim P_n}[\log \sigma(-v{w_k}^T v_{w_i})]L=logσ(vwoTvwi)+k=1∑KEwk∼Pn[logσ(−vwkTvwi)]

负样本采样概率采用频率的 3/4 次方,平滑高频词的过度主导:

Pn(w)∝f(w)3/4P_n(w) \propto f(w)^{3/4}Pn(w)∝f(w)3/4


10.2 语言模型困惑度(Perplexity)

用于评估语言模型质量,PPL 越低越好:

PPL=exp⁡(−1N∑i=1Nlog⁡P(wi∣w1,...,wi−1))PPL = \exp\left(-\frac{1}{N}\sum_{i=1}^N \log P(w_i | w_1, ..., w_{i-1})\right)PPL=exp(−N1i=1∑NlogP(wi∣w1,...,wi−1))

物理含义:模型在每个位置平均面临 PPL 种等可能的选择。


十一、位置偏差与无偏学习(Unbiased Learning to Rank)

这是搜索领域比较深入的话题,大厂面试可能会考。

11.1 检查假设(Examination Hypothesis)

用户行为数据(点击)不等于相关性,因为用户倾向于点击靠前的结果。将观测分解为:

P(click∣q,d,k)=P(exam∣k)⋅P(rel∣q,d)P(click | q, d, k) = P(exam | k) \cdot P(rel | q, d)P(click∣q,d,k)=P(exam∣k)⋅P(rel∣q,d)

即:点击 = 被看到 × 相关 。P(exam∣k)P(exam | k)P(exam∣k) 是位置偏置,只依赖位置 kkk;P(rel∣q,d)P(rel | q, d)P(rel∣q,d) 是真实相关度,只依赖文档内容。

11.2 IPW(Inverse Propensity Weighting)

对每个点击样本按位置偏置的倒数加权,消除偏置影响:

Lunbiased=∑(q,d,k):click=1L(q,d)P^(exam∣k)\mathcal{L}{unbiased} = \sum{(q, d, k): click=1} \frac{\mathcal{L}(q, d)}{\hat{P}(exam | k)}Lunbiased=(q,d,k):click=1∑P^(exam∣k)L(q,d)

P^(exam∣k)\hat{P}(exam | k)P^(exam∣k) 需要通过随机实验(随机展示)或 DLA 算法估计。

11.3 DLA(Dual Learning Algorithm)

交替学习排序模型 fff 和倾向性模型 θ\thetaθ,相互提供监督信号,无需人工标注:

P^(rel∣q,d)∝P(click∣q,d,k)P^(exam∣k)\hat{P}(rel | q, d) \propto \frac{P(click | q, d, k)}{\hat{P}(exam | k)}P^(rel∣q,d)∝P^(exam∣k)P(click∣q,d,k)

P^(exam∣k)∝P(click∣q,d,k)P^(rel∣q,d)\hat{P}(exam | k) \propto \frac{P(click | q, d, k)}{\hat{P}(rel | q, d)}P^(exam∣k)∝P^(rel∣q,d)P(click∣q,d,k)


十二、多样性与重排

12.1 MMR(Maximal Marginal Relevance)

在保证相关性的同时引入多样性,贪心选取每次边际增益最大的文档:

MMR=arg⁡max⁡di∈R∖S[λ⋅sim1(di,q)−(1−λ)max⁡dj∈Ssim2(di,dj)]MMR = \arg\max_{d_i \in R \setminus S} \left[\lambda \cdot sim_1(d_i, q) - (1-\lambda) \max_{d_j \in S} sim_2(d_i, d_j)\right]MMR=argdi∈R∖Smax[λ⋅sim1(di,q)−(1−λ)dj∈Smaxsim2(di,dj)]

  • SSS:已选文档集合
  • R∖SR \setminus SR∖S:未选文档
  • λ∈[0,1]\lambda \in [0,1]λ∈[0,1]:平衡相关性与多样性

12.2 DPP(Determinantal Point Process)

用矩阵行列式度量一组文档的质量(相关性)和多样性(线性独立性):

P(S)∝det⁡(LS)P(S) \propto \det(L_S)P(S)∝det(LS)

其中 LLL 是核矩阵,Lij=qi⋅ϕ(di)Tϕ(dj)⋅qjL_{ij} = q_i \cdot \phi(d_i)^T \phi(d_j) \cdot q_jLij=qi⋅ϕ(di)Tϕ(dj)⋅qj,qiq_iqi 是文档相关度分数,ϕ(d)\phi(d)ϕ(d) 是文档特征向量。行列式大意味着文档向量线性无关(多样)。


十三、图神经网络与知识图谱

13.1 知识图谱嵌入:TransE

TransE 将三元组 (h,r,t)(h, r, t)(h,r,t) 中的关系建模为头实体到尾实体的向量偏移 h+r≈th + r \approx th+r≈t:

f(h,r,t)=−∣∣h+r−t∣∣L1/L2f(h, r, t) = -||h + r - t||_{L1/L2}f(h,r,t)=−∣∣h+r−t∣∣L1/L2

训练时最大化正例三元组分数,最小化负例三元组分数:

L=∑(h,r,t)∈S∑(h′,r,t′)∈S′max⁡(0, γ+f(h,r,t)−f(h′,r,t′))\mathcal{L} = \sum_{(h,r,t) \in S} \sum_{(h',r,t') \in S'} \max(0,\ \gamma + f(h, r, t) - f(h', r, t'))L=(h,r,t)∈S∑(h′,r,t′)∈S′∑max(0, γ+f(h,r,t)−f(h′,r,t′))

其中 S′S'S′ 是通过随机替换头/尾实体构造的负例集合,γ\gammaγ 是 margin。

13.2 GNN 消息传递

图卷积的通用消息传递框架:

hv(k)=σ(W(k)⋅AGG({hu(k−1):u∈N(v)}∪{hv(k−1)}))h_v^{(k)} = \sigma\left(W^{(k)} \cdot AGG\left(\{h_u^{(k-1)} : u \in \mathcal{N}(v)\} \cup \{h_v^{(k-1)}\}\right)\right)hv(k)=σ(W(k)⋅AGG({hu(k−1):u∈N(v)}∪{hv(k−1)}))

GCN 中的归一化聚合:

hv(k)=σ(∑u∈N(v)∪{v}1∣N(v)∣∣N(u)∣W(k)hu(k−1))h_v^{(k)} = \sigma\left(\sum_{u \in \mathcal{N}(v) \cup \{v\}} \frac{1}{\sqrt{|\mathcal{N}(v)||\mathcal{N}(u)|}} W^{(k)} h_u^{(k-1)}\right)hv(k)=σ u∈N(v)∪{v}∑∣N(v)∣∣N(u)∣ 1W(k)hu(k−1)

在搜索中,知识图谱 + GNN 可以做实体关系推理、Query-Document 语义桥接、用户-商品协同过滤等。


十四、强化学习与探索利用(Exploration & Exploitation)

14.1 多臂老虎机(Multi-Armed Bandit)

搜索中常用于广告竞价、新内容冷启动、结果多样性探索等。

ε-greedy :以概率 ϵ\epsilonϵ 随机探索,以概率 1−ϵ1-\epsilon1−ϵ 选择当前最优。

UCB1(Upper Confidence Bound):通过置信上界平衡探索与利用:

UCBi=xˉi+2ln⁡nniUCB_i = \bar{x}_i + \sqrt{\frac{2 \ln n}{n_i}}UCBi=xˉi+ni2lnn

其中 xˉi\bar{x}_ixˉi 是臂 iii 的历史平均奖励,nin_ini 是被选次数,nnn 是总轮数。第二项是探索奖励,选择次数少的臂会得到更多探索机会。

Thompson Sampling :用 Beta 分布维护每个臂的奖励分布(点击 α\alphaα,未点击 β\betaβ),每次从分布中采样选择最优:

θi∼Beta(αi,βi)\theta_i \sim Beta(\alpha_i, \beta_i)θi∼Beta(αi,βi)

选择 arg⁡max⁡iθi\arg\max_i \theta_iargmaxiθi,点击后更新 αi+=1\alpha_i += 1αi+=1,未点击更新 βi+=1\beta_i += 1βi+=1。


14.2 策略梯度(REINFORCE)

将搜索排序视为序列决策,用 RL 直接优化不可微的搜索指标(如 NDCG):

∇θJ(θ)=Eτ∼πθ[∑t=0T∇θlog⁡πθ(at∣st)⋅Rt]\nabla_\theta J(\theta) = \mathbb{E}{\tau \sim \pi\theta}\left[\sum_{t=0}^T \nabla_\theta \log \pi_\theta(a_t | s_t) \cdot R_t\right]∇θJ(θ)=Eτ∼πθ[t=0∑T∇θlogπθ(at∣st)⋅Rt]

用基线(baseline)减小方差:

∇θJ(θ)=E[∇θlog⁡πθ(at∣st)⋅(Rt−bt)]\nabla_\theta J(\theta) = \mathbb{E}\left[\nabla_\theta \log \pi_\theta(a_t | s_t) \cdot (R_t - b_t)\right]∇θJ(θ)=E[∇θlogπθ(at∣st)⋅(Rt−bt)]


十五、训练技巧与工程

15.1 正则化

L2 正则(Ridge)

Ltotal=L+λ∑iwi2\mathcal{L}_{total} = \mathcal{L} + \lambda \sum_i w_i^2Ltotal=L+λi∑wi2

L1 正则(Lasso):产生稀疏解,可用于特征选择:

Ltotal=L+λ∑i∣wi∣\mathcal{L}_{total} = \mathcal{L} + \lambda \sum_i |w_i|Ltotal=L+λi∑∣wi∣

Elastic Net:L1 + L2 的组合:

Ltotal=L+λ1∑i∣wi∣+λ2∑iwi2\mathcal{L}_{total} = \mathcal{L} + \lambda_1 \sum_i |w_i| + \lambda_2 \sum_i w_i^2Ltotal=L+λ1i∑∣wi∣+λ2i∑wi2


15.2 Batch Normalization

x^i=xi−μBσB2+ϵ,yi=γx^i+β\hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}, \quad y_i = \gamma \hat{x}_i + \betax^i=σB2+ϵ xi−μB,yi=γx^i+β

其中 μB,σB2\mu_B, \sigma_B^2μB,σB2 是批次的均值和方差,γ,β\gamma, \betaγ,β 是可学习的缩放和偏移参数,ϵ\epsilonϵ 防止除零。

Layer Normalization(Transformer 中使用,对序列模型更友好):

LN(x)=γ⋅x−μσ+β,μ=1d∑i=1dxi,σ=1d∑i=1d(xi−μ)2LN(x) = \gamma \cdot \frac{x - \mu}{\sigma} + \beta, \quad \mu = \frac{1}{d}\sum_{i=1}^d x_i, \quad \sigma = \sqrt{\frac{1}{d}\sum_{i=1}^d (x_i - \mu)^2}LN(x)=γ⋅σx−μ+β,μ=d1i=1∑dxi,σ=d1i=1∑d(xi−μ)2


15.3 Adam 优化器

mt=β1mt−1+(1−β1)gt(一阶矩,动量)m_t = \beta_1 m_{t-1} + (1 - \beta_1) g_t \quad (\text{一阶矩,动量})mt=β1mt−1+(1−β1)gt(一阶矩,动量)

vt=β2vt−1+(1−β2)gt2(二阶矩,梯度平方)v_t = \beta_2 v_{t-1} + (1 - \beta_2) g_t^2 \quad (\text{二阶矩,梯度平方})vt=β2vt−1+(1−β2)gt2(二阶矩,梯度平方)

偏差校正(解决初始阶段估计偏小的问题):

m^t=mt1−β1t,v^t=vt1−β2t\hat{m}_t = \frac{m_t}{1 - \beta_1^t}, \quad \hat{v}_t = \frac{v_t}{1 - \beta_2^t}m^t=1−β1tmt,v^t=1−β2tvt

参数更新(AdaGrad 思想:自适应学习率):

θt=θt−1−αv^t+ϵm^t\theta_t = \theta_{t-1} - \frac{\alpha}{\sqrt{\hat{v}_t} + \epsilon} \hat{m}_tθt=θt−1−v^t +ϵαm^t

默认超参数:β1=0.9\beta_1 = 0.9β1=0.9,β2=0.999\beta_2 = 0.999β2=0.999,ϵ=10−8\epsilon = 10^{-8}ϵ=10−8。


15.4 Dropout 与推理

训练时以概率 ppp 随机丢弃神经元(Bernoulli 采样),Inverted Dropout 在训练时即做缩放,推理时无需额外处理:

h~=h⊙m1−p,mi∼Bernoulli(1−p)\tilde{h} = \frac{h \odot m}{1-p}, \quad m_i \sim Bernoulli(1-p)h~=1−ph⊙m,mi∼Bernoulli(1−p)


十六、大规模系统工程

16.1 稀疏特征的 Embedding

搜索中用户 ID、Query、文档 ID 等稀疏特征通过 Embedding Table 处理:

e=E[id],E∈R∣V∣×de = E[id], \quad E \in \mathbb{R}^{|V| \times d}e=E[id],E∈R∣V∣×d

对于超大词表,常用 Hash Trick:

idhash=idmod  Nbucketsid_{hash} = id \mod N_{buckets}idhash=idmodNbuckets

牺牲少量碰撞换取参数量可控。

16.2 在线服务延迟估算

召回阶段 延迟主要由 ANN 搜索决定,HNSW 在百万级向量库中延迟约 1-5ms

精排阶段 延迟由模型推理决定,BERT-Base 在 GPU 上对单样本约 5-10ms,100 个候选需要批处理。

整体延迟目标通常为 100-200ms(P99),各阶段需严格分配预算。


十七、知识总览与面试 Checklist

最后汇总几个最容易被问到的面试问题和对应的核心知识点:

Q: 介绍搜索系统的整体架构?

漏斗结构:Query 理解 → 多路召回 → 粗排 → 精排 → 重排,每步都是精度与延迟的权衡。

Q: 双塔和单塔的区别和适用场景?

双塔适合召回(可预计算,支持 ANN),单塔适合精排(全交互,但无法离线预计算)。

Q: BM25 为什么比 TF-IDF 好?

词频饱和(TF→∞TF \to \inftyTF→∞ 时增益有上限 k1+1k_1+1k1+1)+ 文档长度归一化(参数 bbb)。

Q: NDCG 和 MAP 的区别?

MAP 假设相关度是二值的,NDCG 支持多级相关度;NDCG 对位置折扣用对数函数更平滑。

Q: AUC 的物理含义?

随机选取一正一负样本,模型对正样本打分高于负样本的概率。

Q: LambdaMART 为什么有效?

将 NDCG 变化量融入梯度权重,让模型更专注于改善关键排序位置的错误,直接优化排序目标。

Q: 如何处理位置偏差?

检查假设将点击分解为"被看到"和"相关",用 IPW 加权或 DLA 交替学习消除偏置。

Q: 向量检索如何加速?

HNSW(图结构,O(log⁡n)O(\log n)O(logn))、IVF(聚类分治)、PQ(乘积量化压缩)三类方法,工业上常用 IVFPQ 或 HNSW。


建议学习路径:先掌握评估指标(能手推 NDCG、AUC)→ 熟悉 BM25 和向量检索原理 → 理解双塔/单塔架构及对比学习训练 → 掌握 LTR 三种范式(尤其 LambdaMART)→ 了解搜索系统整体架构和各组件的工程取舍 → 深入位置偏差、多样性、强化学习等进阶话题。

相关推荐
TG_yunshuguoji1 小时前
云代理商:Hermes Agent如何通过技能沉淀降低长期算力消耗
人工智能·云计算·ai 智能体·hermes agent
WangN21 小时前
【SONIC】Isaac Lab 系统入门指南
人工智能·python·机器人·自动驾驶·仿真
沫儿笙1 小时前
库卡机器人二保焊混合气节气装置
网络·人工智能·机器人
SelectDB技术团队1 小时前
强行拍平?全表扫描? AI Agent 动态 JSON 的观测分析
数据库·人工智能·json·apache doris
大模型最新论文速读1 小时前
EvoLM:8B 模型自写评分标准,RL 后超越 GPT-4
人工智能·深度学习·算法·机器学习·自然语言处理
晓山清2 小时前
TCN时序卷积网络详解
网络·人工智能·cnn·时序卷积网络
weixin_397578022 小时前
本地git 的使用
人工智能
霸道流氓气质2 小时前
Spring AI ChatMemory 对话记忆配置JDBC方式到Mysql数据库实战示例与原理讲解
数据库·人工智能·spring
搬砖的梦先生2 小时前
Codex 全 AI 辅助测试操作指南
人工智能