一、强化学习六要素 → DRN 推荐系统映射
| 强化学习要素 | 在 DRN 推荐系统中的对应 | 本例中的具体对象 |
|---|---|---|
| 智能体(Agent) | 推荐系统本身(DRN 模型 + 决策引擎) | DRN 双塔 DQN 模型 |
| 环境(Environment) | 新闻 App 端 + 用户 | 今日快讯 App 与用户小明 |
| 状态(State) | 用户当前的特征 + 上下文环境 | 小明(25岁,男,喜欢体育)+ 晚上 8 点 + 手机端 |
| 行动(Action) | 推荐一篇具体的新闻 | 推荐"2026 世界杯预选赛"新闻 |
| 奖励(Reward) | 用户反馈(点击 + 活跃度变化) | 点击 (+1) + 活跃度上升 (+0.5) = +1.5 |
| 目标(Objective) | 最大化长期累积奖励(留存 + 点击) | 提高用户 7 日留存率和总点击量 |
二、DRN 是什么?
一句话概括 :DRN 是一个基于 Deep Q-Network(DQN) 的强化学习推荐框架,它将推荐系统建模为一个智能体(Agent)与 用户环境(Environment)持续交互的过程。核心思想是不仅仅优化当前点击率(短期奖励),更要优化用户长期留存(长期累积奖励)。
核心创新点:
- 双塔 DQN 结构 :用户塔(状态)+ 物品塔(行动),输出行动质量得分 Q(s,a)Q(s,a)Q(s,a)。
- 在线实时更新 :通过**微更新(Minor Update)学习实时反馈,通过主更新(Major Update)**纠正长期偏差。
- 高效探索策略 :使用 Dueling Bandit Gradient Descent (DBGD) 进行参数空间扰动,平衡"探索"与"利用"。
- 新的奖励信号:引入**用户活跃度(User Activeness)**作为长期反馈指标。
三、DRN 模型整体框架(PUSH → FEEDBACK → UPDATE)
DRN 的完整工作流程分为四个核心环节,循环往复:
| 环节 | 英文名 | 含义 | 具体操作 |
|---|---|---|---|
| 推送 | PUSH | 智能体根据当前状态生成推荐列表推送给用户 | 双塔 DQN 对候选新闻打分,排序后取 Top-K 展示 |
| 反馈 | FEEDBACK | 收集用户对推荐结果的反应 | 收集点击(Click)和用户活跃度变化(Activeness)作为奖励 |
| 微更新 | MINOR UPDATE | 实时、轻量地更新模型 | 使用 DBGD 算法,比较当前网络与探索网络的表现,择优更新 |
| 主更新 | MAJOR UPDATE | 定期、全局地重新训练模型 | 使用经验池(Replay Buffer)中的全量历史数据,重新训练 DQN,纠正微更新的偏差 |
四、特征设计与双塔 DQN 结构
1. 特征四分类(DRN 的输入)
| 特征类型 | 包含内容 | 在 DQN 中的角色 |
|---|---|---|
| 用户特征 | 用户 ID、年龄、性别、历史点击过的新闻 ID 等(如 1小时/6小时/1周内点击) | 构成状态(State) 的主体 |
| 环境/上下文特征 | 当前时间、星期几、设备类型、新闻新鲜度等 | 补充状态(State) 信息 |
| 新闻特征 | 新闻 ID、标题关键词向量、类别、作者、发布时间等 | 构成行动(Action) 的主体 |
| 用户-新闻交叉特征 | 用户点击过该新闻所属类别的次数、该新闻与用户历史兴趣的相似度等 | 补充行动(Action) 信息 |
2. 双塔 DQN 的数学建模
DRN 使用双塔结构 来计算 Q(s,a)Q(s, a)Q(s,a):
- 用户塔(State Tower) :输入 = 用户特征 + 环境特征 → 经过 MLP → 得到状态向量 sss。
- 物品塔(Action Tower) :输入 = 新闻特征 + 交叉特征 → 经过 MLP → 得到行动向量 aaa。
- 互操作层(Interaction Layer) :将 sss 和 aaa 做点积(或拼接后 MLP),输出一个标量 Q(s,a)Q(s, a)Q(s,a) ,表示"在当前状态 sss 下采取行动 aaa 的预期总收益"。
公式:
Q(s,a)=MLPinteract(MLPuser(user_feat,context), MLPitem(news_feat,cross_feat))Q(s, a) = \text{MLP}{interact}(\text{MLP}{user}(user\\_feat, context), \ \text{MLP}_{item}(news\\_feat, cross\\_feat))Q(s,a)=MLPinteract(MLPuser(user_feat,context), MLPitem(news_feat,cross_feat))
五、完整业务场景与数据推导(手算演示)
场景:新闻 App "今日快讯" 要为用户"小明"推荐一篇新闻。
- 真实标签 :假设小明点击了这篇新闻(正反馈)。
- 候选新闻:标题为"2026 世界杯预选赛精彩回顾"。
特征向量化(为了手算,设定小维度 d=2):
| 特征类型 | 具体特征值 | 向量表示(维度 2) |
|---|---|---|
| 用户特征 + 环境(状态 sss) | 小明(25岁,男性,喜欢体育,晚上 8 点用手机) | s=0.8,0.6s = 0.8, 0.6s=0.8,0.6 |
| 新闻特征 + 交叉(行动 aaa) | 体育类,关键词"足球",与用户历史体育点击交叉得分高 | a=0.5,0.9a = 0.5, 0.9a=0.5,0.9 |
双塔 MLP 简化(为了手算,省略隐藏层,直接线性映射到 Q 值):
假设已经训练好的权重向量 WsW_sWs(2维)和 WaW_aWa(2维),以及偏置 b=0.1b = 0.1b=0.1。互操作层采用点积 :
Q(s,a)=(Ws⊙s)⋅(Wa⊙a)+bQ(s, a) = (W_s \odot s) \cdot (W_a \odot a) + bQ(s,a)=(Ws⊙s)⋅(Wa⊙a)+b
设 Ws=0.1,0.2W_s = 0.1, 0.2Ws=0.1,0.2,Wa=0.3,0.4W_a = 0.3, 0.4Wa=0.3,0.4。
步骤 1:PUSH(前向传播计算当前网络 Q 值)
计算状态加权向量 s′s's′:
s′=Ws⊙s=0.1×0.8, 0.2×0.6=0.08,0.12s' = W_s \odot s = 0.1\\times0.8,\\ 0.2\\times0.6 = 0.08, 0.12s′=Ws⊙s=0.1×0.8, 0.2×0.6=0.08,0.12
计算行动加权向量 a′a'a′:
a′=Wa⊙a=0.3×0.5, 0.4×0.9=0.15,0.36a' = W_a \odot a = 0.3\\times0.5,\\ 0.4\\times0.9 = 0.15, 0.36a′=Wa⊙a=0.3×0.5, 0.4×0.9=0.15,0.36
计算 Q 值(点积 + 偏置) :
Q(s,a)=s′⋅a′+0.1=0.08×0.15+0.12×0.36+0.1Q(s, a) = s' \cdot a' + 0.1 = 0.08\times0.15 + 0.12\times0.36 + 0.1Q(s,a)=s′⋅a′+0.1=0.08×0.15+0.12×0.36+0.1
逐项计算:
- 0.08×0.15=0.0120.08 \times 0.15 = 0.0120.08×0.15=0.012
- 0.12×0.36=0.04320.12 \times 0.36 = 0.04320.12×0.36=0.0432
- 总和 = 0.012+0.0432+0.1=0.15520.012 + 0.0432 + 0.1 = 0.15520.012+0.0432+0.1=0.1552
当前网络预测结果 :当前网络对这篇新闻的 Q 值为 0.15520.15520.1552。
步骤 2:EXPLORATION(DBGD 生成探索网络)
DRN 不直接推送 Top-1,而是利用 DBGD 生成一个探索网络 Q~Q_{\tilde{}}Q~。
生成探索网络参数 (对权重加随机扰动):
设探索因子 α=0.1\alpha = 0.1α=0.1,随机生成扰动 ΔWs=0.01,−0.02\Delta W_s = 0.01, -0.02ΔWs=0.01,−0.02,ΔWa=−0.01,0.02\Delta W_a = -0.01, 0.02ΔWa=−0.01,0.02。
探索网络的权重:
Ws~=Ws+α⋅ΔWs=0.1+0.001, 0.2−0.002=0.101,0.198W_s^{\tilde{}} = W_s + \alpha \cdot \Delta W_s = 0.1 + 0.001, \\ 0.2 - 0.002 = 0.101, 0.198Ws~=Ws+α⋅ΔWs=0.1+0.001, 0.2−0.002=0.101,0.198
Wa~=0.3−0.001, 0.4+0.002=0.299,0.402W_a^{\tilde{}} = 0.3 - 0.001, \\ 0.4 + 0.002 = 0.299, 0.402Wa~=0.3−0.001, 0.4+0.002=0.299,0.402
重新计算探索网络的 Q 值 Q~(s,a)Q_{\tilde{}}(s, a)Q~(s,a):
- s~′=0.101×0.8, 0.198×0.6=0.0808,0.1188s'_{\tilde{}} = 0.101\\times0.8,\\ 0.198\\times0.6 = 0.0808, 0.1188s~′=0.101×0.8, 0.198×0.6=0.0808,0.1188
- a~′=0.299×0.5, 0.402×0.9=0.1495,0.3618a'_{\tilde{}} = 0.299\\times0.5,\\ 0.402\\times0.9 = 0.1495, 0.3618a~′=0.299×0.5, 0.402×0.9=0.1495,0.3618
- Q~=0.0808×0.1495+0.1188×0.3618+0.1Q_{\tilde{}} = 0.0808\times0.1495 + 0.1188\times0.3618 + 0.1Q~=0.0808×0.1495+0.1188×0.3618+0.1
- =0.01208+0.04298+0.1=0.15506= 0.01208 + 0.04298 + 0.1 = 0.15506=0.01208+0.04298+0.1=0.15506
探索网络的 Q 值 0.155060.155060.15506 略低于当前网络 0.15520.15520.1552(但为了演示探索成功的情况,我们假设实际线上反馈中探索网络表现更好。真实情况会收集实际反馈来比较)。
关键点:在真实系统中,两个网络产生的推荐列表会通过**间隔穿插(Interleaving)**混合后推送给用户。假设我们观测到探索网络的推荐获得了更好的用户反馈(点击率更高),我们就更新。
步骤 3:FEEDBACK(获取实时奖励)
DRN 的奖励(Reward)包含两部分:
- 即时点击奖励 :用户点击 → Rclick=+1R_{click} = +1Rclick=+1;未点击 → Rclick=−0.1R_{click} = -0.1Rclick=−0.1。
- 用户活跃度奖励 :根据用户是否持续使用 App 来调整。假设小明点击后,活跃度上升,Ractiveness=+0.5R_{activeness} = +0.5Ractiveness=+0.5。
总即时奖励 :
R=Rclick+Ractiveness=1+0.5=1.5R = R_{click} + R_{activeness} = 1 + 0.5 = 1.5R=Rclick+Ractiveness=1+0.5=1.5
步骤 4:MINOR UPDATE(竞争梯度下降算法更新模型)
DBGD 的核心是比较当前网络 与探索网络的线上表现。
比较逻辑:
- 假设实际线上反馈显示:探索网络的推荐列表表现更好(例如,点击率更高)。
- 因此,当前网络的参数朝探索网络的方向更新(而不是朝梯度方向)。
更新公式 (论文中的简化版):
Wnew=Wold+η⋅(W~−Wold)W_{new} = W_{old} + \eta \cdot (W_{\tilde{}} - W_{old})Wnew=Wold+η⋅(W~−Wold)
其中 η\etaη 是微更新学习率(设为 0.10.10.1)。
更新 WsW_sWs 的第一个值:
Ws,1new=0.1+0.1×(0.101−0.1)=0.1+0.0001=0.1001W_{s,1}^{new} = 0.1 + 0.1 \times (0.101 - 0.1) = 0.1 + 0.0001 = 0.1001Ws,1new=0.1+0.1×(0.101−0.1)=0.1+0.0001=0.1001
更新 WsW_sWs 的第二个值:
Ws,2new=0.2+0.1×(0.198−0.2)=0.2−0.0002=0.1998W_{s,2}^{new} = 0.2 + 0.1 \times (0.198 - 0.2) = 0.2 - 0.0002 = 0.1998Ws,2new=0.2+0.1×(0.198−0.2)=0.2−0.0002=0.1998
同理更新 WaW_aWa。虽然变化微小,但这是实时在线更新的核心------每推送一次,模型就向"表现更好的方向"挪动一小步。如果探索网络表现不如当前网络,则模型参数保持不变。
步骤 5:损失函数与反向传播(用于 MAJOR UPDATE 主更新)
在**主更新(Major Update)**时,DRN 会从经验池中采样历史数据,进行标准的 DQN 训练。
DQN 的损失函数(时序差分误差,TD Error) :
L=1N∑(Qtarget−Qcurrent)2L = \frac{1}{N} \sum \left( Q_{target} - Q_{current} \right)^2L=N1∑(Qtarget−Qcurrent)2
其中:
Qtarget=R+γ⋅maxa′Q(s′,a′)Q_{target} = R + \gamma \cdot \max_{a'} Q(s', a')Qtarget=R+γ⋅a′maxQ(s′,a′)
- RRR 是即时奖励(1.51.51.5)
- γ\gammaγ 是折扣因子(设为 0.90.90.9)
- maxa′Q(s′,a′)\max_{a'} Q(s', a')maxa′Q(s′,a′) 是下一状态的最大 Q 值(假设下一状态的最大 Q 值为 0.20.20.2)
计算 TD Target :
Qtarget=1.5+0.9×0.2=1.5+0.18=1.68Q_{target} = 1.5 + 0.9 \times 0.2 = 1.5 + 0.18 = 1.68Qtarget=1.5+0.9×0.2=1.5+0.18=1.68
计算当前 Q 值与目标值的误差 :
Error=Qtarget−Qcurrent=1.68−0.1552=1.5248\text{Error} = Q_{target} - Q_{current} = 1.68 - 0.1552 = 1.5248Error=Qtarget−Qcurrent=1.68−0.1552=1.5248
损失值 (单样本):
L=(1.5248)2≈2.325L = (1.5248)^2 \approx 2.325L=(1.5248)2≈2.325
反向传播的详细数值推导(以 Ws,1W_{s,1}Ws,1 为例)
我们要计算损失 LLL 对参数 Ws,1W_{s,1}Ws,1 的梯度,用于主更新。
链式法则 :
∂L∂Ws,1=∂L∂Qcurrent⋅∂Qcurrent∂Ws,1\frac{\partial L}{\partial W_{s,1}} = \frac{\partial L}{\partial Q_{current}} \cdot \frac{\partial Q_{current}}{\partial W_{s,1}}∂Ws,1∂L=∂Qcurrent∂L⋅∂Ws,1∂Qcurrent
第一步 :∂L∂Qcurrent=−2×Error=−2×1.5248=−3.0496\frac{\partial L}{\partial Q_{current}} = -2 \times \text{Error} = -2 \times 1.5248 = -3.0496∂Qcurrent∂L=−2×Error=−2×1.5248=−3.0496
第二步 :计算 ∂Qcurrent∂Ws,1\frac{\partial Q_{current}}{\partial W_{s,1}}∂Ws,1∂Qcurrent
回忆前向公式:
Q=(Ws,1⋅s1+Ws,2⋅s2)×(Wa,1⋅a1+Wa,2⋅a2)+bQ = (W_{s,1} \cdot s_1 + W_{s,2} \cdot s_2) \times (W_{a,1} \cdot a_1 + W_{a,2} \cdot a_2) + bQ=(Ws,1⋅s1+Ws,2⋅s2)×(Wa,1⋅a1+Wa,2⋅a2)+b
展开:
Q=(Ws,1⋅s1)⋅(Wa,1⋅a1)+(Ws,1⋅s1)⋅(Wa,2⋅a2)+(Ws,2⋅s2)⋅(Wa,1⋅a1)+(Ws,2⋅s2)⋅(Wa,2⋅a2)+bQ = (W_{s,1} \cdot s_1) \cdot (W_{a,1} \cdot a_1) + (W_{s,1} \cdot s_1) \cdot (W_{a,2} \cdot a_2) + (W_{s,2} \cdot s_2) \cdot (W_{a,1} \cdot a_1) + (W_{s,2} \cdot s_2) \cdot (W_{a,2} \cdot a_2) + bQ=(Ws,1⋅s1)⋅(Wa,1⋅a1)+(Ws,1⋅s1)⋅(Wa,2⋅a2)+(Ws,2⋅s2)⋅(Wa,1⋅a1)+(Ws,2⋅s2)⋅(Wa,2⋅a2)+b
对 Ws,1W_{s,1}Ws,1 求偏导:
∂Q∂Ws,1=s1⋅(Wa,1⋅a1)+s1⋅(Wa,2⋅a2)\frac{\partial Q}{\partial W_{s,1}} = s_1 \cdot (W_{a,1} \cdot a_1) + s_1 \cdot (W_{a,2} \cdot a_2)∂Ws,1∂Q=s1⋅(Wa,1⋅a1)+s1⋅(Wa,2⋅a2)
代入具体数值:
- s1=0.8s_1 = 0.8s1=0.8
- Wa,1⋅a1=0.3×0.5=0.15W_{a,1} \cdot a_1 = 0.3 \times 0.5 = 0.15Wa,1⋅a1=0.3×0.5=0.15
- Wa,2⋅a2=0.4×0.9=0.36W_{a,2} \cdot a_2 = 0.4 \times 0.9 = 0.36Wa,2⋅a2=0.4×0.9=0.36
∂Q∂Ws,1=0.8×0.15+0.8×0.36=0.12+0.288=0.408\frac{\partial Q}{\partial W_{s,1}} = 0.8 \times 0.15 + 0.8 \times 0.36 = 0.12 + 0.288 = 0.408∂Ws,1∂Q=0.8×0.15+0.8×0.36=0.12+0.288=0.408
第三步 :计算最终梯度
∂L∂Ws,1=(−3.0496)×0.408≈−1.2442\frac{\partial L}{\partial W_{s,1}} = (-3.0496) \times 0.408 \approx -1.2442∂Ws,1∂L=(−3.0496)×0.408≈−1.2442
更新 Ws,1W_{s,1}Ws,1 (主更新学习率 ηmajor=0.01\eta_{major} = 0.01ηmajor=0.01):
Ws,1new=Ws,1old−ηmajor⋅∂L∂Ws,1W_{s,1}^{new} = W_{s,1}^{old} - \eta_{major} \cdot \frac{\partial L}{\partial W_{s,1}}Ws,1new=Ws,1old−ηmajor⋅∂Ws,1∂L
Ws,1new=0.1001−0.01×(−1.2442)=0.1001+0.012442=0.112542W_{s,1}^{new} = 0.1001 - 0.01 \times (-1.2442) = 0.1001 + 0.012442 = 0.112542Ws,1new=0.1001−0.01×(−1.2442)=0.1001+0.012442=0.112542
这个更新幅度比微更新(从 0.1 到 0.1001)大得多,因为主更新使用的是全量历史数据的平均梯度,方向更准确,能有效纠正微更新的随机偏差。
六、DRN 完整流程串联(端到端故事线)
| 时间点 | 环节 | 做了什么 | 数值/结果 |
|---|---|---|---|
| T0 | 离线初始化 | 用历史数据训练好初始 DQN 模型 | Ws=0.1,0.2W_s = 0.1, 0.2Ws=0.1,0.2,Wa=0.3,0.4W_a = 0.3, 0.4Wa=0.3,0.4 |
| T1 | PUSH(推送) | 小明请求推荐,当前网络计算 Q 值 | Qcurrent=0.1552Q_{current} = 0.1552Qcurrent=0.1552(体育新闻) |
| T1 | PUSH(探索) | DBGD 生成探索网络,计算 Q 值 | Q~=0.15506Q_{\tilde{}} = 0.15506Q~=0.15506(略低,但线上效果可能更好) |
| T1 | PUSH(推送列表) | 将两个网络的推荐结果交织后展示给小明 | 小明看到包含该体育新闻的列表 |
| T2 | FEEDBACK(反馈) | 小明点击了新闻,且活跃度上升 | R=1.5R = 1.5R=1.5(点击 +1,活跃度 +0.5) |
| T2 | MINOR UPDATE(微更新) | 比较线上效果,探索网络表现更好,向探索网络微调 | Ws,1W_{s,1}Ws,1 从 0.1 → 0.1001(微小调整) |
| T3 | MAJOR UPDATE(主更新) | 定期(如每天)用经验池全量数据重新训练 DQN | 计算 TD Error =1.5248= 1.5248=1.5248,大幅更新参数,Ws,1→0.1125W_{s,1} \to 0.1125Ws,1→0.1125 |
| T4 | 循环 | 模型不断重复 PUSH→FEEDBACK→UPDATE | 模型逐渐学会推荐更能留住用户的新闻 |
七、竞争梯度下降算法(DBGD)详细作用
算法步骤
-
添加随机扰动 :对当前网络参数 WWW 添加随机噪声,生成探索网络 W~\tilde{W}W~:
ΔW=α⋅rand(−1,1)⋅W\Delta W = \alpha \cdot \text{rand}(-1,1) \cdot WΔW=α⋅rand(−1,1)⋅W
W~=W+ΔW\tilde{W} = W + \Delta WW~=W+ΔW
-
组合推荐列表 :当前网络和探索网络分别生成推荐列表 LLL 和 L~\tilde{L}L~,通过**间隔穿插(Interleaving)**融合后推送给用户。
-
实时收集反馈:收集用户对融合列表的点击反馈。
-
择优更新 :如果探索网络的推荐效果更好,则当前网络向探索网络方向更新:
Wnew=W+η⋅(W~−W)W_{new} = W + \eta \cdot (\tilde{W} - W)Wnew=W+η⋅(W~−W)
否则保持不变。
DBGD 的弊端(来自原文档作业讨论)
- 收敛缓慢:更新方向是随机的,不像梯度下降那样指向最优方向。
- 难以收敛到全局最优:随机方向容易陷入局部最优。
- 探索效率低:每次只尝试一个探索方向,浪费了用户反馈信息。
改进思路
- 使用 Evolution Strategy:从当前网络为中心按高斯分布采样多个子网络,根据反馈计算梯度方向。
- 使用 Double DQN:用 Target Net 和 Action Net 的差值作为 loss,配合 Experience Replay。
- 集成学习策略:维护模型群,基于贡献分数动态增删模型。
八、总结:DRN 的精髓
-
状态与行动的解耦:用户塔(状态)+ 物品塔(行动)的双塔结构,天然适配推荐系统的"用户-物品"匹配逻辑。
-
微更新(DBGD) :通过参数空间随机扰动 + 在线效果比较,绕过了传统 SGD 在线学习的高昂工程成本(不用计算梯度,只需比较推荐列表的实时反馈),实现秒/分钟级别的实时模型调整。
-
主更新(DQN 标准训练):用全量历史数据(含延迟反馈)纠正微更新的偏差,保证模型长期稳定性。
-
损失函数的核心作用 :DRN 的损失函数是 TD Error ,它把"即时奖励 + 未来预期收益"打包成一个目标值,让模型不仅学习"现在点击",更学习"长期留存"。反向传播将这个目标差(如 1.52481.52481.5248)转化为对双塔 Embedding 和 MLP 权重的精准梯度,驱动模型向"最大化长期累积奖励"的方向优化。