搜广推校招面经七十一

滴滴算法工程师面经

一、矩阵分解的原理与优化意义

矩阵分解在推荐系统中是一个非常核心的方法,尤其是在 协同过滤(Collaborative Filtering) 中。我们可以通过用户对物品的评分行为来推测用户的喜好,从而推荐他们可能喜欢的内容。

1.1. 直观理解:补全稀疏矩阵

在推荐系统中,我们常见的用户-物品评分矩阵 R R R 是一个非常稀疏的矩阵:

用户\物品电影A电影B电影C电影D
用户15?3?
用户2?4?2
用户31??5

目标:预测问号的位置,也就是未评分项的评分,用来推荐用户可能喜欢的物品。

1.2. 数学建模:矩阵分解思想

我们希望将评分矩阵 R ∈ R m × n R \in \mathbb{R}^{m \times n} RRm×n分解为两个低秩矩阵:
R ≈ P Q T R \approx P Q^T RPQT
其中:

  • P ∈ R m × k P \in \mathbb{R}^{m \times k} PRm×k:用户的潜在因子矩阵,每一行表示一个用户在 k k k 维隐空间中的向量(偏好)
  • Q ∈ R n × k Q \in \mathbb{R}^{n \times k} QRn×k:物品的潜在因子矩阵,每一行表示一个物品在 k k k 维隐空间中的向量(特性)
  • k k k:潜在维度,远小于用户数 m m m 和物品数 n n n

最终评分预测:
R ^ i j = P i ⋅ Q j T \hat{R}_{ij} = P_i \cdot Q_j^T R^ij=PiQjT

1.3. 优化目标函数

我们只对已有评分位置进行拟合:
min ⁡ P , Q ∑ ( i , j ) ∈ Ω ( R i j − P i Q j T ) 2 + λ ( ∣ ∣ P ∣ ∣ F 2 + ∣ ∣ Q ∣ ∣ F 2 ) \min_{P,Q} \sum_{(i,j)\in\Omega} (R_{ij} - P_i Q_j^T)^2 + \lambda(||P||_F^2 + ||Q||_F^2) P,Qmin(i,j)Ω(RijPiQjT)2+λ(∣∣PF2+∣∣QF2)

其中:

  • Ω \Omega Ω:表示有评分的索引集合
  • λ \lambda λ:正则项系数,防止过拟合
  • ∣ ∣ ⋅ ∣ ∣ F ||\cdot||_F ∣∣F:Frobenius 范数

1.4. 训练算法

常用优化方法:

  • 随机梯度下降法(SGD)
  • 交替最小二乘法(ALS):先固定 ( P ) 求 ( Q ),再固定 ( Q ) 求 ( P ),反复迭代
  • SVD 分解(用于没有缺失值的场景)

1.5. 实际推荐步骤

  1. 构造用户-物品评分矩阵 R R R
  2. 矩阵分解 得到 P , Q P, Q P,Q
  3. 评分预测 R ^ i j = P i Q j T \hat{R}_{ij} = P_i Q_j^T R^ij=PiQjT
  4. 按预测评分排序 为用户推荐他们没有评分过、预测评分最高的物品

二、XGBoost vs LightGBM的差异?如何选择分裂点?

见【搜广推校招面经十、九、六十二】

三、如果数据分布偏移(如疫情前后出行规律变化),如何调整模型?

在现实场景中,如疫情前后,用户行为可能发生显著变化,导致训练数据与当前预测环境存在**数据分布偏移(Data Distribution Shift)**问题。为应对这一挑战,可以从以下几个方面调整模型:

3.1. 数据层面的调整

增加新时期数据

  • 收集疫情后(或分布变化后)的数据,扩充训练集。
  • 保证训练数据涵盖当前的特征分布。

数据加权或重采样

  • 对疫情前后的样本设置不同权重,增强模型对现阶段数据的适应能力。
  • 使用重要性加权 (Importance Weighting),通过估计测试分布和训练分布之间的比值进行重加权。

数据漂移检测与特征选择

  • 使用**KS检验、PCA投影、最大均值差异(MMD)**等方法,检测哪些特征发生了分布变化。
  • 剔除不稳定特征,仅保留稳定有效特征进行建模。

3.2. 模型训练策略调整

迁移学习(Transfer Learning) / 增量学习

  • 在原模型基础上,使用疫情后的少量标注数据进行微调(fine-tuning)
  • 或从零开始对新数据重新训练(若旧数据不再具有代表性)。

联合训练(Joint Training)

  • 将疫情前后的数据合并,同时训练模型,但引入领域标识(Domain Indicator)或多任务学习方式,区分两个分布的数据。

四、Softmax为什么soft?

Softmax 是一种函数,常用于多分类模型的最后一层,用于将一个向量映射为一个概率分布。公式如下:
Softmax ( z i ) = e z i ∑ j e z j \text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{j} e^{z_j}} Softmax(zi)=jezjezi
它的输入是一组实数 z 1 , z 2 , . . . , z n z_1, z_2, ..., z_n z1,z2,...,zn,输出是 n n n 个值,这些值都在 0 和 1 之间,总和为 1,表示每个类的概率。

4.1. Soft 的含义

“Soft” 是相对于 “Hard” 来说的。比如:

  • Hard max 是只取最大值的位置为 1,其他为 0
    • 比如:[2.1, 5.6, 3.3] → [0, 1, 0]
  • Softmax 则是“柔和地”表达各个值的相对大小:
    • 比如:[2.1, 5.6, 3.3] → [0.02, 0.91, 0.07]
      也就是说,Softmax 不是简单地做最大化(max)操作,而是“soft”(柔化)了这个选择过程,保留了其他选项的可能性。

4.2. Soft 的好处

  • 可微分性:相比 hard max,softmax 是光滑且可导的,有利于梯度下降优化。
  • 表达不确定性:当模型不确定时,softmax 可以输出类似 [0.4, 0.3, 0.3] 的概率分布,而 hard max 无法做到。
  • 避免信息丢失:hard max 直接抹掉非最大值的信息,softmax 则保留了不同选项之间的差异。

Softmax 之所以叫 “soft”,是因为它是一种 “平滑的最大化”,在输出概率的同时,保留了对非最大值的“温柔态度”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/900729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实习技能记录【2】-----LVGL[基本概念]

LVGL主要概念 1. Screen (屏幕): 概念: 屏幕是 LVGL 应用程序中的顶层容器。它是用户界面的根对象,所有的可见 UI 元素最终都会添加到某个屏幕上(通常是活动屏幕)。 功能: 作为其他 UI 元素的父对象。 可以拥有自己的背景颜色、背景图片等样…

【c++11】c++11新特性(上)(列表初始化、右值引用和移动语义、类的新默认成员函数、lambda表达式)

🌟🌟作者主页:ephemerals__ 🌟🌟所属专栏:C 目录 前言 一、列表初始化 1. 大括号初始化 2. initializer_list 二、右值引用和移动语义 1. 左值和右值 2. 左值引用和右值引用 引用延长生命周期 左…

软考中级-软件设计师 2022年下半年上午题真题解析:通关秘籍+避坑指南

📚 目录(快速跳转) 选择题(上午题)(每题1分,共75分)一、 计算机系统基础知识 🖥️💻 题目1:计算机硬件基础知识 - RISC(精简指令集计算…

基于MCP协议调用的大模型agent开发02

目录 在AI agent的开发过程中,如何使用mcp服务器作为大模型的工具调用‘百宝箱’? FastAPI FastMCP 本系列: 基于MCP协议调用的大模型agent开发01-CSDN博客 基于MCP协议调用的大模型agent开发02-CSDN博客 在AI agent的开发过程中,…

ES6(8) Fetch API 详解

1. Fetch API 简介 fetch 是 ES6 提供的基于 Promise 的 API,用于发送 HTTP 请求并处理服务器响应数据。与传统的 XMLHttpRequest 相比,fetch 语法更加简洁,使用 Promise 进行异步处理,避免了回调地狱。 1.1 fetch() 的基本用法 …

原生SSE实现AI智能问答+Vue3前端打字机流效果

实现流程: 1.用户点击按钮从右侧展开抽屉(drawer),打开模拟对话框 2.用户输入问题,点击提问按钮,创建一个SSE实例请求后端数据,由于SSE是单向流,所以每提一个问题都需要先把之前的实…

CUDA 工具链将全面原生支持 Python

根据 NVIDIA 在 2025 年 GTC 大会上的官宣,CUDA 工具链将全面原生支持 Python 编程,这一重大更新旨在降低 GPU 编程门槛,吸引更广泛的 Python 开发者进入 CUDA 生态。以下是核心信息整合: 1. 原生支持的意义与背景 无需 C/C 基础…

jupyter notebook 显示conda虚拟环境

使用 nb_conda_kernels 安装 nb_conda_kernels:这个包可以自动从你的 Conda 环境中发现并列出内核。 conda activate base # 确保你在 base 环境或任何其他环境中安装 conda install nb_conda_kernels显示jupyternotebook当前所在的位置。

【AI】MCP概念

一文讲透 MCP(附 Apifox MCP Server 内测邀请) 7分钟讲清楚MCP是什么?统一Function calling规范,工作量锐减至1/6,人人手搓Manus!? | 一键链接千台服务器,几行代码接入海量外部工具…

WSL1升级到WSL2注意事项

今天要在WSL上安装docker,因为机器上安装了wsl1,docker安装后启动不了,通过询问deepseek发现docker只能在wsl2上安装,因此就想着将本机的wsl1升级到wsl2。 确保你的 Windows 系统是 Windows 10(版本 1903 及以上&…

Pycharm常用快捷键总结

主要是为了记录windows下的PyCharm的快捷键,里面的操作都试过了功能描述会增加备注。 文件操作 快捷键功能描述Ctrl N新建文件Ctrl Shift N根据名称查找文件Ctrl O打开文件Ctrl S保存当前文件Ctrl Shift S另存为Alt F12打开终端(Terminal&…

电池分选机:新能源时代的品质守护者|深圳比斯特自动化

在这个新能源蓬勃发展的时代,电池作为能量的存储与释放单元,其性能与质量直接关系到整个系统的稳定运行与效率提升。而电池分选机,作为电池生产流程中的关键一环,正扮演着品质守护者的角色,为新能源产业的高质量发展保…

认识 Linux 内存构成:Linux 内存调优之虚拟内存与物理内存

写在前面 博文内容涉及 Linux 内存构成基本认知包括虚拟内存和物理内存映射,多级页表和MMU简单认知理解不足小伙伴帮忙指正对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的…

SCI科学论文的重要组成部分

科学论文的核心结构 科学论文通常遵循IMRAD结构,即: 引言(Introduction)方法(Methods)结果(Results)讨论(Discussion) 除此之外,还包括其他几个关键部分。让我为您详细介绍每个部分的作用和重要性: 1. 标题(Title) 标题是论文…

期权时间价值与隐含波动率怎么选?

期权隐含波动率与时间价值要怎么选?期权隐含波动率IV对期权价格有着巨大的影响。整体来看,期权隐波与期权价格呈正相关关系。当期权隐波从低水平上升时,期权价格也会相应上涨;反之,当隐波下降,期权价格则会…

STM32 HAL库扩大USB CDC的输入缓冲区

STM32 HAL库,使用USB, 扩大输入暂存区的方法 使用STM32的USB通讯CubeMX建立配置Serial Wire时钟配置USB配置时钟频率设置代码编写运行效果总结使用STM32的USB通讯 STM32可以不用使用串口转换直接和USB通讯。这给串口调试提供了极大的方便。编程,我使用了STM32CubeIDE编程。这…

ffmpeg函数简介(封装格式相关)

文章目录 🌟 前置说明:FFmpeg 中 AVFormatContext 是什么?🧩 1. avformat_alloc_context功能:场景: 🧩 2. avformat_open_input功能:说明:返回值: &#x1f9…

费马小定理

快速幂 理论 a n a a ⋯ a a^n a a \cdots a anaa⋯a,暴力的计算需要 O(n) 的时间。 快速幂使用二进制拆分和倍增思想,仅需要 O(logn) 的时间。 对 n 做二进制拆分,例如, 3 13 3 ( 1101 ) 2 3 8 ⋅ 3 4 ⋅ 3 1 3^{13}…

ADGaussian:用于自动驾驶的多模态输入泛化GS方法

25年4月来自香港中文大学和浙大的论文“ADGaussian: Generalizable Gaussian Splatting for Autonomous Driving with Multi-modal Inputs”。 提出 ADGaussian 方法,用于可泛化的街道场景重建。所提出的方法能够从单视图输入实现高质量渲染。与之前主要关注几何细…

js中this指向问题

在js中,this关键字的指向是一个比较重要的概念,它的值取决于函数的调用方式。 全局状态下 //全局状态下 this指向windowsconsole.log("this", this);console.log("thiswindows", this window); 在函数中 // 在函数中 this指向win…