机器学习中使用的神经网络第九讲
Geoffery Hinton教授的Neuron Networks for Machine Learning的第八讲为可选部分,好像很难,这里就先跳过了,以后有用的时候再回来补。第九讲介绍了如何避免过拟合,提高模型的泛化能力。
这是Cousera上的课程链接
Overview of ways to improve generalization
这一小节,我们介绍如何在网络有过多能力处理过多容量的训练数据集时,如何通过降低过拟合来提高网络模型的泛化能力。下面将介绍几种控制网络容量的方法,以及如何设置度量参数。下图回顾了什么是过拟合(overfitting),由于是以前讲过的东西,这里只贴截图,不再文字叙述。
下图列出了防止过拟合的四种方法,其中第二种方法——适当调节网络的能力(regulate the capacity appropriately)——会在本讲中重点展开,而后面的两种会在以后的课程中介绍。
我们通常通过以下四种方式或它们的组合来实现对网络能力的控制。
- Architecture: Limit the number of hidden layers and the number of units per layer.
- Early stopping: Start with small weights and stop the learning before it overfits.
- Weight-decay: Penalize large weights using penalties or constraints on their squared values (L2 penalty) or absolute values (L1 penalty).
- Noise: Add noise to the weights or the activities.
在使用这些方法时,我们需要设置一些元参数(meta parameters),如隐含单元的数量、层数、惩罚权重等。我们可能会用一些可能的值来设置元参数,然后通过测试数据集筛选出最好的那组参数。但这种方法得来的参数具有对测试集的针对性,再换一组测试数据集可能性能就不佳了。例如一个极端的例子:假设有一个测试数据集,其中的输出都不是通过输入得来的,而是随机标记的。那么由此测试集筛选得来的元参数肯定是经不起别的测试集的检验的。
一个更好的方法是将整个数据集分成训练集、验证集、测试集三部分,训练集用来训练模型的参数,验证集用来筛选出性能最好的参数,测试集用来得到模型性能的无偏估计。这个模型性能的无偏估计肯定比验证集上的性能要低,原因同上面试一个道理。为了尽可能降低模型过拟合验证集的可能性,我们将整个数据集分成同等大小的N+1份,一份作最终的测试集,另外N份(记为$S_1$到$S_N$)用来作训练集和验证集:每次选择其中一份作验证集$S_i$,其余N-1份作训练集,然后计算出在验证集上的错误率$E_i$。这里$S_i$从$S_1$遍历到$S_N$,从而得到N个错误率,然后以这N个错误率的平均为衡量指标来选择参数,再用最终的测试集得到模型性能的无偏估计。这个方法称之为N-fold交叉验证(N-fold Cross Validation),我的叙述不是特别清楚,这里给出一个链接:交叉验证简介。
需要注意的是,N-fold交叉验证得到的N个估计(就是错误率)不是相互独立的。一个很极端的例子是,如果恰巧有一个子集里边都只包含一种类别的数据,那无论该子集做训练集还是验证集,最终的结果其泛化能力肯定很差。
对于大规模的数据集和大的模型,反复训练拥有不同元参数的模型其代价是极其高昂的。代价低的一种做法是,训练之初设置比较小的参数,然后随着模型的训练逐渐增大参数,直至模型在交叉验证集的表现开始变坏。但是如何衡量表现开始变坏是很困难的,所以我们可以在确定表现已经变坏了之后停止训练,然后再返回去找出表现最好的那个点。
Hinton还说,由于权值没有时间增大,模型的capacity被限制住了。下面解释小的权重能够限制capacity的原因。
考虑入下图所示的一个神经网络,即时隐含单元使用逻辑单元,小的权值参数会使得这些单元的输入很接近零,那输出也就落在了逻辑曲线中间的接近线性的那一段上。也就是说,晓得权值参数使得逻辑隐含单元的表现很像线性单元,那整个网络也就很接近一个将输入直接映射到输出的线性神经网络。随着权值参数的增大,隐含单元恢复了逻辑单元的capacity,模型对训练集的拟合能力开始逐渐增强。而最终得到的模型对验证集的拟合程度先增大后减小,当拟合程度开始减小的时候应该就是停止训练的时候。
Limiting the size of the weights
这一小节介绍通过通过限制权值的size来控制网络的capacity,标准的方法是引入一个惩罚项来防止权值变得过大。伴随着一些隐含的假设存在,有着小权值的神经网络要比大权值的简单很多。我们可以使用几种不同的方法来限制权值的size,使得传入隐含单元的权值向量不会超过某个确定的长度。
标准的方法是使用L2权值惩罚项来限制权值的size,其是指在损失函数上加上权值的平方作为惩罚项。在神经网络中,L2有时被称之为权值衰减,因为该惩罚项的导数一直限制着权值变大。下图给出了损失函数的公式,其中权值平方和的系数$\lambda$称之为权值损失(weight cost),其决定的惩罚的强弱。下图中给出了当损失函数导数为零时权值的取值,该取值其实就是权值可以取得最大值。(再大的话,损失函数又开始上升了)
下图列出了L2权值损失的作用。
下图给出了L1权值惩罚项,该惩罚项是权值的绝对值,图像是V形的,见下图。L1权值惩罚项一个很好的作用是使得很多权值接近于零,方便我们理解神经网络中到底发生了什么(我们只需要注意少数几个不接近零的权值即可)。有时我们还会使用使某几个权值一直取较大值的惩罚项。
除了引入权值惩罚项,我们还可以引入权值约束,例如对每一单元的输入权值向量,我们可以约束其平方和的最大值不得超过某一个上限。下图列举了权值约束的优点。
Using noise as a regularizer
这一小节介绍另一种限制网络capacity的方法——使用噪声正则化(using noise as regularizer)。我们可以将噪声添加到权值上或者activities(也就是单元)上,从而达到限制网络capacity的目的,防止出现过拟合。
假设我们在输入中加入高斯噪声(Gaussian noise),那么在进入下一层之前噪声的方差已经被平方权值放大。如下图所示,在一个简单的网络中,输出与输入线性相关,被放大的噪声也被添加到了输出中,同时也就影响了(增大了)平方误差。所以当输入有噪声的时候,最小化平方误差其实也是在最小化权值的平方和。
下图给出了一个数学推导,不过想不明白这里为什么把平方和展开式的中间项省掉了。根据推导,我们可以看到在输入中添加噪声实际上就等同于添加了一个权值惩罚项。
在更复杂的网络中对权值添加高斯噪声,虽不完全等同于添加权值惩罚项,但表现更好,尤其是在循环神经网络中。Alex Grave在其用于手写识别的循环神经网络中加入了噪声,结果证明性能有明显改善。
我们还可以在activities中使用噪声来作为正则化(using noise in the activities as a regularizer)。大概意思是说,对于使用逻辑函数的隐含单元,其输出肯定介于0和1之间,现在我们在前向中用一个二进制函数来代替隐含单元中的逻辑函数,随机的输出0或者1,计算出输出。然后在反向中,我们再使用正确的方法去做修正。由此得来的模型可能在训练集上的表现变差,且训练速度变慢,但其在测试集上的表现有着显著提高。
Introduction to the full Bayesian
这一小节我们通过一个简单的投硬币的例子,来介绍贝叶斯方法(bayesian approach)。贝叶斯方法的主要思想不是直接去寻找模型最可能的参数设置,而是考虑所有可能的参数设置,并根据已有数据来得出每种参数设置的可能性有多大。下图给出了贝叶斯框架:
这里用抛硬币的例子来介绍贝叶斯方法,下图是一些假设。
上面假设每一次抛硬币时抛出人头的概率为p,且上图给出了一组特定的结果———53次人头,47次国徽,那么我们就可以计算出出现这个结果的概率为$P(D)=p^{53}(1-p)^{47}$。现在我们说,如何最大化P(D),也就是如何使发生这种结果的概率最大呢?可以看到P(D)只与p有关,下图给出了求导的过程,得到了当p=0.53时P(D)取到最大值。
但是通过一个例子来求p肯定不合理的,例如只抛一次,抛出了人头,那我们就说p为1,那当然是不合理的。说0.53比1要合理,是因为我们已经有了一个先验的概率分布(p应该是0.5)。
下面的东西没听太明白,这里先只贴图。
总的来说,完全贝叶斯方法与最大似然估计(maximum likelihood estimation)不同,其是根据一个先验概率去求出一个后验概率(在已有观察序列,即训练数据下选择参数w的一个概率)。
The Bayesian interpretation of weight decay
这一小节,我们介绍权值惩罚项的贝叶斯解释。在完全贝叶斯方法中,我们尝试去计算一个模型所有可能参数的后验概率。而我们要用贝叶斯方法找的其实是这样一组参数,其能够在先验概率(即我们先验的认为参数应该是什么样的)和已有的观察之间做一个最好的折中。该方法叫做Maximum alpha Posteriori learning,当我们用权衰减(weight decay)来控制模型的capacity时,其能够很好的解释发生了什么。
下面我们来讨论一下,在监督式最大似然学习(supervised maximum likelihood learning)中当我们去最小化平方误差时,发生了什么。找到一个权值向量能够最小化平方误差就等价于找到一个权值向量能够最大化正确答案的概率密度。为了看到这种等价性,我们假定正确的答案可以由神经网络的输出加上高斯噪声得来。也就是说,我们首先由神经网络得到输出,然后在输出上加上一些高斯噪声,然后问我们现在得到的东西就是正确答案的可能性有多大。下图给出了一个模型输出与目标输出的一个关系:图中曲线是一条高斯分布曲线,模型输出是这条曲线的中心位置,我们要的就是让目标输出的概率密度足够大。(个人理解,欢迎指正。)
然后就有了下面的数学公式。$input_c$是已知输入,$y_c$是由$input_c$和参数$w$得来的输出,$t_c$是目标输出。然后下面是已知神经网络输出加上高斯噪声求目标输出的概率密度的一个公式,再对公式变一下形(两边取log对数,再加上一个负号),就得到了最后的等式。根据最后这个等式,我们就得到了前面的那个等价性:当我们最小化平方误差时,其实我们就是在最小化等式的右端,也就是在最小化等式的左端,那也就是在最大化$logp(t_c|y_c)$,就是在最大化正确答案的一个概率密度。
贝叶斯方法是找到所有可能的权值向量的后验概率分布,但在实际中要得到一个非线性网络众多权值向量的后验概率相当困难,常用的是使用蒙特·卡罗方法(Monte Carlo methods)来得到一个近似分布。现在简单一点,我们只找出最可能的那个权值向量:从一些随机的权值向量出发,在提高P(W|D)的方向上改进权值向量,最终从中选出一个最好的。不过这样得来的是一个局部最优。
下图给出了求解maximum sums of log probabilities的原因,我的理解是我们要求的是在给定训练数据上,模型的输出是目标输出的可能的最大值。这里假定在不同训练样本上的输出错误时相互独立。然后,为了计算上的方便,我们使用对数来计算,因为对数函数是单调的。
下图是最大后验概率学习(maximum a posteriori learning)的损失函数。
最后我们得到了队权衰减(weight decay)的一个贝叶斯解释,如下图所示。最终,我们得到了一个和前面讲权值惩罚项时类似的损失函数。
MacKay’s quick and dirty method of setting weight costs
这一小节,我们介绍由David Mackay发明的一种不使用交叉验证集就能确定权值惩罚项的方法。下面是几张截图。