DRN(深度强化学习推荐网络)

一、强化学习六要素 → 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)持续交互的过程。核心思想是不仅仅优化当前点击率(短期奖励),更要优化用户长期留存(长期累积奖励)

核心创新点

  1. 双塔 DQN 结构 :用户塔(状态)+ 物品塔(行动),输出行动质量得分 Q(s,a)Q(s,a)Q(s,a)。
  2. 在线实时更新 :通过**微更新(Minor Update)学习实时反馈,通过主更新(Major Update)**纠正长期偏差。
  3. 高效探索策略 :使用 Dueling Bandit Gradient Descent (DBGD) 进行参数空间扰动,平衡"探索"与"利用"。
  4. 新的奖励信号:引入**用户活跃度(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)包含两部分:

  1. 即时点击奖励 :用户点击 → Rclick=+1R_{click} = +1Rclick=+1;未点击 → Rclick=−0.1R_{click} = -0.1Rclick=−0.1。
  2. 用户活跃度奖励 :根据用户是否持续使用 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+γ⋅max⁡a′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)
  • max⁡a′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)详细作用

算法步骤

  1. 添加随机扰动 :对当前网络参数 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

  2. 组合推荐列表 :当前网络和探索网络分别生成推荐列表 LLL 和 L~\tilde{L}L~,通过**间隔穿插(Interleaving)**融合后推送给用户。

  3. 实时收集反馈:收集用户对融合列表的点击反馈。

  4. 择优更新 :如果探索网络的推荐效果更好,则当前网络向探索网络方向更新:

    Wnew=W+η⋅(W~−W)W_{new} = W + \eta \cdot (\tilde{W} - W)Wnew=W+η⋅(W~−W)

    否则保持不变。

DBGD 的弊端(来自原文档作业讨论)

  1. 收敛缓慢:更新方向是随机的,不像梯度下降那样指向最优方向。
  2. 难以收敛到全局最优:随机方向容易陷入局部最优。
  3. 探索效率低:每次只尝试一个探索方向,浪费了用户反馈信息。

改进思路

  1. 使用 Evolution Strategy:从当前网络为中心按高斯分布采样多个子网络,根据反馈计算梯度方向。
  2. 使用 Double DQN:用 Target Net 和 Action Net 的差值作为 loss,配合 Experience Replay。
  3. 集成学习策略:维护模型群,基于贡献分数动态增删模型。

八、总结:DRN 的精髓

  1. 状态与行动的解耦:用户塔(状态)+ 物品塔(行动)的双塔结构,天然适配推荐系统的"用户-物品"匹配逻辑。

  2. 微更新(DBGD) :通过参数空间随机扰动 + 在线效果比较,绕过了传统 SGD 在线学习的高昂工程成本(不用计算梯度,只需比较推荐列表的实时反馈),实现秒/分钟级别的实时模型调整。

  3. 主更新(DQN 标准训练):用全量历史数据(含延迟反馈)纠正微更新的偏差,保证模型长期稳定性。

  4. 损失函数的核心作用 :DRN 的损失函数是 TD Error ,它把"即时奖励 + 未来预期收益"打包成一个目标值,让模型不仅学习"现在点击",更学习"长期留存"。反向传播将这个目标差(如 1.52481.52481.5248)转化为对双塔 Embedding 和 MLP 权重的精准梯度,驱动模型向"最大化长期累积奖励"的方向优化。

相关推荐
江畔柳前堤3 小时前
roLabelImg 详细安装教程
开发语言·人工智能·后端·云原生
阿里云大数据AI技术4 小时前
分链路差异化设计的DSP准实时数仓|钛动科技基于阿里云实时计算 Flink 版 + DLF Paimon + EMR Serverless StarRocks 的实践
人工智能·flink
陕西企来客4 小时前
2026年7月AI智能搜索曝光趋势研判
大数据·人工智能·机器学习·ai智能搜索曝光
阿里云大数据AI技术4 小时前
从算力到智能体,面向 Agentic AI 的基础设施演进
人工智能·agent
hangyuekejiGEO5 小时前
GEO技术服务选型指南
大数据·人工智能·python
阿里云大数据AI技术5 小时前
EMR Serverless Spark AI Function 的双维降本实践
人工智能·sql·spark
维基框架6 小时前
GitHub源码处理提速 一趟扫描反而更慢
人工智能·github
冬奇Lab6 小时前
代码库知识库系列(05):向量检索 vs 知识图谱——加了调用图并没有变更好
人工智能
AKAMAI6 小时前
你的源服务器可能是你做出的最昂贵决定
运维·人工智能·云计算
@syh.6 小时前
【贪心】矩阵消除游戏
算法·游戏·矩阵