ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

推荐系统特征注意力机制:SENET与GateNet原理、应用与调优实践

推荐系统特征注意力机制:SENET与GateNet原理、应用与调优实践 1. 从“特征”到“注意力”推荐系统Embedding的进化之路如果你在推荐系统领域摸爬滚打过几年一定经历过这样的阶段早期我们费尽心思做特征工程把用户画像、物品属性、上下文信息等一堆离散特征通过One-Hot编码或者简单的Embedding映射拼接成一个长长的向量然后扔进一个多层感知机MLP里期待它能从这些“原始食材”中烹饪出精准的推荐结果。这个阶段我们关注的是“有什么特征”。后来大家发现不是所有特征都同等重要。一个用户点击商品可能只是因为当时是深夜他/她正在浏览睡衣那么“时间”和“商品类目”这两个特征的交互就至关重要而“用户年龄”在这个场景下可能权重很低。于是注意力机制Attention被引入从NLP领域“跨界”而来教会了模型去“动态地”关注不同特征的重要性。这个阶段我们开始关注“哪些特征更重要”。而今天要聊的SENET和GateNet正是将这种“动态关注”的思想在推荐系统的Embedding层进行了更精细、更结构化的工程化实践。它们不再满足于模型隐式地学习特征重要性而是通过显式的、轻量级的网络模块在特征进入复杂的交叉网络如DeepFM的DNN部分、xDeepFM的CIN部分或Transformer层之前就对特征Embedding进行一轮“提纯”和“校准”。简单说它们的作用是在特征交互发生之前先帮模型筛选和强化那些更有价值的信号抑制可能带来噪声的冗余信号。这就像在食材下锅前先由一位经验丰富的厨师SENET/GateNet进行预处理挑出最鲜美的部分去除可能影响口感的杂质从而让后续的“烹饪”模型学习事半功倍。2. SENET为每个特征通道赋予“权重放大器”SENET全称Squeeze-and-Excitation Network最初诞生于计算机视觉的ResNet架构中用于建模通道Channel间的依赖关系。在CV中一个卷积层的输出可以看作是一组特征图Feature Maps每个特征图就是一个“通道”。SENET的核心思想是让模型自己学会评估每个通道的重要性然后根据这个重要性对通道进行加权增强或抑制。那么这个思想如何迁移到推荐系统这个“表格数据”的领域呢关键在于对“通道”的重新定义。2.1 SENET在推荐系统中的“变形记”在推荐系统中我们的输入通常是一个稀疏特征向量经过Embedding层后每个特征例如“用户性别女”、“物品类别电子产品”、“时间周末”都会被映射为一个固定维度比如d维的向量。假设我们有m个特征字段Field那么Embedding层的输出就是一个m * d的矩阵。在这里每个特征字段的d维向量就可以被视作一个“通道”。SENET模块在推荐场景下的工作流程可以清晰地分为三步压缩Squeeze、激励Excitation和重标定Reweight。2.1.1 第一步压缩Squeeze—— 全局信息汇聚这一步的目标是为每个特征字段的d维向量计算出一个能代表其整体“强度”或“信息量”的标量值。最常用的方法是全局平均池化Global Average Pooling, GAP。具体操作对于一个特征字段的Embedding向量e_i(维度为d)我们计算其所有维度上的平均值z_i AvgPool(e_i) (1/d) * sum(e_i[k]) for k1 to d这个z_i就是一个标量它浓缩了该特征字段Embedding的全局信息。对所有m个特征字段都执行此操作我们就得到了一个长度为m的向量Z [z_1, z_2, ..., z_m]。这个向量Z可以看作是所有特征字段的“重要性分数”的初始估计。为什么用平均池化这是一种简单且被广泛验证有效的聚合方式。它假设Embedding向量的每个维度都贡献了信息通过取平均来获得一个稳定的统计量。当然理论上也可以用最大池化Max Pooling或更复杂的聚合方式但平均池化计算高效且不易过拟合在实践中是首选。2.1.2 第二步激励Excitation—— 学习通道间依赖得到压缩后的向量Z后SENET通过一个小型的前馈神经网络来学习各个特征字段之间的非线性依赖关系并为每个字段生成一个0到1之间的权重可以大于1但通常通过Sigmoid约束在(0,1)。这个小型网络通常由两个全连接层FC Layer组成中间有一个非线性激活函数如ReLU形成了一个“瓶颈”结构A σ(W_2 * δ(W_1 * Z))其中W_1是一个(m/r) * m的权重矩阵r是降维比率Reduction Ratio通常取4, 8, 16等。δ是ReLU激活函数。W_2是一个m * (m/r)的权重矩阵。σ是Sigmoid激活函数将输出映射到(0,1)区间。最终输出的A [a_1, a_2, ..., a_m]就是每个特征字段的“激励”权重。这个结构的精妙之处在于“瓶颈”设计。第一个FC层将维度从m降到m/r这是一个降维过程强制网络学习一个紧凑的、综合的特征表示。第二个FC层再升回m维并最终通过Sigmoid输出权重。降维比率r是一个重要的超参数它控制了模型的容量和复杂度。r越大中间层维度越小模型越轻量但可能表达能力不足r越小模型越复杂更容易过拟合。通常需要通过交叉验证来调整。2.1.3 第三步重标定Reweight—— 加权输出最后一步最简单也最直接。将学习到的权重A与原始的Embedding矩阵进行逐字段逐通道的乘法V_i a_i * e_ifor i 1 to m这里a_i是标量e_i是d维向量V_i就是重标定后的新Embedding。所有V_i组成了SENET模块的输出V。直观理解如果某个特征字段的权重a_i接近1说明SENET认为这个特征在当前样本中非常重要其原始Embedding被几乎完整保留甚至略微增强因为Sigmoid输出可能略大于1。如果a_i接近0说明这个特征被认为不重要或可能是噪声其Embedding信号被大幅抑制。通过这种方式SENET实现了一种软注意力机制动态地调整了输入特征的“音量”。2.2 SENET的实战价值与调参心得在实际的CTR/CVR预估模型中引入SENET模块通常能带来稳定的效果提升尤其是在特征字段众多且重要性差异明显的场景下。例如在电商推荐中“用户历史点击序列”和“当前商品ID”这类强特征往往会获得较高的权重而“用户所在城市”这类相对弱的特征权重则可能较低但其权重并非固定会随样本用户-商品对动态变化。调参核心降维比率r这是SENET模块最重要的超参数。我的经验是从保守值开始通常可以先尝试r8或r16。这是一个不错的起点能在模型复杂度和效果之间取得较好平衡。结合特征数量如果特征字段总数m很小比如少于20使用过大的r如16可能导致中间层维度太小m/r 1失去学习能力。此时应适当减小r如4或2。观察训练动态在TensorBoard或类似工具中观察SENET输出的权重分布。理想情况下权重的分布应该是有差异的不是全集中在0.5附近并且在不同样本间有变化。如果权重分布非常集中或几乎不变可能意味着r设置不当或SENET模块没有有效学习。防止过拟合SENET模块虽然小但也是参数。在数据量不是特别大的场景下过大的r即更复杂的模块可能导致过拟合。可以考虑在SENET的两个FC层之间或之后加入Dropout层。一个常见的“坑”直接将SENET模块加在Embedding层之后然后接入一个非常深的DNN。有时会发现效果提升不明显甚至下降。这可能是因为SENET重新校准后的特征分布发生了变化而后续深层的DNN没有足够的能力快速适应这种分布变化。一个有效的技巧是在SENET输出后先接一个浅层如1-2层的MLP作为“适配层”然后再接入主网络。这个适配层可以帮助平滑特征分布让信息传递更稳定。3. GateNet更灵活的特征交互“门控”如果说SENET是通过一个“中央处理器”小型神经网络来统一计算所有特征的权重那么GateNet则提供了一种更分布式、更细粒度的控制方式。GateNet的核心思想借鉴了LSTM/GRU中的门控机制为每个特征字段学习一个独立的“门”向量Gate Vector这个门向量与特征Embedding逐元素相乘实现更精细的特征筛选。3.1 GateNet的工作原理从标量权重到向量门控GateNet不再满足于为每个特征字段分配一个单一的标量权重而是为每个字段生成一个与Embedding同维度的门控向量g_i维度也是d。然后进行逐元素Element-wise乘法V_i g_i ⊙ e_i这里⊙表示哈达玛积逐元素相乘。这意味着GateNet可以控制Embedding向量中每一个维度的通过比例。有些维度可能被完全保留g_i[k] ≈ 1有些维度可能被完全抑制g_i[k] ≈ 0有些则被部分缩放。这提供了比SENET的标量加权更强大的表达能力。那么这个门控向量g_i是如何产生的呢GateNet通常有两种设计范式3.1.1 范式一基于特征自身生成Self-Gated这是最直观的方式。每个特征字段的门控向量由其自身的Embedding经过一个变换得到g_i σ(W * e_i b)其中W是一个d*d的权重矩阵b是偏置项σ是Sigmoid函数。这种方式下每个特征字段的门控是独立计算的不依赖于其他特征。它的优点是计算简单并行度高。缺点是缺乏特征字段间的交互信息门控的决策可能不够“全局”。3.1.2 范式二基于所有特征交互生成Interaction-Gated为了弥补Self-Gated的不足更强大的GateNet会让门控向量的生成过程也考虑到所有特征字段的交互信息。一种常见的设计是先将所有特征字段的Embedding拼接Concat或求和Sum Pooling起来得到一个全局的上下文向量c。然后将这个全局上下文向量c与每个特征自身的Embeddinge_i进行融合例如拼接或相加再通过一个神经网络生成门控向量。g_i σ(W * [e_i; c] b)或g_i σ(W * (e_i c) b)这种方式下门控向量g_i的生成既考虑了特征i自身的特性也考虑了它在当前所有特征组合的全局上下文中的角色因此理论上能做出更合理的“开关”决策。3.2 GateNet vs SENET场景选择与设计权衡理解了二者的机制我们可以在具体场景中做出更明智的选择。计算复杂度SENET主要计算开销在于两个FC层参数量约为(m^2)/r m^2/r (2m^2)/r忽略偏置。由于r通常大于1且m特征字段数在推荐系统中一般不会特别巨大通常几十到几百所以SENET整体非常轻量。GateNet (Self-Gated)参数量为m * d * d每个特征一个d*d的矩阵W。当Embedding维度d较大时如64, 128参数量会急剧增加可能远超SENET。GateNet (Interaction-Gated)最复杂除了类似Self-Gated的参数还需要处理全局上下文c参数量最大。表达能力SENET输出是标量权重对特征字段进行整体缩放。是一种“粗粒度”的注意力。GateNet输出是向量门控可以对Embedding的每个维度进行精细控制。是一种“细粒度”的注意力。适用场景建议追求效果和效率的平衡特征字段重要性差异明显优先选择SENET。它在大多数CTR预估任务中都能带来稳定的提升且增加的参数量和计算开销微乎其微性价比极高。特征Embedding维度较低d32且对模型效果有极致追求可以尝试GateNet (Self-Gated)。在参数量可控的情况下其细粒度的控制能力可能挖掘出更多信息。数据量充足计算资源丰富需要进行深入的特征交互研究可以考虑GateNet (Interaction-Gated)。它提供了最强的表达能力适合作为探索性研究或打比赛时的“大招”。线上服务对延迟极其敏感SENET是更安全的选择。其简单的结构对推理速度的影响几乎可以忽略。我的实践经验在工业级的大规模推荐系统中SENET因其出色的性价比是更普遍的选择。我们曾在多个业务的精排模型中引入SENETr8在A/B测试中 consistently 获得了0.5%~2%的线上AUC提升。而GateNet尤其是Interaction-Gated版本更多见于一些学术论文或对效果有极端要求的竞赛场景中需要谨慎评估其线上服务成本。4. 在经典模型架构中的集成实践SENET和GateNet不是独立的模型而是可以灵活嵌入到现有推荐系统模型中的“插件”模块。下面以两个经典模型为例说明如何集成。4.1 集成到DeepFM中DeepFM模型由两部分组成FM部分负责二阶特征交互和Deep部分负责高阶特征交互。SENET/GateNet通常被加在Embedding层之后特征分别输入FM和Deep部分之前。原始DeepFM流程Embedding - [FM部分, Deep部分] - 输出层集成SENET后的流程Embedding - SENET模块 - [FM部分 Deep部分] - 输出层关键细节SENET模块的输出V是一个重标定后的Embedding矩阵。对于FM部分FM层接收这个V并基于它计算特征的两两内积二阶交互。由于V中的特征已经被加权因此FM层学习到的交互权重实际上是基于“提纯后”的特征这有助于FM更聚焦于重要的特征组合。对于Deep部分将V展平Flatten成一个长向量输入到DNN中。同样DNN接收到的也是经过筛选的特征信号。梯度流SENET模块的参数会同时受到FM损失和DNN损失的反向传播更新这使得它学习到的权重必须同时有利于线性的二阶交互和非线性的高阶交互这是一种隐式的多任务学习。4.2 集成到Transformer-based序列推荐模型中在如BSTBehavior Sequence Transformer或SIM等序列推荐模型中用户的历史行为序列被建模为一系列物品的Embedding。SENET/GateNet可以在这里发挥重要作用。应用点一序列物品Embedding的预处理在将行为序列输入Transformer的Encoder之前可以先对序列中每个物品的Embedding应用一个轻量的GateNetSelf-Gated。这可以让模型在进入复杂的自注意力计算前先对序列中每个item的信息进行一次“预过滤”减弱噪声item如误点击的影响。应用点二作为特征Field的增强在序列模型中除了用户行为序列通常还有大量的用户侧、物品侧、上下文侧的非序列特征。这些特征的处理方式和DeepFM类似可以在其Embedding层后接入一个SENET模块对所有非序列特征进行统一的重要性校准然后再与处理后的序列表征进行融合。一个实战技巧渐进式训练当在一个已经收敛的基线模型如DeepFM上新增SENET模块时直接从头训练可能不稳定。可以采用渐进式训练首先加载基线模型的预训练权重不包括SENET。将SENET模块的参数初始化例如让第二个FC层的权重初始化为接近0使得SENET初始输出权重接近0.5相当于一个温和的起点。在训练初期使用一个较小的学习率例如主网络学习率的1/10或1/100单独训练SENET模块固定主网络参数。这相当于让SENET先“适应”当前的特征分布。训练几个epoch后再解冻主网络用正常学习率进行联合微调。这种方法能更快更稳地让SENET模块发挥作用。5. 效果评估、线上部署与局限性5.1 如何科学评估SENET/GateNet的效果引入新模块后不能只看离线AUC的提升需要进行多维度的评估。离线指标核心指标AUC、LogLoss。这是最基本的。分组AUC特别重要。观察新模块在不同用户群体如新用户/老用户、不同物品类别、不同时间段上的AUC提升是否均匀。理想情况是全面提升如果出现某些群体指标下降需要深入分析。Calibration检查预测CTR与真实CTR的校准情况。SENET/GateNet可能会改变模型的输出分布需要确保校准曲线仍然良好。在线A/B测试核心业务指标CTR、CVR、人均观看时长、GMV等。消融实验如果可能在A/B测试中设置多个实验组基线模型、SENET、GateNet等进行直接对比。长期观察观察指标提升的稳定性。有些模块短期内可能拉高点击率但长期可能损害用户体验如过度推荐热门商品需要监控用户留存、多样性等指标。模块行为分析权重可视化定期抽样检查SENET输出的权重分布。例如统计每个特征字段权重的均值和方差。如果一个特征的权重方差始终很小接近常数说明SENET可能没有学会对该特征进行动态调整或者该特征在所有场景下重要性恒定。案例分析选取一些典型的正样本点击和负样本未点击查看SENET为各个特征赋予的权重进行人工分析看是否符合业务直觉。5.2 线上服务与性能优化SENET和GateNet作为Embedding层的后处理模块其线上推理开销是需要考虑的。SENET的推理开销极小。主要计算是两次矩阵乘法FC层和一次逐字段乘法。参数量小可以轻松集成到模型文件中对推理延迟的影响通常在1%以内可以忽略不计。GateNet的推理开销需要具体分析。Self-Gated每个特征需要一次d*d的矩阵乘。如果特征数m多且d大计算量不可忽视。可以考虑使用低秩分解等技术对权重矩阵W进行压缩。Interaction-Gated计算最复杂可能成为线上瓶颈。除非效果提升非常显著否则工业落地需谨慎。部署建议使用TensorRT、OpenVINO等推理优化框架它们能对SENET/GateNet这类小算子进行很好的融合与优化。在内存允许的情况下将包含SENET/GateNet的整个模型图导出为单一优化后的引擎避免多次调用带来的开销。5.3 局限性与发展没有银弹。SENET和GateNet也有其局限性静态结构的局限性无论是SENET的“压缩-激励”结构还是GateNet的“门生成”结构其网络结构是固定的。这意味着它们学习注意力模式的能力存在上限。对于极其复杂、非结构化的特征交互模式可能力有不逮。对稀疏特征的处理它们主要作用于稠密的Embedding向量。对于推荐系统中依然存在的、未嵌入的稀疏ID特征如某些长尾商品ID这些模块无法直接处理。与后续网络的协同SENET/GateNet只是在特征交互的“前夜”做了一次筛选。如果后续的交叉网络如DNN、CIN、Transformer本身已经非常强大具备了很强的特征选择能力那么前置的筛选模块带来的边际收益可能会减小。未来的演进方向可能会集中在动态结构让注意力模块本身的结构如降维比率r、网络层数也能根据输入数据动态调整。多粒度注意力结合不同粒度的注意力如字段级、特征值级、Embedding维度级形成层次化的注意力机制。与新一代架构的融合如何将这种思想更优雅地融入基于Transformer、图神经网络等新一代推荐架构中是一个持续探索的课题。在我自己的项目实践中SENET已经像BatchNorm或Dropout一样成为了构建推荐模型的一个常用“标准组件”。它的实现简单收益稳定是性价比极高的优化手段。而GateNet则像一把更精细的手术刀在特定的场景下当我们需要对特征信息进行外科手术般的精确控制时它会是不错的选择。理解其原理明确其优劣才能在你的推荐系统中做出最适合的架构决策。
返回列表