全年不休 发表于 2023-10-4 06:52:12

nlp研究生不会自己写代码怎么办?

看论文不会复现,只会看别人的代码,自己不会写

zmy609 发表于 2023-10-4 06:52:42

昨天午休前随手一答结果这么多赞和收藏,感觉大家对这个问题需求挺大的?
不知道如果做一些从头复现算法与论文的视频大家有没有兴趣,欢迎评论区讨论
————————————————
大家不要只收藏了,给孩子点个赞吧
————————————————
首先我觉得所有从事人工智能研究的同学都要注意工程能力的培养,有时候我真的觉得深度学习越来越像实验学科,如果你的想法能快速被验证,那么你整体科研的节奏会快很多。
接下来是正文
自己本科刚开始做科研的时候也因为这个问题困扰了很久,后面在 @李渔 老师的指导下,一步步提高了工程能力。下面简单分享下两个方法
第一步是复现经典算法,例如word2vec这些。其实网上的代码已经很多很多了,但是尽量不要参考完整的代码,遇到问题和报错可以去查。这一部分,主要是熟悉深度学习的框架和Python语言。具体可以复现的算法,我当时参考的是复旦nlp @邱锡鹏 老师的nlp-beginner项目。这个也是复旦nlp团队的入门项目,有一定学习价值。
第二步是完整复现论文(至少一篇),在此之前,你最好已经完整阅读推敲了一些nlp论文的源代码,对一些常见的文件/函数组织形式有一些理解(比如我就喜欢把训练一个epoch写一个函数,然后不喜欢用class)然后,找一篇你想模仿的论文,从头把整篇论文复现出来,我当时为了逼自己不去参考网上的代码,找了一篇google的用tf写的论文,用torch实现了出来。这一步会非常痛苦,但是这样训练两次以后,你就会发现你的工程能力得到了质的提升。
以上是我自己在入门阶段,提升工程能力的做法。这样的训练,如果每天三个小时(我基本上是八点到十一点,一周三四天),大概会用两个月,但是我觉得磨刀不误砍柴工,后面会越走越快的。
以上,希望对你有所帮助。

heyond 发表于 2023-10-4 06:53:35

同学你把科研过程中写代码这件事想的太复杂了。99%的论文中提出的模型都是对前人工作的“微整形”,也就是
https://www.zhihu.com/equation?tex=model%5C+A+%2B+model%5C+B+%2B+model%5C+C+%3D+%E6%88%91%E7%9A%84%E6%A8%A1%E5%9E%8B+%5C%5C
你只需要选择一份最合适的论文开源代码,在上面魔改就行了:

[*]A、B、C 都没有官方开源代码,甚至没有第三方复现:老实说,现在 NLP 领域开源做的已经很不错了,如果遇到这种情况,很简单,不要想着复现代码,而是换idea,找有开源代码的D、E、F


[*]A、B、C 只有其中一个开源了:运行下能不能复现实验结果,如果可以,好的,答案已经有了,如果不行,尝试改进+与作者沟通,失败的话,换idea,找有开源代码的D、E、F


[*]A、B、C 有两个甚至都开源:运行下能不能复现实验结果,将无法复现的排除,剩下的看哪个和“我的模型”更接近就选哪个

guojun_-2007 发表于 2023-10-4 06:54:25

可以求助ChatGPT,NLP中多用Python语言,而ChatGPT在Python编程上变现尤其出色,只要问题提的好,ChatGPT给出的代码几乎可以不经修改直接运行。
也可以用ChatGPT帮你解读每一行代码,我试过,很不错的。
还有就是咬牙自学,不是太难,多实践,很快就能上手自己写了。

warkinger 发表于 2023-10-4 06:54:44

挑一个最简单的框架
(我觉得llama 2就不错,generate才300行)
然后在上面魔改成一个只有你自己看得懂的屎山
发论文够了
<hr/>23.8.28更新:
我随手写的东西能有好几十个收藏,其实有点意料不到,多说一点吧


我只懂generate这一步,就先来说为什么其他框架这部分代码,相比于llama2更复杂
过去,大模型出来的之前,大家对于最优的生成方式没有共识
最大化模型可能性的方法,就有greedy, beam search, stochastic beam search, diverse beam search……
单就这diverse beam search我就能找出七八种,若是找不出来,我现想也能给你想够八种
抽样的方法,就有sampling,temperature sampling,top-k/top-p sampling,nucleus sampling,以及几种方法的排列组合
除此之外,过去模型小,还得打一堆补丁。比如length penalty,repetition penalty,等等……
那么过去的框架,比如hugging_face,以及我更熟悉的seq2seq是怎么办的呢?
当然是全写上,任君挑选
于是,generate简简单单就突破3000行
代码不好的同学如我,头发也就跟着垮垮掉


那llama 2为什么轻量化了呢?
在大模型时代,大家似乎在生成方式上达成了一个共识
那就是nucleus sampling,或者只有temperature
当然chatgpt的内部代码我看不到,我只是根据llama2的代码猜测的。说得肯定错的比对的多,希望大家指正。
背后的原因,我想有几条。

[*]beam search的成本随着beam数量的增加而增加,在过去模型小的时候inference的成本可以忽略不计,现在跑一次很贵。sampling没有额外成本。
[*]sampling的生成效果更像人话,符合人类说话的distribution。但是如果temperature 设为1,生成质量又太差了,所以还是调一下temperature,取个折中。
[*]抽样方法每次出来结果都不一样,满足用户对多样性的要求。如果用argmax类的方法想实现这一点,就得用那些diverse beam search 12345678,性能不好,主要是对diversity的定义不明确也不自然
然后,随着模型质量的提升,也可能是抽样方法的先天优势,生成结果过短和重复的问题也解决了。过去打得补丁似乎也不需要了。
所以llama2的generate.py就剩300行了。
<hr/>如果你想要实现你的beam search/diverse beam search/nucleus sampling/tree model sampling/常温超导sampling/先天八卦 beam search,怎么办呢?
那就打开hugging_face的代码,一行行看懂了,抄进你的llama2的git里。再改。
抄代码这事,一天一百行不过分吧
你就也别unit test了,大概也不会,直接边写边整个test
写一点test一点,肉眼debug
再复杂的方法,两三天也抄完了
不说对算法更理解,单就是自己写的屎那也比别人的龙涎香要更容易看懂
然后该干什么干什么,跑实验做测试写文章,手工小作坊呗
科研嘛,不丢人


那你要问了,我花这功夫,写出来代码还不如hugging_face原装,为啥不直接用人家的呢?
别人的东西,用着爽,貌似改个东西只用加个几行
但是,debug起来可能要花2-3周,比自己写一遍多了好几倍的时间
3000多行啊,你想找到哪个地方出错了真不容易,还是自己的屎山香
那你又问,说如果我没遇到bug,就用人家的。遇到了再重写,不更好吗?
我的经验是,人都是有惰性的。给你现成的,你肯定下不定决心抛弃不用从头写。
不如开头就逼自己走歪门邪道


最后一个问题,如果这么屎的代码,附在论文后面,不会影响其他人吗?
其实大家也都各自有自己一坨屎山
你的代码也就是pull下来跑一跑最基本的demo
剩下的工作,还是会在自己的屎山上复现,不会在你之上改的
<hr/>我低估hugging face了。它的model.generate至少3w行,里面可以设置的参数比这篇文章点赞还多

木陵子白 发表于 2023-10-4 06:55:13

乐,

要么写
要么不写,做理论分析和定理证明。
还能怎么办,可以花钱顾用别人找人帮你写,自己当老板。
页: [1]
查看完整版本: nlp研究生不会自己写代码怎么办?