☰
Deep Feedback Network:把用户反馈信号建造成深层网络的推荐模型解析
2026/10/26 6:19:08 网站建设 项目流程

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,会觉得它跟DIN(Deep Interest Network)、DIEN(Deep 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_state=h_click) # 加购序列以点击状态初始化 h_order = order_encoder(seq_order, init_state=h_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排序DIN+MMoEGAUC +0.8%,GMV +2.3%十亿级有效
内容兴趣召回DIN-V2AUC -0.4%百万级不推荐
快消复购场景DIN+MLP复购率 +1.5%亿级有效,需调衰减

4.2 踩坑记录:未来信息泄露、回溯窗口过长和冷启动退化

踩坑最狠的一次,是行为增强导致离线AUC虚高。我最开始为了提升转化率,把“购买”也作为点击模块的输入,结果离线AUC暴涨,模型看起来强得离谱。后来才发现这是把未来信息泄露进去了——点击模块在t时刻就已经看到了t+1时刻的购买反馈,等于考试还没交卷就拿到了答案。上线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对特征工程的要求没有降低,反而更高了。很多团队复现这类方案失败,不是模型结构有问题,而是反馈信号本身的质量不过关。先把点击、加购、下单日志的准确性、缺失率、跨端一致性治明白,再上复杂结构才是正确顺序。日志链路如果是脏的,再深的反馈网络也只能把噪声学得更像信号。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询