① 2.8,710 组织了一次月会,让 S2M 其他 Project 的人做分享。有一位教育学 PhD 在做的项目是:如何评估用户活跃度与阅读能力提升之间的关系(比如引入小测试)。
② 2.8,S2M 团队更新了过去 3 个月的数据(我们的数据量从 6 个月增加到 9 个月),此后 3 天我都在跑已有的清理文件代码。代码里实际上有需要对一个 GB 级别的 dataset 进行 outer join,结果在 AWS 上跑,15 GB 的内存并不够用;我卡住的时候 709 就边帮我 debug,边去做别的项目了。
③ 后来我在 Sherlock 上跑,但 Sherlock 不仅一如既往地经常连不上,而且奇怪的是 pip install 以后 Jupyter server 里并不会出现对应的软件。2.10 问了 SRCC 解决之后,分配了 24 GB 的内存,终于成功跑了代码。清理完以后,709 在新数据上重跑了一些模型,效果有些提升。
④ 显然,以后会有更大量的数据进来,清理数据的代码会更加爆炸,现在的解决方法不是长远之计。当时写这个代码的 RA 并没有考虑 scalability 的问题,现在真是要命了。
⑤ 2.4,709 说 pytorchfm 对 FM 算法的复现有误,我仔细研究了一下发现的确如此,于是 709 让我试试其他的 FM 软件。2.11 春节放了个假,2.12 我尝试了 FastFM,然而各种跑不了。之后分别尝试了 libFM、xlearn,然而远没有 sklearn、pytorch 等好用(比如 xlearn 跑的时候不显示 loss、没有 built-in 的评估 metric)。
⑥ 话说 2.15,709 给了我一个文件夹让我看,结果我总是找不到那个文件夹,浪费了些时间,后来 709 发现自己写错了,他自己也经常搞不清什么东西放在什么文件夹里…
⑦ 2.16,709 说加入用户和文章特征以后,FM 的 MSE 会上升,也就是说“混合过滤”(hybrid filtering,即因子分解机)的表现不如纯协同过滤(PCF,pure collab. filtering,即普通的矩阵分解)。我用不同软件、不同参数在 MovieLens 上验证了一下,确实如此。这很奇怪,加入更多的信息以后怎么会表现更差呢。
⑧ 709 说现在我们有了文章的文本,本来可以计划在推荐模型里加入 NLP,但如果看上去引入特征信息以后模型表现更差,还不如只考虑互动信息,那我们得先好好探索一下为啥。
⑨ 另外,“神经协同过滤”(NCF)在 S2M 上的表现也并不如 PCF,于是 2.17,709 让我研究一下 NCF 论文,我也写了篇让他挺满意的分析。2.18,我又研究了一下 Spotify(KKbox)数据,结果加入特征之后 MSE 下降了,有意思。
⑩ 2.19,710 说我跑出来的 csv 里面 9、10 月的数据缺失,让我看看哪里出了问题。我当时很生气,这都啥破事啊。不过后来想想他们也不想这样,归根结底还是回到了整个 lab 没有设定 SWE 标准的问题,既没有 design doc,也没有 code review。709 基本负责了主要的代码,如果只是他自己用那没事,但一需要合作就可能出问题。
⑪ Data cleaning 代码是去年秋季 lab 里另一位 RA 写的,写得真不怎么样,2 千多行里文件名、方法名不知所云;变量名是 input 但实际代表的是 output,output 写到和 input 相同的文件夹;有的文件被基本原封不动地复制了 4 遍…
⑫ 2.19 我搞清了文件处理的流程,知道了这个错误的文件是第 3 步的产出,上游第 1 步里有 2 个相关的文件就已经错了;但并不知道怎么解决。
⑬ 当时我有些担心组员们怀疑我的能力,进而想到我需要更聪明地打造自己的个人名声,证明我的能力,让我在遇到困难时获得更多的话语权和选择权。
⑭ 2.22 我终于跑出了正确的数据,次日 709 验证了加入新数据后模型 MSE 下降了 8%。我说想记录一下清理代码应该怎么跑,709 说当时那位 RA 已经写过文档了,我去,我咋现在才知道?!我看了文档,如果早点看到能省我几小时的功夫啊。不过文档里还是缺失了很多代码运作的重要细节。
⑮ 尤其像这种要跑很多次的、别人需要使用和修改的代码,真的要有很详细的说明,甚至测试文件,不然用起来真是灾难…2.23 我写了一篇文档记录预处理代码的行为和使用方法,我个人觉得比原来的文档好很多倍;709 看了也觉得很赞,他去修改了一些预处理的代码,我们计划加入更多的 sanity checks。
⑯ 我其实想把整个流程重写一遍,当然这样得花很久。产出文件里都有巨量不必要的信息(比如时间精确到 0.01 毫秒、用户和物品的 id 用 36 个字符表示、每个用户每天都记录一些信息…),但如果我尝试去掉它们,估计会 break 很多其他的代码,因为似乎有很多代码都依赖于现在的格式。哎,这些在搭建软件初期的设计决定(design choices),之后再要推翻得花多大的代价啊。