写在前面
最近LeCun在他的Facebook主页发文,称“深度学习已死,可微分编程万岁!”,所以结合自己的一些理解,写一点自己的想法,对与不对,皆不负责哈。
深度学习的本质
深度学习本质上是一种新的编程方式——可微分编程。我们制定可重用的结构,包括:卷积网络、LSTM层、GAN、VAE、memory单元等。
使用深度学习框架开发DL软件,这种软件(即模型/网络)也被称为软件2.0。人们通过组合可复用的模块(网络层,即参数化的函数),得到模型/网络,构建一种新型软件,并且使用优化器基于数据训练网络,得到软件的细节,即模型的参数。
越来越多的人,开始习惯于不显示地指定解决某一任务的具体方法。他们不直接硬编码,而是通过让机器自动从数据中学到知识(机器学习称为数据驱动智能1.0,深度学习则为数据驱动智能2.0),我们说,拥有知识才拥有分类的能力,进而能够体现出智能。
人们以一种依赖于数据的方式,通过定义网络,然后让它们随着输入数据的动态变化而变化(神经网络也称为函数近似机,它会拟合数据,学到输入输出对中蕴藏的那个函数),进而构建DL软件,来解决现实世界中的问题。
神经网络是一个张量到张量的映射,它是一个函数,它有矩阵的表示形式,即模型矩阵*输入矩阵=输出矩阵。网络的每一层则是一个向量到向量的映射,也是一个函数。整个神经网络是一个链式结构,是一个复合函数,将输入向量代入第一层网络所对应的函数中,然后将函数结果代入第二层网络所对应的函数中,依次进行。这就相当于,对输入张量做了一个操作,它变成了中间结果,然后又做了其他操作,直至得到输出张量,所以整个神经网络也能用计算图来表示,有点类似于Spark中的DAG。
套用编程的思想,这就是调用第一个函数处理原始数据,接着,调用第二个函数处理该函数的返回结果,依次进行。所以,深度学习,或者神经网络,就是一种函数编程。基于DL开发的软件,不过就是计算输入数据,然后得到输出数据。
可微分编程
有一种新的编程范式——可微分编程,用这种语言编写程序(即Keras中的定义模型和编译模型),我们调用一些函数(也就是网络层),来处理输入。不过,我们仅指定了函数的结构以及它的调用顺序,而细节则留给了优化器。编译器需要通过反向传播计算梯度,然后使用基于梯度的优化方法,根据程序的目标函数,自动学习到细节,就像优化DL中的权重一样,进而编译出可用的DL软件。
软件1.0和2.0的区别
软件1.0是使用Python、Java等语言编写的,它由程序员编写的明确指令组成。
软件2.0则只是用一些样本数据对程序进行约束,基于可用的计算资源,搜索解空间,得到满足约束的接近最优解的软件细节。
事实上,大部分问题都是收集数据比明确地编写程序更容易。未来,大部分程序员不需要维护复杂的软件库,他们只需对要提供给神经网络的数据进行收集、整理、标记、分析和可视化即可。
网友评论