深度学习从零开始(1)— 如何学习深度学习?

首先说我个人的结论:

(1)假如是为了找工作,或者短时间内解决问题,我建议最好的入门书是:《Python 深度学习》《Scikit-Learn与TensorFlow机器学习实用指南(影印版)》《TensorFlow:实战Google深度学习框架(第2版)》,三本书都是该领域的经典,而且难得的是非常易读,看完就可以利用经典的机器学习和深度学习算法解决常见的问题。

(2)假如想长期学习,深入理解深度学习的原理,并想进一步研究的话。我的建议是自己从零开始不借助任何框架,写一个自己的卷积神经网络。此后再理论和实践两把抓。不要一上来就啃艰深的理论,也不要一直用深度学习的框架,做一个“调包侠”。

转眼间,学习深度学习也已经两年了。也用一些框架写了不少算法,做过不少实践,出了一些论文。但是回顾学习历程,我总觉两脚不着地,不踏实。这种不踏实并没有因为框架用得熟练,项目做多了而逐渐消散,反而经常因为触碰到一些比较深的问题而感到不安。记得2017年,在网上学习了卷积自编码器,自己想将一维卷积自编码器用在时域信号的去噪处理中。在一维卷积自编码器中,要用到一个叫做反卷积的方法,我当时所用的Tensorflow 最新版本还没有一维反卷积这个方法。于是我便自己尝试这个方法,但是由于做“调包侠”久了,写了一个星期的代码还是bug不断,不得已就放弃了。

除了这种自己造轮子的场景,还有用轮子也出现不少问题。我们知道,无论在机器学习还是深度学习,最为关键的就是调参。人言“三分算法,七分调参”不是虚言。但是要练好这调参神功却是不易,学习率要如何设置?要采用什么参数更新方法(SGD,AdaGrad,Adam...)? Batch Normalization 要不要用?选用那种正则化方法?这些都不是看Tensorflow 文档能得到答案的。因此,要想砖搬得好,我意识到看那些光讲框架的书,还有网上的一些实践案例(手写字体识别,风格迁移,图像生成...)是远远不够的。表面上看,看完这些教程和案例,你就可以上手做很多实践。能快速上手当然是好事,但是就像我开头说的那边,这样学到的深度学习充其量不过是“调包侠”而已,要说入门深度学习,还差得甚远。

问题出在哪呢?很显然,是对深度学习的理论理解的不够。理论当然很艰难,但是“欲诣扶桑,非舟莫适”,没有理论的加持,在深度学习这条路上不可能走得远。所以,我们要开始啃那些艰深的大块头了吗?周志华的西瓜书,深度学习花书我都怀着一百二十分的热情买来,但是在几个月之后就放在书架里吃灰了。这当然是我的毅力不济,但是既然已经如此,除了放弃之外,还有没有办法入深度学习这个门呢?

要想彻底理解一个东西,最好的办法就是自己从零开始把它做出来。而在理论的学习过程中,恰恰缺失的是这个做的过程。由于我主要研究卷积神经网络,所以后来我一直在网上找各种博客,学习如何从零开始写一个卷积神经网络。但是在学习的过程中我发现,虽然大部分博客都实现了这个目的,但是解释确比较简略,对于我这种还没有入门的人来说,看得非常痛苦。比如深度学习中最重要的反向传播算法,大部分博客都只是给一个结果,至于代码后面的原理,却很少能讲清楚的。直到后来我看到一本书《深度学习入门——基于Python 的理论与实现》之后,我才有一种恍然大悟的感觉,算是对探索深入学习的本质有了更多的信心。

因此,我把这个学习的过程记录下来,这个系列博客大部分是根据《深度学习入门——基于Python 的理论与实现》而来,当然也会补充我自己的一些心得。假如你想深度地理解深度学习,而不想仅限于做一个“调包侠”,那么这个系列博客应该是对你有所帮助的。当然这个系列博客是我自己学习历程的一个记录,它是一个学习的开始,假如你对深度学习好奇,想理解深度学习的本质,乃至于你想更好地用好深度学习这个工具,我邀请你一同加入到深度学习的原理学习中来。写这篇博客的目的也是为了和同道者交流,希望各位朋友不吝赐教。假如它对你有所启发的话,将是我的一大快乐。

在这个系列博客中,第一步的目标就是利用Python不借助任何深度学习框架,写出一个卷积神经网络(LeNet-5)。在第一步的学习过程中,把所涉及的知识点都理解透彻并用代码加以实现——网络建立、前向传播、反向传播、梯度下降、模型训练、模型测试等等。

在完成第一步的学习之后,相信对深度学习的一系列问题有了直觉上的理解,并且知道深度学习的各部分的实现。在第二步中,我们可以放心地使用深度学习框架,因为我们已经知道了深度学习框架的内部原理。所以,在第二步中,我们会使用深度学习框架实践一些更为复杂的案例(图像识别、语音识别、翻译等),并且像论文一样,进行一定深度地探讨。

在第二步进行的同时,为了实践和理论两者不偏废,我们也会进行理论的学习,这部分的学习包括大部分深度学习所涉及的数学知识——损失函数、链式求导、最大似然估计、降维、流形学习等等。我相信理论的学习和实践是相互助益的。同时,实践和理论的学习也是无止境的,我希望第二步和第三步的学习可以一直进行下去,这意味着我希望这个系列博客可以一直更新下去,也希望与诸位有志于学习深度学习的朋友共勉。

当然,以上的话是写给想长期学习深度学习的朋友看的。假如想短期内应用深度学习解决问题的话,上述的方法就不甚妥当了。我觉得假如想短期内实现一些算法,用在自己的项目的话,最好的入门书是入门书是《TensorFlow:实战Google深度学习框架(第2版)》和《Scikit-Learn与TensorFlow机器学习实用指南》,前者看完基本上能用Tensorflow 写基本的深度学习模型,后者则兼顾机器学习和深度学习,我认为它是机器学习领域内最好的一本入门书,有很强的实践性,同时也兼顾了一些基本的理论。不管学习深浅,我觉得入门是非常重要的,一本好的入门书不仅把知识点讲到,而且还给读者带来极大的热情,我认为上面两本书都做到了。我也很感谢书的作者,在我学习备受挫折的时候给我了很多引导和信心,让我现在可以充满热情继续学习下去。

在接下来的三章中,我会用Python语言从零开始构建自己的卷积神经网络,不借助任何深度学习库。在编写完成之后,可以实现一个深度学习算法的基本要素,从而对原理有一个深入的认识。在这三章的介绍中,我们先从最初的感知机开始,再到普通的三层神经网络,最后到卷积神经网络。在这个过程中,我也将对深度学习中最关键的激活函数、梯度下降、反向传播、损失函数等一一介绍并实现。在这部分中,我力求简易,不跳过任何步骤,做到有基本的高等数学知识就能轻松读懂。

民国大师马一浮在一次书院的讲记中曾说过:“天下之道,常变而已矣。唯知常而后能应变,语变乃所以显常。” 我以为,无论是深度学习还是其他领域,理论即是常,实践即是变。让我们一起学常,知常而应变!

发布了9 篇原创文章 · 获赞 18 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u012995500/article/details/87528681