资讯动态

Deep Feedback Network:把用户反馈信号建造成深层网络的推荐模型解析

发布时间:2026/10/26 6:19:10 来源:尧图企业网站定制
DFN: Deep Feedback Network for Recommendation这个标题最近在我朋友圈和好几个技术讨论群里频繁出现。我做推荐系统也有五六年了一直有个绕不开的困惑点击率模型越做越精细线上CTR也一直在涨但业务那边追着问的成交、停留时长、复购率却经常原地踏步。后来认真研究了Deep Feedback Network这类的思路才慢慢想明白一件事——我们把用户行为当成“标签”和“特征”用了太久却没有把它当成真正的“反馈信号”去建模。这篇内容既算是我对DFN的理解笔记也算是一份从数据到训练的落地复盘做电商推荐、内容推荐、广告排序的同学应该都能在里面找到跟自己项目对应的点。1. 用户行为里被浪费的“反馈信号”DFN想解决什么问题1.1 反馈数据的三个层次以及我们平时是怎么用它们的大部分推荐场景里用户反馈数据大致可以分成三个层次这一点不管是电商、短视频还是信息流内容推荐都一样。第一层是显式反馈比如用户主动打分、点“不感兴趣”、长按不喜欢。这类信号质量极高但稀疏到几乎没有存在感。一个电商App里真正会去给商品打分的用户比例可能连百分之一都不到。第二层是隐式反馈曝光、点击、停留时长、滑走、快速返回这些信号量大但噪声非常严重。第三层是行为链路包括收藏、加购、下单、复购、分享它们出现频率没有点击那么高却是业务真正关心的结果信号。问题出在大多数模型的建模方式上。传统做法是把这些行为拆开看点击做CTR模型下单做CVR模型收藏加购算中间目标最后再用一个多任务框架把它们并列起来。听起来很合理对吧但实际跑多了就会发现这些行为之间是存在先后关系和因果联系的用一个平行多任务框架把它们并列建模相当于把一条完整的反馈链条切成了一段段互不相干的碎片。1.2 只看点击的模型天花板为什么这么低我见过太多团队死磕点击率的场景。点击率模型优化到后期会面临一个很尴尬的收敛状态模型越来越擅长预测“用户会不会点”但对“用户点完之后会不会满意”几乎没有感知。标题党就是最典型的例子点进去三秒钟就退出来内容质量一塌糊涂但点击那一下是真的发生了。我在一个内容推荐场景里做过统计大概有四成的点击用户在十秒内就退出了其中又有很大一部分是看完标题就被骗进去的。如果把这些点击全部当成正样本喂给模型那模型学到的东西本质上就是“如何让用户忍不住点”而不是“如何让用户觉得内容真正有价值”。DFN类模型在这里给了一个不同的思路把点击当作一个“未完成反馈”来对待。它只是反馈传播链上的起点用来触发后续更深层的行为判断而不是直接等同于推荐成功。1.3 收藏、加购、下单这些深层行为之间的转移关系深层行为虽然稀疏但信息密度极高。一个用户从“点击”到“加购”再到“下单”中间的每一步都意味着他对这个商品的兴趣在强化或者偏好正在往某个方向迁移。传统模型把“加购”和“下单”都当作分类标签分别去预测但它们忽略了“点击到加购”和“加购到下单”这两段路径里的转移信号。DFN想解决的问题就在于能不能把用户的所有反馈行为组织成一个有层次的网络让上一级反馈产生的信号作为下一级反馈的输入最终学到一个更完整的用户真实意图。比如用户昨天点击了手机壳今天搜索了散热背夹以前没加购过任何配件推荐流再给他推高价耳机时模型应该有能力判断这条“点击到搜索”的反馈路径到底有多强的购买支撑力。这不是单靠一个点击序列就能回答的问题。2. DFN的建模思路把反馈做成“深层网络”而不是“平铺特征”2.1 它和DIN、DIEN的本质区别在哪里很多人第一次接触Deep Feedback Network会觉得它跟DINDeep Interest Network、DIENDeep Interest Evolution Network长得太像了反正都是对用户行为序列做建模。但核心逻辑其实很不一样。DIN的核心是target attention拿候选商品embedding去和历史行为序列算attention捕捉与当前候选商品相关的历史兴趣。DIEN在DIN基础上引入时间序列建模用GRU刻画兴趣的演化过程。DFN强调的重点则不在序列内部而在行为类型之间的反馈传播路径。它关心的是点击状态能不能作为加购编码器的初始输入加购状态能不能修正购买预测的表征整个信息流是从浅层行为向深层行为逐级流动的。这个差别在工程实现上最直接的体现是DIN、DIEN里用户行为序列只有一个通道DFN则通常会把行为序列按类型拆成多个通道通道之间存在可学习的连接关系而不是各自编码完再做简单拼接。2.2 跨行为聚合、时序衰减和target-aware的三个关键设计DFN类模型里有三个设计点是必须想清楚的不然做出来很容易沦为一个复杂的表象。第一个是跨行为聚合。这里有常见的两种做法一种是先对点击、加购、购买三类行为分别编码然后用attention去融合三个表示另一种是串联式的把上一层的输出状态作为下一层编码器的初始状态形成一条真正的反馈链。后者更符合“反馈传播”的语义。我用一个伪代码来描述第二种思路会非常直观# 伪代码反馈传播层 h_click click_encoder(seq_click) # 点击序列编码 h_cart cart_encoder(seq_cart, init_stateh_click) # 加购序列以点击状态初始化 h_order order_encoder(seq_order, init_stateh_cart) # 购买序列以加购状态初始化 # 用门控融合跨层反馈状态 g1 sigmoid(W1 * concat([h_click, h_cart]) b1) g2 sigmoid(W2 * concat([h_cart, h_order]) b2) feedback_state concat([h_click, g1 * h_cart, g2 * h_order]) # 与目标商品交互 score prediction_head(attention_pooling(feedback_state, target_emb))第二个是时序衰减。三个月前买的洁面仪和昨天买的洗面奶虽然都指向护肤偏好但对当前决策的指导意义显然不同。实操里我习惯用一个简单指数衰减函数权重 exp(-Δt / τ)τ的取值要看业务跑。像消耗品这类快速决策场景τ取7到15天耐用消费品或者内容兴趣场景τ要放宽到30天以上否则长期偏好很容易被短期热搜冲掉。第三个是target-aware。同一个用户常常同时存在多个兴趣比如既是电子发烧友又是新手宝妈。如果当前候选商品是蓝牙耳机模型应该更依赖他评测浏览类的反馈如果候选是婴儿湿巾那耳机相关行为就应该被压低。实现也不复杂在算目标注意力时先按行为类型分别算一个通道级权重再乘上候选商品维度的注意力分数本质上是一个两阶段注意力。2.3 为什么非要用网络结构而不是简单规则加权有人会问收藏权重三倍加购权重五倍下单权重十倍线性加权不也能体现反馈强度吗还真不行。首先反馈和决策之间常常是饱和非线性的。用户连续看了十个同类商品反馈强度并不是单件商品的十倍而是会逐步饱和线性权重刻画不了这种边际递减。其次不同用户群体的行为习惯差异非常大老用户点击一百次可能不如新用户点击三次来得关键固定权重对所有用户一视同仁等于谁都没照顾好。网络结构配上数据至少能把这些非线性关系和群体差异学到一部分虽然代价是工程复杂度上来了。3. 离线训练和在线推理的工程落地细节3.1 数据管道日志对齐、行为去噪、分层负采样DFN类模型对数据的要求比普通CTR模型高非常多第一道坎就是多行为日志对齐。点击日志、加购日志、下单日志往往散落在不同数据链路里有的小时级延迟有的分钟级延迟。不做对齐的话同一个session里“点击A后加购B”的关系都会被切断反馈传播直接失去输入。我当时的做法是用user_id加session_id作为统一key按行为时间戳排序拼出一条完整的行为链路样本。行为去噪这步绝对不能省。爬虫、脚本刷量、反复比价造成的重复点击在真实日志里多到超乎想象。这些噪声会让反馈传播彻底失真。我一般会做几个规则单日点击超过一个明显异常的阈值比如300次的用户直接剔除两次点击间隔小于1秒的序列项删除页面停留时间小于2秒的点击做降权。这些规则看着很“土”但对模型稳定性的提升非常明显。负采样也要重新设计。普通CTR模型只需要“曝光未点击”作为负样本DFN类模型为了学到反馈传播在某个环节断裂的情形还需要“点击未加购”“加购未下单”这种负反馈链。我把样本组织成三层第一层曝光未点击第二层点击未转化第三层加购未购买。这样离线评估时GAUC看起来会稍低一点但线上效果往往更好因为模型真的学会了判断用户在哪一步流失了。3.2 网络结构与Loss设计主任务加辅助任务模型结构我自己跑下来比较顺手的组合是三组行为序列先各自过一个self-attention再接一个target attention。self-attention负责捕捉序列内部依赖target attention负责对齐当前候选商品的相关性。然后进入反馈传播层用上面伪代码那种串联加门控的方式把三层行为状态融合起来。Loss设计上主任务是点击率或成交概率的binary cross entropy辅助任务是预测当前行为链路里的下一个深层动作概率。辅助系数λ一般从0.1开始调太小没有约束作用太大会让模型只顾着学行为转移忽略了真正的推荐目标。我在训练阶段还会把辅助任务的梯度stop-gradient切断一半避免辅助loss反向传播太强干扰主任务的特征表示。3.3 线上推理特征拼装、实时反馈回流、延迟控制线上推理时最容易被坑的不是模型本身而是线上特征和离线训练的一致性。DFN结构里有一个很麻烦的情况线上如果只给模型喂点击历史但模型内部用了“加购状态初始化点击状态”加购信号缺失会导致h_cart被置零结果跟离线完全不同。所以实时行为反馈回流必须做到位点击、加购、下单至少要做到秒级可见确保session内信息是完整的。计算量方面DFN类模型在推理时多出了好几个序列编码器我在线上把每个行为序列长度控制在30以内超过就截断且只保留最近行为。这样单条请求的p99耗时基本能压在30毫秒以内不会拖垮排序服务。4. 我对DFN类方案的实测心得效果验证与调参避坑4.1 复现时的预期提升幅度要看场景先给一个诚实的结论DFN不是对任何场景都有效的银弹。我在SKU级电商排序场景里做过一次比较完整的实验基线是DIN加MMoE换成DFN类结构后GAUC大约提升0.8个百分点成交流水相对提升2.3%这个幅度在工业级推荐系统里已经算相当不错。但同期有个内容兴趣召回项目也尝试了类似的反馈传播结构效果反而掉了原因是内容平台里“加购、下单”这类深层反馈太少反馈网络几乎退化成点击序列模型多出来的参数只是在制造过拟合。场景基线模型指标变化样本规模结论电商SKU排序DINMMoEGAUC 0.8%GMV 2.3%十亿级有效内容兴趣召回DIN-V2AUC -0.4%百万级不推荐快消复购场景DINMLP复购率 1.5%亿级有效需调衰减4.2 踩坑记录未来信息泄露、回溯窗口过长和冷启动退化踩坑最狠的一次是行为增强导致离线AUC虚高。我最开始为了提升转化率把“购买”也作为点击模块的输入结果离线AUC暴涨模型看起来强得离谱。后来才发现这是把未来信息泄露进去了——点击模块在t时刻就已经看到了t1时刻的购买反馈等于考试还没交卷就拿到了答案。上线AB之后效果马上打回原形。处理办法是点击模块的训练样本只能使用行为发生时点之前的信息购买反馈可以往后传播但绝对不能反向影响点击模块的输入。第二个坑是回溯窗口开太大。我第一次设反馈传播层时把用户历史行为窗口开到了180天理由是让长期偏好有足够上下文。结果训练速度慢了一倍效果反而下降。原因也很简单反馈传播是逐层叠加的早期行为里的噪声会像滚雪球一样被放大到后面的深层行为里。后来我把窗口缩到60天并在序列编码器里加了时间衰减才算稳下来。第三个坑是冷启动用户的表现。新用户没有历史反馈反馈网络的所有中间状态几乎都是空的效果连一个纯MLP都打不过。我的处理方式是在排序入口加判断行为数少于5条的用户直接走浅层模型行为数量够多才走完整DFN。这个方案很朴素但确实比硬撑复杂模型要稳得多。4.3 调参要点反馈深度、衰减系数、损失权重调参方面给几个我试出来比较稳的起始点。反馈传播层数不要超过4层再深收益不明显训练还特别容易崩。时序衰减系数τ在电商消耗品上取10天在内容推荐上取20天以上。辅助损失系数λ取0.2跟主任务一起训练时收敛最顺。行为embedding维度不用太高64维足够重点在于三组行为之间有没有用门控连接。门控初始bias我会设成负值让模型先用主序列信号再逐渐放开跨行为影响这样训练初期不会因为反馈传播太猛导致震荡。负样本采样比例同样值得注意。点击未购买这类中途断裂的负反馈采样太高模型会变得保守推荐结果会偏向热门爆款采样太低又学不到反馈链条的转折。我的做法是动态采样训练初期用较高比例让模型先把结构稳定性学好训练中后期降到0.3左右给主目标让出优化空间。5. 从DFN延伸到下一代推荐模型的思考5.1 大模型时代还需要显式反馈网络吗大模型普及的背景下很多人会问是不是直接让LLM做排序就行我的看法是LLM在线做推荐的成本和延迟都摆在那里绝大多数业务不可能让千亿参数模型实时给每个用户算一遍。比较现实的做法是让LLM负责生成增强的反馈信号比如理解用户搜索Query背后的真实需求再把这些信号蒸馏到DFN这种轻量结构里。相当于把大模型的知识压缩成反馈传播网络在毫秒级完成线上召回和排序。显式反馈网络结构不但不会消失反而可能成为大模型落地推荐系统的重要载体。5.2 多端行为打通和长短反馈分离还有一个越来越重要的点多端行为打通。用户可能在App里浏览在小程序里下单在网页端做售后这些反馈分散在不同的端上。如果每端各自建模反馈传播的效果会大打折扣。只要能做到跨端ID映射和统一行为链路DFN结构才能真正发挥跨行为传播的威力。session内的短期反馈和跨session的长期反馈也需要分开建模。短期反馈变化快适合用高衰减系数加实时更新的序列来刻画长期反馈决定用户的基本盘用低频更新的向量表示就够了。二者在反馈网络里建议用门控方式组合简单concat实际效果会差不少。关于更远的方向我很看好反馈归因。经典反馈网络只能告诉模型“用户行为之间存在传播”但解释不了“为什么这次传播成功了”。如果把传播路径上每一步的权重都记录下来再配合可解释工具推荐团队就能拿着这些路径去做更细的干预甚至发现新的用户细分和流量洼地。最后说一个可能不那么学术、但实战价值很高的心得DFN对特征工程的要求没有降低反而更高了。很多团队复现这类方案失败不是模型结构有问题而是反馈信号本身的质量不过关。先把点击、加购、下单日志的准确性、缺失率、跨端一致性治明白再上复杂结构才是正确顺序。日志链路如果是脏的再深的反馈网络也只能把噪声学得更像信号。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑