本文作者 2013 年本科毕业,做过并行计算开发、嵌入式底层,目前在游戏创业公司做服务器开发。
自从作者自学机器学习等 AI 领域技术以来已经有一段时间了,本文作者将简单总结这一段时间的进修情况。
后悔大学不努力
大三的时候学过一门“人工智能导论”的课,只记得课里有一些回溯和图搜索的算法,具体细节全忘了。
虽然算法与数据结构、编程语言很有深度,但当时认为真正厉害的是能干项目,写网站的,懂框架写实际应用程序。
什么语言、算法,现学会用就行。那些编译原理、操作系统课程、数学、英语,听课就行,毕竟真正招人不看这些基础课。
尤其是蕴含其中的算法思想。它们决定了你从事程序员这个行业以后所能达到的深度,而英语决定了你以后的广度。趁年轻,可以多尝试各个方向,但一定要明白基础知识的重要性。
如果想形成知识体系,本人是不赞同碎片化学习某一领域知识的。碎片化时间适合看技术“花边文章”,开眼界。碎片化学到的知识,都是零散的,个别天才除外。
真正能形成系统性的,有深度知识到自己脑海里的一定是靠长时间系统地持续性地学习才能积累和形成的(至少我自己适合持续性学习)。
我刚入学那会儿被各种各样的大部头吓坏了,这能啃完吗?甚至有的老师也不建议啃。
但其实现在看来,大学期间最适合啃这些书,因为那时候有非常多的时间来心无旁骛地学习。
如果你热爱这一行,或者立志想一辈子靠技术吃饭的话,如果不知道啃哪本,就从《算法导论》啃起吧。
不要怕难,认真反复多看几遍,如果全弄懂你的人生肯定会与其他人不一样。
大学里最重要的是学习思想性的知识,好的学习知识的方法,专注和自学的能力,这些是能伴随你一生的习惯,是修炼内功的绝好机会。
这个时候心无杂念,找本自己想学的方向,很容易钻进书本里。如果你还在校园里,那就踏踏实实夯实基础吧(比如4学分的课)。
如果你觉得老师讲得不好,那么去网上自学公开课,自学能力也几乎是技术成长必备的能力。
再一个,不要害怕与众不同,我们从小到大,太强调一致性了,要相信自己。
为什么想学 AI ?
随着近几年计算机领域的不断发展,云服务与并行计算促进了计算力的提升,互联网的发展提供了海量的数据,这些方向的发展都促进了人工智能的发展,也促进了 AI 领域机器学习的发展。
我觉得学习 AI 是投资自己的技术未来,就像前几年火热的移动端开发一样,传统岗位也会依然存在。但是 AI 行业的发展也一定会产生新的岗位。
而人对未知的事物都是充满好奇或者担忧的,至少我是好奇。好奇大家口中的机器学习、神经网络这些名词到底是怎么回事,有什么高深的算法,会如何发展,是否存在自己一直寻找的兴趣方向。
之前的一些机器学习入门的文章也看了很多,都看得迷迷糊糊,大家说的模棱两可,比如不用在乎数学推导,直接调用接口,就好了。
简单的 API 调用,我想大家都很容易学会,但如果我仅把函数当成黑盒使用,我心里是没底的,因为我不知道里面怎么做的,我就会觉得没底。
也许是我性格的原因,会经常执迷于细节,而且学习速度很慢,并且无法从宏观上对事情进行更好的抽象,我现在也在逐渐提高自己的抽象能力,先从宏观上看事情。
一次偶然的机会,看到一篇文章:《入行AI,如何选个脚踏实地的岗位》。这篇文章是我看过所有的入门文章中,介绍的最详细最明白的文章,相见恨晚。
文章中的观点我完全赞同,尽管很多技能我还不具备,但我觉得说得都很对,同时也揭开了各个岗位都是干什么的神秘面纱。
首先,我觉得不懂内部原理甚至细节,只会调用库,是没办法更深入和提高的。所以我觉得数学基础很重要,照着教程敲一遍代码已经不足以满足我现在的追求,做完了没有什么成就感。
成就感是个很神奇的东西,就跟你玩游戏打怪练级一样,如果认识到这件事充满成就感,你会有非常多的力量在上面,找到最大化自己成就感的事情,那个应该就是兴趣所在了,做那件事也就能实现自我的意义和价值。
其次,同意文章中说的在成为机器学习工程师之前要首先要是一名合格的程序员,基本数据结构和算法一定要掌握,我距离合格程序员还有很大差距。要认清自己,脚踏实地。
最后,文章末尾有个讲课的链接,我以前对培训和讲课是很抵触的,片面觉得所有的东西都要自己悟才可以,现在想想是自己钻死胡同里了。
如果有老师讲很好的课,可以帮你快速入门,大幅提高你的时间效率的,而且这门课很便宜。
此外,我个人认为当一篇文章让我有极大认同和感想以后,我就会把作者的所有相关文章都检索出来。
看一遍,如果 80% 甚至更多都和自己的认知相同,那么这个人多半你就是认同的,大概率买她课不会让你失望,李烨老师给我的感觉就是这样。
以上只是我的真实感受,不多说了,要不然有打广告的嫌疑。看完这篇文章后,我对整个 AI 行业有了一些认识,决定要开始行动起来,临渊羡鱼,不如退而结网。
关于买书
关于买书,我从不吝惜,希望自己也能一直保持着这个习惯。基本 200 以内的书,真的需要,或者我知道自己买完了一定会看,我从不犹豫。
但仍然有很多书没买,Amazon 上的购物车,常年有上千的书存着,因为穷,哭。
之前是怕租房搬家麻烦不买,现在觉得自己以前好蠢,这点麻烦算什么。个人觉得电子书的确方便,但的确适合查阅,不适合阅读。
想系统学,还是要买好书经典书,甚至大部头才好,这样知识才能系统建立起来,比碎片化有意义很多。碎片化当开眼界和休息时的新闻看看就行了。
关于知识付费
我觉得学习上不要吝啬,衣服可以不买,吃的可以温饱,但是学习上,不用小气,一件衣服,一双鞋,都够买一年的课或者书了。
我本人收入并不高,但买了很多课,别乱买,买那些你一定会去学的,一定让你有产出的,可以内化成你自己知识的。
我自己买了一些某乎 live 课,但觉得里面都是一些宏观上的方法,细节很少,干货也很少,整个 live 过程都觉得非常赶时间,学到的就更少了,可以作为开眼界,理清一下脉络的方式,甚至有的 live 买完能学到脉络就不错了。
App 上也订阅了某人工智能专栏,老师照书本式的念,听着实在是烦,生硬。说白了,我识字,但你写的我看不懂,你念一遍我也还是不懂。
没有详细解释,只能靠我自己去网上一点点找,也许对数学基础要求很高,我的基础距离主讲人定义的数学基础差太多。
数学基础
个人觉得,如果有好的详细推导过程严谨的教材/教程,看书或图文教程,是学习上手最快的。因为,你可以自己控制学习的速度。
【1】微积分
首先由于连微积分最基础的知识都忘记了,就先回去补高数了,虽然大学上课认真听课了,但不是学霸那种,毕业后基本没怎么用过,就全还给老师了。
看大学教材,这里我用的是 GitChat 上李烨老师推荐的微积分讲义(北师大出版社邝荣雨等编著的《微积分学讲义》),书很薄,很适合快速过一遍。
我属于只看书和例题没有做题的,因为懒。我觉得大学期间,很多时候都留在做题上了,我整个教育历程重点都是题海战术。
但我忽视掉了,真正的数学定义中的物理和几何意义,其实这些意义非常重要。这里重点补充了一下。
如果后面想往算法科学家方向发展的话,这部分还要继续强化,做题,多练,提高自己的计算能力,多看书和例子。MIT 的在163上的微积分公开课也非常棒。
【2】线性代数
由于第一份工作用到了浮点数高阶矩阵求逆并行优化算法相关的工作,这个在当时认真学了,而且当时包括现在的理解,线性代数,只是进行矩阵变换和运算。
【3】概率论
这个是弱项,从高中开始,抽球,就抽不明白,现在也没太明白。但是我属于对学习资料比较苛刻的那种人,各种强调器,而不去做事。其实如果用心学随便一本,都可以内化成自己的知识,但我暂时还达不到这种境界。
学知识不是为了满足自己的我很上进的样子,也不是为了学过这些知识以后,自我满足感。
一定要强调自己的内化——就是拍着自己的胸脯问自己,你真的学会了吗?你学到了什么?都理解了吗?没理解,好,说明没学会,那就重新再看视频,再查阅各种相关资料,再学,每天吃饭睡觉都去想,去琢磨。
这里我推荐台湾大学的叶丙成老师在 Coursera 上的课程:"頑想學概率"(一)和(二)。
话说叶老师说话很像我已经离职的 Leader,亲切感十足。虽然只学了前面几节课,但明显是非常棒的概率课程。跟着学就好。教材,请打印课堂的ppt。
【4】统计学
网上有 edx 或者可汗等国外的公开课,暂时还没有补习,大面积用到了再补。
大家多利用好网上公开课视频。我自己本人是,基本上所有的公开课 App 都装了(买了几千块的手机,不能白买)。
机器学习
这个课程基本你看完微积分,学会求导,求偏导的物理意义,知道矩阵乘法和转置,就可以看机器学习的视频了。
这门课非常好,老师讲的非常浅显易懂。我甚至觉得高中生,学完微积分,求导,了解一下矩阵,如果会编程,都可以学了。
建议边看边做笔记,做完笔记,虽然耗时间,但是我知道自己属于看十遍不如写一遍,一般的视频,看两遍,某个看三遍就能理解了。
Coursera 上有几个是视频的中文字幕是不全的,网易上有更好版本的中文字幕视频。大家可以先去网易公开课上看。
建议先中文,然后达到英文听课的程度,因为真的不难。我自己英语很菜,大学就没怎么学习,看第二遍的时候也能看懂英文字幕了。
顺便说一下:英语这个技能是必备的,只要你从事计算机这一行并且想往上走,没什么商量的。平时查 stackoverflow,看其他的 tutorial 或者 doc 也要看的。
其次推荐:李烨老师在 GitChat 发布的「极简机器学习入门课」
这门课非常值得学习,而且真的好便宜,物超所值。
大多数专栏只是开眼界,没法做到系统。李烨老师的课做得就比较好,课程里非常基础,通俗,有细节。还能让你开眼界,了解常识。
比如会告诉你一直以来,线性关系并不全是直线的关系,这样非常基础而重要的概念。——也许我数学太弱了,学东西方法也不够灵活,理解不够深刻。
当然,如果图文再详细些,图文肯定效率更高。
至于机器学习相关的书籍,我觉得周志华老师的西瓜书(《机器学习》)对我来说太难了,大神觉得简单,请无视我。
因为我很多符号表示都看不懂,这里一位网友说过一句话,我觉得有一定道理:数学符号不统一,导致了入门门槛较高。
但是,坦白说,还是自己太菜了,其实符号大同小异,但的确入门如果一味钻进去抠符号什么意思,是很恼人的。
但没别的办法,只能多去搜,多去看,去老师的群里问,老师和群友都会帮你解答。看不懂你就不知道在人家在说什么。
不要急,不要烦,机器学习就这么多符号,它不是无穷尽的,踏踏实实一个一个学。肯定能学会,这里我主要推崇愚公移山的精神,当你一下子突然理解了,能体会到领悟的喜悦。
有网友推荐台大的林轩田的视频,这个我刚看了开头,还没详细看,以后再补。李航的《统计学习方法》看着更头大,暂时先不看,以后回来补。
编程语言
编程语言首选 Python。Amazon 上有一本让繁琐工作自动化的 Python 书,非常简单,适合无基础的人,如果你和我一样弱,那就看它吧,上手非常快。
Python 编程快速上手:《让繁琐工作自动化》;基础好些的,看:《Python 从入门到实践》,我两本都买了。
Python 开源工具库:
输入输出文件处理:pands
矩阵处理:numpy
机器学习模型:sklearn(比如线性回归模型,一条函数调用就完事,非常高效)
可视化:matplotlib
Python 机器学习相关在线教程:
莫烦 PYTHON:
https://morvanzhou.github.io/
由于目前工作中没有相关机器学习的业务,这里去 kaggle :
https://www.kaggle.com/
上刷比赛是很好的方式,因为上面有大量的接近实际的项目。
心得体会
不要被高大上的符号或者专业术语吓倒,比如:张量,梯度下降,贝叶斯公式,机器学习,人工智能,神经网络...
不仅是机器学习,其实很多方向都是,当听到专业术语时,不要慌张和盲目的跟风,一点一点看,一点点去学习了解。
踏实下来,抽丝剥茧,如果你真的想知道这些名词是什么意思,拿入门机器学习举例,全身心投入一个月就差不多了。
小吐槽:大学教育时,很多算法,模型,都没有学习英文的表达方式以及认真梳理,造成别人说一些专业英文术语的时候,自己不能理解。
其实是自己没意识到要进行知识梳理。造成很多知识学完了,在脑海里,跟一团浆糊一样。
是模型算法都懂,单拿出来能理解,但是看别人文章、书的时候,根本就不知道把这些零散的知识串联在一起,其实有些知识是学过的,知识没有自己梳理。
一定要尽早梳理,做事有条理,学习专业术语正确的英文表达方式,本文还会不断修缮。
专业术语尽可能用英文的专业词汇跟别人交流,能节省很多中文翻译版本上的障碍,有很多知识yy,别人讲了半天,原来是说的其实就英语的xx或者中文另一个版本的zz)
李烨老师还推荐了《人工智能基础(高中版)》是由陈玉琨和汤晓鸥编著,写的非常浅显易懂,适合我这样的菜鸟。
里面有人工智能核心能力的说法我觉得很好:"人工智能最核心的能力就是根据给定的输入做出判断或预测"。的的确确就是这么一回事。
学完对机器学习的理解,昨天碰巧在网上(图片出处)遇到这张图,就偷懒不自己画了:
看完 Cousera 上 Ng 的课,里面如果有不清楚的,可以横向看一下书和网上找文章,建议手动推导一遍梯度下降算法,再用 Python 实现一遍梯度下降算法。
尽可能所有的公式都手动推导一下,提高自己的运算水平,补充之前没有做题的缺陷。而且自己也能真正明白。
最好也能用代码来实现一遍,如何用计算机求导。
学习路线
先分享一下我个人的学习步骤:
1. 先看微积分,知道连续,求导的几何意义,然后了解一点矩阵知识;
2. 开始看 Ng 的视频,然后看李烨老师对应章节的课,看西瓜书,然后看网上的教程实例,手推公式,手写代码实现求导
3. goto 2
4. kaggle 入门级比赛(这部分我刚开始...)
看完一节 Ng 的视频,就去看李烨老师的课程;看不懂的,继续看视频,网上找资料。
或者去课程群里提问,肯定有人知道,大家都不知道就可以问老师,老师都会耐心给与解答。多种学习途径相结合。
由于个人性格比较愚钝,很多事情喜欢刨根问底,没有数学公式上的推导,就觉得心里没底。
抽象出模型的思维较弱,执着于细枝末节,所以喜欢有详细推导过程的教程,但也因为笨,啃得慢,还有畏难与拖延的坏毛病。
以上是我学习的一点感悟,由于水平太弱,经历尚浅,只是学了一点皮毛,如哪里有观点错误,或者看法片面或者其他任何建议,恳请告知,将不胜感激,我的邮箱:[email protected]。
感谢以上所有老师、平台,所有帮助过我的人,最后感谢我的女友。