领域无关对比表示下的标签比例学习:SelfCLR-LLP 在 Criteo 与 MovieLens-1M 上的完整实战指南

发布时间:2026/9/20 0:13:49
领域无关对比表示下的标签比例学习:SelfCLR-LLP 在 Criteo 与 MovieLens-1M 上的完整实战指南 领域无关对比表示下的标签比例学习SelfCLR-LLP 在 Criteo 与 MovieLens-1M 上的完整实战指南【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research本文以 Domain_Agnostic_Contrastive_Representations_for_Learning_from_Label_Proportions 项目为核心系统讲解一种面向标签比例学习Learning from Label ProportionsLLP的领域无关对比表示方法 SelfCLR-LLP包括其问题背景、基于 AutoInt 骨干的实现原理、Criteo-Kaggle 与 MovieLens-1M 两大数据集上的完整复现流程以及它与 DLLP、全监督基线在损失函数与模型结构上的差异。读完本文你将能够独立完成数据下载、预处理、bag 构造与三种模型的训练并理解每一段关键代码背后的设计动机。项目与背景在只有袋标签比例的场景下学习分类器传统的监督分类需要每一条样本都带有实例级标签而在许多真实场景如广告点击预测、隐私受限的医疗与金融数据中我们只能获得一组样本构成的包bag及其正样本比例而不知道包内每个样本的具体标签。这种设定被称为 LLPLearning from Label Proportions。本项目的核心方法是SelfCLR-LLPSelf-supervised Contrastive Representation for LLP通过自监督对比学习构造领域无关的样本表示再在表示空间上施加袋级bag-level约束从而缓解经典 LLP 方法如 DLLP在表示坍缩与过拟合上的问题。项目论文将发表于 CIKM22作者Jay Nandy、Rishi Saket、Prateek Jain、Jatin Chauhan、Aravindan Raghuveer、Balaraman Ravindran。仓库代码以code/criteo/与code/movielens_1m/两个子目录分别承载两个数据集实验两个目录结构完全一致各包含 6 个文件文件职责preprocessing.py数据下载后的预处理、切分与 bag 构造batch_generator.py训练期 bag 采样器与测试期实例级批量生成器autoint_utils.pyAutoInt 骨干网络多头注意力实现selfclr_llp_main.pySelfCLR-LLP 模型训练入口dllp_main.pyDLLP 基线模型训练入口supervised_main.py全监督基线模型训练入口Criteo-Kaggle 数据集完整流程步骤一下载原始数据从 Criteo 官方实验室的 Kaggle 展示广告挑战赛页面下载 Criteo Kaggle 数据集。下载后将原始文件train.txt与代码放置在同一目录下README 明确要求 keep the original Criteo dataset (train.txt) in the same directory as the codes。步骤二运行预处理脚本preprocessing.py会生成./data/train/、./data/test/和./data/val/三个目录分别存放训练集、测试集与验证集。README 指定的划分比例为training:test:val :: 75:20:5这一点在脚本__main__中体现为CriteoPreprocess(train_small.txt, [0.75, 0.95], ./data/)split_frac[0.75, 0.95]表示前 75% 为训练、75%95% 为测试、剩余 5% 为验证见 code/criteo/preprocessing.py。CriteoPreprocess类的主要处理管线如下预处理实现列命名Criteo 原始数据无表头脚本为其添加label 13 个稠密数值特征I1~I13 26 个稀疏类别特征C1~C26的列名低频值处理process_infreq对每个稀疏特征把出现频次低于阈值默认threshold15的取值替换为NaN随后统一填充为-1特征编码process_feats稠密特征缺失值填 0稀疏特征用sklearn.preprocessing.LabelEncoder重新编码并把列名 最大编码值重命名如C1 458供后续 Embedding 层读取词表大小分片落盘store_files按chunk_size5000行分片将 train/test/val 分别写入train_0.csv、test_0.csv、val0.csv等文件。步骤三构造 LLP 训练包bagsLLP 训练的监督信号来自 bag 的正样本比例因此预处理的核心一步是把训练切分中的样本聚合成 bag。create_bags(id1, id2, ...)通过两个类别列的取值拼接出新的bag_idid1_name : id2_name再调用merge_bags与store_bags完成聚合与存储bag 构造逻辑。脚本__main__中给出的默认参数为参数默认值含义_id1, _id25, 7参与构造 bag_id 的两个稀疏列序号_min_bag_threshold5小于等于该样本数的 bag 会被合并重组_bag_per_file25每个输出文件包含的 bag 数量_sample_per_file15000每个输出文件的最大样本行数_max_bag_size2500超过该规模的 bag 会被跳过避免超大 bagmerge_bags会将所有规模过小的 bag 按每 25 个一组重新命名为bag:i:s形式的新 bag既保证 bag 规模可控又避免出现规模过小的极端 bag。步骤四分别训练 SelfCLR-LLP、DLLP 与全监督模型按 README 说明使用三个入口脚本训练三种模型默认超参数已内置于代码中如需调整直接修改对应脚本中的默认值即可# 训练 SelfCLR-LLP python selfclr_llp_main.py # 训练 DLLP 基线 python dllp_main.py # 训练全监督基线 python supervised_main.py三者的默认训练配置来自 selfclr_llp_main.py、dllp_main.py 与 supervised_main.py超参数SelfCLR-LLPDLLPSupervised每 epoch 步数steps_per_epoch100010001000训练 epoch 数505050Adam 初始学习率1e-51e-51e-4学习率调度epoch35 为 1e-5之后 1e-6同左1e-3/1e-4/1e-5/1e-6 四段衰减测试批量大小750007500075000每 epoch 测试批数15155每 bag 的类别原型数cluster_per_class500——每 batch 的 bag 数nb_bag55—训练完成后模型会分别保存为autoint_selfclr.h5、autoint_dllp.h5、autoint_supervised.h5。MovieLens-1M 数据集完整流程步骤一下载原始数据下载 MovieLens-1M 数据集GroupLens 发布的经典电影评分数据集包含用户、电影、评分三个文件同样将原始文件与代码放在同一目录下。步骤二运行预处理脚本preprocessing.py将数据集随机按 training:test :: 80:20划分见 code/movielens_1m/preprocessing.py 的 docstring 与 L94-L101 的实现。该脚本的处理细节包括合并users.dat性别、年龄、职业、邮编、movies.dat标题、年份、类型、ratings.dat评分、时间戳三个文件从电影标题中提取年份、对类型做 one-hot 后编码时间戳做对数压缩变换过滤评分等于 3 的样本并将rating 3二值化为正样本 1否则为 0构成二分类任务输出movie_train.csv与movie_test.csv两个文件比例为 80:20。与 Criteo 版本不同MovieLens 预处理不显式构造 bag 文件bag 的构造发生在训练期BagGenerator.first_process直接以用户zip_code作为bag_id见 code/movielens_1m/batch_generator.py即同一邮编的用户群构成一个自然 bag训练时随机抽取若干 bag 组成 mini-batch。步骤三训练三种模型MovieLens 目录下的三个入口脚本与 Criteo 用法一致默认参数同样内置于代码中CUDA_VISIBLE_DEVICES1 nohup python -m selfclr_llp_main log_selfclr.log CUDA_VISIBLE_DEVICES1 nohup python -m dllp_main log_dllp.log CUDA_VISIBLE_DEVICES1 nohup python -m supervised_main log_supervised.log 上述带 GPU 指定与后台日志重定向的运行方式是脚本 docstring 中直接给出的参考命令Criteo 目录下的脚本以python selfclr_llp_main.py形式直接运行亦可。模型权重分别保存为selfclr_llp_autoint_ml.h5、supervised_autoint_ml.h5等文件。MovieLens 侧的关键默认超参数为SelfCLR-LLP 使用cluster_per_class500、nb_bags5、50 个 epochDLLP 使用 35 个 epoch全监督使用 50 个 epoch且测试批量nb_testbatch147803即整个测试集一次送入。源码级原理AutoInt 骨干与三种损失函数AutoInt 骨干网络两个数据集都复用同一套 AutoInt 架构Criteo 版 autoint_utils.py / MovieLens 版 autoint_utils.py稠密/稀疏特征各自经过Embedding稀疏侧用Embedding层稠密侧用可学习向量做缩放嵌入拼接后送入MultiHeadLayer多头注意力层默认att_embed_size32、head_num2、带残差连接与 ReLU堆叠 3 层多头注意力后把注意力输出与原始 embedding 拼接再经过两层 256 维 Dense BatchNorm ReLU关键差异在输出头model_typeselfclr_llp时输出维度为cluster_per_class × nb_class即每个类别学习cluster_per_class个原型激活Criteo 中cluster_per_class500、nb_class2输出 1000 维dllp与supervised时输出为单节点 sigmoid。Criteo 版稀疏侧 Embedding 词表取最大编码值 1如C1 458中解析出 458MovieLens 版pre_process通过_id not in f过滤掉user_id、item_id后从列名 唯一值数格式中解析词表大小。SelfCLR-LLP 的三项组合损失SelfCLR-LLP 的损失函数由三项组成total_loss 实现total_loss 0.5 * L_cd L_bag 0.01 * L_spread对比散度损失L_cdadd_cd把同一 mini-batch 内所有样本的激活两两做内积得到相似度矩阵以自身与自身为标签计算 softmax 交叉熵。其注释 Same half; different augmentation 表明其设计意图是让来自同一个 bag 的样本表示相互靠近、不同 bag 的样本表示互相分离这正是对比表示名称的来源。袋级交叉熵损失L_bagbag_loss与 DLLP 相同的 bag 约束——对 bag 内所有样本的 softmax 输出取均值与该 bag 的真实正样本比例计算交叉熵。因为 bag 内实例标签不可得只能约束聚合后的比例。原型激活分散项L_spreadmean(reduce_max(sigmoid(logits), axis1))鼓励cluster_per_class个原型头尽量分散激活防止表示坍缩到少量原型上。Criteo 与 MovieLens 版本中L_spread的系数不同0.01 与 0.001是两套实验各自调参的结果。bag 内的标签编码由BagGenerator.process_selfclrllp完成每包首行写入[包大小, 0]第二行写入[正样本比例, 1-正样本比例]见 code/criteo/batch_generator.py。DLLP 与全监督基线DLLPbag_bce_loss不使用对比损失与原型头直接对 bag 内 sigmoid 预测均值与真实正样本比例计算二元交叉熵。相比 SelfCLR-LLPDLLP 缺少对比正则容易在 bag 约束下产生退化解。全监督基线supervised_main.py使用实例级binary_crossentropy损失训练时每个 mini-batch 就是普通样本切片无 bag 概念用于提供理论上限参照。评估方式三个训练脚本都通过 Keras Callback 在每个 epoch 结束时计算测试集 AUROCROCCallback遍历测试生成器、累计预测并调用sklearn.metrics.roc_auc_score仅在 AUROC 提升时记录最佳模型SelfCLR-LLP 的评估会先把输出 reshape 为[batch, cluster_per_class, nb_class]对原型维度取 max 再做 softmax取正类概率计算 AUC。全监督脚本则使用ModelCheckpoint以val_auc为监控指标保存最优权重。复现注意事项运行环境代码基于 TensorFlow 2 / Keras使用tf.function、keras.callbacks、tf.keras.metrics.AUC并依赖numpy、pandas、scikit-learnCriteo 侧还需sklearn.preprocessing.LabelEncoder。建议在具备 GPU 的环境下运行MovieLens 脚本的 docstring 中给出了CUDA_VISIBLE_DEVICES指定显卡的用法。数据放置两个数据集的原始文件Criteo 的train.txt、MovieLens 的users.dat/movies.dat/ratings.dat都必须与代码放在同一目录预处理脚本与训练脚本默认从当前目录读取。目录约定Criteo 训练脚本默认从./data/train/、./data/test/读取预处理产物MovieLens 训练脚本默认读取movie_train.csv、movie_test.csv。超参数调整README 明确指出如需修改超参数请在代码内部更新——项目未提供命令行参数解析所有默认值都写在各脚本的类构造函数与__main__中复现时直接按需修改这些默认值即可。bag 规模上限Criteo 的BagGenerator内置max_size2500超过该规模的 bag 会被跳过MovieLens 的 bag 由邮编列天然构成无显式上限但训练时按nb_bags5随机采样组合。【免费下载链接】google-researchGoogle Research项目地址: https://gitcode.com/gh_mirrors/go/google-research创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考