最近,我把《深度学习》这本书又重读了一遍。
这本书,是深度学习领域的经典之作,由Ian Goodfellow、Yoshua Bengio和Aaron Courville三位大牛合著,2016年出版。书的封面是深蓝色的,上面印着"Deep Learning"几个大字,业内人都叫它"花书",因为封面上有一个抽象的花朵图案。
第一次读这本书是在五年前。那时候我刚接触深度学习,很多概念都不懂,读起来很吃力。很多章节看了好几遍都看不懂,只能囫囵吞枣,记个大概。那时候读完感觉自己学了很多,但又好像什么都没懂,脑子里一团浆糊。
这五年里我一直在做AI相关的工作,从最开始的调参、训练模型,到后来的算法设计、系统架构,积累了不少实践经验。这期间深度学习领域也发生了翻天覆地的变化,从CNN、RNN到Transformer,从监督学习到自监督学习,从大模型到多模态,技术迭代得非常快。
这次重读《深度学习》我发现自己有了完全不同的理解。很多以前看不懂的内容现在一看就懂了;很多以前觉得没用的章节现在发现非常重要;很多以前死记硬背的公式现在终于理解了背后的直觉和意义。
这篇文章,我想分享一下重读《深度学习》的感悟和收获。从第一次读的困惑,到实践后的理解,再到重读时的新发现,聊聊深度学习的本质、发展和未来,以及读书和实践的关系。如果你也读过这本书,或者正在学习深度学习,希望这篇文章能引起你的共鸣,给你一些启发。
第一次读:困惑和囫囵吞枣
先回忆一下第一次读这本书的经历。
五年前,我刚转行做AI,那时候深度学习很火,大家都在学。我买了这本书,想着系统地学一下深度学习。书到手的时候,很激动,觉得这是一本"圣经",读完就能成为深度学习专家。
但真正开始读的时候,才发现这本书有多难。
书的第一部分是应用数学与机器学习基础。里面有线性代数、概率与信息论、数值计算、机器学习基础。这些内容虽然以前上学的时候学过,但早就忘得差不多了。而且书里讲得很简略,很多公式直接就给出来了,没有太多的推导和解释。我看的时候经常是公式认识每个字,但连起来就不知道在说什么。
比如奇异值分解(SVD),以前学线性代数的时候学过,但早就忘了。书里直接说"奇异值分解是将矩阵分解为奇异向量和奇异值",然后给了公式。我看了半天还是不知道SVD到底是干什么的,为什么要分解,分解了有什么用。只能死记硬背,记住有这么个东西。
第二部分是深度网络的现代实践。里面讲了深度前馈网络、深度模型的正则化、优化算法、卷积网络、序列建模的递归网络等。这部分相对实用一些,但也有很多看不懂的地方。
比如反向传播算法,以前只知道是用来算梯度的,但具体怎么算,为什么这么算一直没搞懂。书里讲了反向传播的推导,有很多公式,我看了好几遍还是似懂非懂。只能记住"链式法则"这几个字,具体怎么链式就不清楚了。
还有优化算法,SGD、Momentum、AdaGrad、RMSProp、Adam,这些算法我只知道名字,知道大概是怎么回事,但为什么这些算法有效,它们之间的区别是什么,什么时候该用哪个完全没概念。只能记住"Adam一般效果最好,用Adam就行"。
第三部分是深度学习研究。里面讲了线性因子模型、自编码器、表示学习、结构化概率模型、蒙特卡洛方法、配分函数、近似推断、深度生成模型等。这部分是最抽象、最难懂的。
比如变分自编码器(VAE),书里讲了变分推断,有ELBO、KL散度、重参数化技巧等概念。我看的时候完全是云里雾里,不知道在说什么。只能记住VAE是一种生成模型,可以生成图片,但具体原理是什么完全不懂。
还有生成对抗网络(GAN),那时候GAN刚火起来,书里有一章讲了GAN。我看的时候只知道GAN有一个生成器和一个判别器,两者互相对抗,但为什么对抗就能生成好的图片,背后的数学原理是什么完全没搞懂。
第一次读这本书,我花了大概三个月,才勉强读完。读完之后,感觉自己学了很多概念,记住了很多名词,但真正理解的很少。很多内容,都是囫囵吞枣,死记硬背。那时候,我甚至怀疑自己是不是不适合做AI,这么基础的书都看不懂。
现在回头看,第一次读不懂,其实很正常。因为那时候,我既没有足够的数学基础,也没有实践经验,很多概念对我来说,都是抽象的、没有意义的符号。没有实践的支撑,理论就像是空中楼阁,看不懂、记不住、用不上。
实践中的理解:从用来到理解
第一次读完之后我就开始了深度学习的实践工作。这五年里我做了很多项目,从最基础的图像分类、目标检测,到后来的自然语言处理、推荐系统,再到现在的大模型应用。
在实践的过程中我慢慢对深度学习有了更深入的理解。很多以前在书里看不懂的概念,在实践中遇到了、用了、踩过坑了就突然懂了。
比如反向传播算法。最开始做项目的时候我用的是TensorFlow和PyTorch这些框架,自动求导,根本不需要自己写反向传播。所以反向传播对我来说一直是个黑盒。
直到有一次我需要实现一个自定义的层,框架里没有现成的,需要自己写前向和反向传播。那时候我不得不去搞懂反向传播到底是怎么回事。我找了很多资料,看了很多教程,然后自己动手用numpy实现了一个简单的神经网络的前向和反向传播。
当我亲手写出反向传播的代码,看着梯度一层一层地传回去,损失函数一点点下降的时候我突然就懂了反向传播。原来它就是链式法则的应用,从输出层开始一层一层地算梯度,把误差传回去。以前觉得很复杂、很神秘的算法原来就是这么回事。
从那以后我对反向传播的理解就不再是书本上的公式了,而是一种直觉。我知道梯度是怎么流的,知道为什么梯度会消失,知道为什么会梯度爆炸,知道怎么去诊断和解决这些问题。
再比如优化算法。最开始做项目的时候我都是直接用Adam,因为大家都说Adam效果好。但后来我发现有些场景下Adam的效果并不好,比如训练生成对抗网络的时候Adam容易不稳定;比如做一些精细的微调的时候SGD+Momentum的泛化效果更好。
这时候我再回头去看优化算法的内容就有了更深的理解。我明白了Momentum是为了解决SGD收敛慢、在峡谷里震荡的问题;AdaGrad是为了自适应地调整每个参数的学习率,但学习率会越来越小;RMSProp改进了AdaGrad,用指数移动平均来累积梯度平方,避免学习率下降太快;Adam结合了Momentum和RMSProp,既有动量又有自适应学习率。
理解了这些算法背后的动机和原理,我在选择优化算法的时候就不再是盲目地用Adam了,而是会根据具体的问题和模型选择合适的优化算法,调整合适的超参数。
再比如正则化。最开始的时候我只知道L2正则化可以防止过拟合,就是在损失函数后面加一个权重的平方和。但为什么加了这个就能防止过拟合,其他正则化方法是怎么回事一直没搞懂。
后来做项目的时候经常遇到过拟合的问题。训练集上效果很好,验证集上效果很差。我尝试了各种方法来解决过拟合:L2正则化、Dropout、数据增强、早停、减小模型容量。在这个过程中我慢慢理解了各种正则化方法的本质和区别。
这时候再回头看书里关于正则化的章节就觉得非常透彻。我明白了正则化的本质是通过给模型加约束,降低模型的容量,防止模型记住训练数据的噪声,从而提升泛化能力。L2正则化是通过约束权重的大小,Dropout是通过随机丢弃神经元来防止神经元之间的共适应,数据增强是通过增加数据的多样性来让模型学到更鲁棒的特征。
实践真的是最好的老师。很多在书里看不懂的概念,在实践中用了、踩坑了、解决了就自然懂了。这时候书本上的知识就不再是抽象的符号,而是有血有肉的经验和直觉。
重读:完全不同的理解
有了这五年的实践经验,这次重读《深度学习》,我有了完全不同的理解。
第一个不同是,以前看不懂的,现在一看就懂了。
比如,第一部分的数学基础。以前看线性代数、概率统计,觉得很抽象,不知道这些数学有什么用。现在再看,就觉得很亲切,因为这些数学,在实践中天天都在用。
看线性代数的时候,我会想到,神经网络里的前向传播,就是矩阵乘法;特征值分解,就是把矩阵分解到特征向量的方向上,在PCA里会用到;奇异值分解,在推荐系统、降维里会用到。这些数学,不再是抽象的公式,而是解决实际问题的工具。
看概率统计的时候,我会想到,机器学习本质上就是在建模概率分布;最大似然估计,就是让训练数据出现的概率最大;交叉熵损失,本质上就是预测分布和真实分布的KL散度;贝叶斯方法,就是把先验知识和观测数据结合起来,得到后验分布。这些概念,在实践中天天都在接触,现在再看理论,就觉得非常清晰。
第二个不同是,以前觉得没用的,现在发现非常重要。
比如,数值计算这一章。第一次读的时候,我觉得这章很无聊,讲的是上溢、下溢、病态条件这些东西,觉得和深度学习没什么关系,跳过了。
这次重读,我发现这章非常重要。深度学习里,很多问题,本质上都是数值计算的问题。比如,训练的时候损失变成NaN,往往就是因为上溢或者下溢;比如,梯度消失和梯度爆炸,本质上就是数值不稳定;比如,为什么要用softmax而不是直接用指数,就是为了避免上溢。
理解了数值计算的这些问题,我在遇到训练不稳定的时候,就知道从哪里去排查,怎么去解决。比如,损失变成NaN了,我会去检查是不是学习率太大了,是不是数据有问题,是不是某个地方除零了,是不是用了不稳定的激活函数。这些,都和数值计算有关。
再比如,机器学习基础这一章。第一次读的时候,我觉得这章太基础了,讲的是欠拟合、过拟合、偏差、方差、泛化误差这些概念,觉得自己都懂了,没仔细看。
这次重读,我发现这些基础概念,其实是深度学习的核心。很多人做深度学习,只关心模型结构、超参数调优,但忽略了最基础的机器学习原理。比如,为什么训练集和测试集要分开?为什么要做交叉验证?偏差和方差怎么权衡?这些问题,看起来基础,但很多人其实并没有真正理解,在实践中经常犯错误。
理解了这些基础概念,你在做项目的时候,就会有更清晰的思路。比如,模型效果不好,你会先判断是欠拟合还是过拟合,然后针对性地解决,而不是盲目地调参、换模型。
第三个不同是,以前死记硬背的,现在理解了背后的直觉。
比如,各种激活函数。第一次读的时候,我只记住了sigmoid、tanh、ReLU这些名字和公式,不知道为什么要用这些激活函数,它们之间有什么区别。
这次重读,我理解了激活函数的本质,就是给神经网络引入非线性。如果没有激活函数,不管神经网络有多少层,都等价于一个线性变换,没有办法拟合复杂的函数。而不同的激活函数,有不同的特性,适用于不同的场景。
sigmoid可以把输出压缩到0到1之间,适合做二分类的输出层,但容易梯度消失,而且输出不是零中心的;tanh输出是零中心的,但还是容易梯度消失;ReLU计算简单,缓解了梯度消失问题,是最常用的激活函数,但有"死亡ReLU"的问题;Leaky ReLU、PReLU、ELU这些,都是为了解决ReLU的问题。
理解了这些背后的直觉,我在选择激活函数的时候,就不再是随便选一个了,而是会根据具体的问题和场景,选择合适的激活函数。遇到激活函数相关的问题,也知道怎么去分析和解决。
再比如,卷积神经网络。第一次读的时候,我只知道CNN有卷积层、池化层、全连接层,知道CNN适合处理图像,但为什么卷积有效,为什么要池化,一直没搞懂。
这次重读,我理解了CNN的核心思想,就是参数共享和局部连接。图像有两个重要的特性:一是局部相关性,相邻的像素关系密切,远处的像素关系不大;二是平移不变性,同一个特征,不管出现在图像的哪个位置,都是同一个特征。
卷积就是利用了这两个特性。局部连接,每个神经元只和局部的区域连接,大大减少了参数数量;参数共享,同一个卷积核在整个图像上滑动,检测同一个特征,进一步减少了参数,也保证了平移不变性。池化,是为了降低特征图的尺寸,减少计算量,同时提供一定的平移不变性。
理解了这些本质,我在设计CNN结构的时候,就不再是盲目地堆层了,而是会根据问题的特点,合理地设计卷积核大小、步长、通道数,知道什么时候该用池化,什么时候该用空洞卷积,什么时候该用残差连接。
第四个不同是,对深度学习的发展和未来,有了更清晰的认识。
这本书是2016年出版的,那时候,深度学习还在CNN和RNN的时代,Transformer还没出来,大模型还没火起来。书里讲的很多内容,现在看来已经有些"过时"了。比如,序列建模主要讲的是RNN、LSTM、GRU,没有讲Transformer;生成模型主要讲的是VAE、GAN,没有讲扩散模型;表示学习主要讲的是自编码器,没有讲自监督学习和对比学习。
但这次重读,我发现,虽然具体的技术变了,但深度学习的基本原理和思想,并没有变。Transformer的核心,还是注意力机制和残差连接,这些在书里都有讲到;大模型的核心,还是表示学习和自监督学习,书里也有专门的章节讲表示学习;扩散模型的核心,还是概率建模和变分推断,书里也有讲结构化概率模型和近似推断。
技术会迭代,模型会更新,但底层的原理和思想,是相通的。理解了这些底层的原理,不管技术怎么变,你都能快速理解新的技术,跟上发展的步伐。这也是经典书籍的价值所在,它教你的不是具体的技术,而是底层的思想和方法。
深度学习的本质:我的理解
重读这本书,结合这五年的实践,我对深度学习的本质,也有了一些自己的理解。
第一,深度学习的本质,是表示学习。
传统的机器学习,需要人工设计特征,然后把特征喂给模型。这个过程,叫特征工程,很依赖人的经验和领域知识,而且效果往往有上限。
深度学习的不同之处,在于它可以自动学习特征。从原始数据开始,一层一层地提取特征,从低级的特征,到高级的特征,最后到任务需要的表示。比如,在图像识别里,第一层学习边缘,第二层学习纹理,第三层学习部件,最后一层学习整个物体。这个过程,不需要人工设计特征,模型自己就能学到好的表示。
所以,深度学习的本质,就是表示学习。好的表示,能让后续的任务变得简单。这也是为什么深度学习在很多任务上效果这么好,因为它能学到比人工设计更好的特征。
这几年,自监督学习、预训练大模型的兴起,本质上也是在学更好的表示。用大量的无标注数据,预训练一个大模型,让它学到通用的表示,然后在下游任务上微调。这种方式,比在特定任务上从零开始训练,效果好很多,因为预训练学到的表示,更通用、更鲁棒。
第二,深度学习是经验主义的,不是纯理论的。
深度学习的理论,其实还很不完善。很多时候,我们知道怎么做有效,但不知道为什么有效。比如,为什么深度神经网络能泛化得这么好?按照传统的统计学习理论,参数这么多的模型,应该会过拟合,但实际上,深度神经网络的泛化能力很强。这个问题,到现在还没有完美的理论解释。
所以,深度学习更多是经验主义的。很多方法,都是先在实践中发现有效,然后再去研究理论解释。比如,ReLU、Dropout、残差连接、Batch Normalization,这些都是先在实践中用起来,发现效果好,然后才有了各种理论解释。
这就意味着,做深度学习,不能只看书本上的理论,一定要多实践,多动手。很多东西,你在书里看了,觉得懂了,但真正动手做的时候,会发现很多问题,会有很多新的理解。实践出真知,在深度学习领域,这句话尤其正确。
第三,深度学习是工程和算法的结合。
很多人觉得,深度学习就是搞算法,就是设计模型结构、调超参数。但实际上,深度学习的工程能力,非常重要。
一个模型,能不能训练起来,能不能训练得快,能不能稳定地收敛,能不能部署上线,这些都是工程问题。比如,分布式训练、混合精度训练、梯度累积、模型并行、数据并行,这些都是工程技术。没有这些工程技术,大模型根本训练不起来。
而且,很多算法的创新,其实是被工程推动的。比如,Transformer之所以能取代RNN,一个重要原因是Transformer可以并行计算,训练效率高,而RNN是串行的,训练慢。工程上的优势,让Transformer得到了广泛的应用,然后大家才发现它在效果上也很好。
所以,做深度学习,既要懂算法,也要懂工程。只懂算法不懂工程,很多想法实现不了,或者效率很低;只懂工程不懂算法,就只能做调参和部署的工作,很难有创新。两者结合,才能做好深度学习。
第四,深度学习的发展,是数据、算力、算法三者的共同推动。
深度学习这十年的快速发展,离不开数据、算力、算法这三个因素。
数据方面,互联网的发展,积累了大量的数据,图像、文本、视频,这些数据是训练深度学习模型的基础。没有大量的数据,深度学习就无从谈起。
算力方面,GPU的发展,让大规模并行计算成为可能,训练深度神经网络的速度大大提升。以前训练一个模型要几个月,现在有了GPU集群,几天就能训练完。算力的提升,让训练更大的模型成为可能。
算法方面,从CNN到RNN到Transformer,从监督学习到自监督学习,从生成模型到强化学习,算法的不断创新,让深度学习的效果越来越好,应用场景越来越广。
这三个因素,互相促进,共同推动了深度学习的发展。数据多了,需要更大的模型,就需要更强的算力;算力强了,能训练更大的模型,就需要更好的算法;算法好了,效果好了,就会有更多的应用,产生更多的数据。这样的正向循环,让深度学习发展得越来越快。
读书和实践的关系
重读这本书,也让我对读书和实践的关系,有了更深的思考。
很多人学习深度学习,会陷入两个极端。
一个极端是,只读书,不实践。买了很多书,看了很多教程,记住了很多概念和公式,但从来不动手写代码,从来不去训练一个模型。这样的学习,是纸上谈兵,看起来学了很多,但实际上什么都没懂。遇到实际问题,还是不知道怎么解决。
另一个极端是,只实践,不读书。天天调参、跑实验,积累了一些经验,但从来不系统地学习理论,不知道为什么这么做有效,也不知道还有什么更好的方法。这样的人,容易遇到瓶颈,只能做一些重复性的工作,很难有大的提升。
正确的做法,是读书和实践相结合。
读书,是为了建立系统的知识体系,理解底层的原理和思想。没有理论的指导,实践就是盲目的,只能靠试错,效率很低,也很难有深入的理解。
实践,是为了把书本上的知识,变成自己的经验和直觉。没有实践的支撑,理论就是抽象的,看不懂,记不住,用不上。
最好的学习方式,是"读书-实践-再读书-再实践"的循环。先读书,建立基本的概念和框架;然后去实践,在实践中遇到问题,加深理解;然后再读书,这时候,你会发现以前看不懂的内容,现在一看就懂了,以前觉得没用的内容,现在发现非常重要;然后再去实践,用新的理解去指导实践,提升实践的水平。这样循环往复,不断提升。
我自己的学习过程,就是这样的循环。第一次读《深度学习》,建立了基本的概念,但很多不懂;然后去实践,在实践中积累了经验,加深了理解;这次重读,有了完全不同的理解,很多以前不懂的都懂了;接下来,我会用这些新的理解,去指导我的实践,在实践中继续学习和提升。
而且,经典的书,值得反复读。每一次读,因为你的经验和理解不同,都会有不同的收获。第一次读,你可能只能看懂30%;实践一段时间再读,能看懂60%;再实践一段时间再读,能看懂90%。每一次重读,都是一次新的学习,都会有新的收获。
所以,不要觉得一本书读完了,就完事了。经典的书,要放在手边,时不时地翻一翻,重读一下。你会发现,每次重读,都有新的感悟,新的收获。
深度学习的未来:我的看法
最后,结合重读这本书的感悟,聊聊我对深度学习未来的看法。
第一,模型会越来越大,但大不是唯一的方向。
这几年,大模型很火,参数从几亿到几十亿,到几百亿,到上千亿,越来越大。大模型确实效果很好,涌现出了很多能力。但模型越来越大,也带来了很多问题,比如训练成本太高,推理成本太高,能耗太大,不是所有人都能用得起。
未来,模型会继续变大,但大不是唯一的方向。同时,也会有很多人研究小模型,研究如何让小模型也能有好的效果,比如模型压缩、知识蒸馏、量化、稀疏化等。大模型负责探索能力的边界,小模型负责落地应用,两者会共同发展。
第二,多模态会成为主流。
现在的深度学习,很多还是单模态的,比如处理图像的就是CV,处理文本的就是NLP。但真实世界是多模态的,人获取信息,是通过视觉、听觉、触觉等多种感官的。未来的深度学习模型,会越来越多地处理多模态数据,把图像、文本、音频、视频等融合在一起。
多模态模型,能更好地理解真实世界,也能有更多的应用场景。比如,既能看懂图片,又能听懂语言,还能生成文字和视频的模型,能做很多现在做不了的事情。多模态,是深度学习的一个重要发展方向。
第三,深度学习会和更多的领域结合。
深度学习,已经在很多领域取得了成功,比如计算机视觉、自然语言处理、语音识别、推荐系统等。未来,深度学习会和更多的领域结合,比如科学研究、医疗、教育、金融、制造业等。
比如,在科学研究领域,深度学习可以用来预测蛋白质结构、发现新药、模拟物理过程;在医疗领域,可以用来辅助诊断、药物研发、个性化治疗;在教育领域,可以用来个性化学习、智能辅导;在制造业,可以用来质量检测、预测性维护、智能调度。深度学习会成为一个通用的工具,渗透到各个行业,改变各个行业的运作方式。
第四,深度学习的可解释性和安全性,会越来越受重视。
现在的深度学习模型,很多还是黑盒,我们知道它有效,但不知道它为什么有效,不知道它是怎么做出决策的。这在很多场景下,是有风险的,比如医疗、金融、自动驾驶这些对安全性要求很高的领域。
未来,深度学习的可解释性和安全性,会越来越受重视。我们需要知道模型是怎么做出决策的,需要知道模型在什么情况下会出错,需要保证模型的决策是公平的、可靠的、安全的。可解释性和安全性,是深度学习走向更广泛应用的前提。
第五,深度学习的理论,会逐步完善。
现在,深度学习的理论还很不完善,很多现象还没有完美的解释。但随着研究的深入,深度学习的理论会逐步完善。比如,关于泛化能力的理论,关于优化的理论,关于表示学习的理论,都会有更多的进展。
理论的完善,会反过来指导实践,让我们设计出更好的模型,更高效的算法,更稳定的训练方法。深度学习,会从一门"手艺",慢慢变成一门有坚实理论基础的"科学"。
写在最后
重读《深度学习》,我有了完全不同的理解。
第一次读,是困惑和囫囵吞枣;实践之后,有了经验和直觉;这次重读,很多以前不懂的都懂了,很多以前觉得没用的都发现很重要,很多以前死记硬背的都理解了背后的直觉。
这本书,虽然出版于2016年,很多具体的技术已经有些过时了,但它的底层原理和思想,依然是深度学习的基石。技术会迭代,模型会更新,但底层的原理和思想,是相通的。理解了这些底层的原理,不管技术怎么变,你都能快速理解,跟上发展的步伐。
深度学习,是一个快速发展的领域,也是一个需要终身学习的领域。在这个领域,没有谁能学完所有的知识,也没有谁能永远站在前沿。我们能做的,就是保持学习的热情,保持实践的习惯,不断读书,不断实践,不断提升自己。
读书和实践,是学习的两个翅膀,缺一不可。只读书不实践,是纸上谈兵;只实践不读书,是盲目摸索。只有两者结合,互相促进,才能真正学好深度学习,才能在这个快速发展的领域里,不断成长,不断进步。
最后,用一句话来结束这篇文章:"纸上得来终觉浅,绝知此事要躬行。"
愿每一个在深度学习道路上前行的人,都能在读书和实践的循环中,不断成长,不断收获,最终到达自己想去的地方。
评论(0)
暂无评论,快来抢沙发~
评论功能仅对会员开放,请先登录
登录