1.Gumbel-Softmax的源码MindSpore实现
2.计算机方面的论文如何发表? 评职称用
3.公开处刑:研究者自建Papers Without Code网站,张贴复现不了的源码论文
Gumbel-Softmax的MindSpore实现
在一段时间的间隔后,我将注意力转向了MindSpore的源码相关内容。起因是源码一位同学询问关于模型迁移的问题,目标是源码诺亚的一篇ICML论文《SparseBERT: Rethinking the Importance Analysis in Self-attention》中使用了Pytorch特有的Gumbel-Softmax实现,但该实现难以直接移植到MindSpore。源码canal 源码分析因此,源码我针对这个问题进行了深入研究,源码并撰写了一篇关于如何在MindSpore中实现Gumbel-Softmax的源码文章。
Gumbel-Softmax是源码一种离散采样的可微近似方法,常用于生成模型中,源码如GAN和VAE,源码它解决了离散分布采样不可微的源码问题。具体来说,源码它通过Gumbel-Max trick和softmax函数构建了一个连续分布,源码近似离散类别分布,允许反向传播。Gumbel分布通过从均匀分布中随机抽取并计算得出,而Softmax则用于近似argmax操作。
在MindSpore的实现中,我参考了Pytorch的源码和Tensorflow的手写实现,对三个关键点进行了适配,并通过单元测试验证了正确性。测试包括输出的one-hot特性、采样值分布以及与softmax概率的一致性。最终,我用MindSpore实现的Gumbel-Softmax应用于VAE实验,结果与Pytorch版本的Loss下降趋势基本一致,展示了其在实际应用中的可行性。
尽管这篇文章拖延了很长时间,但为了满足对Gumbel-Softmax需求的开发者,我会将其添加到MindSpore的主要仓库中,供更多人使用和开发。如果你对这个功能感兴趣,可以下载代码进行训练对比,或尝试将其应用到其他GAN网络中。
计算机方面的论文如何发表? 评职称用
第一步. 调研、入门
1. 确定一个感兴趣的大领域,比如分布式系统或者机器学习,或者深度神经网络。读这个领域经典算法和技术,也可以是几本比较好的书,读完然后再实践实践,动手加深理解。这个过程做完就算是初步入门了。
2. 找该领域的顶级会议,比如系统领域的有OSDI、SOSP,机器学习的领域有ICML、CVPR,深度学习的有NIPS、ICLR等等,私藏指标源码大全可以搜CCF会议推荐列表看各领域的顶会列表。然后看近几年这些顶会的论文,因为这代表了最新的研究热点,咱不是说一味的追热点啊,毕竟对于初学者没有足够的领域专业背景,追热点是最快的方法。因为热点往往是该领域最亟待解决的问题,往往是发展最快的小方向,也最容易产生新成果。如果是老问题,人家都研究十几年了,给你留下的待解决的问题就很少或者不是很重要。当然如果是有几十年经验的研究者就不必追热点,他们知道该领域哪些是fundamental的问题,哪些是最值得研究的问题。
3. 读了这些前沿论文后,确定一个小方向,比如分布式系统是个大方向,小方向可能是机器学习分布式训练;大方向是深度学习,小方向可能就是graph embedding;大方向是机器学习,小方向可能是半监督学习等等。确定小方向的过程是个知识不断积累的过程,非常重要,这需要你对大方向有很多了解,对小方向有更深入更全面的理解,需要读好至少篇以上论文,需要你知道该小方向的研究进展历史,这需要你知道该小方向别人都在哪方面做工作,做该小方向的顶级研究组都有哪些,他们正在干什么。
第二步. 发现问题
这步超级难,如果发现了个好问题,那就是成功的一半。这个问题最好是重要的、本质的、没有直观解决方法的。
4. 确定小方向后,你需要阅读大量的这个小方向的论文和了解开源项目,再不断聚焦,再确定一个要改进和优化的小小方向,这个可能就是论文的主题。小小方向可能是机器学习分布式系统中的parameter server通信模型,可能是dynamic graph embedding等。然后就要更聚焦地读这方面的相关论文,这时候论文就比较少了,几篇到几十篇到几百篇都有可能,这些论文要精读,花几个月时间研究一篇论文也不为过。
5. 挑几个重要的论文工作实现,也可以找开源的运行跑一跑试一试,idea往往从实际运行中来,在线拔站源码光靠读是不行的。这个跑一跑可能需要你尝试不同的运行环境,不同的workload数据集,不同的应用场景等。比如,parameter server(PS)模型在本地集群上跑是不是和paper声明的一样、在异构的动态性极强的集群环境下效果怎么样、除了paper提到的算法处理其他算法的时候效果怎么样、除了paper提到的数据集换另外一类数据集怎么样;graph embedding方法处理密集图和稀疏图都怎么样,处理动态变化的图怎么样,等等吧。你要发现X方法仅在a环境下好用,在b环境不好用。这个就是发现问题的过程。当然,没经验的研究者可能很难想到多种环境、多种workload、多种应用场景,这就需要积累。
另外一个发现问题的方法是从实际生产中来,这个当然是最好的,但是往往是大企业环境下才有这个条件。
6. 确定你发现的问题还没有被解决。这又需要广泛的阅读和调研,但是问题已经很聚焦了,搜索也会很容易,用你特定问题的关键字在google 搜索(这里强烈建议用google,其他搜索引擎基本搜不到),找到解决相关问题的论文。看看这些论文是不是已经解决了该问题,如果解决了,你有两种方案:第一,该问题已经解决的非常好了,放弃解决该问题。第二,该问题的解决方案还有问题,我还有更好的办法。我建议后者,最起码尽量尝试尝试。
5和6步是个迭代的过程…
第三步. 分析问题
7. 分析问题产生的本质原因。这个往往和第5步发现问题同时进行。这一步靠的是功底和积累,靠的是对问题的理解程度。理解的越深刻,分析的越透测,你之后产生的解决思路就越有可能正确和有效。比如分布式机器学习的PS模型在异构环境下、和在处理数据不均匀的情况下就不好,本质原因是其同步的集中式通信模型,造成PS集中服务器往往需要等待。传统graph embedding方法采用批处理模式,桃源码头景区需要graph的全局信息做embedding,当然无法应付动态性非常强的局部更新情况。
8. 基于分析,就是对该问题的深刻理解,产生改进的idea。这个可能很难,可能靠运气,但我觉得更多的是靠对问题的理解程度,理解的越深刻,本质原因抓的越准,就越可能产生创新idea。读过一本介绍google企业文化的书,google产品的成功,既不是靠技术能力,也不是靠用户需求,而是靠技术洞见(insight),这就是对问题本质的深刻理解。比如,PS模型在某环境下问题的本质原因是集中式的同步模型,那么我们就可以提出尝试异步通信的模型的idea。
分析能力跟个人的批判性思维、独立思考能力都有关,而这正是中国人欠缺的,可以通过读有深刻见地的书籍文章、经常提问来锻炼。
第四步. 解决问题
9. 实现你的idea,做大量实验验证。这需要动手能力,需要编程能力,需要坐得住。
. 验证你的解决方案,根据实验分析不断优化你的方法。做了大量试验后,得到了若干结果,可能是不好的结果,但是不要一下子否定自己的解决方案,这不能说明你的idea不好用。一个好的方法往往经过千锤百炼,同样,你的idea通常不会一下子就成功。需要你根据实验结果分析不好的原因,然后基于你的理解改进方法,这是一个反复不断迭代的过程。
比如,你发现异步PS模型效果还不如原来的呢。那么关键的是,你要问自己为什么?为什么理应提升的却没有提升?你要看实验运行的日志,看看是哪里慢了,差在哪里,最后你经过不断的实验、分析、波段股票源码思考,你发现了,你提出的异步PS模型虽然没有了等待开销,但是计算的有效性却降低了,结果整体性能反而下降了。那么你下一次迭代就要想怎么把这个计算有效性提上来。我又有了个方法,可以评估每次计算的有效性,然后把计算资源都投到有效性高的计算上。OK,idea不错,那么怎么评估有效性呢?不能开销太大,否则又得不偿失了,你可能想到了一种近似地评估方法。重新实现后,发现效果还不错。OK,恭喜你!你可以准备发论文了!
整个研究过程,导师将起到关键的作用。导师可能会给你个问题,这是难能可贵的,基本帮你做了一半的事了,否则你可能需要花上一年时间找问题。然后整个研究过程,都是在导师的引导下进行,需要定期向导师汇报,与导师讨论idea和请导师分析实验结果。最好自己也要经常找同门讨论,而不是闭门造车。
第五步. 撰写论文
. 设计你的论文,草拟论文的骨架。每一章都写啥,每一段都写啥,实验都做啥。论文的逻辑往往比语言重要的多,逻辑合理的论文更易读懂,即使咱华人有天生的英语语言缺陷,但是好的逻辑就可以弥补这个不足。写论文就和讲故事一样,怎么能把一个事说明白,不那么简单,甚至说很难,需要不断锻炼。写完给老师看,老师同意后进行下一步
. 写作论文。这个就是根据骨架填肉的过程,但是这一步也不简单,特别对于英语不好的同学,写出来的东西简直是不忍直视、不堪入目、毁人三观。最近上海某高校老师辱骂学生这事就是因为这个,我可以说,我每次看到学生论文也都是这个心情,给学生通宵改论文在家里一边改一边骂,但是当面对学生还是要以鼓励为主,要耐心,要耐心,要耐心,尽力压制自己的怒火,以平和的心态帮助学生提高,期望他下次能给个更好的版本。但是往往事与愿违,看淡点吧,仅求写作态度好点就行了,毕竟这不是一朝一夕能提高的,需要你不断积累。
有几个写作的方法吧。第一,不要自己想当然,对于不确定的句型,用“”扩上上google搜,看看你这句型有多少人用过,如果没有几个人用,那就别用,换个写法。第二,读别人论文时,遇到好的句型就记下来,不断积累才能提高。第三,避免一切语法错误,我觉得这个是可以做到的,现在网上那么多工具都可以用。语法错误都避免不了那基本就是态度问题。遗憾的是,我很少遇到能避免语法错误的学生,我生气往往是因为态度问题,而不是能力问题。第四,尽量用短句用简单句子,别用长句。你写论文是为了让别人理解你的方法,不是写文艺作品,能说明白就行。
. 提炼总结,改进方法。写作的过程也是屡顺自己思路的过程,写作的过程中往往也能发现自己方法的漏洞,那么就要继续回到8,重新思考解决方案,又或者你发现需要补实验来支撑你的论点,那么就继续实现系统做实验,得到实验结果。
. 关于实验。怎么做实验是学生总问的问题,怎么做科学实验也是一个很重要的问题,有对照组、无偏的、定量的,这些都是科学实验的重要要素。如果有解决该问题的其他方法你首先要说明你的方法更好,至少在某一方面更好,这其中可能要涉及到不同的执行环境,或不同的算法数据集。然后设计实验说明你的方法好在哪里,用实验数据说明,比如异步PS和同步PS对比。然后你要进一步用实验数据说明,异步PS的有效性也提高了,如果不考虑有效性的话那么结果就不好。然后你的方法是否有些重要的超参数,试试variation导致各种结果。在实验结果展示方面,要学会用各种工具画各种图,把重要的因素用可视化方式体现出来。
第六步. 投稿和看待审稿意见
. 接下来就是投稿。选一个合适的会议或期刊投稿,这个可以听老师的,老师基本有这方面的常识,根据你工作的方向和档次选择合适的去处。确定好了哪个会议期刊后,就需要按照会议期刊要求来整理论文格式,latex是必会的工具了。之后赶在deadline之前提交论文,这个最后的几天可能很痛苦,因为你的论文和方法总有改进的地方,老师的要求会让你最后几天是最忙的几天。但是需要认识到,凡事无完美,你总也改不到完美,你需要一个deadline来督促你完成一个milestone。开始进一步工作或下一个工作。
. 看待评审意见。接下来是漫长的等待,会议一般是2-3个月的时间,结果可能是接收也可能是拒掉,相比于结果,更应该看评审意见,看看这些意见是否合理,是否能解决,无论是接收还是拒绝,然后接下来就再次回到解决问题的部分,再次开始优化方法的过程。如果是接收了,那就可以准备订机票开会旅游去了。如果是拒掉那一般是有比较大的问题,那就再仔细深思下一下你的方法。继续优化,还是降低档次投个差点的会,就看你导师的了。
第七步. 后续
. 宣传你的工作,扩大影响力。首先你可能是要去参加会议,做个漂亮的ppt,反复演练,争取有比较好的演讲效果。有时你导师有机会去一些地方做报告,把这个工作介绍一下,都是扩大影响力的方法。
. 开放源码。还有是尽量把自己工作的代码和数据开放,挂到网上,让别人来使用,接受别人的改进意见或者是简单的debug。咱不是专业的工程人员,也不用指望你的成果可以马上用于生产,个人觉得开放代码主要是为了让别人更好滴了解你的方法,这有助于扩大影响力,产生后续研究工作。如果有人引用你的论文、或咨询论文内容、又或是使用了你的代码和数据,这也算是你对整个科研事业有那么一丁点的贡献了,这比水论文有意义多了。
整体来说,发表论文需要你有:批判思维能力,动手能力,知识面,写作能力,表达能力,英语,韧劲(抗打击能力)等等一系列能力,如果在研究生期间真能发表一篇论文,经历了以上这么多磨难和锻炼,我想你的能力也是不知不觉提高了很多,成为了该小小方向的一个小小的专家了。这对你来说,是最最重要的。
这里我提到了韧劲,就是说,在解决问题过程中,你会受到不断的打击,包括来自导师的、来自自己的实验结果方面的、来自评审意见的,但是你要做的就是,站起来,继续凿,直到导师满意,知道reviewer满意,直到大家满意。别把这事想简单了,当你想象一下周围好多人都发好多sci了,而你还在为这么一篇完全未知结果的论文而这么努力的时候,我觉得大部分人可能就是缺少这个韧劲才最终以失败告终的…
最后,我想再强调一下,发论文不是简单地发论文,而是通过发论文宣传你的工作,以便对某技术或人有那么一丁点影响。无论你发哪个档次的论文,只要目标正确,我觉得你都会有收获和有贡献的。相比较于为了发论文而发论文,你会觉得你是那么地高尚和高大,他们只是造废纸,而你已经对社会有贡献了…
(以上内容来源于学术堂)
公开处刑:研究者自建Papers Without Code网站,张贴复现不了的论文
在 Papers「Without」Code 网站上,复现不了的论文将被公开曝光,作者可能面临社会性死亡。
“无法复现的论文都是耍流氓。”Reddit用户ContributionSecure在机器学习社区中抱怨道,他花费了一个星期尝试复现一篇论文,却失败了。
“有没有专门列出无法复现论文的清单?这样研究者们可以节省大量时间和精力。”ContributionSecure询问道。
另一位Reddit用户表示:“所有论文中可能有%-%是不可复现的,这是事实。”
如今,越来越多的机器学习研究者选择在论文发表时公开代码,一些顶会如ICML、ICLR、NeurIPS也要求投稿人附上代码,以确保研究结果的可靠性。
然而,这一切并不意味着论文复现变得容易了。
ContributionSecure一气之下创建了名为“Papers Without Code”的机器学习研究反馈平台,专门挂出无法复现的论文研究。
该网站托管着4万多个研究的实现代码,但并未解决“有代码也复现不了”的问题。Papers Without Code或许能提供答案。
研究者可以提交无法复现的机器学习论文以及他们的工作细节,如花费了多少时间来复现结果。
如果提交内容有效,Papers Without Code将与该论文原作者联系,并要求其澄清或公布实现细节。论文成功复现后,可以在PapersWithCode或GitHub上发布,供其他研究者参考。
如果作者未及时答复,该论文将被添加到“不可复现的机器学习论文列表”中,公开处刑。
ContributionSecure表示:“Papers Without Code的目标与PapersWithCode及整个ML社区是一致的。”目前已有几篇论文上榜。
反馈者需要提交包括论文标题、论文链接、提交原因等基本信息。
这样做的目的是为了节省研究者时间和精力,以免花费成本去复现一篇无法复现的论文结果。
如果某篇论文“光荣上榜”,论文作者会被第一时间告知,并有机会作出回应。这一机制的建立也是为了促进机器学习社区之间的有效交流,并培养健康的研究生态。
复现一篇论文有多难?事实上,行业内仍有相当数量的优质研究未能复现,这为后来研究者带来了阻碍。
ContributionSecure表示:“如果其他人不能以该论文为基础或基准,那么公开发表的有实证结果的论文毫无意义。”
但他同时也承认,有时候出于某些正当理由,机器学习研究者不会公开代码,比如使用大型内部数据集进行预训练。
在某些情况下,即使作者将源代码和数据都发布在论文中,其他机器学习研究者仍然很难复现结果。
造成这种情况的原因有很多,比如论文作者可能会从多个实验中挑选出最好的结果,以达到SOTA水平。
可复现问题并不局限于少数小规模机器学习研究团队,即使是那些大公司也常常无法验证其论文的结果。
NeurIPS组委自年起鼓励论文作者提交代码,目前成效显著。
但代码公开问题也不能“一刀切”,可复现性并不是评价论文的唯一标准。
除了Papers Without Code,还可以参考Pineau教授的“机器学习可复现性调查表”。
人们一直抱怨AI论文难复现,但机器学习社区在促进可复现方面可以发挥更加重要的作用。
唯一能够改变这种趋势的可能性在于,引导机器学习研究者们在进行研究时更加注重质量而非数量。