献给我的 20 岁

22 min

Keep hands dirty, and keep mind clear.

人生能有几个 20 岁呢?寥寥三四个吧。我想在这个重要的节点,记录下我的一些思考,算是对过往的总结和反思?一些想法或许会很幼稚,甚至说错误,还望见谅,当然更希望你能指出来,我们共同进步。

祝自己生日快乐。

学深与学广

一年前,我总是会有这样的疑问:我究竟应该是学深,还是学广呢?学深的话,虽然能够很快地得到某个领域的前沿知识,但是万一哪天这个领域不行了呢?到时候的退路在哪里呢?学广的话,虽然看上去像是样样都精通了,但是没有深入,也不会有较高的成就。

在我没有进入实验室之前,我基本上是按照广度在进行学习:我按照 csdiy 上的公开课,以及自己找的一些公开课、博客开始学习,先后接触了数学分析、线代、概统、随机过程、凸优化,以及之后的机器学习、深度学习、cv、nlp、slp、AIGC、大模型等等。我当时是这样感觉的:哇,我学了好多新东西欸。但是也会有隐隐的担忧:我学了这些,对于之后的科研/实习等等的帮助会有多大呢?

之后进入实验室,正式开始科研学习,迅速地深入一个领域之后,我突然感觉到,我之前学习的这么多课,似乎并没有特别大的帮助(似乎就 linux、conda、docker、pytorch 有点帮助);或许从一开始,我就应该直接开始学科研需要用到的东西,这样或许会更快,或许也会更容易出成果。于是在之后的大半年时间里,我基本上没有再碰公开课这一类增加广度的资料,而是一头扎在了前沿的 paper、项目中(当然,敝人不才,没能做出什么有影响力的工作)。

然而,当我有一天开始思考未来的发展方向的时候,却发现这样做未免太过激进——我没有给自己留下充足的后路,倘若等到我就业的时候,我研究的东西已经凉凉了,应该怎么办?我还有其他路径可以走吗?换句话说,这个社会的容错率真的容纳得下现在这样的我吗?想必是不能的。

那么,学深和学广,如何抉择?

而后来我读到了这样一篇教程,它指出的几点让我茅塞顿开:

  • 学习的本质——体系化学习是一种错觉,学习不等于记忆;学习思维
  • 工作与学习——局部与整体,短期与长期,目的性与工具性(判断力)

它里面所讲的工作与学习的关系,不正就是我所不得解的学深与学广的关系吗?我似乎可以把学习视作一个金字塔形状的结构:底层是代表了广度,而顶部则代表了高度。受限于社会形式,我们不得不去在底层未能牢实的基础上就开始深层次的探索;然而这不应该是我们放弃广度学习的理由——把路走宽永远是对的,深入学习(不管是现在正在进行的,还是未来将会发生的)一定会依赖于牢实的基础,which 需要通过广度的学习来补足;为了未来(可能的)解决一个更高纬度、更有意义的问题的时候,无论是广度,还是深度,都是不可或缺的一部分(这方面的例子可以看看莎莎写的如何看待2022年秋招Java后端开发岗一片红海?以及半条命)。

关于这个话题更多的思辨,前人之述已备,我就不献丑了。不过可以大概讲讲我现在的想法:我准备找到一个方向深耕的同时,利用本科剩下的时光,努力打牢各个方面的基础,以备(研究生)将要毕业时能够毫不费力地追逐那时候的热点。

一个有意思的比喻

我其实一直认为人类就是一个进化了数百万年的某种模型 + RL 机制,不管是从训练婴幼儿说话,还是到上课、学会某项技能,实质上都是对于自己的反复训练,只不过这个过程相比于如今的 LLM 之辈,“效率”高了不知多少。

我向来都将知识分为三种:一种是自己内化了的知识,另一种是从外界汲取了但是尚未内化的知识,最后一种是外界的、我尚未汲取的知识。更新它们在我看来和 LLM 的 forward 以及 backward 有异曲同工之妙。

当我从外界获取知识时(听课、读论文、读博客、与人讨论),我将它比作 forward,在此期间我从书上获得了“激活值”,并进行了恰当的组织与重构(简单记录笔记);当我对获取到的知识进行思考时,我是在进行 backward,获取到的“梯度”将会用于更新我内化了的知识;最后,我会将这些思考进行记录,舍弃一些或是修改一些(梯度剪裁),同时更新内化知识。

这个过程看似很美好,实则存在一些显而易见的问题:

  • 不同于 LLM,我们其实并不能保证在每次 forward 之后立即开始 backward,期间可能会受到各种各样的影响,导致我们不得不暂停当前的事情
  • 不同于 LLM,我们的“权重”并不能永久的保存以及随时的取出,也就是说我们所内化的知识,会有遗忘、暂时找不到的情况发生
  • 不同于 LLM,我们的“模型”其实并没有固定的输入和结构,意味着我们得接受各式各样的信息,每次更新权重都需要主动寻找哪些部分需要被更新,以及学习率等超参数如何选择
  • 不同于 LLM,我们还可以借助非常多的工具来帮我们“训练”

这时候,写一点简单的笔记、写一些自己的思考的重要性就得以体现了:它们就是 checkpoints!当结束当前的进展时,我们需要记录当前的状态,以避免下次重新的训练(recompute);为了下一次能够迅速的将几个可能的环节串联到一起,就需要做好 rag,即做好一个索引状态并存储下来,方便下次直接检索。另外,显而易见的,我们需要反复几次地进行记忆重现(replay),以避免遗忘。

当然,我们在同一时间也会遇到 multi task 的问题,而这,正需要 scheduler:对于若干个 requests,如何合理分配 running、waiting、swap 等状态的 requests。对于每一个 request,也会有相对应的 kv cache,当 request 过多时,如何合理的安排 kv cache 的调度方式,则需要每个人为自己思考了。

方向选择

目前为止,我(只能说是)接触了许多领域(而非深入研究),例如说 TTS、多模态、分布式推理等等,也遇见了并和许多人交流了挺多,虽然没能有什么值得一提的产出,但是关于方向选择,关于怎么向前去迈出步子,我想我也有了一定的体会。

首先我想说的是,多尝试,多涉足。以算法为例,在这块刚刚起步的人其实是没有什么顾虑的,他们只需要扎扎实实把手上的机器学习、深度学习等等课程学会就好了,而不需要考虑以后要去做大模型,3D,多模态,语音,agent,mlsys 还是其他什么。而到了要考虑后者的时候,未免就会陷入一些迷茫:我到底该去做哪个?是考虑以后工作更多一点,还是学界更多一点,或者是自己的兴趣爱好多一点?

如果我能重来一遍,我想我大概会去各个方向 roll 一圈吧,各抽一两周或者至多一个月来了解它们在做什么、有什么前沿进展,或者说日后的工业、学界的发展前景等等,而非仓促地加入某一个实验室(打工)。另外,也不能局限于本校,更应该到处看看,比方说外校、企业、研究院等等,因为一来本校不一定有那么多可供你选择的方向,二来校内资源可能也会比较有限。

可能你会说,我什么都不会,怎么去实习呢?人家公司/实验室怎么会要自己这种小菜鸟呢?然而,就我所观察到的,说出这种话的同学往往具备以下几个特点:

  • 没有足够流通的信息,认识不到真实的 bar 有多高
  • 不会自己针对性的进行准备,比方说做做一些小的项目,至少能展示自己的自学、实操能力,也可以写到简历上丰富内容
  • 随大流,没有自己的想法,就跟着学校的安排温水煮青蛙了

但其实,你至少尝试过就会知道,并没有想象中的那么困难,并且实习也不等同于上手工作,(大多数)也是会有一个学习的过程的。实习的意义不是为了现在就工作赚钱/发 paper,而是为了理解业务、学习技术,为将来进大厂/读研究生/出国做准备。

好吧似乎扯远了,我们回到方向选择的正题上来。我有过一个大(而无用?)的想法:人活着不能只是为了几台机器吧(笑),是不是应该做一些更有意义的事情呢。除了在现在的社会中被迫的内卷,被各种指标量化,人类难道不应该仰望星空?难道不应该有自己的,更宏大的追求?不过为了追求这种,也必须要之前做好一定的经济物质基础,就好像人起跳前,必定需要下蹲一样。

Anyway,有时候,想要向前一步,意味着必须舍弃一些东西;而有些东西是骨子里的,注定放不下。我不希望日后为了其他什么的放下我内心深处真正想要的东西,永远都不要。

研究

关于做研究,我想目前为止只能对自己问出下面的三个问题:

  1. 你所在领域最重要的问题是什么?
  2. 你正在解决其中之一吗?
  3. 如果不是,为什么?

而之后,我应该能逐渐回答他们吧。

输出

我希望自己的想法能够被记录,被别人看到,希望有一天有人可以和我一起讨论这些想法,希望能够得到交流和共鸣。所以,我想要向外输出,原因就是这样简单。

我也知道自己的很多想法很幼稚,很蠢,但我也不害怕被人嘲笑,被人讽刺,被人一笑而过。有则改之,无则加勉,就这样很足够了——笑我的人得到了笑的满足,而我得到了更进一步的可能性。

我阅读过 Markson、OneChapter、Emiya、Marisa、星爷等等人的自述,他们的喜悦、疲惫、放松、迷茫,我也都感受过,因而我更能理解这份通过不管是文字还是视频传递的奇妙感受——那时候我们仿佛是一个人,他们的种种经历似乎也投射到我的生活中来,而又逐渐和自己的过往一点点重叠。我曾听说所有人是一张网的关系,而我认为网上的每个节点并非一个个单独的人,而是一群相似的人的集合体。而输出,就是让这样一群相似的人能够有机会,最终走到一起。

也正是通过这些,认识了好多人,不管是 abc 群、后来自己创建的小群聊、水源,还是别的什么地方,真是何其有幸。

任务管理

再来说说任务管理吧。管理任务,其实来源是因为时间是有限的,而任务是做不完的,那么时间哪里来呢?当然每个人每天的时间都只有 24 小时啦,根据我的经验,大抵有以下几点:

  • 早上 8 点开始工作,你会发现任务可以很早地完成掉。比方说你原本是 9 点开始工作,但是你提前一个小时(于你而言并不是什么办不到的事情,不要为自己找借口),你的所有工作都会提前一个小时完成,进而大大增加收获感和满足感,从而提高一整天的效率,多出来的时间不管干什么都是开心且没有负担的
  • 学会休息。人不是机器,人的长时间集中注意力思考是有限的,因此你的效率会在一段时间后开始大幅度地下跌。最简单的办法就是用番茄钟——做一段时间休息一下,另外进入心流也很重要。效率高 = 时间多了。
  • 不要死磕在一些任务上。就比如,一些 bug,你盯死了都盯不出来,那这个时候就不要和它耗太久,放在一边,去做其他事情;在空闲的时间里,你的脑海里会反复出现这个 bug,进而更有可能达到灵光一闪的效果
  • 去运动,运动带来的精力旺盛,才能够有更高的效率

另外,最好是不要养成拖延症的习惯,这样并不好。但是关于拖延症也有如下一些观点需要注意:

  • 为了做真正的工作而把琐事搁在一边不算拖延
    • “琐事在扼杀伟大项目方面如此有效,以至于许多人故意用它来达到这个目的”
    • 不可放任琐事占据一整天,来逃避面对某些棘手的问题
  • 大块的时间和恰当的心境是可遇而不可求的,每当遇到这样的时候,都请拿来做最为重要的事情

以前写过一篇关于流式规划的,现在想来过于幼稚。如今我一般是这样进行任务安排的:

  1. 把所有任务都记录在一起,写下开始和截止日期;obsidian 的 tasks 插件可以自动根据这些信息来计算重要性
  2. 每天早上起来给自己指派几个最重要任务,并首先保证能够完成这些任务
  3. 这一天的时间内有新的任务,就继续安排下来,如果不是非常紧急,可以不用强求当天完成。
  4. 完成后或晚上的时候复盘,达成动态的任务调度

最后引用一段不知道从哪里看到的话,希望自己不要变成一个工作狂:

现在才明白,吃喝玩乐并不等于虚度光阴,吃苦耐劳也不等于意义非凡。当你焦虑、精神内耗的时候,请一定要记得,人生是各种各样体验的叠加。只要你想,你就可以去做那些看似毫无意义的事情,比如说发呆、看日出、数星星、坐在草地上一整天…你的体验就是意义。人生不一定要去做大家世俗认为有意义的事情才对,也不是非得按照社会主流价值观去生活,比如,学生一定要上名牌大学,上了大学就一定要读研、读了研就一定要去大厂卷生卷死。这些都是别人给的定义,是否执行只看我们自己。谁都是第一次来人世间,意义是我们自己赋予的,人生是旷野不是轨道,只要你当下是享受的,那么这个活动就是有意义的,那人生就是有意义的

认识自己

我以和外界交互的方式,认识我自己。我和他人交流,然后观察自己的反应;我阅读这个世界,然后留意内心的想法。我感到向内探索自己实在困难,于是向外求索。

所以我自己是什么呢?我是不是一个平庸的人(时常感觉到自己很平庸)?或者说我自己到底是怎么样的一个人?

我想到目前,我还不能说非常清晰的认识自己,往后也会努力向这方面发展吧。

最后

再次祝自己生日快乐🥳