斯坦福自然语言处理习题课1——绪论

对于技术人员来说,如果要问当前最热门的技术是什么?我想大家一定会回答是人工智能技术。而在人工智能技术中,哪个技术方向最火呢?大家肯定会回答是深度学习技术。如果我们要问在深度学习技术中,哪些应用方向最火呢?我想大家可能会不约而同地说是机器视觉和自然语言处理了。机器视觉自然就不必说了,比如说像商汤、旷视、Face++等独角兽级企业,是史上成长最快的独角兽级企业了,融资规模在几十亿以上,同时机器视觉工程师的平均年薪已经达到50万起,由此可见这个领域有多火爆。但是我们觉得,机器视觉已经发展接近顶峰了,未来几年很难再现像前几年的飞速发展期了,未来的发展的会比较平稳。但是自然语言处理领域则不同,目前处于刚刚开始起飞阶段,未来三到五年,将迎来进喷式发展,发展速度甚至比机器视觉还要快,因为自然语言处理应用领域比机器视觉更广泛。因为未来的人工智能要求更自然的人机交互、人机协同和人机融合,这就要求机器具有听、说、读、写能力,而这正是自然语言处理的研究领域。

综上所述,目前是学习自然语言处理技术的黄金时期,一方面是目前自然语言处理技术工程师的年薪已经接近甚至超过机器视觉工程师的年薪,另一方面,我们认为未来2、3年或者3至5年将是自然语言处理飞速发展期,会对自然语言处理方面的人才产生巨大的需求,现在开始学习,才能够抓这一趋势,成为市场上抢手的人才。

那么我们怎样来学习自然语言处理技术呢?我想大部分人可能会选择学习网络上可以公开获取到的斯坦福大学自然语言处理课程cs224n了。这门课出生名门,不仅讲述基础原论而且讲述业界最新进展,同时还沿袭了斯坦福大学理论联系实际的传统,这点从课程作业的选题中可以看出来。所以说这门课绝对是学习自然语言处理技术不可多得的资料,但是我们从公开渠道只能看到老师上课的视频、课程讲义PPT和作业资料,而这门课中更加重要的,由斯坦福大学这门课助教讲解作业实现技术的习题课,我们就看不到了。而对于初学者来说,这些助教讲的习题课才是这门课的干货,虽然老师讲的理论和最新进展也很重要,但是我们只有通过动手实践才能真正掌握和理解这些内容,但是非常遗憾,习题课是不公开的。

基于这种情况,我们在网易云课堂上开设了《斯坦福自然语言处理习题课》这样一门课程,我们在这门课中,将像斯坦福的助教一样,向大家详细讲解作业的实现技术,使大家真正做到理论联系实际。讲到这里,可能有同学会问,对于CS224n这门课的作业,网上也有很多作业实现和博客文章来讲解实现细节,我们直接学习这些内容不就可以了吗?还用学习这门课吗?当然,直接看这些是可以的,但是由于同学们是初学者,对于网络上的这些资料,到底质量怎么样很难区分。另外,这些资料通常都是由在校生完成并分享出来的,而在校生由于没有大型工程项目的经验和教训,他们的实现容易陷入就事论事的状态。

比如我们来看一个例子:
斯坦福自然语言处理习题课1——绪论
斯坦福自然语言处理习题课1——绪论
这个还是一个比较著名的实现,实现的质量还是蛮高的。但是就是这样一个实现,也是有很大的问题的。先来说一下这个实现好的地方,在这个实现里面使用了lambda表达式、numpy apply_along_axis这样的高级函数。但是这个实现有一个小的问题,大家看老师给的作业要求里面,对于X的说明里,写了这样一句:You are allowed to modify x in place.这句话只是一个建议,所以很多同学都把这句给忽略了。绝大多数同学在实现时都采用x = np.exp(x)的形式,但是这样写的会复制一个x的数组并返回,这样既浪费了内存空间同时会浪费运行时间,虽然softmax一般只用于输出层,一般对MNIST手写数字识别只有10个类别,李飞飞开发的ImageNet竞赛也不过是1000类,计算量并不大,但是在训练阶段训练样本集通常有数百万的训练样本,而且会学习多轮,这样就浪费太大了。所以老师才会提醒你,你可以在x数组里进行修改,不必返回一个全新的数组,但是可惜被同学们忽略掉了。当然,可能也有同学尝试过老师提的in place方式,但是在老师给的代码情况下,直接使用是通不过的,需要进行一些小的修改,这点在我们课程中间会详细讲解。这就让我们想起了西游记里孙悟空学艺,菩提老祖在孙悟空头上敲三下,孙悟空就能悟到是老师让他三更去找老师,而其他弟子就悟不到了。所以在这门课里,我们会代领大家掌握自然语言处理技术的精髓,达到业界标准甚至更高的水平。

所以说我们这门课的价值不仅仅告诉你怎么把CS224n这门课里面的作业做出来,而是要给大家展示业界的最佳实践,使同学们真正达到业界自然语言处理工程师的水平。

这里面还有一点,就是即使像斯坦福自然语言处理CS224n这样的精品课程,也存在由于录课时间较久远,课上所用技术存在过时的情况。例如,在CS224n的作业中,还是基于python2的代码,而我们知道Python2已经停止更新了,业界已经基本完成从python2到python3的转化了,大家到实际工作中,基本都是使用python3了。这不得不说是一个遗憾。所以在这门课里面,我们将带领大家一起,把课程作业中的代码移植到python3。还有例如在作业1里面,老师给我们的神经元**函数还是sigmoid,而我们知道,自从06年深度学习崛起之后,神经元特别是隐藏层神经元的缺省**函数已经变为ReLU了,如果是近一两年,还会看到很多采用SeLU**函数的,这一点也比较遗憾。关于这一点,我们在课程中也会向大家作一个简单的介绍,使同学们能够掌握最新的技术。还有一点,也是在作业1里面,在讲解随机梯度下降算法的时候,还采用的是传统的BP算法的方式,而我们知道,当前流行的深度学习框架,如TensorFlow、PyTorch和Theano等,都是基于计算图的实现方式了,这些内容也略微有些过时,我们在课程中也会以TensorFlow普遍采用的计算图方式,向大家讲解递度下降算法。当然了,这门课毕竟是CS224n配套的习题课,不可能向大家系统的讲解计算图模型,如果同学们对这方面内容感举趣,可以关注我们即将推出的《自己动手写TensorFlow》课程,在这门课中,我们将带领大家,模仿TensorFlow框架,使用C语言来实现深度学习的核心算法,使用Python语言来进行数据可视化、模型可视化和训练过程可视化工作。

回到我们这门课程,我们会带领大家使用python+numpy的方式来实现所有的核心算法,虽然实际工作中,大家可能会使用TensorFlow、PyTorch这样的深度学习框架来实现算法,甚至很多人用更高层的Keras来写算法,但是这些框架和库会给我们屏蔽了底层的细节,虽然使我们更容易入门,可是也使我们很难搞懂底层的数学原理和代码实现技术,而我们通过python+numpy的方式,自己动手完全从头来实现这些核心算法,恰恰可以弥补大家在这方面的知识缺陷。

如果大家对自然语言处理技术感兴趣,想掌握这些算法的底层实现原理,请关注我们的课程:斯坦福自然语言处理习题课https://study.163.com/course/introduction/1006361019.htm?share=2&shareId=400000000383016),课程目前处于连载状态,早学的同学有优惠呦!