干货|卷出顶级AI实验室(1)
(本人已授权小红书转载)
目前NLP这个方向的研究日新月异,想要能够从学术小白到发出自己的第一篇论文,除了掌握基础的工具之外,还得跟踪最新的科研方向,多与身边的peer进行交流,找到尚未发现的研究点。
基础工具
数学:其实NLP方向对数学的要求并不算特别高,掌握常用的线性代数和贝叶斯公式就行,最多加一点复杂度的知识,大多数NLP方向的开发都是非常tricky的,像ResNet、DenseNet也就仅仅是网络架构层次的上的变换,更多的只是收集数据集、或者把某一层的位置前后挪一挪就是一个新的work(例如Transformer里面的pre-norm或者post-norm)。一般用到数学的地方就是各种公式推导(线性代数)以及如何计算metric(例如PPL、pass@k、MSE、BERT-score等等)
需要高深数学工具的都并非本领域的研究重点(例如各种optimizer或者diffusion),当然如果有志于开发更general的工具可以适当多储备一些随机过程和微积分的知识即可。
编程语言:如果只是改网络架构,那么只需要python就行,刷leetcode用到的基础语法可能在更加深入的研究中显得捉襟见肘,可以多了解一些python的进阶语法,例如python装饰器。
对于package而言,numpy、pytorch(很老的项目可能会用tensorflow,直接忽略掉这些项目也没问题)、csv、pandas、matplotlib、tqdm、json(jsonlines)、os、transformers等等是必须要掌握的工具,而pytorch是重中之重,要学会看https://pytorch.org/上面的文档。而且,python最重要的是看懂其他人的package,例如基于ChatGPT的研究通常需要熟悉openai库。
如果想要进一步去深入研究,可能会遇到各种各样其他的语言,例如C++、Rust甚至Java,唯一的要求是学会类比,看懂程序是怎么做的,然后能够翻译成python。
如果是学生的话,可以免费使用Copilot,一般给一些自然语言提示,copilot能够自动补全剩下的代码,可以成倍提高效率。
计算机知识:即便是最壕的组,顶配8台A100,在训练大模型的时候,也得考虑显存管理的问题。至少要对MB、GB,以及float32、float64、int等基本单位和类型有一个清晰的认识。例如假设一个float32模型参数量为n,那么nx4(float32一个数为4B)x6(用Adam optimizer训练的时候正向、反向共需要存储6个相应的数),大概就是单卡训练所需要的显存。
需要知道git和bash相关的操作(例如如何git clone别人的工作,如何移动文件夹),在实际经验中还得用一些其他的工具,例如scp、zip、tar、tmux(防止成为学堂路车神),以及nvidia-smi(查看显卡状态)、top(查看进程和cpu状态)、如何配置跳板机等等;还有一些其他边角知识,例如对于一个乱码的数据集,你得需要知道能够在ascii、UTF-8、GB2312等编码之间切换。
这些知识几乎没有哪个中国大学的CS专业课上面会讲,大多都是学生一步步摸索出来(看stack overflow/github论坛/CSDN/知乎 etc)或者对应习题课的助教1to1讲解来的。光学课程、刷leetcode也是没用的,还得有实操经验(这是转码与计算机科班生的最大差距)。
AI知识:非CS专业学生学吴恩达《深度学习》作为进阶确实也够了,要是想要挑战更难的课程,可以找找美国名校(MIT、CMU、Berkeley、Stanford等)的课程,清华的很多课也是借鉴了一部分这些课程的内容和习题的。也可以用《Deep Learning》(理论,有中文版)和《Dive into Deep Learning》(实践、有中文版、有在线Google colab免费试炼场),甚至可以跟着Pytorch官方教程试着开发CNN、NLP等等项目,都是开源的。
找到大方向(NLP、CV、Robotics、Graphics等等):
可以了解对应方向的一些代表作,找到自己的兴趣所在(NLP:Transformer、Word2vec;CV:CNN、ViT、Diffusion、ResNet;Robotics:PaLM;Graphics:NeRF),我当时入坑NLP就是因为看了Transformer以及相关的一些应用。然后根据Google Scholar上的引用和被引用再拓展自己的视野。
找到具体研究的点
多了解了解最新的研究方向,可以与同学和导师沟通,最好是加入一个实验室,看有什么迫切需要解决的问题,或者长期以来没有用AI解决的任务,又或者紧跟时事,趁着别人还没发出论文,先把别人的工作发表了。
然后根据所了解到的论文,去Google Scholar上搜索对应论文的引用该文章的其他论文,确认该任务没有AI解决的先例,或者AI的效果不好。一般一个灵光一闪的点,95%的概率别人已经用CNN或者BERT等比较简单的结构先占了个坑。一般一个工作的目标是在一个或者多个metric上超过SoTA(state-of-the-art,目前最好结果)。当然,还有其他的工作,比如创立数据集(基准,benchmark),然后测试其他模型在该数据集上的结果。
对于先前只有CNN或者Word2vec等基础模型的工作,可以用更好的模型(ViT/Diffusion、Transformer)进行替换。对于已经有更好模型的工作,可以考虑修改网络结构(比如更改position embedding的方式,更改ReLU为Swish等等),不过不是随便乱改,要有一定的理由,这些理由可以从先前论文的conclusion和limitation部分,或者跑出来的结果进行分析(如BERT因为Attention要让所有的token直接都有联系,需要O(n^2)的空间复杂度,可以通过减少attention的感受域变成O(nk),k远小于n)