从研究思路的提出到实验的具体实现,是工程中的基础环节。但这个过程经常会因明显的小瑕疵而受到损害。在学术界,研究生研究涉及艰苦的工作——大量编写代码、编写说明和撰写论文。新的工程项目往往需要全新的代码库,而且往往很难将过去使用的代码直接扩展到这些新项目中。考虑到这一点,哥伦比亚大学计算机科学博士生、OpenAI研究员DustinTran从他自己的角度概述了从研究想法到实验过程的步骤。最关键的步骤之一是想出新点子,这往往需要很多时间;而且至少对于作者来说,实验部分不仅仅是学习,更是解决不可预知问题的关键。另外,作者也明确表示,这个工作流程只适用于实验研究,理论研究需要走另外一个流程,虽然两者也有一些共同点。机器之心编译介绍工作流程。你怎么认为?在评论中与我们分享。找到正确的问题在实际开始一个项目之前,如何让你的想法“落地”成为一个更正式的问题是非常关键的。有时就像导师给你分配任务一样简单;或处理特定数据集或实际问题;或与您的合作者交谈以确定要处理的内容。更常见的是,研究实际上是一系列迭代想法(想法)的结果,这些想法通常是通过日常对话、最近的工作、阅读专业内外的文献、反复阅读经典论文而产生的。我发现所有未探索的研究想法的主文档非常有用-维护一个主文档,这通常是很多工作。首先,它有一个项目列表来安排所有的研究思路、问题和主题。有时它们可??以是相对高级的问题,例如“用于强化学习的贝叶斯/生成方法”、“解决机器学习领域的公平性问题”;它们也可以是非常具体的问题,例如“处理具有中等内存复杂性的EP推理网络”、“尺寸偏差和对称狄利克雷先验分析”。我经常尝试使项目列表更简洁:子内容用一些链接扩展。然后,根据下一步要做什么对想法列表进行分类。这通常为我的后续研究指明了方向。我也可以根据这些项目的方向是否符合我的研究视角,是否必要,是否有效,随时修改这些项目的优先级。更重要的是,这个列表不仅仅是关于后续的想法,还有我接下来更愿意研究的东西。从长远来看,这是对发现重要问题和提出简单新颖的解决方案的重要贡献。我经常访问此列表,重新排列内容、添加新想法并删除不必要的问题。最终,当我可以详细说明一个想法时,它可以成为更正式的论文。总的来说,我发现在同一个地方(相同格式)重复想法的过程使得正式论文写作中的表达和实验过程更加流畅。管理项目我们为最近的arXiv预印本构建的存储库我喜欢在GitHub存储库中维护研究项目。不管研究的“单元”有多少,我都将其定义为相对独立的东西;例如,它可能与特定论文、已应用的数据分析或当前的特定主题相关联。GitHub存储库不仅可用于跟踪代码,还可用于跟踪一般研究进度、论文写作进度或尝试其他协作项目。但项目的组织方式一直是一个痛点。我更喜欢以下来自DaveBlei的结构,请参阅:http://www.cs.columbia.edu/~blei/seminar/2016_discrete_data/notes/week_01.pdf--doc/--2017-nips/--序言/--img/--main.pdf--main.tex--introduction.tex--etc/--2017-03-25-whiteboard.jpg--2017-04-03-whiteboard.jpg--2017-04-06-dustin-comments.md--2017-04-08-dave-comments.pdf--src/--checkpoints/--codebase/--log/--out/--script1.py--script2.py--README.mdREADME.md为我自己和合作者保留了一份待办事项列表,这使问题和前进的方向变得清晰。doc/包含所有记录,每个子目录包含一个会议纪要或文件提交,main.tex是主文件,每一章是不同的文件,比如introduction.tex,把每一章分开可以让多人在不同的章节上工作同时,避免合并冲突。有些人喜欢在主要实验完成后立即写一篇完整的论文,但我更喜欢将论文作为当前想法的记录,让它像想法本身一样随着实验的进展而演变。etc/是其他的东西,跟前面的目录没有关系。我通常用它来存储项目中讨论遗留下来的白板内容图片。有时候,我在日常工作中得到一些灵感,我会把它们记录在一个Markdown文档中,这个文档也是一个处理各种对工作的评论的目录,比如合作者对论文内容的反馈。src/是写所有代码的地方。可运行的脚本直接写在src/中,类和实用程序写在codebase/中。下面我会详细说明(还有脚本输出目录)。编写代码我现在用来编写所有代码的工具是Edward,我发现它是快速试验现代概率模型和算法的一个很好的框架。Edward链接:http://edwardlib.org/在概念层面上,Edward的吸引力在于语言遵循数学:模型的生成过程被翻译成Edward的每一行代码;然后将希望编写的算法翻译成下一行...这种干净的转换过程为您节省了将来尝试将代码扩展到自然研究问题的麻烦:例如,之前使用不同的方法,或调整梯度估计,或者尝试不同的神经网络架构,或者其他方法应用于大型数据集等等。在实际层面上,我总是受益于Edward现有的模型示例(在edward/examples或edward/notebooks中),并且我将预构建的算法源代码(在edward/inferences中)作为代码库中的新文件粘贴到我的项目中/目录中,并进行调整。这使得从头开始非常简单,我们可以避免许多底层细节的缺失。在编写代码时,我一直遵循PEP8(我特别喜欢pep8包:https://pypi.python.org/pypi/pep8),随后尝试将每个脚本与脚本共享的类和函数定义分开;前者被替换为Putitincodebase/forimport。从第一步开始保持代码质量永远是最好的选择,这个过程非常重要,因为随着时间的推移,项目会不断扩大,其他人也会逐渐加入。Jupyter记事本。许多人正在使用JupyterNotepad(链接:http://jupyter.org/)作为交互式代码开发的一种方式,并作为嵌入可视化和LaTeX的简单方法。对我来说,我没有将它整合到我的工作流程中。我喜欢将所有代码写入Python脚本,然后运行该脚本。但是像Jupyter这样的工具的交互性是值得称道的。实验管理投资好的工作站或云服务商是很有必要的。像GPU这样的功能基本上是普遍可用的,我们应该可以并行运行许多作业。当我在本地计算机上完成脚本编写后,我的主要工作流程是:1.运行rsync将我本地计算机的GithubRepository(包含未经授权的文档)同步到服务器的目录。2.SSH到服务器。3.启动tmux并运行脚本。万事俱备,tmux允许您脱离此进程,因此您无需等待它结束就可以再次与服务器交互。脚本运行后,我开始使用多个超参数配置进行钻孔实验。有一个有用的工具tf.flags可以使用命令行参数增强Python脚本,向您的脚本添加如下内容:flags=tf.flagsflags.DEFINE_float('batch_size',128,'Minibatchduringtraining')flags.DEFINE_float('lr',1e-5,'Learningratestep-size')FLAGS=flags.FLAGSbatch_size=FLAGS.batch_sizelr=FLAGS.lr然后,您可以运行这样的终端命令:pythonscript1.py--batch_size=256--lr=1e-4这使得为超参数更改提交服务器任务变得容易。***,说到管理实验时的任务输出,回忆一下上一篇src/目录的结构:--src/--checkpoints/--codebase/--log/--out/--script1.py--script2.py我们描述每个脚本和代码库/。另外三个目录用于组织实验输出:checkpoints/记录训练时保存的模型参数。当算法每隔固定次数迭代时,使用tf.train.Saver保存参数。这有助于维护长时间的实验-您可以稍后取消一些任务并恢复参数。每次实验的输出都会保存在checkpoints/下的一个子目录下,比如20170524_192314_batch_size_25_lr_1e-4/。第一个数字是日期(YYYYMMDD),第二个是时间(HMS),其余是超参数。log/存储用于视觉学习的日志。每个实验都有自己的子目录,对应于checkpoints/。使用Edward的一个好处是,对于日志记录,您只需传递一个参数inference.initialize(logdir='log/'+subdir)。可以使用TensorBoard可视化所跟踪内容的默认TensorFlow摘要。out/记录训练后的探索性输出;例如生成的图像或matplotlib图,每个实验都有自己的子目录,对应于checkpoints/。软件容器。virtualenv是管理Python安装环境的必备软件,可以降低安装Python的难度。如果您需要更强大的工具,Docker容器可以满足您的需求。Virtualenv链接:http://python-guide-pt-br.readthedocs.io/en/latest/dev/virtualenvs/Docker容器链接:https://www.docker.com/探索、调试和诊断TensorBoard是一个可视化和探索模型训练的优秀工具。由于TensorBoard的交互性很强,您会发现它非常易于使用,因为这意味着您无需配置大量matplotlib函数即可了解训练。我们只需要将tf.summary添加到代码的张量中即可。Edward默认记录大量摘要,以便可视化训练迭代过程中的损失函数值、梯度和参数变化。TensorBoard还包括运行时间比较,还为完全修饰的TensorFlow代码库提供漂亮的计算图。对于仅使用TensorBoard无法诊断的棘手问题,我们可以在out/目录中输出内容并检查这些结果。调试错误消息。我的调试工作流程很糟糕。为此,我在代码中嵌入打印语句,并通过排除过程来查找错误。这种方法非常原始。还没试过,不过听说TensorFlow的调试器很强大。提高对研究的理解不断测试您的模型和算法。通常,学习过程会让你更好地理解自己的研究和模型。这可以让你回到绘图板,重新思考你所处的位置,并寻求进一步改进的方法。如果该方法指向成功,我们可以从简单的配置逐步扩大到尝试解决高维问题。在较高的层次上,工作流本质上是将科学方法应用于现实世界。在实验过程的每次迭代中,没有必要放弃主要思想。但另一方面,这一切的理论基础必须扎实。在这个过程中,实验不是孤立的。与其他领域的专家合作、交流、阅读论文、思考短期和长期的问题、参加学术会议,都有助于拓宽你看待问题的方式,帮助解决问题。请注意,此工作流程主要用于实证研究,但其中一些方法值得其他任务参考。主要文档结构的模板可以参考:https://github.com/dustinvtran/latex-templatesReference1.Gelman,A.,&Shalizi,C.R.(2012)。贝叶斯统计的哲学和实践。英国数学与统计心理学杂志,66(1),8-38.2。J.珀尔(2000)。因果关系。剑桥大学出版社。3.Wainwright,M.J.,&Jordan,M.I.(2008)。图模型、指数族和变分推理。*机器学习的基础和趋势,1(1–2),1–305。【本文为栏目组织《机器之心》微信公众号《机器之心(id:almosthuman2014)》原文翻译】戳这里,阅读更多本作者好文
