前言
今天是2022年1月10日,决赛答辩在1月7日结束了,最终取得了第二名的成绩,拿到了浦发银行和百度智能云的招聘绿色通道和5万奖金,可以说是我人生中拿到过的奖励最高的一次比赛了,休息了两天后决定对这次比赛做一个简单的总结。
比赛题目
比赛链接在此2021“智荟杯”浦发百度高校极客挑战赛 - 百度AI Studio - 人工智能学习与实训社区
我们参加的是算法赛道,比赛题目简单点说就是一个下棋博弈的游戏,每一支队伍都要设计一个模型,然后不同队伍之间的不同模型会进行下棋对决,赢的人会加分,输的人会扣分,然后按最终得分进行排名。下棋游戏名字叫“捕碳大作战”,具体的规则非常复杂,有兴趣的可以在这里了解一下。
初赛
我搜了一下这个比赛,好像2018年是第一届,所以我参加的2021年的是第四届,参赛人数并不算多,初赛一共只有92支队伍参赛,但是晋级规则有点奇怪,排名前15所高校中排名第一的队伍晋级总决赛,也就是说一个学校只能晋级一支队伍,这样可能是为了防止某些学校太厉害全部进复赛了,导致一些弱一点的学校没有机会了吧。
师兄跟我说这个比赛参加的人很少,参赛有机会去线下答辩,可以出去旅游,于是我果断参加了,结果初赛开始后才知道光是我们学校就有三支队伍参赛,而且有一支队伍和我们是一个实验室的,实力很强,我们当时都是前15名,所以只要我们能打败他们队伍就可以进决赛,否则哪怕在前15名也晋级不了。
当时初赛最后那几天真的是绝望,我们无论怎么改模型都打不过同校的另一支队伍,每天都在坐牢,又不想放弃,毕竟排名在前15名。我们不断分析与他们之间的对局,仔细分析为什么我们的模型会输,然后不断改进,但也始终打不过。在最后一天封榜之后,我们发现我们的模型虽然打不赢他们,但是可以打赢排名更靠前队伍,而他们的模型虽然能打赢我们,但是打不赢排名更靠前的队伍,这就导致最终我们以极小的分数差领先了他们,从而晋级了决赛。
初赛解决方案
这种下棋博弈游戏的最好解决方案就是强化学习,阿尔法狗就是用强化学习在围棋上打败了人类冠军。但是强化学习对硬件的要求很高,需要学习大量的对局,我们实验室最好的服务器是RTX8000,我们使用比赛官方提供的baseline进行测试,将RTX8000的48G内存全部用满,训练了三天三夜,也只训练了10000轮对局,要知道阿尔法狗可是训练了几千万轮对局,这让我们对使用强化学习解决这个问题的方案产生了极大的不安。不过我们还是先试了试强化学习,为了让模型能够和旗鼓相当的对手进行训练,我们设计了一些简单的规则算法,并通过调整采用这些规则输出的action的最终概率来模拟不同实力的对手,让模型能够从易到难的去学习下棋策略。除此以外,我们还修改了模型的结构,提取的特征以及reward,但是效果一直很差,强化学习训练出来的模型始终打不过我们随便设计的简单规则算法,不知道是因为我们设计的reward和模型不好还是因为模型训练的不够久。
初赛一共只给了三周时间,我们花了一周半在强化学习上,结果没有任何进展。然后我们发现,虽然比赛介绍上的标签写了强化学习,但规则中并没有强制要求用强化学习,于是我们灵机一动,开始写纯规则算法。作为前ACM选手,这种纯规则算法自然是难不倒我,但最大的问题在于各种策略以及超参数的选取,比如说捕碳员捕到多少碳回家、种植员在收益率高于多少时种树、捕碳员和种植员的比例等,这些参数的设置只能依靠经验或者观察对局从而进行人工调整。为了保证各个agent不会相撞,不会目标冲突,我们专门设计了防撞和防目标冲突的算法,给每个agent的候选动作打分,然后排序,按分高到分低依次分配action,如果分高的候选动作下一步要走这个地点,那么分低的候选动作就禁止走这个地点。具体的代码如果有需要可以私信我,我可以发给你,不过我猜应该没人想要这个源码吧😂
决赛
我们真的没想到能进决赛,明明打不赢同校的另一支队伍,但既然我们进了决赛,肯定就要全力以赴。决赛的规则有一些改变,一个是双方开局从一个转化中心变成了两个转化中心,一个是全地图的碳含量变得不再可见,只有agent经过的地点才有视野,但最关键的是,比赛举办方可能发现了初赛有很多人使用纯规则算法,这违背了比赛的初衷,所以要求决赛必须要使用深度学习相关算法。
最终晋级决赛的15支队伍,有3支队伍不知道为什么弃权了,在决赛期间没有提交代码,剩下的12支队伍里也有1支队伍躺平了,虽然提交了一版但是效果太差没有再继续改进了,后续的答辩也没有参加,所以实质上决赛是11支队伍在争夺奖金。
决赛期间的心路历程可以说和初赛一模一样,直到最后一天,我们都是排行榜上的第七名,要知道只有前六名是有奖金的,所以决赛的最后几天我们真的是废寝忘食的写代码,改模型。晚上一两点还在床上用笔记本上传数据,运行代码。洗澡时在想策略,吃饭时也在想,就差做梦梦到了。每一场对局信息我们都会整个团队一起反复观看,分析我们模型的不足,然后再改进。最终功夫不负有心人,比赛在1月3日晚上11点59分结束,而我们在1月3日晚上10点30分提交的代码一路过关斩将,最终取得了排行榜第二的成绩。
决赛解决方案
因为初赛的经历我们已经深知强化学习对我们来说很难,可能是因为我们自身对强化学习了解的不够多,所以reward和模型设计的不好,也可能是因为硬件条件不够,模型训练太慢导致迭代很慢,所以难以在可接受的时间里取得较好的效果。总而言之,我们还是放弃了强化学习这条路,转而使用传统的监督学习,同样能满足决赛要求使用深度学习的规则,具体来说我们的模型包含以下五个关键点。
1,训练数据获取
既然是监督学习,那么肯定要有训练数据,我们专门设计了一个随机地图生成的算法,将棋局中会出现的各种情况全部考虑在内,同时尽可能真实,比如刚种下的树周围一般有很多碳、年龄大的树周围的碳一般很少、回合数越小碳分布越对称等。但说到底这种随机出来的数据还是和真正的对局有一定差异,因为不同队伍不同模型的对局信息我们是可以在排行榜上看到的,所以我们爬取了不同队伍之间的真实对局,并处理成了我们需要的训练数据,这样我们通过在大量的伪造数据上预训练,学习一种通用策略,然后在真实的数据上进行微调,学习真实对局的情况,最终取得了不错的效果。
2,特征提取
baseline中提供的特征非常底层,而且是为强化学习准备的,于是我们完全放弃baseline中的特征,直接重新设计。具体来说我们为捕碳员和种植员设计了捕碳地图,追击地图,回家地图,种植地图,威胁地图等地图信息,每一个任务的地图信息分别记录了在地图上进行该任务的分数,比如说种植地图就是在地图上各个地点种树所能获得的收益分数。这种人工提取出来的高层特征可以让模型较为轻松地学会我们的引导策略。
3,引导策略
引导策略基本上和初赛时最终的算法比较相似,仅根据决赛修改的规则和对局情况稍微做了一些修改。为了让模型能够仅根据我们所提供的特征信息预测合适的action,我们将引导规则也修改为只使用所提取的特征,并在此之上进行打分,排序,分配action。
4,模型设计
因为我们提取出来的特征完全是地图信息,全部是15*15的向量,所以我们直接采用多层卷积网络。因为本科毕业设计用过yolov3,所以这里也借鉴了一些yolov3的思想,比如残差网络以及关注不同尺度的特征。而转化中心则因为特征以及要学的规则比较简单,所以用的是简单的全连接网络。
5,碳追踪算法
因为决赛将地图上的碳信息修改为对选手不可见,只有agent经过的地方才有视野,这就导致很多需要地图碳信息才能获得的特征变得不可用,但考虑到地图上所有碳信息的变化规则以及各种动作的优先级在比赛规则说明中是完全告诉选手的,所以我们可以记录被探明的地点的碳含量,并模拟这个地点碳含量的变化,从而维护一个全图的碳信息,再加上地图在最开始是完全中心对称的,所以我们最终设计出来的算法会在50回合左右就实现对全局碳信息的精准把控。
最终我们设计出来的模型也是不负众望,在决赛中取得了第二名的成绩。如果有兴趣需要代码源码的,同样可以私信我。
总结
这次比赛真的是我参加过的比赛中,获得的荣誉最高的一次比赛吧,全国第二名,还拿了5w奖金,不过这个比赛一共也只有92支队伍参赛😂,但是我已经很满意了。
在这里特别感谢我的队友小洪和范博,小洪写数据生成的代码真的也很辛苦,我不停的提要求,她就任劳任怨的改,ppt也是做的非常认真,范瑞博士也是一直帮我分析对局信息,告诉我我们模型的缺点有哪些,然后最终答辩的时候也展现了博士级别的答辩,真的非常精彩。有了他们的后勤保障我才能专心写代码,没有后顾之忧。
如果大家看到了这里,我觉得各位也可以去挑战一下自己,参加一次智荟杯比赛,这个比赛从18年开始每年都有,趁着现在参赛队伍还不多,厉害的大佬还没有来,说不定下一个拿奖金的人就是你!