放牧代码和思想
专注自然语言处理、机器学习算法

Hinton神经网络公开课10 Combining multiple neural networks to improve generalization

目录

2017年05月26日21-42-57.png这节课讲了为什么要综合多个模型,好处与原理、具体做法等。讲解了贝叶斯学习中的神经网络模型混合、马尔科夫蒙特卡洛方法,以及从新角度阐释更高效的Dropout。

综合网络:偏置方差均衡

训练数据少,容易过拟合。综合多个模型可以防止过拟合,特别是当模型做出的预测差别很大的时候。

对回归来讲,平方误差可以分解为偏置与方差两项。偏置由模型过于简单带来,方差由模型过于复杂带来。方差项之所以称为方差,是因为再来一个同分布的训练集,因为采样误差的存在,模型拟合的结果会不一样,于是产生方差。

通过平均多个模型,可以降低方差。这些被平均的模型一般具有高方差低偏置。

综合模型的优势

的确在某些特定例子上,单个模型会比综合模型得到更准确的结果。但单个模型擅长的例子各不相同。如果在同一个例子上单个模型们分歧很大,则综合模型将胜出所有的单个模型。所以要主动让它们产生差异。

综合模型降低方差

假设$\bar{y}$是所有模型预测结果的平均:

2017年05月26日15-06-14.png

尖括号表示期望,下标表示谁的期望。

如果随机挑选单个模型,则结果与目标值的平方误差的期望如下:

2017年05月26日15-10-57.png

同时加上一个$\bar{y}$减去一个$\bar{y}$,得到等号右边的部分。

展开平方后,没有下标i的与i无关,可以提出来,得到最终一步。在最终一步里,第一项是综合模型的平方误差;第二项是单个模型的方差;第三项中第一个括号与第二个括号无关,可以看做常系数,而$\bar{y}$是$y_i$的平均,均值是0,所以第三项为零。

于是有$<(t-y_i)^2>_i-(t-\bar{y})^2=<(y_i-\bar{y})^2>_i$,这说明随机挑选单个模型执行预测得到的平方误差,比综合模型的平方误差要大,而且大出了所有模型的方差那么大。

图解

2017年05月26日15-23-28.png

横轴是预测结果,可见所有模型的预测都偏高了。越远离目标值t,平方误差越大越接近目标值t,平方误差越小

红色效果更显著,因为是平方运算。

假设$t=0$,红绿离均值距离都是$\epsilon$,那么随机选择单个模型得到的平方误差是

2017年05月26日15-30-29.png

比综合模型的${\bar{y}}^2$要大。

这种效果不是一直有的,这取决于平方误差的存在。如果你用平均多个时钟的结果,则可能造成灾难。

分类问题是同理的吗

前面是回归问题,分类问题也有类似的道理吗?

假设一个模型以$P_i$给出正确答案,另一个模型是$P_j$,则平均下来是否效果更好?

如果以对数概率作为目标函数去衡量的话,则答案是效果要好。

2017年05月26日15-36-18.png

画个图一目了然:

2017年05月26日15-39-14.png

让模型各持己见

这种方法的关键之处是让模型的预测结果差异化,有很多手段可以达到这一点。

有种笨办法是利用学习算法只能达到不同的局部最优点这个性质,值得一试。

也可以利用多种模型,比如非神经网络的模型(决策树、SVM,广告时间推荐Andrew NG的机器学习课程)。

如果非要用神经网络一家,可以通过不同数量的隐藏层、不同数量的隐藏单元、不同类型的单元(激活函数不同)、不同的权值惩罚因子、不同的学习算法来实现。

通过不同的训练数据实现

还可以让它们接受的训练数据不同。一种具体的做法是bagging,通过去掉全集中的一部分实例、重复等量实例来获得与全集大小一致的训练“子集”。随机森林就是利用bagging得到的多个决策树模型,比单个模型效果好很多。

但将bagging用于神经网络实在太昂贵了,因为神经网络的训练通常比其他模型耗时更多。

另一种做法是boosting,用全集训练但实例的权值不同。那些被前面模型误分类的实例将被提权以获得重视。第一次应用是在MNIST数据集上,因为那时候的计算机非常弱。

混合专家模型

中心思想是训练擅长不同数据子集的“专业化”模型,然后有一个“总经理”模型来决定数据属于哪个领域应当被交给哪个模型来处理。这种方法使得数据碎片化,利用效率低。在小数据集上效果不好,但在大规模数据集上则效果较好。

在Boosting中,模型权值一致实例权值不同;而在此处模型的权值因实例的不同而不同,从而选择依赖哪个模型。在训练时,这会导致模型分配给不同的领域,而忽略它不擅长的领域。

关键之处是让一个模型专注于预测那些比其他模型预测得更准的实例上,这会带来“专业化”。

模型流派

有些模型非常地“local(局部、局限)”,比如最近邻:仅仅储存所有训练实例,在预测的时候找出与训练实例最近的就给出答案。

这些模型训练起来很快,但不平滑。

2017年05月26日16-07-05.png

另一些模型是完全全局化的,比如多项式模型。这些模型难以训练,而且不稳定。这是因为每个参数都取决于所有数据。

2017年05月27日09-56-08.png

多个局部模型

在上述两种极端模型的中间,是多个局部模型的综合模型,其复杂度也是中等的。

如果数据来自不同的领域,有着各自不同的规律,则效果很好(比如金融数据)。但问题是,如何将数据分为不同的领域呢?

数据分块

需要将数据聚类到不同的领域,每个局部模型负责一个。但这不是根据输入向量来聚类的,而是根据输入-输出的相似性进行聚类的。

 鼓励合作的损失函数

如果要鼓励模型合作,可以计算所有模型的输出的平均与目标值的误差,并尝试降低此误差。

2017年05月26日19-45-49.png

这会导致模型过拟合,但这种过拟合实际上是,一些模型学习了如何弥补其他模型的失误。

图解为什么平均会导致合作而不是专业化

2017年05月26日19-49-42.png

上图中间的是目标值,左边是某个模型的输出,右边是其他模型的输出的均值。由于寡不敌众,均值肯定是非常非常接近$\bar{y_{-i}}$的。如果我们想让均值靠近t,则$y_i$必须远离(红色箭头)目标值。这说明该模型其实是在学习弥补其他模型的过失,而不是在学习真正的知识(绿色)。我们真的希望如此吗?

鼓励专业化的误差函数

另一种机制与上述机制稍有不同。要想鼓励专业化,就将每个模型的输出单独地与目标值作比较;然后训练一个“队长”负责分配每个模型的权重。

2017年05月26日19-56-19.png

误差是模型的平方误差的加权的期望。

在这种机制下,每个专家只负责一个很小的子集,而在其他实例上不起作用。

图解专家架构

损失函数定义为:

2017年05月26日20-00-34.png

然后根据输入

2017年05月26日20-01-20.png

每个专家都做出判断,但“领导”也同时根据输入决定每个专家做出的判断的“可信程度”。

代价函数的导数

2017年05月26日20-04-50.png

其中$x_i$是gating network的输出,也即softmax层的输入。

从对专家输出的导数上看,如果某个实例上某个专家的权重很小,说明这不是该专家负责的领域。则该专家会得到很小的梯度,也就不会被“打扰”了。

另一方面,对$x_i$求导,会得到:

2017年05月26日20-08-49.png

这是该专家被挑到的概率乘以它自己的平方误差与综合模型的平方误差之差。这个公式的意义是,如果该专家的平方误差比整体平方误差小,负梯度更新,则增大它的权重;反之则减小。这就是“专业化”。

更好的损失函数

只是简单介绍一下,更好的解释还是广告时间Andrew NG的课。回忆一下上节课讲的,将模型的输出看做方差为1的高斯分布。

2017年05月26日20-14-17.png

红绿两个专家的输出分别看做上图两个高斯分布。“领导”负责输出两者的权重,该权重被用来缩放各自的高斯分布:

2017年05月26日20-19-20.png

求和后会得到黑色的预测分布,这不是高斯分布了。我们的目的是最大化此预测分布下目标值的对数概率。

混合高斯模型下的目标值概率

2017年05月26日20-24-04.png

上表C表示第C个训练实例,$\sqrt{2\pi}$是方差为1的高斯分布的正规化项。于是目标函数定义为上述概率的负对数,需要得到最小化。

知识共享许可协议 知识共享署名-非商业性使用-相同方式共享码农场 » Hinton神经网络公开课10 Combining multiple neural networks to improve generalization

分享到:更多 ()

评论 欢迎留言

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

我的开源项目

HanLP自然语言处理包基于DoubleArrayTrie的Aho Corasick自动机