图书前言

前言

深度学习及神经网络算法涵盖较广的计算机和数学领域,如果使用PyTorch、TensorFlow等深度框架,并记住它们的使用规则,可能能够应付大部分的情况并绕过许多细节,但知其然而不知其所以然,显然只是学习深度学习的第一步,通用的深度学习框架并不总是能满足所有的需求,如果要从使用到扩展乃至创造,就需要掌握远比简单使用更多的知识和细节。

得益于PyTorch、TensorFlow等深度学习框架都是开源的,有些时候通过发掘它们的源码来进阶相对简单,例如我想知道PyTorch是如何实现Adam的,可以将光标移到torch.optim.Adam类名上,使用快捷键Ctrl+B或Ctrl+鼠标跳转到声明,便可以发现它调用了torch.optim.functional.adam函数,同样进入torch.optim.functional.adam,在这里可以发现Adam的算法实现。但这种方法并不总是能得到想知道的答案(实际上,大部分时候都无法奏效)。

作为一个成熟的框架,PyTorch 1.7.0的源码已经难以全部阅读(C++/Python代码行数都在十万量级),且出于程序健壮性的考虑,其源码含有不少条件判断语句,对阅读也会造成一定的阻碍,因此对读者而言阅读本书中的代码和解读相比直接阅读深度学习框架的源码应该效率更高。在有自研深度框架的经验后,使用这些成熟框架显然会事半功倍,而且也能知道当它们无法满足要求时如何扩展。

深度学习理论由来已久,但限于计算机的运算速度近几年才被推上风口浪尖。深度学习中的大量运算往往以矩阵或张量为载体,它们的运算有高度的并行性,因此能够在具有许多计算核心的GPU上被加速,这也是深度学习兴起的现实基础。

如果你曾关注过显卡,那么可能也听说过“CUDA核心”这个名词,NVIDIA介绍一块新显卡时首先会说明它有多少个CUDA核心(或多少个流处理器)。CUDA是NVIDIA公司推出的计算平台,目前主流的深度框架如TensorFlow和PyTorch都是以CUDA为核心,本书也会在介绍深度学习之余介绍它的基本用法,帮助读者全方位地了解深度学习这个领域。

书中包含大量细心编写的代码,带着读者一起思考。本书在重点及难点处配有视频讲解,扫描书中提供的二维码可观看对应章节的视频讲解。

本书绝大多数理论辅以代码实现,同时也建议读者先按照自己对理论的理解编写对应的程序,若有疑问再参考本书的代码。因为编程是不允许对知识模棱两可的,理解有偏差时编写的代码往往会输出显而易见的错误结果甚至直接报错无法运行。换言之,如果能将理论转换为代码,通常对那个概念就有一个初步的认识了。

因作者水平有限,书中难免存在疏漏,敬请读者批评指正。

张伟振

2020年12月

本书源代码