本文介绍如何阅读学术论文和项目的源代码, 其中的观点分别来自于台湾清华彭明辉教授的研究生手册以及李峰在 GitChat 上分享的文章<<利用开源代码和读相关论文来提高写代码能力>>.

如何写一篇有价值的论文

  1. 论文的主要内容是叙述一套方法在一个特定场合中的应用
  2. 这套方法必须有创新或者突破. 它或者是对既有问题的新方法, 或者是既有方法的新应用, 或者是一个新方法开启一个新的领域
  3. 论文中, 必须有足够的证据使读者信服在这个应用下,论文中的新方法有比其他文献中的既有方法更优越的地方.
  4. 论文中必须能指出这个方法在应用上的限制, 并且充分的证明主要满足论文中提出的前提条件, 此方法就一定可以适用, 其中的优点就一定会存在
  5. 论文中必须清楚的指出这个方法的限制和可能的缺点
  6. 行文风格上必须保证论证严谨, 逻辑关系清楚, 而且结构有条理. 使得这个专业领域的任何读者, 都有办法根据你的描述, 在他的实验室中复制出你的研究成果
  7. 方法中的每一步都必须提供充分的理由, 说明为什么非要如此不可
  8. 论文应当在适当的位置注明所有和你研究题目相关的文献

注意: 论文研究领域的所有文献(尤其是学术期刊的论文)都应该阅读过, 否则无论是否参考过这些论文, 都是重大过失.

完成硕士论文需要的能力

1. 数据检索能力

在给定的访问内, 必须有能力利用数据检索系统查出所有相关的文论, 而没有任何遗漏.到达此目的的关键是选择合适的关键词和程序. 如果关键词不恰当, 可能导致集合太小, 忽略重要的文献. 如果关键词太一般化, 则又会导致集合过大, 除了相关文献还包含了太多无关的内容.

2. 资料筛选能力

即使使用正确的策略, 通常找到的文献数量还是比需要的多. 通常情况下会搜索到一两百篇甚至数百篇文献, 而其中与研究问题密切相关的文论, 通常只有二三十篇左右. 因此需要通过 只读论文题目, 摘要, 简介和结论, 在没有完全读懂全文时, 就可以判断是否有进一步阅读的价值.

只有通过这样的筛选过程才能使需要仔细阅读的论文从数百篇降低到二三十篇.

3. 期刊论文的阅读能力

期刊论文是没头没尾的十几页文献, 只交代最核心的创意, 并援引许多其他论文的研究成果(但只注明文献出处, 而完全不交代其内容). 因此, 要读懂一片论文, 一定要同时读懂数篇或数十篇援引的论文.

相比于大学的教科书, 期刊论文是一个极端没有系统的知识, 必须依靠读者从几十篇论文中汲取相关的片段, 自己组织成一个有系统的知识, 然后才有办法开始阅读和吸取.这种能力需要大量而持续的时间去摸索和体会.

4. 期刊论文的分析能力

为了保证论文的研究成果确实比所有的相关的学术期刊论文都适合拟定的场景, 首先需要有能力逐篇分析所有的相关论文的优点与缺点, 以及自己研究成果的优点和缺点, 然后在进行比较, 总结自己论文的优点和限制.

但是好的论文都是名师和一流的博士生共同的研究成果, “打败”他们是一个极端困难的挑战. 本科生通常是只有理解的能力, 而没有批判的能力. 硕士生则必须要有对一切既有进行精确批判 的能力.

这种批判不是个人的好恶或者情绪化的批判, 而是真的找到充分的理由去支持的批判. 一个严格训练过的硕士, 他做事的时候应该是不需要其他人在背后替他做验证, 他自己就应该要有能力分析自己的优缺点, 主动向上级或平行单位要求支持.

如何阅读期刊论文

一般而言, 好的期刊论文有较多的创意. 虽然阅读比较累, 但是收获也较多且深入. 在阅读前, 有必要参考SCI Impact Factor以及学长的意见. 一篇期刊论文可以分成四个部分.

1. Abstract

说明这篇论文的主要贡献, 方法特色和主要内容. 需要学会只看Abstract和Introduction就可以判断论文的重点和研究有没有直接关系的能力, 从而决定是否要读完.

如果能从每三十篇文章中筛选出五篇最密切的论文, 那么效率就比别人高五倍. 以后不管是做事还是做研究, 都比别人有能力从更广泛的文献中挑出最有价值的资料.

2. Introduction

介绍问题的背景和起源, 交代前人在这个题目上已有的主要贡献, 说清楚前人留下的问题, 以及在这个背景下这篇论文想要解决的问题和它的重要性.

对一个领域不了解时, 可以先收集可能相关的论文30~40篇, 每篇都只读Abstract和Introduction, 不读Main Body, 只在必要的时候参考Illustrative examples和Conclusions, 直到能够回答以下的三个问题

(2A): 在这个领域最常被引述的方法有那些?
(2B): 这些方法可以分成那些主要派别?
(2C): 每个派别的主要特色(以及优缺点)是什么?

有一种称为 review paper 的论文, 这种论文会在一种题目下整理所有相关的论文, 并且做一个简单的回顾, 在搜索的时候加上 review 关键字可以帮助筛选出这种论文. 借助于这种论文, 在集合相关论文的title和Abstract, 可以更容易的选择出比较合适的30~40篇论文.

通常只需要阅读30~40篇论文的Abstract和Introduction, 就可以回答(2A)和(2B). 在试图回答这两个问题时, 一定要选择Introduction写的比较有观念的论文(如果论文写的像流水账, 则开始的时候不要读).

如果阅读了30~40篇论文的Abstract和Introduction之后, 还是无法回答(2C), 则做如下的工作. 根据(2A)的答案, 把这个领域内最常被引述的论文找齐, 在把他们根据(2B)的答案分成派别, 每个派别按日期先后次序排好. 然后每次重新读一派的Abstract和Introduction(必要时简略参考内文, 但目的是读懂Introduction中与这派有关的陈述, 而不是真的读懂内文), 按照日期先后读, 每次只试图回答一个问题:这一派的创意与主要诉求是是? 这样逐派逐派的把每一派的Abstract和Introduction读完, 总结出这一派别的主要诉求, 方法特色和优点(每一篇论文都会说出自己的优点)

其次, 再次把论文拿出来, 只读Introduction, 认真回答问题:每篇论文对其他派别有什么批评? 然后把读到的重点记录到各派别的缺点栏.

通过以上步骤, 获得(2A), (2B)和(2C)的答案以后, 对于这个领域内的主要方法和文献之间的关系应该是比较熟悉了. 此时可以用这些论文来测试之前使用的keywords是否合适并进行修正. 使用修正的keywords再次搜索论文, 把主要的论文补齐, 并且将原来的30~40篇论文中关系较远的论文删除, 最后只保留大约20篇关系最密切的论文. 如果有把握, 可以删除一两个不使用的派别(但是要与充分的理由), 只保留两, 三个派别(也要有充分的理由).

在(2C)的基础上, 再进一步回答一个问题

(2D): 这个领域内大家认为重要的关键问题有那些? 有那些特性是大家重视的优点? 有那些特性是大家在意的缺点? 这些优点与缺点通常在那些应用场合会比较被重视? 在那些应用场合不会被重视?

根据这个问题, 就可以整理出这个研究领域主要的应用场合, 以及这些应用场合上应该注意的事项.

最后, 在真正阅读main body之前, 应该依据(2A)和(2C)的答案, 按照派别将论文分类, 然后以研究的密切程度和时间次序一个派别一个派别的阅读.

3. Main body

在第一次阅读某个派别的论文的main body时, 只需要理解

(3A): 这篇论文的主要假设是什么(什么条件下是有效的)? 假设条件在现实条件下成立的难度是多少?
(3B): 在这些假设条件下, 这篇论文主要有什么好处?
(3C): 这些好处主要表现在那些公式的那些项目的简化上?

一个前提条件越难成立, 则其参考价值也越低. 整篇论文的详细推导并不需要懂, 除了最关键的几个公式之外(是实际应用相关的公式, 用于评估方法的方便程度或计算效率), 其他的公式不懂也没有关系. 公式之间的恒等变化完全可以忽略过去.如果需要看公式, 重点是看公式推导过程中引入的假设条件, 而不是恒等式的转换

注意, 在详细阅读论文前, 应该先把这个派别的所有论文拿出来, 初略的阅读一遍, 从中挑出容易的论文和经常被引用的论文, 先阅读这些论文. 阅读时只需要记住回答(3A), (3B)和(3C)三个问题, 不需要读的太细致.

这样完成一个派别的阅读之后, 应该依据这一派的发展过程, 主要假设, 主要理论依据, 以及主要的成果, 做一个完整的整理. 其次, 在(2D)的基础上, 结合这一派的主要假设, 进一步的回答

(3D)这一派的主要缺点有那些?

最后根据这四个问题整理出这一派最适合什么时候使用, 最不适合什么场合使用.

当评估一个方法的优缺点时, 需要参考提供的examples, 但更应该考虑方法的基本假设, 主要公式的适用条件, 并且分析某些场合无法满足相应条件时, 这个方法是否会出现某些状况. 尝试分析这个方法在那些条件下表现优异, 又在那些条件下出状况? 根据猜测在检验一下论文提供的examples是否覆盖了这些情况, 并且充分的展现出来.

永远不需要完全理解一篇论文, 硕士生必须学会选择性的阅读, 而且必须锻炼出选择的准确度和选择的速度, 不要浪费时间学用不到的细节知识. 多吸收点子比细节知识更重要.

补充说明

阅读论文应该是一批一批的读到某一个层次, 而不是一篇一篇的读懂. 读论文的时间永远是不够的, 一定要带着问题阅读, 每次阅读只需要根据论文尝试回答问题. 读论文一定要有选择的读, 一定要逐渐由粗到细地一层一层的了解.

这样一轮一轮的阅读过程中, 可以根据学到的知识, 逐渐的筛选掉不相关的论文, 从而进一步提高阅读效率. 不要读不会用到的东西, 白费的力气必须极小化.

按批次粗略阅读还可以使得之后阅读论文时, 对阅读顺序进行规划, 从而规划出一个最容易阅读的顺序. 理解A论文的内容并不一定必须阅读A论文, 阅读B论文时, 也可能帮助理解A论文的思想.

读论文要有想象和猜测, 读论文的时候, 猜测作者的思想, 并从论文中寻找依据. 如果猜对了, 可以加速论文阅读, 即使猜错了, 也能够加深理解.

方法特性表

在阅读了大量论文之后, 应该形成一个方法特性表和一个问题特性表, 方法特性表形式如下

方法特性表 方法一 方法二 方法三 方法四
特性1 o x x v
特性2 v o v o
特性3 o v x x
特性4 x o o x

问题特性表形式如下

问题特性表 应用甲 应用乙 应用丙
特性1 o x x
特性2 o o o
特性3 o x x
特性4 x o o

不同的方法有不同的特性, 而不同的应用场景对特性的要求也不相同. 方法没有好坏, 只有优缺点. 一个方法应用在合适场景就是一个好的方法, 反之则是一个糟糕的方法.

如果想要一个新的方法, 可以先分析应用场景对各种特性的需求, 找到其中的关键特性, 根据这些特性再去寻找表现优异的方法. 将一些可以互补的方法尝试组合就是一种新的方法.

论文报告的要求与技巧

一篇论文, 按照报告先后次序, 完成以下的要求

  1. 第一页列出论文的题目, 作者, 论文出处与年份
  2. 每一页只讲一个观念
  3. 说明论文研究问题的重点, 以及这个问题可能与工业界的那些应用相关
  4. 说明论文的主要假设, 主要公式, 主要应用方式
  5. 说明这篇论文中的例子在不同场合下可能的准确度或好用的程度
  6. 个人的分析,评价与批评
    • 这篇论文主要创意是什么
    • 这些创意在应用上有什么好处
    • 这些创意和应用上的好处是那些条件下才成立的
    • 这篇论文最主要的缺点或局限是什么
    • 这些缺点或局限在应用上有什么坏处
    • 这些缺点和应用的坏处是因为哪些因素而引入的
    • 建议学长学弟什么时候参考这篇论文的那些部分

如何阅读源代码

1. 熟悉阶段

遇到一个新的软件时, 首先一定要阅读文档, 了解其需要解决的问题, 设计的核心概念, 每一个模块的功能等.

通常可以阅读如下的一些文档资源

  1. 官方文档: 项目对应的官方网站提供的文档
  2. wiki: 项目对应的wiki文档
  3. 相关论文: 比较有名的项目同时也会有相关的论文发表

完成相关论文的阅读以后, 一定要能够把项目运行起来. 通常在项目的starter或者example文件夹中会提供官方的使用示例, 首先尝试运行这些示例. 最后, 在示例的基础上, 可以尝试根据自己的需求, 简单的修改其中的业务逻辑.

能够正确运行代码以后, 就可以进行下一个阶段: 构建数据流运行图. 通过阅读文档和实际运行代码来分析数据的流动过程, 先分析核心概念, 然后逐步的细化. 分析数据流图有如下的一些优点

  1. 理解概念, 了解系统的运行机制
  2. 产生问题, 从而阅读源代码时有目标
  3. 了解实现细节, 从而后续能够为系统添加需要的细节
  4. 遇到问题时, 更容易找到问题模块的位置, 获得切入点

2. 阅读阶段

首先分析项目的外部依赖库, 对其中的依赖的模块都要有基本的了解, 否则应该先去了解依赖库的基本信息. 学习依赖库也是知识储备的一个环节, 以后需要类似的问题, 就可以节省时间.

具有一定的知识储备以后, 就可以开始阅读源代码了. 关于切入点的选择, 可以考虑如下的几点

  1. 从数据的依赖库入手, 查看它在项目中的使用.
  2. 从使用中的bug入手, 分析日志和代码
  3. 从概念模型入手, 阅读相应的实现类, 在依据这些类进行扩展
  4. 从问题出发, 查看相应的文章和代码, 从而解决疑惑
  5. 从demo代码开始debug

在阅读过程中, 没有必要一行行的阅读, 可以适当的忽略不太相关的部分. 在阅读过程中, 可以适当的进行总结, 例如完善前面的数据流图.

3. 应用阶段

在平常的项目设计阶段, 可以积极的尝试借鉴开源系统中的一些概念. 这些开源软件通常都具有优秀的概念模型和系统架构.

开源系统中使用的优秀基础库也可以应用到自己的系统之中. 开源系统中部分优秀的代码也可以引入到自己的代码之中.

部分源代码在注释中还会引入一些论文, 如果想了解算法的具体内容, 也可以下载阅读. 很多有名的开源系统都会提供相应的论文.

参考文献

最后更新: 2024年04月24日 15:50

版权声明:本文为原创文章,转载请注明出处

原始链接: https://lizec.top/2019/02/11/%E5%A6%82%E4%BD%95%E9%98%85%E8%AF%BB%E8%AE%BA%E6%96%87%E5%92%8C%E6%BA%90%E4%BB%A3%E7%A0%81/