一、初学者容易踩的 5 个深坑
1 心态易受学习状态的影响
初学者容易踩的第一个深坑就是心态不好。
有的人过于自信,多自己的学习能力深信不疑。但是当遇到非常困难的算法或者推理,容易受到打击,甚至气馁,长此以往,不断怀疑自己,容易产生消极情绪,甚至放弃。
有的人过于消极,觉得算法太难学了,刚开始学习时觉得就像天书一样,自乱阵脚,整天都在怀疑当中,影响心情,也影响学习进度。
以上这两种心态都应该尽量避免,算法是一门很深的学问,想要真正入门,可能需要很长时间,长则一年,短则半年。如此长的时间里,如果不能摆正心态,越到后面越容易焦虑,也越容易放弃。
叔本华说过:”事物本身并不影响人,人们只受对事物看法的影响“。
我们对事物的看法,会影响我们的心理,把困哪看作高山,我们就会胆怯;把问题看做鸿沟,我们就会退缩。但如果我们懂得调整思维,把这些困扰我们的障碍,看做是我们进步的源泉,我们就会乐于接受挑战。
当我们遇到某一个觉得比较难学的算法模型的时候,我们学了一遍甚至多遍仍不能很好的理解,也不要因此怀疑自己,要相信其实很多人跟你一样,大家都是这么慢慢一步一步走过来的,你可以给自己打气,你可以再学几遍,这样,你会比别人懂得更多,更深刻,以此来激励自己。
2 定位不准,三心二意
这里我想要先跟大家普及一个概念,深度学习是什么?很多初学者对深度学习一无所知,却在不停地找各种资料,堆积在自己的电脑或者云盘里,然后更加焦虑,我们要做到对一件事情有足够的了解,定位清晰,这样学起来才得心应手。
要想明白深度学习,你得先知道,深度学习,机器学习,人工智能之间的关系,各自包含哪些内容,便于你对自己的准确定位。
深度学习(deep learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。 深度学习是机器学习中一种基于对数据进行表征学习的算法,至今已有数种深度学习框架,如卷积神经网络、深度置信网络和递归神经网络等已被应用在计算机视觉、语音识别、自然语言处理、音频识别与生物信息学等领域并获取了极好的效果。
深度学习(Deep Learning)是利用多层神经网络结构,从大数据中学习现实世界中各类事物能直接用于计算机计算的表示形式(如图像中的事物、音频中的声音等),被认为是智能机器可能的“大脑结构”
Learning:让计算机自动调整函数参数以拟合想要的函数的过程
Deep:多个函数进行嵌套,构成一个多层神经网络,利用非监督贪心逐层训练算法调整有效地自动调整函数参数
简单地说深度学习就是:使用多层神经网络来进行机器学习。
了解了深度学习的大致概念,你得知道深度学习主要应用在哪些场景。语音识别,机器翻译,视觉翻译,图像识别,自动驾驶汽车,问答系统,自然语言处理等等领域。这里每一个领域的知识点都有区别,也有联系,而你首先在学习之前就得很清晰的知道,你要选择哪个领域,选择好了以后,就展开学习,万不可三心二意,好高骛远。
你学不完所有领域的知识,初学者最忌讳学得杂而不精。当你掌握了一个领域的知识,其它领域自然而然就了解甚至懂得如何做了,前期你要做的就是精于一个领域,深耕下去。
3 必须把数学知识都学懂才能学算法(线性代数,概率论,高数)
初学者还有一个比较容易犯的错误是,对数学的恐惧,觉得自己不懂数学,就害怕自己学不懂算法,不敢面对,不敢学。
所以很多人初学者非得把数学学了以后,才来开始看算法,要知道,数学知识其实也很多,那是大学要学至少 2 年的内容,常见的数学知识包括高等数学,微积分,线性代数,概率论。其实这些知识点你在大学和考研期间都学过了,只是你忘记了,在你重新学习某个模型原理的时候,你便可以重新拾起,根本不用从头再来一遍。
你怎么在短短的几个月内全部学完,而等你学了一部分,你便开始焦虑,觉得知识点太多,永无止尽。
我曾经就有过这样的焦虑,我不记得线性代数的知识了,不知道什么是「矩阵的秩」,我甚至一点印象都没有,我也不记得我当时在学哪一个模型了,偶尔看到一篇博客讲到这个知识点,我很懵逼,很慌,因为曾经有个大佬跟我提到过一个线代的教程,甚好,我脑子里立马浮现一个观点,我要把线性代数全部补一遍。就这么,我花了大概 2 周不眠不休的学习,总算把线性代数学完了。非常不巧的是,我学完以后,2 天就忘得一干二净,到现在,我还是不知道「矩阵的秩」是什么。
我举这个例子是想告诉大家,你学的东西忘记是很正常的,不要因此自乱阵脚,如果遇到我这种情况,千万不要像我一样,把所有都去学一遍,你可以单独找几篇博客把矩阵的秩看明白,然后回过头再去理解你那个模型,你的目的是把某一个算法模型原理学明白,而不是为了去学习数学知识的。
这可能是人的一种心理,人都喜欢去学习简单的,而忽略觉得难的知识点,让自己暂时放松,其实很多东西只是我们自己想得太难,而不敢面对,很多时候,直面困难,并没有那么难,都是心理作用而已。
4 把算法公式推了十多遍,却不跑代码,也不懂里面的底层原理
曾经的我就是这样一个人,因为听说师兄师姐,大佬们都在说,面试的时候面试官会让你手推算法原理,所以我异常重视算法的数学公式推导,想当初我把 XGBoost,SVM,手推了十几遍,甚至面试前都不用复习。RNN,LSTM,LDA,HMM,CRF 数学公式我都能轻松讲出来,其实都不能算是讲下来,我觉得推了十几遍,可以说的背下来了。
可是,有什么用呢?你知道这个模型用在什么场景吗?你知道他有哪些参数要调整吗?你知道它每个参数的意义吗?你知道要解决一个分类问题的时候,你应该选择什么模型吗?你知道模型的底层实现吗?你看过源码吗?
可能你除了知道一个模型原理,你可能什么都不知道,初学者都是这样,懂了一点,就下意识的觉得自己明白了,不懂得扩展。
这里提一点思路,当你把这个模型原理看懂以后,你还要再去做哪几件事情?
- 看懂原理以后,首先就要要直观的理解模型,那就去找几个 Demo 跑一跑,调调参,感受一下不同参数对结果的影响,这很重要,一定要亲手跑几个 Demo,帮助你理解模型很有帮助。
- 跑了代码以后,你对模型有了更深刻的认识,接着就可以看看模型源码,对源码的主要功能熟知,也许新手觉得太困难,但是一定有好处。
- 最好将你所学到的知识点记下来,否则你过几天就忘记了,方便自己复习。
- 如果这个模型有一些其他变种,比如 RNN,就有 LSTM,GRU 等,你可以将这几个进行比较学习,加深理解。
5 先深入,再发散
我觉得这个问题很多人都有,我前面也说过,人都喜欢先学简单的,难的总是最后才来面对,这是人的心理。
但是,发散学习这种方式我已经实践过了,效果并不好,我之前是先将所有的机器学习模型,深度学习模型原理有个大概了解,然后就自以为自己懂了,也没有深入思考和学习。直到我面试的时候,面试官问我很多问题我都没思考过,才知道自己学的多浅薄。
所以,要验证一个模型有没有学深,你可以从几点入手:模型原理,跑Demo,应用场景,优缺点,数学推导,模型源码及底层实现,模型间的比较,模型的一些补充知识点。如果你把这几个点都做到了,这个模型算是学得比较系统了。
二、4 个技能轻松入门深度学习
大脑具有深层结构
人体的大脑具有深层的结构,如被深入研究的视觉皮层,包含一系列的区域,每个区域都有输入信息,信号流从一个区域到下一个区域( 也有跳过连接或在某种程度上的并行路径,所以情况更复杂 )。在这种功能层次结构中,每个层次上的输入代表了不同层次的抽象特征,越底层的信息表征,抽象性越高,如图 (c) 所示。
值得注意的是,大脑中的表示是介于密集分布和纯局部之间,也就意味着它们是稀疏的:大脑中 1% 的神经元是同时活动的。
大脑的认知过程是深层次的
• 人们是使用层次化的方式来组织它们的想法和观念的
• 人们首先是学习简单的概念,然后将它们组合起来以表示更加抽象的概念
• 工程师们习惯于将解决问题的方案分解为多个层次的抽象和处理过程
如果能够像人一样学习到这些概念,那将会是非常棒的。知识工程(Knowledge Engineering)在这方面是失败的, 但语言表达概念的内省的方法也表明了稀疏表示:对于一个特定的输入(就像一幅视觉的图像), 仅仅只有一小部分的单词或概念是相关的。
构建深度学习的方法:人工神经网络
深度学习就是利用人工神经网络的特点,本身人工神经网络 (ANN) 就具有层次结构,如果给定一个神经网络,我们假设其输出与输入是相同的,然后训练调整其参数,得到每一层的权重,自然地,我们就得到了输入的几种不同表示 (每一层代表一种表示),这些表示就是特征。
既然前面讲到深度学习是利用层次结构的网络,对每一层进行非线性映射,那么久会涉及到数学,所以,数学必定是重中之重。
1 数学
高等数学,线性代数,微积分,概率与统计,这些都是曾经学过的,如果数学基础还算可以,就不需要像我前面讲的那样,从头来一遍,你学到某个模型,涉及到相应的知识点,补一下就行了。
高等数学里面比较重要的就是导数,极限,微分中值定理,泰勒公式,函数的单调性,凸优化等等。
线性代数本质是研究向量的,多维模型的多维参数一定要由向量来表示,并且很多空间问题都可以用向量理念抽象出来。
概率论是很多机器学习算法的基础,其实人在考虑问题的时候,不也在权衡各种可能结果,最终选择一个最优方案吗,像贝叶斯算法,Logit 算法,神经网络等都是机器用概率来权衡判断的。
2 python
为什么机器学习的框架都偏向于 python?我认为有几点吧。
简单易用,用户基础大: python 作为解释型语言,大大减少开发者工作量,写过代码的同学都清楚,这种易用性导致 python 庞大的用户群体及繁荣的社区。
丰富的第三方库: 尤其是目前机器学习,深度学习主流库都是 python 开发的,如Tensorflow,Keras,scikit-learn 等。
数据运算快捷:Pandas,Numpy,Scipy 等直接可以计算多维数组,数据分析极快。
虽然在性能方面比不上 c,c++,java 等语言,但在很大程度上确实大大减少了开发难度。
编程方面,工科生基本都学过一些编程语言的,基本直接上手 python 没什么问题。
python 入门教程如今网络真的是一抓一大把,而如果你本身就有编程基础,基本上不需要再额外学习 python,2 周差不多就能上手了。
3 方向
你学深度学习是要解决什么问题,这里我打个不恰当的比方。你要学哪个方向?
计算机视觉、语音识别、自然语言处理,推荐系统,问答系统,机器翻译。以这几个方向举例。
想当初我对自己定位不清晰,我真的是把很多领域都扫了一遍,当然,我每个领域学的都是半吊子。我刚开始觉得深度学习太难了,对自己定位是机器学习工程师,好不容易学完了,可能是学得不好吧,找工作也各种碰壁,于是有点气馁,不相信自己,或者怀疑自己方向选错了。遂换了推荐系统方向,看了一些推荐系统的原理,跑了几个项目,总以为自己好像懂了,于是又出去面试,面试官问的好多工业界问题都没听过,于是放弃,又换到深度学习的 NLP 方向,总是在各个方向徘徊,各种学习,看起来很忙,但是却成效不大。
虽然后面,也有点好处,我对机器学习,深度学习,推荐算法似乎都了解一点,但是太散,不精浪费了很多时间,所以想告诉大家,在学习之前一定要仔细斟酌,结合自己的特点,喜好选择一个方向,之后一定要坚持下去,不要轻易换方向。
4 实战
前面也讲到过,初学者容易犯的一个错误就是不爱写代码,对未知的恐惧,觉得项目太难理解,太难做,所以就先放到一边,到最后也没有写什么项目,也没有跑过多少代码。
在这里我要重点强调,一定要实战!
我曾经也在学习的时候不爱跑代码,看着老师敲就好了,眼睛都懂了,手不懂。这是很致命的,不敲代码,你就不会了解这个模型有哪些细节需要注意,有哪些深坑你要踩。比如举个例子,当你在学习 CNN 的时候,你看图片好像理解了 CNN 是如何做卷积,如何做池化的。但是你知道在网络中的输入是什么吗?输入的维度,卷积之后输出的维度是什么?也许你并不了解。
三、6 个网站,帮你找到学习教程和资料
1 菜菜的 sklearn 课堂
讲了这么多,总算讲到教程了,对于初学者,我强烈推荐的第一个教程是「菜菜的 sklearn 课堂 」,说实在的,我在学完了机器学习和深度学习才找到这个课程,真的对初学者有一种醍醐灌顶的感觉,菜菜将数学公式推导,原理讲解,案例全部包含在课程中,可以说是目前最全最详细的一个教程了,真的是业界良心啊。
https://study.163.com/course/introduction/1006536008.htm
来个图感受一下,你真的无法在其他教程中能找到对 决策树 如此详细的教程了。包括了原理,实现,调参,实战。
2 动手学深度
李沐,亚马逊首席(principal)科学家,美国卡内基梅隆大学计算机系博士。从 ACM 班、百度到亚马逊,深度学习大牛。
这是深度学习首页简介,《动手学深度》面向中文读者的能运行、可讨论的深度学习教科书,有视频教程,文档,代码,社区,遇到问题都可以讨论。
这里截取一部分课程目录,可以说是相当完整的。
3 斯坦福大学课程
CS231n 近几年一直是计算机视觉领域和深度学习领域最为经典的课程之一,本课程从计算机视觉的基础概念开始,在奠定了基本分类模型、神经网络和优化算法的基础后,详细介绍了 CNN、RNN、GAN、RL 等深度模型在计算机视觉上的应用。斯坦福已经开放了该课程的全部视频,并且还有配套英文字幕。
斯坦福大学的 CS231n 和 CS224n。CS231n 专注于计算机视觉的深度学习,而 CS224n 专注于序列建模。
4 哔哩哔哩
bilibili 作为国内最受年轻人喜欢的视频站点,网站拥有各种各样新奇大胆,脑洞大开的视频,以及一批又一批努力勤奋的 UP 主每天辛勤的更新。关键是,视频高清,没有广告,一次看个爽。
哔哩哔哩上涉及范围特别广,各类教程都非常多,比如你要学数学,直接搜高数,线性代数,就有你想要的答案。比如你想学深度学习,直接搜。
还有一个就是Youtube,Youtube 是全球最大的视频网站,跟哔哩哔哩类似,但是需要翻墙,也是一样,想要什么,直接搜就是了。
5 吴恩达的深度学习课程
这是深度学习工程师微专业中的第一门课,这门课将为你介绍深度学习的基础知识,学完这门课,你将能够:
理解驱动深度学习的主要技术趋势。
能够搭建、训练并且运用全连接的深层神经网络。
了解如何实现高效的(向量化)的神经网络。
理解神经网络架构中的关键参数。
这门课将会详尽地介绍深度学习的基本原理,而不仅仅只进行理论概述。
6 数据比赛
除了大名鼎鼎的 kaggle,数据科学家可以参加的数据竞赛平台其实还蛮多的,当然下面只是列举了一部分,你还可以去搜索,比如下面这些:
Kaggle:https://link.zhihu.com/?target=https%3A//www.kaggle.com/
天池:https://link.zhihu.com/?target=https%3A//tianchi.aliyun.com/home/
数据城堡:https://link.zhihu.com/?target=http%3A//www.pkbigdata.com/
DrivenData:https://link.zhihu.com/?target=https%3A//www.drivendata.org/
Codalab:https://link.zhihu.com/?target=https%3A//competitions.codalab.org/
Challenge Data:https://link.zhihu.com/?target=https%3A//challengedata.ens.fr/
crowdAI:https://link.zhihu.com/?target=https%3A//www.crowdai.org/
参加这些比赛可以说是有百利而无一害,它里里外外的好处有很多,比如:
- 这是一个学习的好机会;
- 可以接触当前最佳的方法和数据集;
- 可以和志同道合的人交往,团队合作很棒的地方在于可以从不同角度思考问题;
- 可以向世界展现你的才华,从而获得更好的就职机会;
- 参与并了解自己在排行榜上的表现也很好玩;
- 还有奖品作为额外福利,但不应把它作为唯一的标准。
别害怕不懂,每个人都是从菜鸟开始的,刚开始可以从已经打过的比赛开始尝试,因为有很多比赛的开源代码,数据都有,实战才能进步更快。
四、实战,是掌握一门技术亘古不变的真理
既然我将实战单独拿出来讲,足以说明其重要性,俗话说:实践是检验真理的唯一标准!
当你学完了某个知识点的时候,一定要用代码验证一下,在实战过程中会遇到很多 Bug,此时就是你学习的时候,只有你真的明白了其中的原理,你才能在项目实现上游刃有余,在工作中就能少写 bug。
五、持续精进,你需要做到这 4 点
想要持续精进,你得学会持续学习,现在我们很多人,工作之后一忙起来,就忘了曾经的梦想。
我刚入门深度学习的时候,总是幻想着,上班以后,我也要好好学习,把这些漏掉的知识点全部都补回来。总是想着我要怎么怎么学习,可真正当我工作以后,便再也没有当初的那种学习热情了。
一方面是压力小了,学习的时候担心找不到好工作,没有钱,所以一定要学,也必须要学,紧急程度都不一样,这是必须要做的。
一方面是真正忙起来了,心态也不一样,每当下班的时候,什么都不想,只想看看短视频,看看自己喜欢的东西放松放松,这一看就是一晚上,时间就这么一点一点浪费了。
也尝试过要改变,执行力和学生时期完全不一样,学校可以纯粹的学习某个知识点,时间很多,每天学一点,工作精力分散,容易放弃,事情杂。
其实很多人都有这个问题,道理都懂,但就是做不到啊。
为了持续精进,我们可以指定一系列的计划。
1 时间分配
想要持续精进,首先你得有时间,时间都是靠挤出来的,很多人上班说自己没时间,其实都是找借口,包括我自己也一样。你想想你领导,想想你老板,人家比你忙,为什么还有时间去做别的。我领导就是,一边上班,一边还有自己的家业要管理,好几个子公司,他还能在我们公司当总监,管理几十人的团队。工作能力太强了,学习能力也强,人也好。
很多人其实白天基本上是没时间的,白天上班,下班虽然有时间,但是经过白天一天的消耗,晚上效率并不高,而每天早晨精力却很充沛,用来学习非常好。
所以建议每天抽出 2 小时时间学习,最好是早上,这样你就不用担心晚上下班不想学习了。
2 目标明确
想要精进,你就要针对你遗漏的知识进行补充,这时候就不能再泛泛的学,对于某一个知识点,就应该精深。
比如你最近工作中要用到一个什么模型,你觉得你学得不是很好,你就可以在下班时间补一补,最好记点笔记什么的。或者你觉得你编码能力比较弱,可以每天刷一个 Leetcode,如果没时间,可以几天一题,但不能放弃。
如果你觉得实战比较差,你就可以找一些比赛来做,参与在其中,长此以往,能力自然就上去了,而且还能结实一些志同道合的朋友。
3 学习方法
很多时候,我们学习都只学给自己看,其实并不清楚自己学的怎么样,你可以将你学习的知识点分享出来,有人看到你这篇文章,人家觉得你写得好,说明你确实掌握了,如果有人给你提出建议,那你就可以调整。
著名的费曼学习方法就是这样,通过向别人讲清楚一件事,来确定自己是否真的弄懂。而且你分享出来,也可以在一定程度上增加你的知名度,正向帮助你。
如何利用费曼学习提高你的学习效率
- 选择一个你要理解的概念,然后拿出白纸,在这个概念写在白纸的最上边。
- 设想一种场景,你要向别人传授这个概念,在白纸上写下这个概念,就像你在教小白一样,这样你会更清楚的知道这个概念你理解多少。
- 如果觉得卡壳了,就再去回顾一下这个知识点,直到领悟为止。
- 为了让你的讲解更通俗易懂,简化语言表达,如果你的语言冗长或令人迷惑,说明你没有理解顺畅,你要努力表达更加简单,甚至建立一些类比关系,便于更好的理解。
也许你没有听众愿意听你表达,你就可以将它写成文章,发表出去,让所有看到这篇文章的人,给你建议,你总会知道最后你写的如何。
真正的学习高手,是有系统思维的人。如果我们想真正做到自我实现,你需要的不是目标管理,而是系统思维。
从系统性思维来看,我会认为学习是一个比较复杂的系统,它是一个从输入到输出的完整闭环,需要你从信息收集环节到知识加工整理,再到建立个人体系内化,创造性的应用解决具体问题。
建议大家去看看这本书《思维力:高效的系统思维》,这是目前我认为对系统思维讲述最清楚的一本书,本书上这么说:简化后的系统思维,就是通过选择,改善或构建框架,从而更快速,全面,深入地思考问题。
一个简单的不恰当的比喻:假如你要看一本书,你最好先了解下这本书的目录,目录是这本书内容的概括,也是这本书的框架,你要知道这本书的框架是什么,然后再带着目录的疑问去学习其中的知识点。
读书跟学习是一样的,你要先构建知识框架,然后对各个框架去各个击破,等你把框架中的知识点了解清楚了,你再回过头来看框架,你会形成一个系统的学习闭环。
4 记录知识,学会分享
前面我讲费曼学习方法的时候,提到过,当你觉得你对某一个知识点学明白的时候,最好能花点时间将你学到的知识点写成笔记,完完整整的记录学习过程,踩的坑,以及需要注意的地方,这不仅是帮你深化理解,也可以提高你的表达能力,如果在写作过程中,你发现某个知识点卡壳了,你就再去学习,这样反复,你就会对这个知识点有更深刻的理解。
而且这是一个正向循环,当你分享出去的时候,如果读者看到这篇文章觉得写得很好,你会觉得有成就感,并且更加愿意分享,如果有不好的地方,帮助你改进,你还可以因此结实更多志同道合的朋友,甚至收获很多粉丝,真的算是百利而无一害了。
如果您觉得文章对您有帮助,欢迎点赞,转发,评论,关注个人公众号。