滴滴算法工程师面经
一、矩阵分解的原理与优化意义
矩阵分解在推荐系统中是一个非常核心的方法,尤其是在 协同过滤(Collaborative Filtering) 中。我们可以通过用户对物品的评分行为来推测用户的喜好,从而推荐他们可能喜欢的内容。
1.1. 直观理解:补全稀疏矩阵
在推荐系统中,我们常见的用户-物品评分矩阵 R R R 是一个非常稀疏的矩阵:
用户\物品 | 电影A | 电影B | 电影C | 电影D |
---|---|---|---|---|
用户1 | 5 | ? | 3 | ? |
用户2 | ? | 4 | ? | 2 |
用户3 | 1 | ? | ? | 5 |
目标:预测问号的位置,也就是未评分项的评分,用来推荐用户可能喜欢的物品。
1.2. 数学建模:矩阵分解思想
我们希望将评分矩阵 R ∈ R m × n R \in \mathbb{R}^{m \times n} R∈Rm×n分解为两个低秩矩阵:
R ≈ P Q T R \approx P Q^T R≈PQT
其中:
- P ∈ R m × k P \in \mathbb{R}^{m \times k} P∈Rm×k:用户的潜在因子矩阵 ,每一行表示一个用户在 k k k 维隐空间中的向量(偏好)
- Q ∈ R n × k Q \in \mathbb{R}^{n \times k} Q∈Rn×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=Pi⋅QjT
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)∈Ω∑(Rij−PiQjT)2+λ(∣∣P∣∣F2+∣∣Q∣∣F2)
其中:
- Ω \Omega Ω:表示有评分的索引集合
- λ \lambda λ:正则项系数,防止过拟合
- ∣ ∣ ⋅ ∣ ∣ F ||\cdot||_F ∣∣⋅∣∣F:Frobenius 范数
1.4. 训练算法
常用优化方法:
- ✅ 随机梯度下降法(SGD)
- ✅ 交替最小二乘法(ALS):先固定 ( P ) 求 ( Q ),再固定 ( Q ) 求 ( P ),反复迭代
- ✅ SVD 分解(用于没有缺失值的场景)
1.5. 实际推荐步骤
- 构造用户-物品评分矩阵 R R R
- 矩阵分解 得到 P , Q P, Q P,Q
- 评分预测 R ^ i j = P i Q j T \hat{R}_{ij} = P_i Q_j^T R^ij=PiQjT
- 按预测评分排序 为用户推荐他们没有评分过、预测评分最高的物品
二、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"(柔化)了这个选择过程,保留了其他选项的可能性。
- 比如:[2.1, 5.6, 3.3] → [0.02, 0.91, 0.07]
4.2. Soft 的好处
- 可微分性:相比 hard max,softmax 是光滑且可导的,有利于梯度下降优化。
- 表达不确定性:当模型不确定时,softmax 可以输出类似 [0.4, 0.3, 0.3] 的概率分布,而 hard max 无法做到。
- 避免信息丢失:hard max 直接抹掉非最大值的信息,softmax 则保留了不同选项之间的差异。
Softmax 之所以叫 "soft",是因为它是一种 "平滑的最大化",在输出概率的同时,保留了对非最大值的"温柔态度"。