前言

如愿地、顺利地完成了上一阶段的任务(课内的诸多结课作业),终于可以全力做RecBole的科研任务了。

老师和师姐没有给我定ddl,说“大三事情也比较多,看自己安排就好”,但是尽快完成也能给老师留下好的印象,同时也可以早一点推进到后续的科研工作当中。

暂时给自己定下春节前完成模型开发的ddl,时间刚好一周左右。春节之后就要开始做校内的科研任务和准备美赛以及复习开学考了,到时候四线交织想必会是非常痛苦的一段日子(让我想到了上个暑假末尾同时学车+复习五门课程的艰难)。如果把DAGFM模型的开发留到那个时候,恐怕会非常焦虑和痛苦。所以一定要争取在年前把这个阶段性的任务完成,一个阶段做一个阶段的事情。

实现难度如何还是未知。看辅助开发人员列表,里面有三个月开发一个模型的,也有一个月开发三个模型的,恐怕还是看个人能力罢。我会用多久的时间呢,没有把握。按照这样算也就是十天左右。不过今天就回上海了,后续一个星期打算泡在上海图书馆,应该学习时间会蛮多的,其他事情我也不打算做。希望能快速攻克吧。

在1.13、文章的开头立下了flag,希望1.21时回来再看已经达到目标了吧。

前两天把DAGFM模型的论文读了一遍,应该算是看懂了。现在的规划就是先把作者用PyTorch实现的代码看懂,然后尝试用RecBole实现,再根据代码风格、注释规范等等进行修改,最后联系学姐尝试提交。

本帖应该会是本站当前战线最长的帖子,计划是把知识相关和自己的感受都记录下来,可能会比较冗杂。

那么,开始吧。

源码阅读

先看最基础的DAGFM实现

1/14 16:08 现在的情况是已经弄明白DAGFM模型和KD_DAGFM模型的源码实现了,接下来尝试在RecBole当中开发这个模型吧。感觉主要还是数据接口和配置什么的会比较麻烦。

现在非常痛苦的一点就是本机算力十分不足。

阅读开发RecBole的handbook《伯乐开发手册》

开发环境的搭建:

依托Linux系统、使用Python开发、根据requirements.txt进行依赖库的安装,建议用conda虚拟环境。

代码提交管理:

基于GitHub平台

代码开发规范:

PEP8

(实际上后期好像有直接根据PEP8修整)

开发流程:
代码准备:

fork主仓库到自己的仓库,在自己的仓库上进行开发。

代码文件header注释:

到时候再看就行

撰写注释:

一定要用英文注释

代码检查:
  1. 代码风格检查:

    conda install yapf工具自动按照PEP8改变代码风格

  2. 代码正确性检查:

    本地简单测试bash run_test.sh

代码提交:

到时候再看

模型开发:
模型信息登记:

等快完成了再登记吧

模型开发:

a.模型文件创建:

模型开发一般创建两个文件:

。。。。。。。。。手动分割线

1/14 17:52

感觉handbook看的差不多了,现在打算上手复现了

1/15 10:39

目前复现卡住了一个很难解决的点,其他教师模型的复现当中没有embedding_layer,但是知识蒸馏要求共享embedding_layer。

1/15 10:51

似乎有出路,虽然教师模型都没有定义,但是所有教师模型的父类ContextRecommander里面有统一的embedding方法,这应该是出路。

1/15 11:48

不知道是机遇还是问题的点出现了。本论文的教师模型选择的是xDeepFM和DCNV2,但是实际上教师模型都不是完整的模型,而是其中的部分模型CrossNet和CIN,这两个模型都是简单的特征交互模型,因此比较简单,我觉得可以直接在我自己的模型文件当中实现,这样的话也解决了embedding_layer的问题。

1/15 12:39

embedding_layer的问题还是没有解决,因为参考源码里面的embedding是自己实现的,但是到底需要不需要自己实现这么麻烦呢?能不能直接用nn.Embedding?目前还是未知的。

1/15 14:48

目前随着引入的模型增加,整体代码量增大,又没有办法实时debug,目前有些混乱,估计最后形成框架跑起来debug会很痛苦

1/15 14:57

总体框架完成了,现在感觉最大的问题是数据集接口。归根结底还是对伯乐框架不够熟悉。

1/15 15:38

感觉脑子里一团浆糊,但是似乎也无从改善

感觉眼前的主要问题就是数据接口和embedding_layer

这两个解决应该会差不多

1/15 18:00

论文源代码的运行似乎还是有问题,在GitHub上提交了issue不知道什么时候会回复。

其实train.py也是要认真看的,因为在源代码当中是模型和训练分离了,但是在recbole当中复现模型必须考虑train

1/15 18:35

对interaction的结构似乎更有了解了。

interaction实际上就是一次取了batch_size个项目进来。

而这个batch_size是可以作为超参数设置的。

现阶段主要需要攻克的目标也很明确了,就是把DAGFM模型源码当中一次一次的特征交互改成一批一批的特征交互。

1/16 10:22

现在有了些许进展,但是似乎还差点。

1/16 13:42

似乎有了不错的进展,但是目前遇到的问题是config不是简单的字典,config[“teacher”]这样可以取到对应的键值,但是没有办法进行遍历,修改教师的配置参数"t_"

1/16 19:00

前面的问题得到了解决,现在的问题是,为什么ml-100k数据集的特征只有7个而不是8个

1/16 19:48

遇到了比较严重的问题,之前写代码都是用python库里面的代码作为参考,但是似乎python库里面的代码和GitHub有出入

1/16 21:53

现在似乎整体稍微能跑起来,但是还是tensor的维度处理的不是很好。

现在需要处理的就是维度的问题,传入的是有batch_size的三维的数据,原本处理的是二维数据。

1/16 22:55

模型跑起来啦,教师模型的训练估计没什么太大的问题,后续就是完成学生模型的训练和细节的完善。然后就可以进行测试和交付啦!

阶段性的胜利,更新到博客上。

1/17 10:50

没有想象当中的顺利。教师模型CrossNet复现出来了,但是CIN和学生模型DAGFM都还有bug。整合之后还有save_info的问题。

1/17 11:08

当前就是三大问题

  • CIN教师模型的bug,关于维度
  • DAGFM学生模型的bug,同样关于维度
  • 加载教师模型的bug

1/17 11:14

目前来看,CIN教师模型的bug被解决了

这意味着教师模型的完全胜利

接下来就主要是知识蒸馏的问题了

1/17 11:40

有的时候勇于发问真的能节省不少的时间,问到了所有的feature都是B * F * E大小的,瞬间解决了所有的维度问题,两个教师模型和一个学生模型都已经准备就绪了

现在唯一的问题就是如何进行训练&知识蒸馏

我感觉年前应该可以做出来

1/17 12:10

现在已经把加载模型的问题给解决了

现在就是似乎知识蒸馏的代码那里还有一点问题

我想这两天也许能做出来

1/17 12:30

模型完完全全可以跑了,可以进行知识蒸馏了!

但是就是效果似乎没有理想的那么好。

我感觉这两天应该可以做出来。

知识蒸馏的效果似乎还没有普通的DAGFM强。

auc=0.51,真的就和随便猜差不多

知识蒸馏训练的AUC反而越来越低了,真服了。

现在就是对照着检查一下代码吧,看看是不是哪里出问题了

上午先到这里吧,下午开始查代码,争取今天把实验效果搞好,明天提交测试。

炼丹的事情就很难说了,呜呜呜。

1/17 15:56

检查了一遍完整代码,似乎没什么问题

1/17 17:11

目前模型没什么问题,效果也上来了,就是最后的超参数调整和模型测试了,估计明天可以提交

-------------------------------------手动分割线

1/20 16:39

不知不觉间有接近三天没有更新了。

项目的进展有了非常多的变化。唉,有很多想说的想写的,但是想法一齐喷涌上来,结果就堵住了,一下子不知道如何“落笔”。

为什么在1/17就断更了呢,因为在那之后就满心都是这个项目了,实在没有分出的心思记录。

我实在想写下很多东西,但因为思绪纷乱和最近几天的焦虑、压力和疲劳导致我的脑子运转不畅,就当是碎碎念吧,没有逻辑也不去梳理思路,想到什么就写下什么。

说说眼下的进展吧,目前看起来是做完了,KD_DAGFM模型在RecBole框架下能正常使用,不会产生冲突和影响框架的其他部分,也通过参数的调整在数据集上达到了论文当中描述的效果,基本的测试也没有问题。现在已经提交上去给学长review了。

但是我并不确定会不会有其他的错误,毕竟谁能保证自己写的代码不会出错呢,希望可用顺利结束开始下一阶段的任务吧,希望一切顺利。但是师兄师姐也需要放假嘛,所以不可能马上有检查的反馈。

再回顾回顾这几天为项目奋斗的日子。不能说难过,但是也不能说很开心。但是确实很累。

大概也就是回上海一周左右的时间吧。每天其实过的都一样,早上七点起床,洗漱收拾一下(不得不说我在这一环通常都需要花上三十分钟,相比大部分男生似乎都更“磨蹭”),出门买好早饭,就去健身房健身。一般换好衣服准备开始锻炼时都已经八点了。刚好一周的时间,肩、背、跑步、胸、腿、椭圆机、休息日轮了一遍。(身体适应了这个节奏,今天早晨在七点就自然醒了,不过因为是休息日,就多睡了一个小时。)健身之后坐地铁到图书馆,先吃买的早饭(包子、鸡蛋),那时基本已经冷了,不过我倒是不挑剔。吃完饭在二楼找个位子坐下开始学习。反正就搞项目呗。搞到一点左右点外卖,两点吃饭,两点半左右吃好。开头两天还会找个沙发睡个午觉,后来因为那样也没有睡得很好,再加上想早日把项目做完,因此就不睡午觉了。回到座位继续学习。当然学累了或者炼丹的时候会玩玩手机。学到快晚上八点,就收拾书包坐地铁回店里吃饭了。吃完饭和家里人聊一会天就回家。回到家基本已经很累了,如果是没有午睡的日子,晚上脑子里更是一坨浆糊,可能会做点简单的工作或者刷手机,然后晚上十一点半十二点睡觉。如此循环。其实这样的日子并不困难,但是多少有些令人疲倦。其实我想想,我在学校的时候都没有这样认真学习与工作。读大学已是第三年,寒暑假也已经是第五个了,这一次的假期是最充实的,也由此想到我前几个寒暑假的摆烂与虚度,完全没有好好利用,这也导致了前面被人拉开差距。不过生活总是向前的,倒也不觉得遗憾。

怎么发现自己似乎疲惫了呢?当然每天晚上回去的时候的疲惫是不必说的。主要最近食欲都下降好多,吃什么都不像以前那么香了。昨天和姐姐去逛街买衣服(实在没衣服穿了),照着镜子看着自己杂乱的头发,变小和无神的眼睛,一脸的油,才真正意识到自己累了。忙着连理发的心思都没有,一晃都大年二十九了,想理发也没处去,主要是人多我也不想排队。过完年正月一般又不能理发。只好再议。

先写到这里吧,准备回家吃饭了。

---------------------------------------------------------手动分割线

休息了一晚上再来码字头脑都清醒了不少。

项目的进展也回顾完了,最近这几天过的日子也回顾完了。目前还不能说我完全复现了KD_DAGFM模型,所以所谓“获奖感言”以后再说吧,半场开香槟的事情是万万做不得的。

这篇文章就写到这里吧,另外想说的话已经不符合这个主题了,待会再开一篇博客。