2021-MAXP-DGL图机器学习大赛-Graph@ICT-复盘与总结【rank6】
2021-MAXP-DGL图机器学习大赛-Graph@ICT-复盘与总结
文章目录
- 2021-MAXP-DGL图机器学习大赛-Graph@ICT-复盘与总结
- 写在前面
- 初赛:超长战线
- 前期:顺风顺水到阶段性受挫
- 中期:柳暗花明后又遭受打击
- 后期:人都被卷没了到又重新燃起希望
- 复赛:决定命运的48h
- day1:稳扎稳打,一切顺利
- day2:完成提交
- 复赛放榜
- 答辩与颁奖
- 总结
- 0、赛题与任务
- 1、总体架构
- 2、解决方案介绍
- 原始数据处理
- Pre-processing
- Model
- C&S
- Ensemble
- 3、结果
- 4、相关探索整理
- 5、前排大佬方法学习
写在前面
时间真快,遥想刚开始搞这个比赛的时候,我还是刚从字节离职。一晃几个月就过去了,我的研一上学期也接近了尾声。
这个比赛奖金贼多,总奖金18w,但是根据我从小到大围棋比赛的经验来看,有奖金特别是奖金丰厚的比赛往往能卷出新高度,一般都非常的难打。所以,我就一直觉得重在参与就好,但即使这样我中后期还是心态崩了。在组队方面,虽然师姐和同学是我的精神支柱,但是我没能找到一起写代码的队友,只好全程自己一个人肝。此外,研一上的课不是一般的多,感觉天天都是上课、写作业、考试,卑微的打工人只能抽出所剩无几的课余时间推进一下比赛的进度(虽然我觉得我全身心投入也干不过前排大佬,哈哈哈哈)。
虽然最后只是rank8(最后4, 5不知道咋回事,好像是一个人,所以变成rank6了,哈哈哈哈),但好歹也有1w奖金,也算是几个月的努力没有白费,今后还要继续努力啊。
代码:https://github.com/ytchx1999/MAXP_DGL_Graph
初赛:超长战线
不得不说,这比赛初赛的时间真的长(10月~12月),分三个阶段总结一下。
前期:顺风顺水到阶段性受挫
我开始的比较早,基本就是国庆之后数据集和baseline就放出来了。有一点值得一提,这个比赛只能用DGL,其他的不能用(PyG、PGL等)。我之前没怎么用过DGL,就只能现学现卖,好在官方给了baseline。
首先肯定是跑baseline,看看啥情况。这个赛题我再熟悉不过了,几乎是和本科毕设一模一样(引文网络的节点分类任务),只不过数据集大了好多。有了一些先验知识的指导,再看代码感觉也比较好理解了。前期主要是在学习DGL的一些使用,仔细去看看了文档,慢慢也就熟悉了,甚至我觉得DGL比PyG更香一点。
baseline主要是GraphSAGE和GAT,没调参没加trick,GraphSAGE的acc大约在48左右,GAT高一点差不多在49左右。后面主要是根据在baseline的基础上做了一些改动(吐槽,baseline代码写的太烂),对GAT加了一些之前刷榜用过的trick:
- node2vec embedding:全图跑一边node2vec,得到embedding拼接到原始特征上,和C&S一起用有一些提升
- FLAG:分类器比较弱的时候能有5k的提升吧,不过一个epoch的速度肉眼可见的慢了,也导致了我训练的难度变大了
- bn/dropout:稳定梯度,防止过拟合
- label usage:有点歪门邪道,加上C&S后就果断抛弃了
- C&S:好好调调超参还是比较有用的
- 模型融合:主要融合了GAT,GraphSAGE和GCN,大约有4k的提升
一波操作,分数就来到了54.24。由于我开始的比较早,还没有多少人来提交这个比赛,所以我当时还能在rank8左右徘徊,当时还挺乐观的。但万万没想到,还有双周赛这个东西,第一个双周赛就被卷没了,记得好像是掉到了16名,让我放弃了幻想。但这还只是噩梦的开始,后面只会越来越卷,一段时间我直接不看排行榜了,因为每次一刷新排名就又掉一名。
我甚至冒出了一些非常离谱的想法——在ogbn-papers100M上进行训练!但是失败了,我分析原因可能在于:
- 节点输入维度不一样,ogb是128,maxp-dgl是300维
- 训练节点的规模上ogb和maxp-dgl差不多都是100多万个,能训练的节点差的不是很大
- 没有用什么其他的训练策略,就是保存模型然后在maxp-dgl数据集上finetune
- 最后没什么效果,放弃
阶段性放弃了,只能用研一上的课程大作业来麻痹自己,哈哈哈。
我和室友(也是此次队伍的一员)说,我卷不动了,他却说,你最后应该能是第7。我当时觉得他这是在损我,没想到竟是一语成谶。。。
中期:柳暗花明后又遭受打击
中间我参加了DataFun的一个线上分享会,主要是一些学术界和工业界的GNN大佬们出来做分享。由于我之前看到OGB节点分类任务被GAMLP刷榜了,正好论文的一作也要分享,于是就关注了一下。但是,GAMLP毕竟是和SIGN、SAGN类似,都是Scalable GNN,我一开始理解他们放弃了一些精度,来做到Scalable。原始GAMLP根本也达不到刷榜的程度,之所以能刷榜是因为加上了类似伪标签/标签蒸馏等类似的trick。我并没有想用Scalable GNN来做比赛,毕竟比赛要的是精度,只要能跑起来,跑得快不快其实是次要的因素。
但是,我还是选择了“病急乱投医”,准备试试Scalable系列模型,就算不成功,也算是学习了一些新的方法。就这样,我又开始了一波自认为没有希望的探索:
- SGC
- 想用SGC提取一些高阶的特征,再用GAT训练,效果差,放弃
- SAGN
- 先看了一下SAGN的论文,算是SIGN的attention版本,思路还是比较清晰
- 先preprocess做邻居聚合,然后每一跳的feature放到一块进行attention
- 论文里用到了label model,self-training和伪标签的方法,但是在maxp-dgl这个数据集里面并不管用,一个原因是ogb里面valid和test节点虽然不能显式的用,但是通过label的邻居聚合确实可以隐式利用其label;但是maxp-dgl比赛并不会给任何test信息,标签太少,label model的方法就不太行了。self-training有一点点用,伪标签没单独试过,但感觉模型欠拟合有可能会强化错误。
- 总体来说,加上node2vec,C&S和模型融合之后,大概到了54.54,能有提升我也是没有想到(虽然很小)。
- GAMLP
- 直接把原来dgl版本的代码拿过来调试了一下,感觉前面preprocess和SAGN是差不多的
- RLU和SAGN里面的SLE在思想上有一些相似,都用到了label model,所以和SAGN一样,也不好用
- 加上node2vec,C&S和模型融合(SAGN,GAT,GraphSAGE),能到54.78,调整一下融合策略大概能到55.09左右
- 试了一下只用不同随机种子的GAMLP进行融合,达到了55.36。这一波确实是意外惊喜,排名也来到了第9,重新燃起了希望。
- 后面有尝试了调整node2vec,GAMLP和C&S超参数,并用不同随机种子跑了8-fold,最好成绩55.53,集成了20个不同初始化的GAMLP模型。
但是,尽管如此,前排的大佬还是太强了。太卷了太卷了,每次到双周赛,我都不敢看排行榜,又开始往下掉。我再一次放弃了。有个小插曲,比赛举办方亚马逊DGL在群里打广告招实习生,日常和暑期实习都可以投递。我一想,既然我比赛拿不到奖金,那我何不再面一下试试,至少又可以积累一波经验了。我暑假7月份面过DGL,毫无悬念的被拒了,这次算是“二战”吧,哈哈哈哈。没想到,不知道是这次的题简单还是这几个月来我有所进步,居然过了。。那天上选修课,亚马逊的hr给我打来了电话,问我啥时候能去实习,这个以后再说吧,不是本次复盘的重点。
后期:人都被卷没了到又重新燃起希望
大佬们逐渐发力,越来越多的人也加入了这个比赛(钱多,宣传力度大。。)。前排先是分数逐渐上到了56,后来又上到了57,逐渐卷出了新高度。我一度快被卷出30名,卷不动了,真的躺平了。初赛还有一个月结束的时候,我彻底放弃了。分数也一直停滞不前,没有正反馈,比赛真的很难打下去了。而且这一阶段很多结课作业和考试,确实也顾不上了。之前我还加了前排大佬的微信,卑微的寻求组队,但是无奈自己太菜,大佬还是婉拒了我。
被这个比赛伤透了心的我,去看了一下同样是亚马逊举办的WSDM Cup,这次是动态连接预测任务,于是就做了一段时间的数据处理工作,提交了中期榜,这个也等有时间再说吧。至少换个比赛(没有实时榜),我就没有之前那么难受了。
但是,我的运气似乎是一下子就来了。临近初赛结束的某一天,我发现复赛的规则居然改了!!!原来只有前20名能参加复赛,现在是全体参赛者都可以了!我在往下看,更是抑制不住激动地心情——复赛时间只有48h!这样的话,如果有新的节点和边的加入,可能需要重新训练,模型是否Scalable非常重要,太复杂的模型未必能在48h内跑完。(虽然这个时候主办方还没有说是否要加入新的节点和边)我觉得,机会来了。
也正因为规则的改变,前排大佬开始疯狂的组队。我的排名竟然一天一天的提升了!直到复赛开始之前,我居然到了rank14,简直是不敢相信我居然是以这种方式前进。我突然对复赛重新燃起了希望,这时候,室友又跟我说,“我早都说了复赛能拿第7,我说第7就第7”。虽然有希望,但我还是半信半疑。总之,到了这一步,把自己全部发挥出来不留遗憾就好了。
复赛:决定命运的48h
复赛规则对我来说完全是有利的:每天能交2次,没有实时榜,也看不到自己的分数,比赛结束放榜。复赛新加入了160w+节点和2000w+的边,不重训是不行了。这样的话,GAMLP的优势就完全体现出来了——快。我甚至跑完“老牛拉破车”般的node2vec后,还能跑8-fold,集成20个模型。。48h绰绰有余,几乎没有“丢盔弃甲”的现象出现。
day1:稳扎稳打,一切顺利
早上8点,复赛开始。我借了是有的百度网盘vip,开始有条不紊的下载数据集。在下载数据集和上传服务器的同时,我开始重新code review并修改原来的代码,适配新的test数据。9左右我开始运行jupyter的数据处理代码,虽然比较数据比较大,但是服务器还是相当的给力,没有和群里的大佬那样出现训不动的情况,都顺利地完成了。9点半左右正式开始执行了不带node2vec的GAMLP训练,看了一下loss和valid acc以及显存(毕竟V100 32GB)都没什么问题,放心的让他去后台跑了。
来到下午,我居然还要去上模式识别课!!!1点半到4点半,听一会看一会,后面老师讲的都懂了索性不听了,就修改了一下ensemble的代码,适配了test submission。
晚上回来,开始跑C&S和模型集成。保险起见,我没有选择更快的方式,而是选择了最稳妥的方式进行test submission文件的生成,7点左右提交了一下8 ensemble的版本,系统显示“success”,分数暂时看不到,这也代表代码应该没什么致命的非逻辑bug。然后整晚上就在等node2vec跑完。一边等一边看“孤独的美食家”,哈哈哈哈。大约到了11点,node2vec跑完了,虽然效果并不尽如人意,但也只能死马当活马医了。在另一块V100上开了GAMLP+node2vec的实验,观察了一会发现没什么问题,就上床睡觉了。
day2:完成提交
没课的一天,早上起来,提交了不加node2vec的20 ensemble版本,提交成功了。
下午3点左右,GAMLP+node2vec也跑完了,然后就开始20 ensemble,也提交成功了。
晚上洗了个澡平复了一下心情,但还是非常的紧张。我不知道为什么会这样,虽然我一直告诉自己平常心,但是到这了一步,努力了这么久,总是想要一个好的结果。室友说,你最后一定是第7。于是,我怀着惴惴不安的心情睡了一晚上。
复赛放榜
早上起来,精神焕发。主办方说8点整放榜,但是那边好像又出了一些问题吧,总之,8点没能放榜。我来图书馆本来是要复习模式识别的,迟迟不放榜,我直接去复习模式识别了。快9点的时候,我看了一下群里,有人截图了,看来是出来了。我点开截图一看,居然是第8!要不是在图书馆,我可能都会叫出来。我把喜讯发给了队友们,队友们直呼过瘾。前排有两个号的结果一模一样,如果是小号的话,那我还真是rank7了,室友yyds。我从没想到过我能在奖金如此之多,如此卷的比赛中拿到奖金。感觉是实力+运气+各方面其他因素共同作用的结果,运气是还很重要的啊。整个上午都沉浸在这种喜悦当中,当然是无心复习了。
下午整理了一下文档和模型文件,由于我一直都维护着一个私有的仓库,所以只要把private变成public就好了,剩下的整理也不怎么花费时间了。无数次想要放弃,但都是由于某种机缘巧合坚持了下来,这对我来说也是一种莫大的鼓励。
答辩与颁奖
总结
主要是总结一些失败的尝试,为以后积累经验。
0、赛题与任务
2021 MAXP 命题赛 任务一:基于DGL的图机器学习任务
- 数据集
- 引文网络,节点是paper,边是论文引用关系
- 500w节点,4800w边(有一些节点没有label,也不用来test和valid)
- train节点100w左右
- valid节点57w左右
- test节点160w左右
- 300维节点特征,据主办方说是transformer训练论文的title和abstract得到的
- 任务
- 23节点分类问题
- 评估指标accuracy
1、总体架构
整体是Scalable GNN,内核是GAMLP。对于大规模图,可扩展性较好,训练的速度比较快,显存占用很低。
2、解决方案介绍
原始数据处理
baseline给的jupyter文件,主要是构造DGL格式的图(节点列表、边列表以及节点特征)。
Pre-processing
- 生成全图的node2vec embedding
- 有424个节点没有feature,baseline直接用的用所有节点特征的平均值代替,这里用邻居聚合方法为这424个节点构造特征(a榜上没什么用,毕竟只有400多个节点,mean完全可行)。
- 构造节点的paper id和整型id的映射关系
- GAMLP预处理:邻居聚合k次,生成k-hop邻居的节点特征列表。
Model
GAMLP(Graph Attention Multi-Layer Perceptron):https://arxiv.org/abs/2108.10097
- 8 fold cross validation with 3 random seeds (9-hops)
- 这里没有用到原文里的RLU(Reliable Label Utilization),因为效果不好,后面会分析原因。
C&S
每一折的输出都进行C&S:https://arxiv.org/abs/2010.13993
Ensemble
总共集成了不同初始化的20个模型,最后进行Soft-Voting。
3、结果
- b榜 (test):rank8
- 为了在48h内能跑完,node2vec没有使用之前调好的参数,导致node2vec学到的embedding差一些,所以加上去没有明显的效果。仔细调一调的话,应该会有提升。(a榜大约有2k-3k的提升)
Method | Test Score |
---|---|
GAMLP (leaky-relu, 9 hops, 8-fold) + node2vec + C&S (DAD, AD) + Model Merge (+GAMLP_8fold_seed_{0-2}) | 49.7822086481499 |
GAMLP (leaky-relu, 9 hops, 8-fold) + C&S (DAD, AD) + Model Merge (+GAMLP_8fold_seed_{0-2}) | 49.7923833548815 |
GAMLP (leaky-relu, 9 hops, 8-fold) + C&S (DAD, AD) + Model Merge (+GAMLP_8fold_seed_{0}) | 49.7767704428278 |
- a榜 (valid):rank14
Date | Method | Valid Score |
---|---|---|
2021-11-17 | GAMLP (leaky-relu, 9 hops, 8-fold) + node2vec + C&S (DAD, AD) + Model Merge (+GAMLP_8fold_seed_{0-1}) | 55.53829808307 |
2021-11-13 | GAMLP (leaky-relu, 9 hops) + node2vec + C&S (DAD, AD) + Model Merge (+GAMLP_seed_{0-9}) + lr adjustment | 55.5081350224647 |
2021-11-08 | GAMLP (leaky-relu) + node2vec + C&S + Model Merge (+GAMLP_seed_{0-9}) | 55.3825306357653 |
2021-11-06 | GAMLP + node2vec + C&S + Model Merge (+GAMLP_seed_{0-9}) | 55.3694749826675 |
2021-11-05 | GAMLP + node2vec + C&S + Model Merge (+GAMLP_seed_1, +SAGN_SE_stage_0, +SAGN_SE_stage_2, +SAGE, +GAT) | 55.0993580220235 |
2021-11-04 | GAMLP + node2vec + C&S + Model Merge (+SAGN-SE, +SAGE, +GAT) | 55.0070680604702 |
2021-10-31 | SAGN + node2vec + SE + Model Merge (+GAT, +SAGE) + C&S | 54.5420166932282 |
2021-10-24 | GAT + node2vec + FLAG + C&S + Model Merge (+SAGE, +GCN) | 54.2394856973069 |
2021-10-22 | GAT + node2vec + FLAG + C&S | 53.9846753644328 |
… | … | … |
2021-10-18 | GAT+res+bn+dropout+train_label的特征增强+FLAG +增加训练epoch(5–10) | 52.95 |
2021-10-17 | GAT+res+bn+dropout+train_label的特征增强+FLAG +inception(已注释) | 小于52.53 |
2021-10-15 | GAT+res+bn+dropout+train_label的特征增强 +FLAG | 52.53 |
2021-10-15 | GAT+res+bn+dropout +train_label的特征增强 | 51.27 |
2021-10-14 | GAT+ res+bn+dropout,调整了采样策略 | 50.79 |
2021-10-13 | GraphSAGE +一些tricks | 48.48 |
2021-10-13 | GraphSAGE(baseline) | 48.14 |
4、相关探索整理
方法 | 效果 |
---|---|
node2vec embedding | 一般来说是有用的 |
GAT embedding | 试过了,没什么用 |
SGC embedding | 试过了,没什么用 |
FLAG | 模型效果差的时候有一点效果,大约有5k,但是一个epoch的时间会变慢 |
残差连接,batch norm,dropout | 几乎是必须加的 |
inception | papers100M上好像有点用,这边没什么用 |
label usage | 有点用,但是用C&S就不要用这个了 |
C&S | 有用,传播残差,不过超参数要好好调调 |
norm adj. of GAT | 没什么用 |
self-kd | 前排大佬说有点用 |
SAGN里面的SLE | 没用,因为这里面test没给标签,标签太少,label model聚合不到什么有用的信息 |
GAMLP里面的RLU | 没用,因为这里面test没给标签,标签太少,label model聚合不到什么有用的信息 |
ogbn-papers100M预训练 | 没用(没用什么其他策略,只是finetune),主要是因为特征的生成方式、输入和输出维度不同,而且两个数据集的训练节点规模差不多 |
模型融合 | 不同随机种子的模型融合是有用的 |
k折交叉验证 | 配合模型融合是有用的 |
伪标签 | 自己没试过,前排大佬说有点用 |
self-train | 有点用,但不大 |
… | … |
5、前排大佬方法学习
有个大佬对前排的方案进行了汇总:https://github.com/CYBruce/MAXP-DGL-solutions
比赛答辩视频:https://www.bilibili.com/video/BV1fr4y1v737?p=2
rank2大佬的代码:https://github.com/langgege-cqu/maxp_dgl
2021-MAXP-DGL图机器学习大赛-Graph@ICT-复盘与总结【rank6】相关推荐
- 图机器学习(Graph Machine Learning)- 第二章 图机器学习简介 Graph Machine Learning
第二章 图机器学习简介 Graph Machine Learning 文章目录 第二章 图机器学习简介 Graph Machine Learning 前言 1. 环境要求Technical requi ...
- 2021年图机器学习有哪些新突破?麦吉尔大学博士后一文梳理展望领域趋势
©作者 | 机器之心编辑部 来源 | 机器之心 图机器学习领域的热门趋势和重大进展. 又一年又接近尾声,还有两天我们就要告别 2021 年了. 各个 AI 领域也迎来了年度总结和未来展望,今天来讲一讲 ...
- 2021图机器学习有哪些新突破?麦吉尔大学博士后一文梳理展望领域趋势
选自Medium 作者:Michael Galkin 机器之心编译 机器之心编辑部 图机器学习领域的热门趋势和重大进展. 又一年又接近尾声,还有三天我们就要告别 2021 年了. 各个 AI 领域也迎 ...
- 全面回顾2020年图机器学习进展,12位大神论道、寄望2021年大爆发
2021-01-10 18:22:01 作者 |Michael Bronstein 编译 | Mr.Bear 编辑 | 陈大鑫 图机器学习在 2020 年大放异彩,各种新理论和新应用精彩纷呈. 就在近 ...
- 2020年,图机器学习的趋势有哪些?
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 2020 年已经过去了2个多月,但我们已经可以从最近的研究论文中一窥图机器学习(G ...
- 2020年,图机器学习将走向何方?
点击我爱计算机视觉标星,更快获取CVML新技术 本文转载自机器之心. 选自towardsdatascience 作者:Sergei Ivanov 机器之心编译 参与:魔王.杜伟 2020 年已经过去了 ...
- cs224w(图机器学习)2021冬季课程学习笔记12 Knowledge Graph Embeddings
诸神缄默不语-个人CSDN博文目录 cs224w(图机器学习)2021冬季课程学习笔记集合 文章目录 1. Heterogeneous Graphs and Relational GCN (RGCN) ...
- cs224w(图机器学习)2021冬季课程学习笔记4 Link Analysis: PageRank (Graph as Matrix)
诸神缄默不语-个人CSDN博文目录 cs224w(图机器学习)2021冬季课程学习笔记集合 文章目录 1. Graph as Matrix 2. PageRank / the Google Algor ...
- cs224w(图机器学习)2021冬季课程学习笔记9 Graph Neural Networks 2: Design Space
诸神缄默不语-个人CSDN博文目录 cs224w(图机器学习)2021冬季课程学习笔记集合 文章目录 1. A General Perspective on Graph Neural Networks ...
最新文章
- STM32学习笔记(七) ADC模数转换测电平(普通和DMA模式)
- golang中的死锁
- AngularJS - 自定义指令
- Git 的安装与初次使用 —— Git 学习笔记 03
- 抓wifi包工具linux,测试工具之在Ubuntu使用Wireshark抓无线数据包
- Dump文件:线程dump和堆dump
- 打表巧解蛇形方阵(洛谷P5731题题解,Java语言描述)
- 中国制造特斯拉亮相 中文车尾标亮了!网友:好抠吗?
- 电流电压曲线 vc源码_电瓶修复—充电曲线你知道多少?
- linux内核奇遇记之md源代码解读之十一raid5d
- 说说ejabberd离线消息踩过的坑
- 大佬对Maven进行深度讲解:什么是Maven?POM.XML如何解读?
- Mac下生成多个SSH KEY并管理
- 西门子PLC1200模拟量功能案例
- office2003、2010、2013下载资源
- Wireshark分析sql布尔盲注流量包
- 十一、Cadence ic 617以及assura使用总结
- Java 将表格数据导入word文档中
- 给百度地图每个市添加颜色
- 真因数之和编程matlab,真因数
热门文章
- Java安全-注入漏洞(SQL注入、命令注入、表达式注入、模板注入)
- 定时器 setTimeout(),setInterval() 清除定时器
- CAD-Cass小结(4)——Cass、CAD对图像校正与等高线矢量化
- 微服务学习总结5(Ocelot+Polly+Consul)
- Matlab:表示 MATLAB 中的日期和时间
- 什么是嵌入式 如何理解嵌入式系统开发
- debian是什么?
- 万象网管重启计算机,万象网管客户端改了密码没用?重启就不对了?
- (推荐)彻底理解ROC曲线和AUC值
- mysql isnum()_mysql 一些基础的语法和命令