在RecBole当中复现KD_DAGFM模型是科研实习的第一份正式工作。想来也算是比较的曲折。

在工作的初期我对于PyTorch、RecBole、推荐系统可谓是一无所知。

最开始老师问我,会PyTorch吗?我说不会,但是我可以学。于是老师让我学完告诉他。

记得那天是周五,我就花了一个周末的时间在b站恶补了PyTorch,然后告诉了老师。

接着老师让我了解RecBole,熟悉的差不多了可以在这上面复现一篇模型。(其实老师的意思应该是我先了解、熟悉RecBole,好了再联系他,然后开始复现模型。我理解成我自己熟悉RecBole,然后自己找模型进行复现,检验自己的学习效果。然后当时还纠结这个复现的要求是什么样的)当时对RecBole也是一无所知。那段时间因为考虑到后面要完成结课作业,也是尽量给自己设ddl(老师完全没提ddl)。于是自己就开始看伯乐的官方主页、官方文档以及一些相关的帖子,感觉差不多了找了一个已经实现的DCN模型进行模仿复现。然后应该是花了一段时间,可能一周左右吧。去找老师说复现了模型。老师还蛮惊讶的,问我提pr了吗。后来老师可能意识到我理解错了,于是就给我推了一个师姐,让她给我分配具体的工作。于是和师姐聊了一下之后,给我分配了KD_DAGFM的复现工作。

后来要赶着把课内几门课的大作业都做一下,所以就暂时搁置了复现工作。大概花了两周的时间完成课内的结课任务,又碰巧需要回将乐一周,所以中间算是耽误了三周时间。回到上海已是1.13,距离过年一周左右的时间。

就算是除夕前做完,都算花了一个月。况且除夕前我也没有把握做完。当时想的是必须争取除夕前完成任务,毕竟年后还有复习开学考等其他的工作,堆到年后势必非常焦虑、难受。

虽然说回到上海已经1.13了,但是在将乐我还是挤出时间把KD_DAGFM模型的论文读懂了(这里也感慨学长写的真的非常好,论文读起来深感思路奇妙,而且具体的细节也是属于讲的通俗易懂的)。也就是说这一周的时间就是全力复现了。

具体细节就不再赘述了,帖子在RecBole当中实现DAGFM模型 | Yangyy’s Life记录了我的复现过程和当时的心路历程。

大体上应该是:先看了论文,弄懂KD_DAGFM模型;看KD_DAGFM模型的源代码,尽量弄懂代码细节;看RecBole开发的handbook,弄清楚要求;开始在RecBole框架下复现。

总体还是蛮曲折的。也费了很大的力气让模型跑了起来。

实际上需要考虑以下方面的问题:

  1. 是否会引起整个框架的冲突(大忌)?
  2. 能否在现有框架下顺利运行?
  3. 是否在多个数据集上达到了与论文描述相当的效果?
  4. 能否顺利进行超参数搜索?
  5. 能否通过CI测试?
  6. 代码风格是否符合规范?

因为添加的文件比较的少,没有动其他地方,所以问题1不太担心。

当时也是可以在框架下顺利运行的。

但是效果并不甚理想、超参数搜索也有隐患、CI测试也跑不完。主要是这三方面问题。

其实想想当时是非常心酸的。因为校内的服务器没有校园网不能用,实习那边不方便给我服务器。我自己也没有可用的计算资源。就是靠自己的CPU跑啊。CPU跑深度学习模型啊。记得当时超参数搜索跑了一晚上都没有进展。

不过也是我自己消息闭塞,后来和朱子林聊天,他告诉了我AutoDL这个平台,真正让我工作进度推进速度快了不少。GPU一小时0.88,我是完全可用接受的。前后大概花了20元左右吧,完全是可用接受的。

当时在CI模型测试没完成,大数据集跑不完所以效果未知,超参数搜索存在隐患的情况下(都没和师姐说),师姐让我先提pr放上去,我只好硬着头皮提了pr。所幸当时学长没空给我review。

有了GPU之后我就可以很高效地炼丹了。修改了CrossNet模型部分。然后整体通过调参达到了论文描述的效果。但是超参数设置和学长大不相同。(因为实际上有一处细节错误),但是能达到论文效果我相对有了不少信信心。

利用RecBole的官方CI测试我也得知模型可以顺利通过CI测试。

于是担心就变成了:对玄学的效果相当的担心;对超参数搜索隐患的担心。也就这样先交了。等待学长的review。

等学长忙完给我review大概过了半个月。所以即使我基本完成了这项工作,我内心的石头也没有彻底放下,内心还是不安。也不敢在自己的博客上发表自己完成任务的感言。但是也算是一个阶段的结束吧,就开始忙其他的了。

昨天(2/4)我终于和老师沟通上了,也请学长帮忙review我的代码。当时真是抱着忐忑的心等待学长的检查。不过学长真的非常nice,态度非常温柔,也让我放松不少。学长说我写的非常好,也让我更安心些。当时在等待期间想通了超参数搜索的隐患问题(见博客对在RecBole当中复现KD_DAGFM模型的超参数搜索环节的思考 | Yangyy’s Life),也就是其实没有问题。

那么就只剩下玄学的效果的问题了。确实玄学的达成效果没有用。但是学长还是帮我发现了问题。就是embedding_layer没有冻结。不过其实我自己还真不知道应该怎么冻结,学长教了我加上一行代码解决了这个问题。

最终、最终!把玄学的效果问题也解决了。那么目前来看似乎没什么问题了。果然是这样,学长说没有其他问题了让我提pr!

在昨天晚上十一点左右时收到GitHub的邮件,看到了让我十分十分开心的"mergerd"字眼,我当时真是过于开心。因为小刘正在和我视频,她录下了我的反应,真是十分有意义的记录。

也许对于技术大佬来说,这不值一提,但是对我个人而言,真是有莫大的成就感。其实我在做之前,我是毫无把握的,至少对于在春节之前做完毫无把握。

说说

这是在1.15心怀焦虑不安地在博客记录了自己的心情。

一件毫无把握的事,但是却又是我必须要完成的事,我此前很少面对这样的事情。但是我最终通过努力实现了。(我不以努力、勤奋标榜自己,在大部分情况下,我不认为自己是一个勤奋、努力、拼搏的人,我想我还不配,但是对于过去的这段日子,我觉得自己努力了、奋斗了)

这也告诉我,虽然很多东西是注定无法达到的。但是努力可以让我拿到更多的东西。

当然任务的顺利完成,我不觉得均源于我自己。我十分感谢自己的幸运。首先老师和师姐没有给我定ddl,甚至师姐还劝我别急,慢慢做;其次我感觉分配给我的模型KD_DAGFM模型是老师实验室的学长的作品,其源码实现基于PyTorch,风格我想也和RecBole接近(毕竟学长也是RecBole的主要开发者),这对我的复现有很大的帮助,如果源码是用TensorFlow实现,自然就没有PyTorch这么顺利;如果是国外作者写的,自然也更难迁移到RecBole上;学长是作者还有巨大的优势便是,当我出现了上述的问题时,学长能较为轻松的帮我纠正;同时学长本人还非常nice,在赶论文期间,我邮件问他问题他都非常耐心地解答了;甚至学长还用了“辛苦了”、“感谢我的贡献”等词汇,我真是非常非常感激。

伯乐工作已经告一段落啦。我很幸运,我真的非常感谢这份幸运。我也非常感谢帮助我的人。希望自己能继续努力。继续前进!