推荐系统需要同时优化多个目标:点击率、转化率、用户时长、多样性、商业收入等。这些目标往往相互冲突,需要精心设计融合策略。
| 方法 | 核心思想 | 优点 | 缺点 |
|---|---|---|---|
| 加权融合 | 分数加权求和 | 简单 | 权重难调 |
| 乘法融合 | 分数相乘 | 强调交集 | 尺度敏感 |
| 排序融合 | 排名加权 | 尺度无关 | 信息损失 |
| 多任务学习 | 共享表示 | 信息共享 | 负迁移 |
score = Σ α_k · score_k
Σα_k = 1
L = Σ w_k · L_k
不存在另一个解在所有目标上都不差
import numpy as np
np.random.seed(42)
print("="*60+"\n多目标优化推荐\n"+"="*60)
n_samples=500;n_features=8
X=np.random.randn(n_samples,n_features)
# 三个目标
click=(X@np.random.randn(n_features)+np.random.randn(n_samples)*0.5>0).astype(float)
duration=np.abs(X@np.random.randn(n_features)+np.random.randn(n_samples)*0.3)+1
diversity=np.random.random(n_samples)
print(f"样本:{n_samples} 点击率:{click.mean():.4f} 平均时长:{duration.mean():.2f} 平均多样性:{diversity.mean():.4f}")
# 单目标模型
def sigmoid(x):return 1/(1+np.exp(-np.clip(x,-500,500)))
def train_single(X,y,task='click',lr=0.01,epochs=80):
w=np.random.randn(X.shape[1])*0.01;b=0
for ep in range(epochs):
pred=X@w+b
if task=='click':
pred=sigmoid(pred);err=pred-y
loss=-np.mean(y*np.log(pred+1e-10)+(1-y)*np.log(1-pred+1e-10))
elif task=='duration':
err=pred-y;loss=np.mean(err**2)
else:
pred=sigmoid(pred);err=pred-y
loss=-np.mean(y*np.log(pred+1e-10)+(1-y)*np.log(1-pred+1e-10))
w-=lr*(X.T@err/len(y)+0.01*w);b-=lr*np.mean(err)
return w,b
w_c,b_c=train_single(X,click,'click')
w_d,b_d=train_single(X,duration,'duration')
w_v,b_v=train_single(X,diversity,'diversity')
# 加权融合
print("\n--- 加权融合 ---")
scores_c=sigmoid(X@w_c+b_c)
scores_d=sigmoid((X@w_d+b_d-duration.mean())/duration.std())
scores_v=sigmoid(X@w_v+b_v)
for alpha,beta,gamma in [(0.5,0.3,0.2),(0.7,0.2,0.1),(0.3,0.4,0.3)]:
fused=alpha*scores_c+beta*scores_d+gamma*scores_v
top10=np.argsort(-fused)[:50]
print(f"权重({alpha},{beta},{gamma}):点击率={click[top10].mean():.4f} 时长={duration[top10].mean():.2f} 多样性={diversity[top10].mean():.4f}")
# 多任务学习(Shared-Bottom)
print("\n--- 多任务学习(Shared-Bottom) ---")
h_dim=16
W_shared=np.random.randn(n_features,h_dim)*0.01
b_shared=np.zeros(h_dim)
W_click=np.random.randn(h_dim,1)*0.01;W_dur=np.random.randn(h_dim,1)*0.01;W_div=np.random.randn(h_dim,1)*0.01
b_click=0;b_dur=0;b_div=0
lr_mt=0.005
for ep in range(80):
shared=np.maximum(0,X@W_shared+b_shared)
pred_c=sigmoid((shared@W_click+b_click).flatten())
pred_d=shared@W_dur+b_dur
pred_v=sigmoid((shared@W_div+b_div).flatten())
err_c=pred_c-click;err_d=pred_d.flatten()-duration;err_v=pred_v-diversity
loss_c=-np.mean(click*np.log(pred_c+1e-10)+(1-click)*np.log(1-pred_c+1e-10))
loss_d=np.mean(err_d**2);loss_v=-np.mean(diversity*np.log(pred_v+1e-10)+(1-diversity)*np.log(1-pred_v+1e-10))
total_loss=0.5*loss_c+0.3*loss_d+0.2*loss_v
# 更新task-specific
W_click-=lr_mt*(shared.T@err_c[:,None]/n_samples+0.01*W_click)
W_dur-=lr_mt*(shared.T@err_d[:,None]/n_samples+0.01*W_dur)
W_div-=lr_mt*(shared.T@err_v[:,None]/n_samples+0.01*W_div)
# 更新shared(梯度汇总)
d_shared=err_c[:,None]@W_click.T+err_d[:,None]@W_dur.T+err_v[:,None]@W_div.T
d_shared*=((X@W_shared+b_shared)>0).astype(float)
W_shared-=lr_mt*(X.T@d_shared/n_samples+0.01*W_shared)
if(ep+1)%20==0:print(f" Epoch{ep+1}:TotalLoss={total_loss:.4f}")
# 帕累托前沿
print("\n--- 帕累托分析 ---")
pareto_points=[]
for a in np.arange(0,1.1,0.2):
for b in np.arange(0,1.1-a,0.2):
c=1-a-b
fused=a*scores_c+b*scores_d+c*scores_v
top20=np.argsort(-fused)[:50]
pareto_points.append((click[top20].mean(),duration[top20].mean(),diversity[top20].mean()))
print("帕累托前沿(点击率,时长,多样性):")
for p in pareto_points[:5]:print(f" ({p[0]:.4f},{p[1]:.2f},{p[2]:.4f})")
✅ 验证通过
本课代码涵盖了从数据生成、模型训练到效果评估的完整流程。以下是关键步骤的详细解读:
代码设计原则:简洁可读、关键步骤有注释、结果可复现(固定随机种子)。
| 组件 | 版本 | 说明 |
|---|---|---|
| Python | 3.8+ | 推荐3.10版本 |
| NumPy | 1.21+ | 核心数值计算库 |
| SciPy | 1.7+ | 统计检验(部分课程) |
本课是第23课:多目标优化,属于评估与优化阶段。我们系统学习了本课的核心概念、数学原理和代码实现,并通过实机运行验证了算法的正确性。
练习1:实现MMoE(Multi-gate Mixture-of-Experts)
练习2:实现不确定性加权(Kendall 2018)
练习3:用进化算法搜索帕累托前沿
练习4:实现在线多目标权重学习
| 公司 | 场景 | 核心技术 |
|---|---|---|
| 字节跳动 | 抖音/TikTok | 多目标排序+实时特征+双塔召回 |
| 阿里巴巴 | 淘宝推荐 | DIN/DIEN序列模型+MIND多兴趣 |
| 腾讯 | 微信看一看 | DeepFM+图神经网络召回 |
| 美团 | 本地生活推荐 | 多场景多目标+时空特征 |
| Netflix | 视频推荐 | 矩阵分解+深度学习混合 |
✅ 理解推荐系统多目标优化的必要性
✅ 掌握加权融合和多任务学习方法
✅ 实现Shared-Bottom多任务模型
✅ 理解帕累托最优在多目标推荐中的应用