自然语言处理之路:工具——七种兵器

自然语言处理之路:工具——七种兵器

一个自然语言处理炼丹师的自白

往期:

自然语言处理之路:前提——英文

自然语言处理之路:前提——数学

自然语言处理之路:前提——语言学

欲善其事,必先利其器。这一篇介绍个人在研究中常用的工具,这些可以成倍地提高你的效率,不用为一些细节的东西浪费时间,而专注于自己的想法

首先,假设这样一个场景,我们在一个小实验室。最近,终于用经费买了带GPU的服务器,于是再不用去超算和大家排队抢计算资源了。但是,现在我们得先知道如何使用服务器,来训练我们模型才行,不然也只会对着金山光流口水。

第一步,我们得连接上服务器,并使用那边的终端。

远程登录(SSH)

image

这里我们可以使用基于 SSH 的一些工具来连接服务器。

在 Windows 系统,可以试试常用的 PuTTY。但我个人更推荐目前在用的 Xshell,在一些设置上更加方便。而且虽然这是款商业软件,但我们可以申请研究免费许可。当然,还有种是直接在 Windows 上用 shell 命令行,通过安装 Cygwin

在 Mac 和 Linux 系统,直接打开终端 ssh 过去就好了。

关于将自己文件拷到服务器,可以用 scp 或 rsync 命令。更多 SSH 相关常用的命令,可以查看这篇文章《如何使用SSH》。

这样就连接上了服务器,但又会遇得到新问题:如何使用终端环境。因为此时没有了熟悉的图像界面,只有黑色的窗口和闪灭的命令行,让人手足无措。

Linux 命令行 (Shell)

image

要在这样一个环境下生存下来,那我们就得了解一些“咒语”,即命令行中的各种命令。每个咒语都有着其独特的功用,对于这些咒语,一些基础的初级咒语比如 ls, cd, less 这些,高级的一些比如 awk, sed,掌握的咒语越多你就会越得心应手,效率更高。到那时,反过来还会去 diss 图形界面。顺便 vim 的操作也可以了解下。

最初,我从 Windows 转过来也费了很多劲。先是在东芝实习时,需要研究 Linux 内核,就稍微接触了一些。但之后又不用了,直到最近需要在 GPU 上跑程序,重新捡起来,时间一长,就习惯了。

自己比较喜欢的学习资源,是被称为 TLCL (The Linux Command Line) 的一本很赞的书,有中文翻译版,先快速照着书练习一遍就好了,之后可以回头细细看。

此外相关学习资源很多,搜索一下就有。当 Shell 熟练后,就可以写大杀器,shell 脚本,让自己的工作完全自动化。自动下载数据,自动前处理,自动训练模型,自动分析结果... 那你呢,去玩吧,多亏了它我才能天天到处浪。

于是这样,就可以开始写代码了。

Python

image

人生苦短,大家都用Python。所以我们也用,首先深度学习现在的主流框架,基本都是 Python 写的,而且 Python 好用且易上手,特别在处理数据上面,有各种成熟的模块。

关于 Python 的资源就更数不胜数,这里列出几个我用过的非常棒的学习资源:

  1. Udacity 的 101 Intro to Computer Science:很棒的 CS 入门课程,因为里面用 Python 来写代码,所以上完之后 Python 基础也学差不多了。

  2. 还有 MIT 的 Introduction to Computer Science and Programming Using Python,也是计算机科学与 Python,但比上面讲得更深一些。

  3. 中文资料,我推荐廖雪峰的 Python 教程,和前两个不同。这个主要讲 Python,看看前面部分,网络编程后的不看也行。

会了 Python 之后,此刻你可能撸起袖子准备大干特干了。来!用 Python 从底层实现一个深度学习模型!3秒钟让你从入门到放弃。所以最好还是拿来主义 ,用已有成熟的深度学习框架就好了(值得一提:用 Python 还有 Numpy 从底层实现,其实对理解深度学习非常有帮助)。

深度学习框架 (Framework)

image

跟着 Python 语言,再介绍几个基于 Python 的主流深度学习框架。框架部分我就不说孰好孰坏了,稍微点一下,说说自己用过的:

  1. Pytorch:目前我主要用的框架。特点是代码符合 Python 编码哲学,简洁而且优美,自己定制的空间也比较大,此外 debug 的时候也很方便找。比较适合用于科研,最近越来越火了,首先 fast.ai 已经开始用它来教学,还有把 caffe 也给合并了。

  2. Tensorflow:因为有 Google 这个爹,所以可能是最流行的一个框架吧(我们都是 TF Boys)。因为社区大所以基本上什么代码都能找到,个人认为 TensorFlow 更适合产品开发。

  3. Keras:在 Kaggle 上玩的时候用过,非常傻瓜式,简单好学。

关于更多详细比较,可以查看李飞飞 CS231n 的深度学习框架的PPT

OK,现在就能写出自己的模型,然后在 GPU 上跑了。但对于深度学习任务,除了 GPU 计算资源,还有一个很重要的是数据
》直接进行数据处理,当然厉害的大触们是可以做到的,但对于一般人,我推荐有很好交互性的工具,Jupyter Notebook。

Jupyter Notebook

image

可以把它当成一个网页应用,视觉化地编辑服务器端的一些文件,但主要管理 notebook 文件。 notebook 可以进行实时的交互,很适合测试代码。 而且里面可以混杂 Markdown 语句,代码,图片等等,所以很适合进行分享,以及之后自己阅读。

使用时,先需要在服务器端搭建 Notebook 服务器,然后直接浏览器访问。

关于 Jupyter Notebook 的介绍还有使用方法,网上有很多教程,比如说这个《Jupyter Notebook介绍、安装及使用教程 - 知乎专栏》。最近还发布了相关的 JupyterLab ,也可以了解一下。

数据和模型都搞定了,终于可以跑程序了吧。是的,恭喜你,可以跑动自己第一个程序了。

但跑程序的时候,当前终端窗口就会被占用了,不能干其他事情,比如说跑第二个程序,或进行文件操作。这时你得建立额外的窗口再次连接服务器。每次都这样会特别麻烦,所以就需要一个在服务器端直接进行分屏的小应用。

Tmux (分屏)

Tmux 是个在终端窗口中分屏,运行多个终端会话的工具,同时还能随时断开会话放入后台,或者接入。

学习的话,可以去下一个备忘单,然后边用边查。

常用的几个命令也就创建,分屏,还有切换。

这样对于跑程序相关的就一切都 OK 啦,无论是想跑一个,还是同时跑 n 个,随你喜欢。

但最后还有一点要提,那就是如何管理你的代码

Git & GitHub

首先 Git 必须得会,基本上编程弄个项目都会用到。Git 的好处是,不会因为手贱误删了某些代码而找不回来;或者突然觉得以前写得更好而换不回去;或者发现实践各种想法,结果搞出一大堆自己都分不清的文件。特别,在做实验时,有很多模型想试,这时就建立成多个分支(branch)来执行。

学习资源的话,也有很多这里列两个我用过觉得挺好的:

  1. Pro Git:有这一本基本上就已经够了

  2. 廖雪峰的Git教程:更简洁快速一些,最开始就是用这个入门的

说到 Git 就得提 GitHub,超级神器。主要是用来托管代码的,可以用过 Git 将代码推到 GitHub,之后自己使用或用于共享。GitHub 还有一个很厉害的功能是,找代码。如果你想做任何东西,或者实现论文代码,做之前可以先搜搜 GitHub,总会有你意想不到的收获。

这样基本上整个工作流程用到的工具就都有了,下次再见吧。

推荐阅读更多精彩内容