短视频推荐是当前最活跃的推荐场景。抖音/TikTok的成功证明了短视频推荐的巨大商业价值。核心挑战是多目标优化(完播率、互动率、时长)和内容冷启动。
| 指标 | 含义 | 优化方法 |
|---|---|---|
| 完播率 | 观看完成比例 | 短内容+开头吸引力 |
| 互动率 | 点赞/评论/分享 | 内容质量+引导 |
| 时长 | 总观看时间 | 长内容+连续观看 |
| 留存率 | 用户回访率 | 体验+内容多样性 |
score = α·P(completion) + β·P(interact) + γ·E(duration) + δ·freshness
import numpy as np
from collections import defaultdict
np.random.seed(42)
print("="*60+"\n短视频推荐项目\n"+"="*60)
n_users=40;n_videos=50
# 视频特征
video_duration=np.random.randint(5,60,n_videos) # 秒
video_category=np.random.choice(["搞笑","知识","生活","游戏","音乐"],n_videos)
video_quality=np.random.random(n_videos)*0.5+0.5
video_freshness=np.random.randint(1,48,n_videos) # 小时
video_emb=np.random.randn(n_videos,8)
print(f"用户:{n_users} 视频:{n_videos}")
# 用户行为数据
behaviors=defaultdict(list)
for u in range(n_users):
n_watched=np.random.randint(10,30)
for _ in range(n_watched):
vid=np.random.randint(n_videos)
duration=video_duration[vid]
watch_time=min(np.random.exponential(duration*0.6),duration)
completion_rate=watch_time/duration
liked=np.random.random()<0.15
shared=np.random.random()<0.05
commented=np.random.random()<0.08
behaviors[u].append((vid,completion_rate,liked,shared,commented,watch_time))
total_actions=sum(len(b)for b in behaviors.values())
print(f"总行为数:{total_actions}")
# 多目标建模
print("\n--- 多目标排序 ---")
def sigmoid(x):return 1/(1+np.exp(-np.clip(x,-500,500)))
# 完播率模型
completion_labels=np.array([b[1]>0.8for u in range(n_users)for b in behaviors[u]])
# 互动率(点赞+评论+分享)
interact_labels=np.array([b[2]or b[3]or b[4]for u in range(n_users)for b in behaviors[u]])
# 时长模型
duration_labels=np.array([b[5]for u in range(n_users)for b in behaviors[u]])
print(f"完播率:{completion_labels.mean():.4f} 互动率:{interact_labels.mean():.4f} 平均时长:{duration_labels.mean():.1f}s")
# 简单多目标融合
target=0
target_behaviors=behaviors[target]
watched=set(b[0]for b in target_behaviors)
# 计算每个视频的多目标得分
multi_scores={}
for v in range(n_videos):
if v in watched:continue
# 完播率预估(基于视频时长)
completion_prob=1/(1+video_duration[v]/30)
# 互动率预估(基于视频质量)
interact_prob=video_quality[v]*0.3
# 时长预估
expected_duration=video_duration[v]*completion_prob*0.6
# 时效性
freshness=1/(1+video_freshness[v]/12)
# 多目标融合
score=0.4*completion_prob+0.25*interact_prob+0.15*expected_duration/60+0.2*freshness
multi_scores[v]=score
ranked=sorted(multi_scores.items(),key=lambda x:-x[1])
print(f"多目标推荐Top-5:")
for v,s in ranked[:5]:
print(f" 视频{v}:综合={s:.3f} 完播率预估={1/(1+video_duration[v]/30):.3f} 时长={video_duration[v]}s 分类={video_category[v]}")
# EE策略
print("\n--- EE策略 ---")
# 新视频用Thompson Sampling
new_videos=np.where(video_freshness<6)[0]
print(f"新视频数:{len(new_videos)}")
alpha_ts=np.ones(n_videos);beta_ts=np.ones(n_videos)
for u in range(n_users):
for b in behaviors[u]:
vid=b[0]
if b[1]>0.5:alpha_ts[vid]+=1
else:beta_ts[vid]+=1
ts_scores=np.array([np.random.beta(alpha_ts[v],beta_ts[v])for v in range(n_videos)])
ts_rec=np.argsort(-ts_scores)[:5]
print(f"Thompson推荐:{[f'视频{v}'for v in ts_rec]}")
# 完播率分析
print("\n--- 完播率分析 ---")
for cat in ["搞笑","知识","生活","游戏","音乐"]:
cat_videos=np.where(video_category==cat)[0]
if len(cat_videos)==0:continue
cat_completions=[]
for u in range(n_users):
for vid,cr,_,_,_,_ in behaviors[u]:
if video_category[vid]==cat:cat_completions.append(cr)
if cat_completions:
print(f" {cat}:平均完播率={np.mean(cat_completions):.4f}")
✅ 验证通过
本课代码涵盖了从数据生成、模型训练到效果评估的完整流程。以下是关键步骤的详细解读:
代码设计原则:简洁可读、关键步骤有注释、结果可复现(固定随机种子)。
| 组件 | 版本 | 说明 |
|---|---|---|
| Python | 3.8+ | 推荐3.10版本 |
| NumPy | 1.21+ | 核心数值计算库 |
| SciPy | 1.7+ | 统计检验(部分课程) |
本课是第29课:短视频推荐项目,属于实战项目阶段。我们系统学习了本课的核心概念、数学原理和代码实现,并通过实机运行验证了算法的正确性。
练习1:实现DeepFM短视频排序模型
练习2:实现基于视频内容的多模态特征提取
练习3:实现用户兴趣实时更新机制
练习4:实现多目标MMoE模型
| 公司 | 场景 | 核心技术 |
|---|---|---|
| 字节跳动 | 抖音/TikTok | 多目标排序+实时特征+双塔召回 |
| 阿里巴巴 | 淘宝推荐 | DIN/DIEN序列模型+MIND多兴趣 |
| 腾讯 | 微信看一看 | DeepFM+图神经网络召回 |
| 美团 | 本地生活推荐 | 多场景多目标+时空特征 |
| Netflix | 视频推荐 | 矩阵分解+深度学习混合 |
✅ 理解短视频推荐的核心挑战
✅ 实现多目标排序(完播/互动/时长)
✅ 掌握Thompson Sampling冷启动策略
✅ 评估短视频推荐效果