最近几天,学习理论的东西一致困扰着我,查阅一番资料仔细思考之后,写作此文,方便以后查阅。参考的链接主要有:1.The hard thing about deep learning , 2. Model Theory of Deep Learning:Why does it works so well?,3.Non-convex Cost Funtions of Neural network,4.Non-convex Functions
什么是学习理论?
我们可能常常听说这样一句话:深度学习,甚至神经网络是个黑箱,我们并不知道里面发生了什么。这句话是没有错的,但是有很多人并没有完全明白这句话的含义。说它是个黑箱,很大程度上是因为,我们在深度学习上缺乏相应的学习理论。
那么什么是学习理论?学习理论就是泛化性能的理论保证。更具体一点说,什么样的模型才叫好模型?泛化性能强的模型!那么相应的,什么样的模型才叫有用的模型?答案也很简单:具有泛化性能的模型。想象一下,我们拿到了一个训练数据集 ,然后我们把里面的数据全部都背下来了,这一下训练损失0,但是泛化性能也是0了,没有用的模型。
所以哇,我们的学习理论想要保证的就是我们的模型能够具有一定的泛化性能,那么这个问题就是转换成了learnable problem。那么怎么保证泛化性能呢?接下来将会介绍这方面的内容。
传统的机器学习的学习理论
传统的机器学习在证明学习理论的时候走的是这样一个心路历程:我们想要的是有用的模型,有用的模型转换成机器学习的语言就是①泛化性能不能跑的太偏,即泛化误差得有个上界。②我们的训练过程得是提高泛化性能的过程。经过研究哇,我们发现我们定义的模型和最终的泛化性能之间确实存在着一种关联,直观来讲就是我们的模型越复杂,泛化性能就会下降,越简单,泛化性能就会提高。那么我们该怎么定义这个模型的复杂度呢?我们使用VC维来定义(当然还有 Rademacher complexity,在这里不介绍了,我也不会),简单说一下VC维度:VC维就是你的模型能够shatter的数据样本的最大个数。那么什么叫shatter?就是说我们把每个样本当成高维度空间中的一个点,模型看做是高维空间中的一条二分类的直线,如果我们的通过模型能够把样本所有可能的标签组合都取到,我们就认为这个模型shattered 这个数据集了,而这个数据集的维度就叫做VC维度。(思考:我们可以看出VC维度考虑到了数据的可分性和模型的复杂度两个因素),我们就用这个维度来表示模型的复杂度,并且利用这个维度我们能够给出前面提到的两个要求:①泛化性能的上界②证明训练损失减少的过程(ERM)就是泛化性能提高的过程。具体的证明过程可以参考CS229上给出的证明,这里就不写了。下面给出vc维的一个例子。以二维线性模型为例,如下图,我们要求的是线性模型能够shatter的数据点的个数。一个数据点肯定没问题,两个数据点就存在四种标签组合(0,0),(0,1),(1,0),(1,1)。同样我们的线性模型仍然能够很好的完成任务可以以不同的划分方式取到所有可能的组合。三个数据点的有八种组合,如图所示,也是能够完全取到所有的组合。再增加到4个我们就发现不行啦,总有些组合是没有办法得到的。
深度学习的学习理论
这个标题起的不好,深度学习哪里有什么学习理论。只有前几年Yoshua Bengio提出的和validation set有关的学习理论。
讲道理,深度学习和机器学习是同根同源的,但是我们发现深度学习的表现是出乎我们意料之外的,在学习理论上尤其是颠覆三观。具体的表征如下:
1.说好的模型越复杂,泛化性能越差呢???熟悉深度学习的童鞋都知道,深度学习的网络参数可以是非常大的,那么不是会造成严重的过拟合问题吗?传统的机器学习的学习理论在这里或许还可以再挣扎一下说,不对哇,我们的理论没问题哇!你参数增多了,但是数据量也变大啦呀,我们的VC维可是从数据和模型两个角度上考虑的,么有足够多的数据你还是会严重的过拟合!对于这种争辩,我只想说一句:不对!现在深度学习的模型有些参数数量已经达到了几百万个甚至几亿个(比如说BERT),这什么意思?参数比数据都多,这个时候显然是没有足够多的数据集可以用来训练这个的,按照VC维度的理解,这个时候泛化性能应该已经凉凉了,但是结果呢???深度学习的泛化性能超级好哇。(猜想:模型记忆下来的数据太多啦,我们用的测试数据集不够优秀,测不出来我们没训练出来的数据。换句话说测试集就是个假测试集实际上已经在训练的时候见过差不多的了。)
2.说好的Bias-Variance tradeoff 呢??tradeoff怎么不见啦?我们都知道在深度学习里的一些防止过拟合的手段,比如说dropout 和各种normalization 有些时候甚至不存在tradeoff这种此消彼长的关系存在,bias和variance居然同时减少。这是为啥????
思考和总结
1 non-convex optimization
在查学习理论的过程中,遇到了这么一个概念叫:non-convex 函数,中文可以叫非凸函数。结论是这样的,深度学习的损失函数都是非凸函数,而传统的机器学习的损失函数大多数都是凸函数。非凸函数是什么概念呢,就是说损失函数存在多个local minima(局部最优),而凸函数只有一个全局最优(global minima)。换种说法,同样用梯度下降的方法,非凸函数可能会掉进局部最优的坑里爬不出来,凸函数则只要收敛一定是全局最优。
首先这个性质是成立的,简单证明可以这样想,我们只要存在任何的隐藏层(hidden layer),在训练完了之后,我们只需要交换一些参数的位置,就可以得到同样的结果。这看起来很白痴,但是在空间上,这个交换位置可以连坐标轴都发生交换了的翻天覆地的大变化。但是得到的结果是一样的,都是我们认为的最优,那么这个最优就不是全局最优了(至少不是唯一的),也就是只能当做局部最优来看,深度学习(包含隐藏层)的网络的损失函数是非凸函数。
其次这个性质决定了我们在深度学习中采用的一些技术的思路和方向。比如随机梯度下降,随机初始化(防止掉到同一个坑里出不来了)等等。
最后说一下,非凸函数的优化是一个很难的问题。具体点说,寻找非凸函数的全局最优这是一个NP问题,什么叫NP问题?就是多项式时间内无法完成的问题(但是在多项式时间内可以验证一个解,这不重要)?什么叫多项式时间内无法完成?就是我们求解全局最优的过程所需要的时间随着数据量的增大,是指数增长的。这是我们无法接受的。所以我们在解决深度学习的问题时,并不会去找全局最优,而是找到一个比较优秀的局部最优我们就满足啦。
2 pretraining+fine-tuning
有了这些理论知识,虽然说我还没能力在这个基础上搞什么吧,倒是解答了我一个问题。就是我们pretraining+fine-tuning 的做法为什么会比直接随机初始化的效果好?答案就是我们通过pretraining 阶段已经把相应的参数带到了一个我们比较满意的局部最优啦,而随机初始化呢将会有很大的可能进入到大坑里。所以如果我们每一层都使用比较好的pretraining 有可能会取得比较好的效果以及比较快的收敛速度(有点像layer normalization的思路,就是让某一部分的参数或者输入相对稳定,有利于整个模型的收敛)。此外,比较复杂的网络使用pretraining 的效果可能更好一些,简单的网络局部最优这样的小弹坑并不多,踩进去说不定也是能够凭本事自己爬出来的,所以没有必要采用pretraining 的方式。