Geoffery Hinton教授的Neuron Networks for Machine Learning的第十讲介绍了如何combine模型,并进一步从实际应用的角度介绍了完全贝叶斯方法。

Why it helps to combine models

这一小节,我们讨论在做预测时为什么要结合许多模型。使用多个模型可以在拟合真正的规则和拟合样本错误之间做一个很好的折中。

我们已经知道,当训练数据比较少时容易出现过拟合,如果我们平均一下许多不同模型的预测,那我们就可以降低过拟合的程度。对于回归来讲,当模型的capacity较弱时容易出现high-bias;当模型的capacity太强时,模型就会过多的拟合样本错误,从而出现high-variance。而结合多个不同的模型,我们就可以实现一个更好的折中。

下面我们来分析如何对单独的模型(individual model)和平均的模型(an average of models)进行比较分析。在任意一个单个的测试集上,一些单独的模型的预测结果可能要比结合的模型的预测要好,这很正常。而在不同的样本上,不同的单独的预测器可各有优劣。如果单个的预测器之间相差很大的话,那平均下来,结合后的预测器肯定比单个的都要强,所以我们应该尝试着让单个的预测器差距大一些(犯的错很不相同,但各自的性能还是可以的)。

现在,我们来看一下网络结合背后的数学推导。如下图所示,$\overline{y}$是N个不同模型对同一个输入的预测的平均,而$<(t-y_i)^2>_i$表示目标输出t与每一个预测值$y_i$的误差平方的均值。我们可以将$<>_i$看成一个取平均的符号。注意推导的最后一步,平方和展开式的结合项为零,可以直接省去。可以看到,目标输出t与每一个预测值$y_i$的误差平方的均值可以写成目标输出t与结合后的预测$\overline{y}$的误差平方再加上一个正值。这就是说,结合后预测要比结合前的好。

10_1

下图给出了一个示意图,表示了不同的预测和目标输出的一个差距:红色的表示不好的预测,其与目标输出t的距离要比$\overline{y}$与t的距离大得多;绿色的表示好的预测,其与目标输出t的距离要比$\overline{y}$与t的距离小。但因为是使用平方误差,所以不好的预测占一个主导地位。

10_2

然后我们再做一个数学上的计算,我们假设$\overline{y}$到good guy和bad guy的距离相等,然后做一个计算得到了上图中的等式。但这样的等式并非总成立,这里主要是因为我们使用的是平方误差。换一个误差衡量方式,等式就未必成立了。下图给出了一个例子。

10_3

下图列出了很多让预测器不同的方法:

10_4

下图给出了通过使用不同的训练数据集来得到不同模型的方法:

10_5

Mixtures of experts

本小节介绍多专家模型(the mixture of experts model),该模型的思想是训练多个神经网络(也就是多个专家),每个神经网络(专家)被指定(specialize)应用于数据集的不同部分。这就是说,数据集可能有着多个不同的来源(different regimes,意思是说数据集中的数据的产生方式不同,这里我翻译成了“不同的来源”),不同来源提供的数据差距较大(但真实),因此我们为每一个来源的数据一个指定的神经网络来处理,而且模型还有一个managing neural net用来判断一个输入应该交给哪一个神经网络来处理。

对于较小的数据集,该模型的表现可能不太好,但随着数据集规模的增大,该模型的表现会有明显的提高。更重要的是,单个的模型往往善于处理一部分数据,不擅长处理另外一部分数据(在这部分数据上犯错多),而多专家系统则很好的解决了这个问题:系统中的每一个神经网络,也就是每一个专家都会有一个擅长的数据区域,在这组区域上其要比其他专家表现得好。

10_6

下图给出了局部模型(very local models)与全局模型(fully global models)的一个比较。

10_7

多专家系统是单一全局模型或者多个局部模型的一个很好的折中,但我们现在面临的一个很重要的问题就是如何将数据集分成不同的部分。下图展示了划分数据集的几种方法:按照输入到输出的映射,可以将图中数据分成两组,一组对应那条红色的抛物线,一组对应那条绿色的抛物线;仅按照输入作一个聚类的话,就被图中那条蓝色直线分成了两类。这里划分训练数据集的目的在于能够从每一个cluster中的输入和输出很好得得到一个局部模型。

10_8

下面我们来介绍使模型cooperate的损失函数,下图使用了前一小节介绍的东西,这样训练得来的模型要比单独训练每个模型的性能更好。

10_9

下图给出了averaging models为什么能够使模型cooperation的原因。下图右侧是除模型i外所有模型对某一输入的预测的平均,中间的t是目标输出,左侧$y_i$是模型i的预测。当我们加上$y_i$去计算一个新的平均值时,这个值肯定要更接近t,从而实现了一点点修正。所以,为了使平均值越来越接近t,我们就需要$y_i$左移。

10_10

但实际上,我们希望做的是让$y_i$越来越接近目标t,而这种做法就会使得模型specialization。下图给出了一个使模型specialization的损失函数。这里的损失是一个期望值,其中的$p_i$是我们在处理该组输入数据时会使用模型i的概率。

10_11

多专家系统使用了第二种损失函数的形式,下图给出了示意图。在多专家系统中有一个softmax gating network,对于一个给定的输入,该网络输出每一个专家对该输入的处理的可靠度。而系统最终的损失函数就是每个专家的输出与目标的差值平方再乘上可靠度。

10_12

下图给出了两个偏导。前一个偏导得到的梯度表示一个专家应做的修正:如果该专家的可靠度($P_i$)较小,那么该梯度值也就很小,也就意味着该专家(神经网络)只需要做一个很小的调整(只需要为现在犯的这个错误负很小的责任);如果该专家的可靠度($p_i$)较大,那么该梯度也就比较大,也就意味着该专家(神经网络)需要做一个大的修正(需要为现在犯的这个错误负很大的责任)。后一个偏导得来的梯度用来修正专家的可靠度:如果一个专家犯的错比平均错误来的小,那我们就要增大其可靠度;如果一个专家犯的错误比平均错误来的大,那我们就应该降低其可靠度。

10_13

在这一小节的最后hinton给出了多专家系统的一个更好的损失函数。

10_14

10_15

The idea of full Bayesian learning

这一小节继续介绍完全贝叶斯方法,介绍在实际中如何应用它。在完全贝叶斯方法中,我们不是尝试着去找到仅仅一组参数设置,而是去求出所有可能的参数设置的后验概率分布(也就是对于每一组可能的参数设置都有一个后验概率密度,积分起来恰为一)。然后在预测阶段,我们计算出所有参数设置对应的预测值,然后每个预测值乘上该参数设置的后验概率再求和得到一个加权值,这个加权值就是模型最后的输出。当然,这两个过程都需要做大量的计算工作。还有一点,完全贝叶斯方法在较小的数据集上仍可以使用较复杂的模型。

前面我们已经讲过,复杂模型在较小的数据集上会出现过拟合的问题。但前面说的过拟合是发生在我们前面得到的那个最佳参数设置上,完全贝叶斯方法要所有可能的参数设置,这就大大较小了过拟合的可能。在较小的数据集上,完全贝叶斯方法考虑的参数设置会特别多(可用的参数设置所在的空间比较大),因此最终的预测也会很模糊。随着数据集的增大,完全贝叶斯考虑的参数设置越来越有指向性(可用参数设置所在空间变得越来越小),最终的预测也会越来越准确。

10_16

下图给出了拟合的一个典型例子:右上图中有六个数据点,红色曲线表示一条五次多项式,明显过拟合。但是如果我们基于一个合理的先验条件,如多项式的次数为5,去使用完全贝叶斯方法求得所有可能的参数设置。下图右下给出了几条可能的参数设置对应的曲线。可以看到,这些曲线差别很大,但如果由所有曲线的预测值去计算出一个加权值,会发现这些加权值大概会落在绿色直线的附近。

10_17

对于为什么数据集的大小会影响我们的先验条件和模型的复杂度,从贝叶斯的角度出发是没有原因的。下面介绍在一个仅有几个参数的神经网络中去近似的使用完全贝叶斯学习。

我们在参数空间上放置一个网格(a grid),然后对每一个参数选定几个值,然后我们就得到了参数空间上的若干网格点。每一个网格点对应一组参数,我们就可以判断每一组参数预测数据的性能如何。这里没有引入梯度下降,我们需要考虑的只是参数空间中的一系列参数点。一旦确定了每个参数点的后验概率,我们就可以对预测集中的数据做预测了。整个过程的计算量都很大,但在较小的数据集上,该方法要比最大似然法或者最大后验概率法好很多。下图中给出了一个概率计算公式。

10_18

下图给出了完全贝叶斯学习的一个例子。

10_19

Making full Bayesian learning practical

这一小节我们介绍如何在有数千甚至百万之多的权值参数的神经网络中使用完全贝叶斯方法,这里使用的方法称之为蒙特卡罗方法(Monte Carlo
method)。我们使用一个随机数生成器以随机的方式在权值向量空间中来回移动,不过该生成器要遵循降低损失的bias。如果顺利的话,我们得到的样本权值向量会按比例的遵循后验概率分布。

通过一系列的权值向量的样本,我们可以得到完全贝叶斯方法的一个好的近似。网格点的数量是参数数量的指数级倍数,因此对于少数数量的参数我们可能不能构成网格(这点不太明白)。如果存在足够大的数据集使得大部分的参数向量差别较大,可能只有的一小部分网格点(参数向量)能够有效的去做预测,我们就可以取估计这一小部分的参数向量。下图给出了一个概率计算公式,这里的权值向量$w_i$为参数样本。既然使用的是样本,那不可避免的就会引入噪声。

10_20

下面两张图说明了在标准的反向传播(back propagation)中发生了什么。下图右侧是一个权值空间的示意图,其可能有着很高的维度且无边界(unbounded)。在这个空间中,我们已经标注了一些轮廓线,轮廓线上的参数对应的损失函数是相等的。反向传播就是从某一个参数向量出发,然后沿着梯度的方向向损失曲面的谷底移动。最终,我们要么取得一个局部最小值,要么陷入一个平台区域。现在如果我们使用a sampling method的话,我们从某一个地方出发,在每一次用梯度对权值做更新时都会引入高斯噪声,因此权值向量可能一直来回晃动永远无法确定下来(不收敛)。就是说,权值参数可能会一直从参数空间的某一个区域跳到另一个区域,当然这些区域都很接近一个局部最小值。

10_21

10_22

现在一个很重要的问题是参数向量多久会遍历一次所有可能的参数设置。现在我们想到的一个方法是,在反向传播没进行10000步时我们保存一下权值向量。图中红点表示我们漫游(wander around)权值空间时得到的一些样本点,当然,这些样本点中的一些可能对应较高的损失(因为那些损失曲面的谷底部分可能比较大)。the deepest minimum部位可能会包含最多的红点,其他次最小值部位也会包含一些红点。不过这些红点不会是局部最小值对应的参数向量,因为它们是noisy sample。

上述的过程称之为马尔科夫链蒙特卡罗方法(Markov Chain Monte Carlo method),该方法使得在拥有数千个参数的模型上使用完全贝叶斯方法变得可行。

10_23

完全贝叶斯学习还可以和小批量梯度下降法结合起来使用。

10_24

Dropout

这一小节,我们介绍一种新的combine大量神经网络的方法——dropout,该方法不用事先单独的训练每一个神经网络。在使用每个训练样本训练网络时,我们会随机的忽略一些隐含单元,所以每一次训练都会得到一个不同的模型。那么,问题来了,我们如何在测试时对前面得到的不同模型做一个平均呢,答案就是我们使用大量的权值共享(weight sharing)。

下面我们介绍两种方法来实现combine多个模型的不同输出。假设现在有模型A和模型B,模型对每个输入都给出三个标记的可能性,如下图中给出了模型A对输入的三个标记的可能性分别是0.3、0.2、0.5,模型B对输入给出了三个标记的可能性分别为0.1、0.8、0.1。第一种方法计算两个模型输出为同一个标记的可能性的平均值,如下图中给出了combine后输出三种标记的可能性分别为0.2、0.5、0.3。第二种方法计算的则是几何平均(geometirc means),如下图所示。

10_25

下面介绍dropout,该方法可能不如真正的贝叶斯方法好,但其具有更强的可行性。考虑一个只有一个隐含层的神经网络,每次使用一个训练样本来训练网络时,我们随机的忽略隐含层的隐含单元(每个隐含单元被忽略的几率为0.5),这样就得到一个模型。通过这种方式,理论上我们可以得到$2^H$种模型的样本。当然实际上我们只能得到很少的一些模型的样本,且每个样本通过通过仅一组训练数据得到的。然后hinton说这里要权值共享(weight sharing),但我没想明白到底怎么实现共享。

10_26

10_27

下面介绍在测试阶段,我们应该做些什么。

10_28

下图是当网络有多个隐含层时,我们应该怎么做。

10_29

在输入层上,我们也可以使用dropout,不过要给一个更高的概率(前面说隐含单元每一次存在的概率为0.5,而输入单元存在的概率要高很多),这在实际中已有应用。

下图提到了dropout的性能,其能降低过拟合的程度。

10_30

下图从另一个角度来解释了dropout。

10_31

There’s another way to think about dropout, which is how I originally arrived at the idea. And you’ll see it’s a bit related to mixtures of experts, and what’s going wrong when all the experts cooperate, what’s preventing specialization? So, if a hidden unit knows which other hidden units are present, it can co-adapt to the other hidden units on the training data. What that means is, the real signal that’s training a hidden unit is, try to fix up the error that’s leftover when all the other hidden units have had their say.

That’s what’s being back propagated to train the weights of each hidden unit. Now, that’s going to cause complex co-adaptations between the hidden units. And these are likely to go wrong when there’s a change in the data. So, a new test data, If you rely on a complex co-adaptation to get things right on the training data, it’s quite likely to not work nearly so well on new test data. It’s like the idea that a big, complex conspiracy involving lots of people is almost certain to go wrong because there’s always things you didn’t think of. And if there’s a large number of people involved, one of them will behave in an unexpected way. And then, the others will be doing the wrong thing. It’s much better if you want conspiracies, to have lots of little conspiracies. Then, when unexpected things happen, many of the little conspiracies will fail, but some of them will still succeed.

So, by using dropout, we force a hidden unit to work with combinatorially many other sets of hidden units. And that makes it much more likely to do something that’s individually useful rather than only useful because of the way particular other hidden units are collaborating with it. But it is also going to tend to do something that’s individually useful and is different from what other hidden units do. It needs to be something that’s marginally useful, given what its co workers tend to achieve. And I think this is what’s giving nets with dropout, their very good performance.

总体理解的不是很透彻,以后有了新的理解之后会做修正补充。