@Team
2019-01-12T19:32:58.000000Z
字数 4212
阅读 2278
刘才权
在这个日新月异的信息时代,海量数据的积累,计算能力的不断提升,机器学习尤其是深度学习的蓬勃发展,使得人工智能技术在不同领域焕发出蓬勃的活力。自己经历了嵌入式开发,移动互联网开发,目前从事自然语言处理算法开发工作。从工程软件开发到自然语言处理算法开发,希望通过这个系列的文章,能够由浅入深,通俗易懂的介绍自然语言处理的领域知识,分享自己的成长,同大家一起进步。
很多同学提到算法可能就会打退堂鼓,尤其是一直从事纯工程的软件开发。工作中连经典的数据结构都很少使用,更不用提五花八门的机器学习和深度学习算法。尤其各个大厂的算法专家、数据科学家都是背景爆表,动不动就是国外名校的Phd,至少也是国内清北、C9。实际上,针对普通的算法开发岗,从学习梯度上来讲,算法和工程的差异并不大。当然也并不需要非要名校硕博。
以前经常和同事开玩笑说,好歹大家都是985的本硕,但手上这工作,找个高中生也能妥妥搞定啊。虽然是玩笑,线上的产品当然也不是像Demo那么简单,但真实的工作真的没有那么明显的条条框框限制。自己也是面试官,百度这样的大厂对普通的开发要求也只是大专。针对普通的算法开发,自己觉得本科基本足够了,当然更没有像211/985这样的限制。
一般来讲,从事某个领域的工作,从底层基础到业务实现一般包括如下的几个层次(以互联网移动开发和算法开发为例):
方向 | 通用基础 | 专业基础 | 领域基础 | 业务方向 |
---|---|---|---|---|
移动开发 | 操作系统、计算机网络、编译原理、数据结构、编程语言、设计模式 | Android开发、iOS开发 | 驱动开发、Framework开发、应用开发 | 电商、社交、智能硬件 |
算法开发 | 编程语言(python)、数学基础(线性代数、概率/统计、微积分) | 机器学习,深度学习 | 语音、自然语言理解、计算机视觉、推荐、计算广告、风控 | 搜索,智能客服,广告推荐,互联网金融 |
从技能栈的对比来看,算法开发对数学要求要高些,这又会让很多同学看着头痛。实际上对数学的恐惧主要原因在于,对大多数人来说,数学主要是用来应付作业和考试的,而很少在真实的工程场景中使用它。
自己的本科专业是电子信息方向(觉得空闲时间多,顺手拿了个计算机科学与技术的双学士),有一些专业课程也蛮让人头痛的,比如《通信原理》、《信号与系统》、《数字信号处理》、《微机原理》、《数字电路》等,五花八门的抽象概念和算法公式。当时参加全国大学生电子设计竞赛,选入的学校的电子设计校队,参加系统的学习和培训(有半年的时间参加集中培训,不用像其他同学一样日常上课):
当大家还在纠结《通信系统》里的调制解调原理时,我们已经在做单边带调制收音机了;
当大家还在纠结《信号与系统》的傅里叶变换时,我们已经在做基于快速傅里叶变换的频谱仪了;
当大家还在纠结《数字信号处理》里的滤波器时,我们已经在做50Hz及其谐波过滤的工频陷波器了;
当大家还在纠结《微机原理》的X86汇编指令时,我们已经用上工业级的Msp430和C8051F系列控制器了;
当大家还在纠结《数字电路》的逻辑控制和抱怨VHDL难学时,我们已经在用Verilog玩Altera的FPGA了。
本来是非常枯燥有难以对付的专业课,但有了实际的使用场景和工程实践,反而变得非常有趣,不但专业课的教材就在手边经常翻阅,还会专门找相应的Paper,看看有没有更好更新的方案。自己对这些专业课不但没有反感,反而觉得超级有用,知识就是力量,在这一刻特别贴切。
我们回过头来说数学,也是同样的体验。算法的开发工作为数学和算法提供了实践的土壤,理论有了实践这块沃土,也就不再那么枯燥和晦涩。像很多数学大神一样徒手推公式确实是件很难的事情,但基于基础的数学知识来解决工程问题,这并没有想象中的那么难。而且,学习本来就是一个往复的过程,先有一个大概,尝试用已有的知识解决问题,当问题解决不掉时,再反过来学习自己欠缺的知识。
说了信心再说兴趣,很多同学会觉得目前机器学习和深度学习大火,是不是就该放弃手上的工程岗位,全力以赴的加入到算法的大军中。自己觉得要不加入这个方向还是看个人兴趣吧,现在算法岗位炙手可热,但三五年之后就不好说了。典型的就是Android/iOS移动开发,10年左右如日中天,市场蓝海,人才紧俏,公司抢人的盛况应该跟现在差不多。收益的决定因素是市场,但个人的成长从长期来看,还要看自己的兴趣。依照T型能力理论来说,深度方面,前端、后台、架构、嵌入式、客户端都OK;广度方面,机器学习和深度学习不论从是否要从事相关的领域开发,花些时间了解和学习一下,总的来说也还是不错的。
好了,下面我们就具体看看从事自然语言处理需要准备的基础知识吧。
编程语言的要求是很低的,弄掌握Python就基本OK。我的自己经验是:
系统的基础学习可以参考:《Python基础教程》
晋级学习可以参考:《流畅的Python》
经典的数据结构和算法,主要指数组、链表、队列、堆栈、树、图这样的经典数据结构,以及各种排序/查找、深度搜索、广度搜索、最小路径、Hash等算法。对一般的算法开发,这部分不是必须项。如果时间有限,可以跳过这部分。但从长远来看,无论是普通的工程开发还是算法开发,经典的数据结构和算法还是必要了。
落实到具体的学习上,基础的《数据结构与算法》应该随便一本教科书都OK。在实际操作方面,可以抽空刷一刷LeetCode,书的话可以考虑《进军硅谷,程序员面试解密》,内容基本都是LeetCode的原题,可以先刷题再看书。如果LeetCode上能持续刷上200+的题目,以后面对经典的数据结构和算法问题,应该也就没有恐惧的感觉了,反而遇到新问题还会饶有兴趣的去研究研究解决方案。
对于算法开发,本科学习的《微积分》、《线性代数》、《概率/统计》基本上就够用了。有些同学会提到《概率图模型》和《凸优化》等。我觉得对于入门来说,前面的三门课基本够用,后面如果真的觉得需要深入,再看后面的内容也不迟。
如果觉得当时大学的课程成绩还不错,那最快的方法就是把大学的教材拿出来重新再扫一般即可。如果觉得时间充裕,想再系统的学习一遍,在线视频是个不错的选择,
MIT:《单变量微积分》
MIT:《线性代数》
可汗学院:《概率》
可汗学院:《统计学》
学习的过程不要太苛求全面理解,没必要像数学大牛一样能把所有的公式都手动的推导一遍。能理解基本的概念和原理,关键是有系统的知识框架,后面遇到细节问题,可以回过头来再看。
这部分目前资料应该是铺天盖地的多,当然还有各式各样的培训班。自己觉得从入门角度,只要把吴恩达在Coursera上的机器学习课程完整的学习完,并完成作业拿到证书,机器学习这部分就算及格了。
Coursera:《MachineLearning》
一定要完成作业!一定要完成作业!一定要完成作业!重要的事情说三遍。
Coursera不翻墙速度好像有些慢,网易云课堂也有视频,但不能提交作业作业。
至于书的话,可以看看周志华老师的“西瓜书”:《机器学习》
看完前面机器学习的内容你会发现两个事情:
真实情况也大抵如此,如果直接跳过机器学习直接学习深度学习可以吗?当然可以啊,而且,直接学习深度学习还会觉得深度学习的入门门槛更低。
这估计会让很多同学觉得反常识。但反过来你问问自己,如果没有学习过汇编,上来就用C语言搞嵌入式应用开发可以吗?没有学习过C++,上来就用Java搞Android开发可以吗?当然可以啊。从入门角度没问题,但从长期来看还是需要的,想深入一个领域,知识的完备是必要的。比如嵌入开发用汇编写过两级中断向量表,做Android开发也开发过JNI。
深度学习也是一样,从最快入门的角度来看,可以跳过机器学习,直接进入深度学习,但从长期看机器学习还是必要的。而且,看完了吴恩达的《机器学习》课程,再看他的深度学习也更流畅。
Coursera:《DeepLearning》
一定要完成作业!一定要完成作业!一定要完成作业!重要的事情说三遍。
补充下,吴恩达在Coursera上的课程,《MachineLearning》是免费观看的,在线作业是付费的。《DeepLearning》无论是视频还是在线作业都是付费的。网易云课堂有免费的视频课程,但不能提交在线作业。其实,Coursera上的课程也挺便宜的,做完作业还有证书,还是挺不错的。
至于书的话,可以看看“花书”《深度学习》
好了终于到了这篇文章的核心部分了,因为是专业基础,所有市面上的系统学习资料也就没前面那么多了。但仔细找找的话也不少(都需要翻墙,手动捂脸):
经典自然语言处理(斯坦福):《Natural Language Processing course by Dan Jurafsky and Christopher Manning》
经典+深度学习(National Research University Higher School of Economics):《Natural Language Processing》
深度学习自然语言处理(斯坦福):《Natural language processing with DeepLearning》
深度学习自然语言处理(CMU):《CMU Neural Nets for NLP》
除了第一个之外,后面的视频都比较新。相对来说,书的资料就相对滞后了,如果有兴趣可以翻翻经典的宗成庆的《统计自然语言处理》,主要是针对经典的自然语言处理方法,虽然方法是经典的,但领域问题的描述还是很全面的。
总的来说,算法开发和普通的工程开发,从学习梯度上来讲差别不大,也不需要高大上的背景和学历。确定兴趣,看好方向,就坚持一步一步积累,理论结合实践,相信很快你也能像我一样,跨过算法开发的门槛,体会用算法解决实际工程问题的乐趣。