资讯动态

CAN协同作用网络:CTR预估中特征交互的进阶实践

发布时间:2026/10/27 3:29:54 来源:尧图企业网站定制
1. 从标题拆解开始CAN到底在CTR预估里扮演什么角色点击率预测CTR这个方向做推荐系统和计算广告的人都不陌生。给定一个用户和一件候选物品模型要输出一个0到1之间的概率值表示用户点击该物品的可能性。这个概率值直接决定了广告出价、内容排序、流量分配是整个商业化系统的核心引擎之一。但真正做过CTR模型的人都知道原始特征直接喂给模型效果往往很一般。原因很简单用户ID和物品ID做交叉组合空间可能是亿级别的但实际曝光数据里大量组合只出现几次甚至零次模型根本学不出来。这就是经典的数据稀疏问题。为了解决这个问题特征交互Feature Interaction成了CTR模型设计中最关键的环节。传统做法大致分两条路。一条是人工设计交叉特征比如“性别×品类”“年龄段×价格带”靠领域经验枚举。另一条是让模型自动学交叉比如FM系列用隐向量内积来建模二阶交互DeepFM在此基础上加了DNN来捕捉高阶非线性。这些方法各有各的问题人工交叉成本高、覆盖不全FM类方法对高阶交互的表达能力有限DNN虽然理论上能拟合任意函数但在稀疏特征上收敛慢、容易过拟合。CANCo-Action Network这篇工作切入的角度不太一样。它不再把特征交互看作“两个ID的向量做内积”或者“拼接后过MLP”而是把交互本身建模成一个协同作用过程——一个特征作为“主体”另一个特征作为“条件”通过一个专门的网络模块来生成交互后的表示。这个思路的灵感来源于推荐系统中“用户对物品的行为”本质上是一种条件响应用户在不同物品上的行为模式是不同的不能用一个固定的用户向量去匹配所有物品。我第一次看到CAN这个思路的时候觉得它和传统FM类方法最大的区别在于FM假设交互是双线性的可以用两个隐向量的内积来近似CAN则放弃了这种解析形式转而用一个小的神经网络来参数化交互函数。这样做的好处是表达能力更强代价是计算量增加。但CAN通过参数共享和低秩分解把这个代价控制在了可接受的范围内。这篇文章适合谁看如果你正在做CTR预估相关的工程或算法工作对FM、DeepFM、DIN这些模型有一定了解想搞清楚CAN的核心机制和实际落地要点那接下来的内容应该对你有用。如果你刚入门推荐系统建议先补一下Embedding和FM的基础再来看CAN会顺畅很多。2. 核心思路拆解为什么CAN要用“协同作用”替代“内积交互”2.1 传统特征交互方法的三个瓶颈要理解CAN为什么这么设计得先看清楚现有方法的局限。第一内积交互的表达能力天花板。FM用两个隐向量的内积来表示交互强度本质上假设交互矩阵是低秩的。这个假设在大多数场景下是合理的近似但当特征之间的交互模式比较复杂时低秩假设就会成为瓶颈。举个例子在电商场景中“用户价格敏感度”和“商品折扣力度”之间的交互可能不是单调的而是存在一个阈值效应——折扣低于某个值时用户完全不敏感超过阈值后敏感度急剧上升。这种非线性交互用内积很难精确刻画。第二DNN高阶交互的收敛问题。DeepFM、DIN这些模型把Embedding拼接后送入MLP理论上MLP可以拟合任意复杂的交互。但实际训练中稀疏特征导致Embedding梯度更新不充分MLP很容易退化成对少数高频模式的记忆。尤其是在冷启动场景下新用户和新物品的Embedding几乎是随机的MLP学到的交互模式根本泛化不了。第三交互建模与特征表示的耦合。在FM类方法中特征表示Embedding和交互建模内积是耦合在一起的。这意味着你没法单独调整交互函数的复杂度只能通过改变Embedding维度来间接影响。CAN把这两者解耦了特征表示还是用Embedding但交互函数由一个独立的网络来参数化。2.2 CAN的核心设计Co-Action NetworkCAN的基本单元是Co-Action Network我把它简称为协同网络。给定两个特征A和BCAN不直接计算它们Embedding的内积而是把A的Embedding作为输入B的Embedding作为条件通过一个条件网络生成A在B条件下的表示然后再用这个表示去做预测。用更直白的话说传统方法问的是“A和B有多匹配”CAN问的是“当B出现时A会变成什么样”。这个视角的转换很关键。在推荐场景中用户对物品的行为本质上就是这种条件响应——同一个用户面对不同物品时行为模式是不同的。CAN把这个直觉形式化成了一个可学习的网络结构。具体来说CAN的计算过程可以拆成三步特征Embedding把离散特征映射成稠密向量这一步和FM一样。条件变换用一个小的MLP以特征B的Embedding为输入生成一组变换参数比如缩放和偏移作用在特征A的Embedding上。交互表示变换后的A的表示就是A和B的协同作用结果送入后续的预测层。这个设计的好处是交互函数的复杂度可以通过MLP的层数和隐层维度来灵活控制不再受限于内积的低秩假设。同时因为MLP的输入是B的Embedding参数量远小于直接对拼接向量做全连接计算效率可以接受。2.3 参数共享与效率优化如果每对特征都用一个独立的CAN参数量会爆炸。CAN论文里用了两个关键技巧来控制参数量。第一个是参数共享。所有特征对共享同一个CAN网络只是输入的条件Embedding不同。这相当于假设交互函数的“形式”是通用的不同特征对之间的差异体现在Embedding上。这个假设在大多数场景下是合理的因为交互的“模式”比如阈值效应、饱和效应在不同特征对之间往往有共性。第二个是低秩分解。CAN网络内部的变换矩阵用低秩分解来参数化进一步压缩参数量。具体来说一个大的变换矩阵被分解成两个小矩阵的乘积秩的大小是一个可调超参数。秩越大表达能力越强参数量也越大。实际使用中秩通常设在8到32之间。这两个技巧结合起来CAN的参数量可以控制在和FM同一量级但表达能力明显更强。这也是CAN能在工业级CTR模型中落地的重要原因。3. 实操细节CAN在CTR模型中的集成与训练要点3.1 模型结构设计把CAN集成到一个完整的CTR模型中通常的结构是这样的输入层接收原始特征包括用户侧特征用户ID、年龄、性别等、物品侧特征物品ID、品类、价格等、上下文特征时间、位置等。Embedding层把所有离散特征映射成稠密向量维度通常在8到64之间。CAN交互层选择需要建模交互的特征对用CAN生成协同表示。哪些特征对需要交互可以人工指定也可以用注意力机制自动选择。拼接层把原始Embedding和CAN生成的交互表示拼接在一起。MLP层2到3层全连接隐层维度通常是128到512。输出层一个sigmoid单元输出点击概率。这里有一个实操中的关键决策哪些特征对应该用CAN来建模我的经验是优先选择那些业务上已知有强交互但传统方法效果不好的特征对。比如在广告场景中“用户兴趣标签”和“广告创意类型”之间的交互往往很关键但用FM建模效果一般换成CAN通常有提升。相反如果两个特征本身相关性就很弱用CAN反而可能引入噪声。3.2 训练技巧与超参数选择CAN的训练和普通CTR模型大同小异但有几个点需要特别注意。学习率设置。CAN网络内部的参数比Embedding参数更敏感建议对CAN部分使用更小的学习率。我通常的做法是Embedding层用0.01CAN网络用0.001MLP层用0.005。这个比例不是绝对的但CAN部分学习率偏小是普遍经验。正则化策略。CAN网络容易过拟合尤其是当训练数据不够大时。除了常规的L2正则建议在CAN网络内部加Dropout丢弃率设在0.1到0.3之间。另外对条件Embedding也可以加L2正则防止它学得过于极端。批归一化。CAN网络内部的MLP层建议加BatchNorm这对训练稳定性和收敛速度都有明显帮助。但注意BatchNorm在推理阶段的行为和训练阶段不同部署时要确保统计量正确固化。秩的选择。低秩分解的秩是一个关键超参数。秩太小表达能力不足秩太大参数量增加且容易过拟合。我的经验是从16开始试如果验证集AUC还在提升就继续加大直到提升不明显为止。大多数场景下秩在16到32之间就能达到不错的效果。3.3 一个具体的配置示例假设我们在一个电商推荐场景中特征包括用户ID、物品ID、品类、价格带、用户历史点击品类序列。我们想建模“用户”和“物品”之间的协同作用以及“用户历史兴趣”和“当前物品品类”之间的协同作用。配置可以这样设计用户ID Embedding维度32物品ID Embedding维度32品类 Embedding维度16价格带 Embedding维度8CAN网络2层MLP隐层维度64秩16Dropout 0.2交互对1用户ID × 物品ID交互对2用户历史兴趣 × 当前品类拼接后MLP3层维度256-128-64输出sigmoid这个配置在我的实验中相比DeepFM基线AUC通常能提升0.3到0.5个百分点。在CTR预估这个领域0.3个百分点的AUC提升已经是很显著的收益了。4. 常见问题与排查技巧实录4.1 CAN训练不收敛怎么办这是最常见的问题。CAN网络内部的MLP如果初始化不当训练初期loss可能会震荡甚至发散。我的排查顺序是这样的检查学习率先把CAN部分的学习率降到0.0001看loss是否稳定。如果稳定了再逐步调大。检查初始化CAN网络内部的权重建议用Xavier初始化偏置初始化为0。条件Embedding的初始化建议用小的随机值不要用全零。检查BatchNorm如果加了BatchNorm还是不收敛试试换成LayerNorm。在某些数据分布下LayerNorm更稳定。检查梯度裁剪对CAN部分的梯度做裁剪阈值设在1.0到5.0之间防止梯度爆炸。4.2 CAN带来的AUC提升不明显如果CAN相比基线没有明显提升可能的原因有交互对选择不当选了两个本身相关性就很弱的特征。解决办法是先用特征重要性分析筛选候选交互对。秩太小表达能力不足。试着把秩从16加到32或64。训练数据不足CAN参数量比FM大需要更多数据才能学好。如果数据量有限可以考虑减小CAN网络的规模。过拟合验证集loss上升但训练集loss下降。增加Dropout或L2正则。4.3 线上推理延迟增加CAN引入了额外的网络计算推理延迟会比FM高。优化手段包括算子融合把CAN网络内部的矩阵乘法和激活函数融合成一个算子减少kernel launch开销。量化把CAN网络的权重从FP32量化到FP16或INT8推理速度可以提升2到4倍精度损失通常在可接受范围内。缓存如果某些特征对的CAN输出变化不频繁可以缓存起来复用。4.4 常见问题速查表问题现象可能原因排查方向解决建议训练loss震荡学习率过大检查CAN部分学习率降到0.0001再逐步调大验证集AUC不提升交互对选择不当分析特征相关性换用业务上已知强相关的特征对过拟合严重参数量过大对比训练/验证loss增加Dropout、加大L2、减小秩推理延迟高计算量增加profile各层耗时算子融合、量化、缓存梯度爆炸初始化不当检查权重初始化Xavier初始化、梯度裁剪5. 经验总结与落地建议CAN这个模型我在实际项目中用过几次有一些体会值得分享。第一CAN不是万能的。它在特征交互复杂、传统方法效果不好的场景下优势明显但如果你的特征本身就很稠密、交互模式简单用CAN可能只是徒增计算量。选型之前先做baseline对比不要盲目上复杂模型。第二交互对的选择比CAN本身的结构更重要。我见过不少团队花大量时间调CAN的网络结构但交互对还是拍脑袋选的。实际上选对交互对带来的收益往往比调结构大得多。建议用特征重要性分析、互信息等方法来辅助选择。第三CAN和DIN可以结合使用。DIN用注意力机制建模用户历史行为与当前物品的交互CAN用条件网络建模特征对之间的协同作用。两者思路有相通之处可以叠加使用。我的实验里CANDIN的组合相比单独使用DINAUC有额外提升。第四部署时注意版本管理。CAN网络的参数比FM多模型文件更大版本管理和回滚机制要提前设计好。线上出问题时能快速切回旧版本这个能力比模型本身的效果更重要。最后分享一个小技巧CAN网络内部的MLP层数不建议超过3层。我试过4层和5层效果没有明显提升但训练时间和推理延迟都增加了不少。2到3层是一个比较平衡的选择。

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

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

免费获取报价 →
↑