社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

对自己深度学习方向的论文有idea,可是工程实践能力跟不上,实验搞不定怎么办?

机器学习算法与自然语言处理 • 4 年前 • 441 次点击  

公众号关注 “ML_NLP
设为 “星标”,重磅干货,第一时间送达!

作者丨Giant、叶小飞
来源丨知乎问答
编辑丨极市平台


原问题背景:本人7月份才接触现在的课题,看了将近40多篇相关英文文献了吧,有了几个idea,开组会,老板们也通过了,接下来就是实现idea,可是自己之前没有接触神经网络方面的,现在要改实验代码,觉得好难啊,是一块硬石头。快泄气。。但是没有退路,必须得做。因为没有正反馈,所以总是很打击自己…… 自我怀疑,我都自闭了。。但是,同时也告诉自己,别人也是从不会到会,从无到有。广大的知友们,有没有什么好的建议,让我可以少走点坑,顺利一点…

原问题链接:https://www.zhihu.com/question/348376942

# 回答一


作者:Giant

来源链接:

https://www.zhihu.com/question/348376942/answer/1917476012


去年五一,我正在洛阳旅行,本已收到了腾讯公司的offer,准备假期过后去实习。这时候导师突然来了电话,让我6月份回实验室做科研。

一瞬间我觉得自己好悲惨,大厂实习泡汤了,研究生最后一段自由时光也成了泡影。

科研的主题是Text2SQL,就是把一句话翻译成对应的SQL语句。这是我毕业的开题方向,当初对NLP这个朝阳领域很感兴趣,有几个不错的idea。可我也就止步于此,没尝试过代码实现,看的论文不到10篇,处境很尴尬。

放弃了实习的念头,我在6月底重回实验室后,经历半年多我终于对Text2SQL领域有了清晰的认识。完成毕业论文的同时,产出了paper和专利,并在10月份获得了耶鲁大学Text2SQL比赛的全球第二名。


从开始的懵懂、工程能力不足到最终收获了还不错的结果,我对这半年多经历用了3个方面来概括:
  1. 阅读领域内近3-5年顶会论文
  2. 站在巨人的肩膀上,强化工程能力
  3. 充分利用学校和实验室资源


一、阅读领域内近3-5年顶会论文


阅读已有工作是开展科研的必经之路,既是为了站在一个制高点饱览研究领域这块蛋糕,也是为了提升学术嗅觉与idea能力。同时,可以避免想出了一个很好的idea立即开始复现,结果提交论文时才发现,这个点早就被别人做掉了的极端现象。

高效收集paper的4个途径:

1)在研究领域的公开赛事或榜单上学习Top名次的解决方案(一般都有相应的论文链接)。比如Text2SQL领域有:WikiSQL、TableQA、Spider、CoSQL等比赛,里边有大量值得学习的paper。
2)收集2-3篇综述论文。一篇好的综述概括了该领域的整体进展、已有工作以及潜在的研究方向等等,能够给予我们启发,事半功倍。
3)在谷歌学术上通过关键词搜索相关论文。论文质量可以根据引用数量、会议等级来衡量。

点击某一篇文章的 “被引用次数” 链接,可以跳转进入引用了这篇论文的界面,继续寻找有价值的论文。很多论文其实没有精读的必要,我们在收集了一批论文后,不妨先读读摘要、实验、结论部分,再确定是否需要通篇精读,以提高效率。


当然一些经典的paper是一定要看的,比如做NLP肯定不能错过Transformer、BERT等等。

4)在Github上搜索资源整合项目。如果这个领域比较热门或者正处于上升期,一般都会有热心用户分享自己整理的资料。例如,关于Text2SQL我已经整理好了一份大礼包,包含了背景、论文、数据集、解决方案、应用案例等内容,帮助感兴趣的小伙伴们节省时间:https://github.com/yechens/NL2SQL

二、站在巨人的肩膀上,强化工程能力


有了学术积累和idea后,就需要快速复现idea。刚开始我有一个误区:科研一定要从0做到1。

后来导师告诉我大可不必这样。聪明的人会先参考别人的解决方案(特别是SOTA),在学习过程中强化工程和coding水平,形成更优雅的代码风格。这就像站在巨人的肩膀上,我可以基于他们的工作实现自己的想法,取其精华,去其糟粕。
还是以Text2SQL为例。这个任务的数据处理部分特别繁琐,需要同时考虑文本和数据库信息,仅预处理就包含了上千行代码。我参考了Spider上的Top方案后,发现大家在这部分有很多思路是共通的,完全可以借鉴。这样一来,我可以把更多精力放在模型结构设计和后处理上,这两者对最终结果有关键影响。

有的同学表示说,“自己之前没有太多接触神经网络,现在要改实验代码,觉得好难”,这就涉及基本功问题了。我们每天需要额外挤时间来补漏洞,提升自己的coding能力。

如果喜欢看书,我推荐Keras之父的《Python深度学习》和李沐老师的《动手学深度学习》。两本书我都认真看过,非常经典和通俗易懂。

三、充分利用学校和实验室资源


最后一个关键是学会充分利用现有资源,这个资源包括学术资源、人力资源、硬件资源。

学术资源


最直接的学术资源就是实验室的师兄师姐们,还有大Boss——导师。
师兄中肯定有人发过paper,无论是写作还是关于编程和技巧,和他们聊过之后都给我带来了启发。导师是我研究领域中的权威人物,可以帮助我把关idea是否work、是否有足够的竞争力,甚至在没有任何思路的时候点醒我,提供有价值的idea。

人力资源


导师精力有限,往往神龙见首不见尾,不可能顾及所有人,所以带领学弟学妹们的工作一般留给了高年级同学。如果研究的方向他们也感兴趣,大家完全可以一起合作。例如让coding能力强的师弟帮忙做一些实验,coding弱些的同学分析数据和badcase,便于我迭代模型。不仅让他们有所收获,也帮助我分担了很多工作量,一举多得。

如果能带学弟学妹们投中论文,我想他们一定会从心里发出感激的,没准也更愿意在今后的工作中加上我的名字。

硬件资源


俗话说巧妇难为无米之炊,做科研有了idea和coding能力,没有机器也还是白搭。所以无论是在实验室还是公司,要善于利用资源。

我在实验室时,老板很慷慨的采购了服务器,还有Tesla V100显卡让我们做实验。实验室24h可以进出,提供免费饮用水和咖啡。如果做出了成绩(比如会议中稿,比赛拿下SOTA)会有丰厚的物质奖励。

如果实验室没有这些硬件资源,应该主动和老板沟通,请他帮忙协助解决。

总结


路漫漫其修远兮,吾将上下而求索。

做科研是一条艰辛的路,特别是从0到1的过程。但是通向光明之路,从来没有一帆风顺的选择。

为了避免拖延症和摸鱼,我会给自己罗列各个阶段的deadline,然后从学术调研、coding实验、多次迭代方面进行攻坚。如果真的感觉很累,我会停下来离开实验室,去球场和朋友打球;或者跑跑步,呼吸新鲜空气,让自己清醒放松。

最后推荐几个深度学习方向科研工作的神器吧,希望能为同学们的科研道路提供帮助:
arxiv:论文收录网站(防止自己的idea被剽窃,完成论文后可以先挂上去,证明原创性);
PaperwithCode:论文和代码的结合工具,包含了很多NLP、CV方向的SOTA论文和模型实现;
dblp:计算机英文资料收集网站,支持各种字段搜索(会议、作者、时间等);
Connected Paper:论文引用信息可视化工具,分析出文献的前世今生;
NLPIndex:NLP学术搜索神器,同时链接了paper、code、graph,是上述上个神器的综合体;
Deepl:翻译神器,特点是地道,更接近真人翻译(略胜于谷歌翻译)
diagrams:画图好帮手,制作高大上的流程图、模型图必备,可以在线导出为pdf高清矢量图(放大后图片细节不失真)

  • 参考资料

  • [1] https://github.com/yechens/NL2SQL

  • [2] arxiv: https://arxiv.org/

  • [3] PaperwithCode:https://paperswithcode.com/

  • [4] dblp: https://dblp.uni-trier.de/

  • [5] ConnectedPaper: https://www.connectedpapers.com/

  • [6] NLPIndex: https://index.quantumstat.com/

  • [7] deepl: https://www.deepl.com/translator

  • [8] diagrams: https://app.diagrams.net/

  • [9] Spider: https://yale-lily.github.io/spider


# 回答二


作者:叶小飞

来源链接:

https://www.zhihu.com/question/348376942/answer/1923857788


题主和我反着,我一直比较困扰提出很novel的idea, 但我实现idea的速度是很快的,从头搭一个一般复杂的pipeline并调通基本都能控制在一周之内。题主按我这四步走,一定很快就能上道!

第一步:找到baseline


论文一开始对深度学习不熟时,切勿自己蒙着头写代码。既然题主已经看了四十多篇论文,并且有了自己的idea, 那么肯定知道自己要做的方向有哪些前人写下的不错的论文, 从这些论文中挑选出一到两篇作为你的baseline,作为你的代码开端。

一般一个好的baseline有两个特点:

1)它一定有开源代码,而且有较完整的文档(readme)。如果它的github星蛮多的更好,说明很多人用过,质量没问题。
2)它发表的时间是近两到三年的。深度学习的发展速度实在过快,时间久远又没人维护的,它用的代码框架什么的可能会过时,比如我之前做colorization, 有几篇不错的都是用的caffe, 比较难拿来直接用。
3)它里面的公式整体较为清晰,这样方便你对照着代码来看公式,当你明白了如何把理论的公式转化为代码时,你基本就上道了。


第二步:深入baseline代码


当你找到了不错的baseline论文后,就要深入阅读、使用它的代码了。在你基础较差时,提高代码能力最好的方法绝对不是头铁地去楞写,而是阅读别人写的优质代码。 阅读代码也是有诀窍的,一般分为这么几步:

  1. 按照github的文档配置好你的环境。 几年前配置环境其实是个蛮痛苦的事,那时候我还用caffe,简直就是噩梦,但现在配置环境变得特别傻瓜式,pytorch/tf都特别好配置。
  2. 配置好环境后,按它readme的步骤下载相应的数据,运行相应的脚本,让它的训练先能流畅地跑通。 优质的开源代码基本都能跑通,如果在中间报了错,一般都是library版本不符。但如果是涉及到算法内部的问题,就要走到下一步了。
  3. 当你把开源代码跑起来或者遇到算法里的bug之后,用一个好的ide(例如pycharm)进入debug模式。 在这个模式下的最大好处,就是你可以拿着实际的数据一步一步看代码,哪一步看不懂就对照论文的流程加谷歌一下API的使用方法,很多你干看看不懂的代码结合着tensor shape或者处理过后的数据的shape/value就能看懂。在这一步一步debug运行代码的过程里, 其实你对深度学习完整的pipeline怎么写基本就有了一个比较好的认识。 如果时间允许,建议把你找到的几篇baseline都这样跑一遍,并且写个笔记记录下大概流程。

第三步:搭建你自己的pipeline


我一般喜欢根据自己特定的任务从头搭建整个pipeline(包括数据I/O, 预处理,模型搭建,loss定义、训练与验证、测试等等),但鉴于题主刚接触深度学习代码,可以从第二步中挑选一个不错的baseline作为你的基础代码,站在它的肩膀上进行修修剪剪。一般你要做的方向虽然可以用baseline的算法,但数据集往往不同,所以在别人的基础上搭建自己的pipeline最重要的是修改数据读取和预处理部分。在这一步先不要把自己的模型加进去,用baseline的模型能跑通你自己的数据即可。

第四步:将你的核心算法融入pipeline


经过了上面三步之后,你已经对深度学习训练预测的流程有了一个比较清晰的认识,这个时候可以开始把你自己的idea加入pipeline. 一般来说你的idea无非是提出了更好的模型,或者更好的训练机制。模型或者loss你在网上一般都能找到整体架构较为类似的代码,比如你要做轻量级图像分割,那大概率可以借鉴Unet,网上一搜一大堆,按照他们的格式仿写即可。这里有个小诀窍,你搭建自己的模型搭好后可以先不放入自己的pipeline里真枪实战的训练,先生成几个随机的tensor扔进去做inference, 看看能不能跑通,输出的shape是否正确。

最后一点点建议,新手想快速入门首选pytorch, tf1.x对新手挺不友好的,而用tf2的研究人员比较少,容易找不到现成的代码。


推荐阅读:
H.T. Kung 关于研究的有用建议
什么是Transformer位置编码?
17篇注意力机制PyTorch实现,包含MLP、Re-Parameter系列热门论文


点击下方卡片,关注公众号“机器学习算法与自然语言处理”,获取更多信息:

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/119570
 
441 次点击