搜广推校招面经九十一

美团 机器学习/数据挖掘算法工程师_二面

一、介绍一下ESMM模型,是否有进行过函数推导

传统的转化率建模方式:

  • 只用发生点击(click=1)的样本来训练 CVR 模型。
  • CVR 定义如下:
    CVR=P(y=1∣x,z=1) CVR = P(y=1 | x, z=1) CVR=P(y=1∣x,z=1)
    • y=1 表示用户发生了转化(如购买)
    • z=1 表示用户点击了广告

这样做的问题:

  • 样本选择偏差(Sample Selection Bias, SSB):训练样本不是来自真实全量分布。
  • 数据稀疏(Data Sparsity):点击后转化的数据远少于点击数据,训练困难。

二、ESMM 思想

ESMM 通过建模两个可观测事件,联合推导出 CVR:

  1. CTR 模型:点击概率 : P(z=1∣x)P(z=1 | x)P(z=1∣x)
  2. CTCVR 模型:点击并转化的联合概率 : P(y=1,z=1∣x)P(y=1, z=1 | x)P(y=1,z=1∣x)
  3. CVR 由上述两个计算得出
    CVR(x)=P(y=1∣x,z=1)=P(y=1,z=1∣x)/P(z=1∣x)=CTCVR(x)/CTR(x)CVR(x) = P(y=1 | x, z=1) = P(y=1, z=1 | x) / P(z=1 | x) = CTCVR(x) / CTR(x)CVR(x)=P(y=1∣x,z=1)=P(y=1,z=1∣x)/P(z=1∣x)=CTCVR(x)/CTR(x)

优点:

  • 所有样本都使用曝光(impression)数据训练,无偏差
  • 转化事件稀疏时仍能训练 CTCVR,提高泛化能力

2.1. 模型结构

         x
         │
     ┌───┴─────┐
     │         │
     ▼         ▼
  CTR网络   CTCVR网络
     │         │
     ▼         ▼
 P(z=1|x)   P(y=1,z=1|x)
     │         │
     └────┬────┘
          ▼
 CVR(x) = P(y=1|x,z=1) = CTCVR(x)/CTR(x)
  • x:样本特征
  • z ∈ {0,1}:是否点击
  • y ∈ {0,1}:是否转化(仅在 z=1 时观察)

三、如何解决类别不平衡问题,追问了focal loss。

3.1. Focal Loss(用于类别不平衡):

FL(pt)=−αt(1−pt)γlog⁡(pt) FL(p_t) = -\alpha_t (1 - p_t)^\gamma \log(p_t) FL(pt)=αt(1pt)γlog(pt)

  • ptp_tpt:正确类别的预测概率
  • αt\alpha_tαt:类别权重(如正样本 0.25,负样本 0.75)
  • γ\gammaγ:聚焦因子,常设为 2
  • 易分样本 pt→1p_t → 1pt1(1−pt)γ(1 - p_t)^γ(1pt)γ 接近 0,降低损失
  • 难分样本 pt→0p_t → 0pt0(1−pt)γ(1 - p_t)^γ(1pt)γ 接近 1,保留高损失

3.2. PyTorch 伪代码实现

import torch
import torch.nn.functional as F

def focal_loss(inputs, targets, alpha=0.25, gamma=2.0, reduction='mean'):
    ce_loss = F.cross_entropy(inputs, targets, reduction='none')  # shape: [B]
    pt = torch.exp(-ce_loss)  # shape: [B], 概率越大表示模型越自信
    focal_loss = alpha * (1 - pt) ** gamma * ce_loss
    if reduction == 'mean':
        return focal_loss.mean()
    elif reduction == 'sum':
        return focal_loss.sum()
    else:
        return focal_loss  # no reduction

四、Faiss 的应用场景

Faiss(Facebook AI Similarity Search)是由 Facebook 开发的用于高效相似度搜索和密集向量聚类的库,主要用于大规模向量检索。以下是其典型应用领域:

4.1. 向量检索(Vector Search)

  • 图像检索:将图像特征向量进行索引,支持从数百万张图片中快速查找相似图片。
  • 文本相似度匹配:将文本编码成向量(如 BERT 输出)后进行相似查询,常用于问答系统、语义搜索。
  • 音频匹配:音频特征向量化后使用 Faiss 做快速近似搜索。

4.2. 推荐系统(Recommender Systems)

  • 个性化推荐:通过用户和物品的嵌入向量进行高效匹配,查找最相关的物品或用户。
  • 协同过滤:通过用户行为特征向量化后查找相似用户或物品。

4.3. 大模型应用中的向量数据库(LLM Retrieval Augmentation)

  • RAG(Retrieval-Augmented Generation):用于将外部知识库(如文档、网页)的嵌入向量构建索引,供大语言模型实时查询。
  • 向量存储后端:作为向量数据库的一部分被 LangChain、LlamaIndex 等工具集成。

4.4. 聚类分析(Clustering)

  • K-Means 聚类:支持 GPU 加速的高维数据聚类分析。
  • 大规模无监督学习:用于加速预训练模型中的表示学习阶段。

4.5. 图像和视频去重

  • 重复内容检测:基于向量相似度快速判断两张图像或视频片段是否重复。

4.6. 生物信息学 / 医疗数据处理

  • 基因序列或蛋白质结构向量匹配:用于查找相似的结构或功能蛋白。

4.7. 索引创建与相似度搜索

  • Flat 索引(暴力搜索)
  • IVF 索引(倒排索引 + 聚类中心)
  • HNSW 索引(图结构索引)
  • PQ、OPQ等

五、215. 数组中的第K个最大元素

搜广推校招面经九十一_第1张图片

class Solution:
    def partition(self, nums, left, right):
        pivot = nums[right]
        i = left-1
        for j in range(left, right):
            if nums[j] <= pivot:
                i += 1
                nums[i], nums[j] = nums[j], nums[i]
        nums[i+1], nums[right] = nums[right], nums[i+1]
        return i+1
        
    def topk_split(self, nums, k, left, right):

        if left<right:
            index = self.partition(nums, left, right)
            if index == k:
                return
            elif index < k:
                self.topk_split(nums, k, index+1, right)
            else:
                self.topk_split(nums, k, left, index-1)

    def quicksort(self, nums, left, right):
        # 快排
        if left < right:
            index = self.partition(nums, left, right)
            quicksort(nums, left, index-1)
            quicksort(nums, index+1, right)


    def findKthLargest(self, nums: List[int], k: int) -> int:
        right = len(nums)-1
        # 上面快排是从小到大排序,要找topk大,那就该倒过来n-k
        self.topk_split(nums, right-k+1, 0, right)
        return nums[right-k+1]

你可能感兴趣的:(搜广推校招面经九十一)