关于深度学习的一些感悟
工作之余学习深度学习也有很长一段日子了,之前因为家逢巨变耽误了不少日子。近来又重新拾起,突然新增不少感悟,很多之前无法理解的问题也迎刃而解,在此想做对自己做一个总结。
前阵子看了<阿里云天池赛题解析——深度学习篇>,该书第二题提到超分辨率算法,从一堆传统逻辑讲到深度学习再讲到基于GAN的SRGAN算法。我用Pytorch弄了一个模型,尝试着重建一些低分辨率图片到高分辨率,效果尚可。如果有更多更好的数据集和算力,相信其效果一定可以做的更好。
但是深度学习SRGAN算法解决这类问题,究竟是一个什么样的理论基础呢?
曾经看过浙江大学胡浩基教授的机器学习公开课,在讲支持向量机核函数的时候提到一句话,大概意思是说任何一个线性不可分的问题,但是如果把这个问题映射到高维度空间,那么大概率能够线性可分,维度越高,线性可分的概率就越大,如果能映射到无限维度,那么线性可分的概率将为1。如何理解这句话?相信在农村的同学都见过农民伯伯晒稻谷或者麦子,从地里收割过来的谷麦都会带有很多灰层枯叶杂草等等,如果把谷麦平摊在地面,再把灰层枯叶杂草去除,这是一件极其麻烦的事情。但是如果把谷麦灰草扬起来,那么一阵风即可将其吹散。这就是所谓的二维空间很难解决的问题,但是将其映射到更高的三维空间,那么问题就可以轻易分类而解决掉,支持向量机的核函数就是起这个作用。
同样的道理,假如一堆乒乓球和铁球混在一起,一个个的分类也很麻烦,但是如果全部丢到水里,铁球沉下去乒乓球浮在水面上,这样也是二维空间到三维空间轻易解决这个分类。小说三体提到水滴根本无法从外攻克,但是到了四维空间,水滴根本不堪一击。
通过以上例子我们可以去想,也许任何两件事情之间的转换都必然存在,比如说把低分辨率图像转成高分辨率图像,但是这个转换映射必然在高维空间,也就是说是一个高维度函数。然而这个维度是多少?函数是又是什么样子?参数多少个?我们都无法知晓。有些传统机器学习算法遇到这一类问题往往会假设这是一个概率分布,又假设分布近似服从于高斯分布,再通过极大似然估计拟合,但是在这里只知道概率分布必然存在,不过具体怎么计算完全无从得知。
但是如果我们能想办法逼近这个概率分布,在工程上达到我们的要求就可以了,毕竟工程计算上很多数值都没办法取完全精度,比如圆周率,自然对数,三角函数。也就是说对于这种我们根本就不知道维度多高,分布如何的场景,如果我们能采样出大量的数据,那么使用数值逼近也是一种比较有效的解决办法。如果有足够的数据,甚至可以完全代替这个连长相维度参数均无从知晓的概率分布。
那么深度神经网络就是时候出场了。
深度学习与传统机器学习一个重要区别就是深度学习需要很大的数据量,原本数据采集就是一个极其费力的事情,但是好在全世界一起努力,现在已经有了很多公开数据集可以使用。其次传统机器学习需要通过算法提起特征,但是这样也会严重影响速度,最具代表性的莫过于目标检测R-CNN算法系列,到Faster R-CNN完全使用深度神经网络之后,整个算法比最早的R-CNN系列明显提升很多。当然神经网络问世已经超过半个世纪了,之所以直到近年来才彻底火爆,主要就是数据集和算力限制,这两者又反过来限制算法发展,直到新世纪以来随着互联网的高速发展,大数据以及GPU异构计算共同为深度神经网络再次提供了发展基石,而深度残差网络出现神经网络层数可以达到千层,从而可以拟合更多复杂的数据分布。另外神经网络引入非线性激活函数,其意义就是通过拟合复杂的数据类型,比如图像,音视频等。类似这种数据往往可以看成是一个高维空间的数据概率分布,而神经网络理论上可以通过各个神经元非线性组合来拟合各种数据分布,所以说对于这种数据概率分布函数,只要神经网络设计的足够好,采样数据足够多,完全可以足够近似拟合出来。
由此,我们根本不用关心从低分辨率到高分辨率转换的这个映射是维度有多高,形式又是什么样子。下面这张图相信熟悉深度学习的人,一眼就能看透精髓。
然而深度学习训练过程中难以避免会遇到各种各样的问题,比如说梯度消失或者爆炸,权重矩阵退化,还有类似GAN生成器与判别器分布不重合导致极其不稳定等等。面对各种各样的问题,近年来也有各种各样的对策,比如说各种正则,归一化,dropout,relu,深度残差网络,WGAN,数据增强等等。
当然,除了利用神经网络做图像文本音视频等基础处理以外,语义分割与实例分割更是让我感觉叹为观止。其实真正弄懂神经网络的原理,再看这类算法也并不觉得太难。以语义分割为例,下图几乎囊括基本的框架架构,而熟悉的人仅凭此图一看便能心领神会:
有时候我在想,神经网络如果不断发展,究竟还能做多少我们目前想不到的事情?