![640?wx_fmt=gif](https://i-blog.csdnimg.cn/blog_migrate/d2b439be8e91281f7371bf168b0d2849.gif)
参加 2019 Python开发者日,请扫码咨询 ↑↑↑
作者 | 赤乐君,日本某大手研发部门的NLP工程师。关注关系抽取与知识图谱的相关研究。
来源 | 赤乐君的知乎专栏
最近AllenNLP在EMNLP2018上做了一个主题分享,名为“写给NLP研究者的编程指南”(Writing Code for NLP Research)。
内容干货满满,仅仅只是看了slide就知道是非常有意思的一次演讲了。slide共有254页之多,这里我简单做个摘要,分享一些有意思的内容。
有时间的话推荐大家直接看slide,下面是地址,请自备梯子。
https://github.com/allenai/writing-code-for-nlp-research-emnlp2018/blob/master/writing_code_for_nlp_research.pdf
下面是整个分享的大纲。通过这次演讲,你可以学到如何写代码来促进你的研究,以及可复现的实验。
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/0769e09a4f8903b36c1ae66a6d455a0e.jpeg)
这里有两种写研究代码的模式,一种是写原型,一种是写组件。
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/c7ca44e9dfe9d0267a4fa7b2560989d4.jpeg)
我们先从写原型的方式开始介绍。
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/8ab9d741b34e90a5ee35e32bbcf4d519.jpeg)
当我们开始写一个原型代码的时候,我们要做到下面三点。
写代码要快
跟踪实验结果
分析模型结果
快速开发
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/802600e16f9bc5b7ef8492a571c48531.jpeg)
要做到快速编程,不要从头开始写所有内容,而是使用框架。这里的框架不仅指tensorflow或pytorch之类的框架,也可以理解为模板。比如上图中如果写trining loop的部分,已经有人写好了。我们只要看懂后,直接拿来用就行,没有必要从头开始自己写所有部分。
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/95c9710fef6fb654b65e895f252b2643.jpeg)
上面提到的一些内容,都是可以找到现成框架来套用的。
Don’t start from scratch! Use someone else’s components.
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/ac91853cd08c23625c7772d81df9989b.jpeg)
如果有人把你想用的东西模块化了,还等什么,直接拿来用啊!
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/02bd7fabef38f00f5797c8617d744648.jpeg)
要想快速开发,另一个建议就是先复制,再重构。要记住,我们是在写原型,不用在乎什么可用性,先把代码写work了再说。如果实现的效果不错的话,再回去重构。
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/8e487b587a770514621517245f3ef3ba.jpeg)
另外,我们要有好的编程习惯。比如起有意义的变量名,写注释帮助理解。记住,我们是写给人看的,不是机器!
跟踪实验结果
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/e8f0a3c0bc46ab2c91ba87e35083466f.jpeg)
可以准备一个Excel表格,来记录实验结果
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/fe273bcff89650fec58ba8f4ab687f5c.jpeg)
每次只改变一个部分,方便跟踪实验结果的变化其原因在于哪里。
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/1dde48c9d558b679ee5794053779bf74.jpeg)
这里光是embedder,我们就有很多种选择
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/02229b14addb607087a004e1fb7e7d99.jpeg)
使用设定文件来记录模型的改变,方便我们以后查询当时的设定。
分析模型结果
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/9551df4fc6320675c3a5206e966c9b32.jpeg)
在训练的时候,可视化对于分析模型表现是非常重要的。这个技能必须掌握。
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/1be9294f2ae33e378efb5de27ee72b14.jpeg)
Tensorboard可以提供很多分析结果。
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/312c510fbdb7d4a78e7c577a407d2442.jpeg)
Tensorboard能帮我们找到优化的bug。比如上图中的embedding梯度有两个数量级的差别。
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/5c41303313c1bd2beb0dd62ca99a241c.jpeg)
原因在于embedding的梯度是稀疏梯度,即只有一部分会被更新。但是ADAM中的动量系数是针对整个embedding计算的,所以解决方法是直接引入特定的优化器:DenseSparseAdam。
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/741925269e03886a718789e1ee9c3d30.jpeg)
对于预测结果,如果和做到交互式的方式来查看的话,是最好的。
开发组件
与写原型不同,开发可重复使用的组件有很多要注意的地方。
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/e30ba09d4d08fa83bf1627359c0059b7.jpeg)
Code Reveiw是必不可少的。Review的时候,不仅能发现错误,还能提高代码的可读性。
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/efb8643daf07e804881ce56fda6865cc.jpeg)
如果我们不是软件开发人员的话,对于持续集成 以及构建自动化 这两个词可能比较陌生。通常我们只说持续集成的时候,也包含了构建自动化的意思。想要做到这点,要多写测试才行。
当然,如果我们不是开发一个很多人都会用到的库,上面这些步骤是用不到的ㄟ(▔,▔)ㄏ
不过测试很重要,如果是原型开发,也要做一些最基本的测试。
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/7de1f5582fa52bfc700ad25740056521.jpeg)
对读取的数据进行测试,看是否正确。
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/dc09fff748a30cd333383b23e5461cc8.jpeg)
对模型进行测试,比如检查维度是否一致。
可以看到这两种测试的代码都不会很多。所以不要犯懒了,好好写测试吧。
关于AllenNLP库的一些介绍,这里就不花时间讨论了,感兴趣的可以看slide中p141~p205的部分。
下面直接进入分享的部分。
分享研究
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/f25181a783b16921be7789836a1b828e.jpeg)
简化安装的流程,令代码运行在任何平台,使用隔离的环境。
下面是使用Docker的一些优点。
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/313e13b955c97754b98a0ffeff48ff22.jpeg)
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/7b346ea022c618b850153e39a2d892db.jpeg)
用docker开发的好处不用多说,大家想必也已经都知道了。当然,缺点也是有的。
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/43e0ba09c1b725bba2f6d6e9cd49dc8a.jpeg)
至于Python的包管理系统,AllenNLP采用了ANACONDA。
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/bfa0feb42cfbbecb0a4852d6d50c6ca7.jpeg)
Docker是不错,但不适合做本地开发,这样的话,使用一些本地的包管理系统反而更方便。
最后做个总结。
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/4cc6be8bf2ff2860c92fe00be731cf4a.jpeg)
快速开发原型(要安全)
写安全的产品代码(要快)
好的流程有利于做出好的研究
使用正确的抽象
查看AllenNLP(广告)
这次分享的slide看了几遍,很多地方看得自己脸上发热,不写测试什么的说到了痛处。现在人工智能领域对于算法工程师的要求已经不是能掉个包,谈谈研究那么简单了,工程实践能力已经变得越来越重要。写优秀的代码,做优秀的研究,二者是一个互相促进的过程。最后放上原slide链接,感兴趣的最好自己看一遍。
https://github.com/allenai/writing-code-for-nlp-research-emnlp2018/blob/master/writing_code_for_nlp_research.pdf
如果你有什么想法,欢迎评论区讨论。
作者其他个人平台
Github: https://github.com/BrambleXu
Medium: https://medium.com/@bramblexu
Twitter: https://twitter.com/BrambleXu
知乎: https://www.zhihu.com/people/life-learner-lux/activities
原文地址:
https://zhuanlan.zhihu.com/p/48504619
(*本文是AI科技大本营转载文章,转载请联系原作者)
◆
精彩推荐
◆
推荐阅读:
2019Python开发者日其他活动,你也可以点击阅读原文。