Archive ← Prev Next →

D5P381-210324

《Recsys Research Project (8)》

3.9,Loretta 告诉我春季学期可以给我 25% RAship(半奖,工作时长、学费免额与工资都是全奖的一半),我想想这也好,少一点负担可以多做做其他事(比如在 Vandy 多待会)。3.16,710 拉上 709 和 Loretta 开了个会,总结我的这学期、讨论我下学期的计划。

我提到上次和 Susan 的一对一取消了,Loretta 强烈鼓励我找机会一对一,说“ lab 存在的原因就是 Susan 喜欢指导年轻学生”,最近和新录取学弟学妹聊天的我对此有些感触。710 也鼓励我在和 Susan 的会议上多发言,说他经常发完言以后感觉自己说的好傻,这让我有些吃惊。

709 评价我“ reasonably smart ”,反思了他在我入 lab 初期给予的指导,当时扔了一堆信息给我,让我不好消化;Keshav 加入时他就更有经验了,让他先跑 pipeline 上手。是啊,我在想新人在初期是需要老员工花很多精力带的,之后再慢慢独立负责一件事。当时我在 tx,mentor 每天在我身上花的时间非常少,这也许是因为他们太忙加上我不会 return,但就让我体验不太好。

3.24 早上,大组里另外两个做 EdTech 的小组做了演示,一个是 Khan Kids,一个是“一起作业”。17 作业声称月活有 2 千万,比 S2M 多 3 ~ 4 个数量级,确实 S2M 这么点数据,太难设计实验了。

3.26 开始做 latents 分析的工作。这个其实之前 Rina 做过一些,但当时做的软件很杂乱,不太方便跑新数据,我可能需要重做。(注:后来交给 Keshav 做了)709 说他做了太多事,很多时候记不得自己干过什么。他最好花一天时间回想一下哪些事已经做过了。

709 写了一篇 notes,大致描述了需要用到的代码的功能。虽然这已经比之前好了,但还是忽略了很多细节,想到又要和 709 那没有任何注释的老代码打交道,真蛋疼。我真想抗议道,如果没有 comments,我拒绝使用你的代码。

另外,我对 lab 的周报制度还是很不满,224n Project 的经历再次验证了科研的工作不适合写周报,写周报是血汗工厂行为,做科研是需要自由的阅读、思考来获取灵感的。尤其是下周每项工作的计划还要精确到小时、每项任务要分解成最多 4 小时的子任务,真是令人窒息!!!时间管理不是这样做的好吗!你们 lab 还号称拥有世界领先的管理模式,真是扯淡。

3.29 开始做内容过滤算法,709 提议用线性回归;这个我们其实已经试过了,当时由于 LR 需要的训练集大小非常大(每个样本都是一百多个维度的特征,然后样本数量上百万),我们 VM 内存根本装不下。我的年度朋友圈里讲 lab 用的背景图片,就是 1.22 我俩一起 debug 这个问题的场景。最后解决办法是,一百多个特征我们只能留下几个,这样模型的表现显然不会好。

我提出了一个新方法:利用文章描述,用 sentence embedding 加 k 近邻来寻找相似文章,这次我的想法终于被采纳了。还好我周末看了点文章,自己思考了一会!

新模型可以继承 torch.nn.Module,但这似乎是唯一能 fit 进已有 pipeline 的步骤了:DataLoader 得重写(之前用的 training 数据里并没有加入每篇文章的描述),eval 也得重写(之前的都是预测 utility,现在的模型输出直接是推荐列表)。

即使是模型,也没有统一的定义,仅仅继承 nn.Module 还不够,若能搞一个 base class,说清每个 model 应该继承哪些 method(比如 train、predict),这些 method 应该干啥,会更好。当然,现在赶进度的我只能先让代码勉强 work 完事,以后有空再提 restructure 代码的事情吧。

像那些成功的软件,都是有详细的文档和统一的接口的。以前我都理所当然地拿来用,现在我体会到了做到这些需要花多大功夫来设计。架构这东西是需要一个牛人来搭建的,合作者去使用或加入模块应该是一件轻松的事情,不需要管 pipeline 里其他的部分;但我现在就处于相反的境地,真的很麻烦。

模块化最重要的可能是要统一、明确每一步输入和输出的格式,需要 abstraction,也就是分离 behavior 和 implementation。

这种系统化设计虽然对后来人很有帮助,但对搭框架的人却可能是“吃力不讨好”的,因为会在短期内拖慢进程。像我们 lab 由于人员流动比较频繁,容易出现之前的同学扔下一堆翔山,坑后面同学的情况,反正也不需要负责任。

这应该是我继 Manim.js 之后第一次在实战中考虑软件架构设计。我之前实习里一半的内容都是数据分析,这方面的代码都是可以单独存在的,基本不需要协调各个模块,进行端到端的计算。

啊这篇日记写了好多抽象、哲学性的东西…而且有些是我自己总结出来的,以前似乎并没有人教过我其中一些概念。是我在瞎想、在不必要地把东西搞复杂吗?我觉得不是,对于现实中团队合作性质的软件工程,我觉得还有太多太多未知的技能需要我去探索。

3.31 初步写了代码,3 周前 224n 写过的代码直接用太方便了,想起夕小瑶在提高炼丹手速那篇文章里写过:

为每种经典算法任务都积累一个重构的不错的完整、易用、灵活的 project,这种 project 就是将来你完成其他相近 project 的热启动 project。由于这个 project 是经过你的手重构的,所以二次上手成本和魔改成本会远低于你去找个外部的 github repo。

话说最近注意到 YouTube 手机版里,第一项推荐视频下面有个小问卷,先是让我评价喜不喜欢(1 ~ 5 分),然后问为啥(放松、好笑、有用)。另外 710 写的一篇 memo 里,提到 Freadom 和 Netflix 场景的区别:Freadom 里用户在每篇文章上停留的时间短。

(上篇:D5P379,下篇:D5P387