[Hinton] Neural Networks for Machine Learning - Bayesian

时间:2022-03-13 12:03:25

Link: Neural Networks for Machine Learning - 多伦多大学


Lecture 09

Lecture 10

提高泛化能力

介绍不同的方法去控制网络的数据表达能力,并介绍当我们使用这样一种方法的时候如何设置元参数,然后给出一个通过提早结束训练来控制网络能力(其实就是防止过拟合)的例子。

所以我们需要方法来阻止过拟合,

  1. 第一个方法也是目前最好的方法:就是简单的增加更多的数据,如果你能提供更多的数据,那么就不需要去提出更多花哨的方法了,数据永远有着防止过拟合的正确的特性,在假设你的电脑足够快的情况下,数据是越多越好的。
  2. 第二个方法就是试着对模型的能力进行约束,这样使得模型有足够的能力去拟合真实的规律性,但是却没有足够的能力去拟合由采样误差导致的虚假的规律性。当然这很难,随后会介绍各种方法去试图控制这个能力。
  3. 第三种方法是关于许多不同模型的平均化,如果我们对有着不同形式的模型和犯着不同错误的模型进行均化,那么这个均化后的效果要好于单独的模型。可以通过在训练数据的不同子集上训练这些不同的模型。这种技术也叫做“bagging”。当然也有很多其他的方法去打乱数据使得模型都尽可能的不同。
  4. 第四种方法:也叫做贝叶斯方法,是通过使用一个单一的NN结构,但是却能找到许多不同的权重集合来很好的预测输出。然后再测试数据上,使用所有的这些不同的权重向量来均化这些预测的结果。

各种方法的详解如下

第二个方法

小权值的魅力

也是较为便利的方法就是以很小的权值开始,然后再快要过拟合的时候停止学习,也就是假设它已经找到了正确的规律,但是还没找到由特定的训练集所带来的错误的规律性,在本小结的最后会介绍这方面。

一个常见的方法去控制NN的能力就是通过给定隐藏层数或者每层的单元数量是从小到大,然后惩罚这些权重,通过使用惩罚项或者使用权值的平方值约束(就是L2范数)或者权重的绝对值(L1范数)。

最后,可以通过对权重加上噪音的方法或者对激活值加上噪音的方法来控制模型的能力。

通常来说,我们使用这些不同的能力控制方法中的几种的组合方法。

对于大多数方法来说,有些元参数还是需要去设置的,就像隐藏单元的数量或者层数或者权值惩罚的尺寸(size,或者翻译成范围,规模)。一个显而易见的选择元参数方法就是在每个元参数中的每个参数都使用许多不同的值,

那么问题就是有解决方法吗?

将数据分成三部分:训练交叉验证测试集合

当在一个小的计算机上训练一个大模型的时候而且也没那么多时间去使用不同的隐藏单元数量或者不同的权值惩罚尺寸来训练多次的时候是很好的。你所要做的就是:

以小权值开始,然后随着模型的训练,不断的增大,然后盯着验证集合上的效果,一旦结果开始变差,那么就可以停止训练了。

如果使用的是错误率而不是平方误差或者其他什么误差,那么在集合上的效果折线图也许会特别的波动。所以很难看出它什么时候该停止,所以通常要做的就是看着,然后确定事情真的变坏了,那么就退回到之前最好的那个点上。

这个方法的原理就是当以很小的权值开始的模型通常来说不会有多大的能力,而且这个权值也没有时间变大。

有趣的是为什么小权值有着更低的能力?

考虑一个有着许多输入、许多隐藏单元和许多输出单元的模型,当权值很小的时候,如果隐藏单元是逻辑单元,那么他们总的输入将会接近于0,而且它们差不多会在线性范围的中间,也就是说:

它们的行为很像线性单元,意思就是当权值很小,整个网络和一个将输入直接映射到输出的线性网络是一样的。

所以如果将权值矩阵W1乘以W2,那么就得到了一个用来连接输入和输出的权重矩阵,假设权值很小,那么一层逻辑隐藏单元的网络的行为就很像是线性网络了。

同样假设我们将线性网络中的权重划分成四份,考虑这么一个事实:当对于隐藏单元来说,在线性区域中,他们是有着四分之一的斜面,所以它们的能力不比线性网络强多少。

所以在这里显示的网络中,是3x6和6x2的权重,它的能力不比一个3x2的网络强多少。

按照这种方法增长,开始先使用序列的非线性区域,然后使用所有的这些参数,所以如果这个网络在开始的时候有6个权重,并以30个权重(3x6+6x2)结束.那么就可以认为这个网络的能力是平滑的随着权重变得更大的从6个参数过渡到30个参数(这里看来size应该翻译成规模的意思)。

在早期停止所发生的就是在验证数据上有着尽可能正确数量的参数,也就是在拟合正确的规律性和具体选择的训练样本导致的错误的规律性之间的优化。

L1 & L2 

通过限制权重的大小来控制模型的能力。

标准的方法就是通过引入一个惩罚项来防止权重变得太大,这里是包含一个隐藏的假设:有着很小权值的网络比有着大权值的网络更简单。有好几个不同的惩罚项可以使用,同样也可以限定权值来使得输入到每个隐藏单元的权重向量不允许比某个具体的长度要长(个人:这里是使用的欧式距离的长度,其实就是自身的平方再开根)。

标准的限制权重的大小的方法就是使用一个L2权重惩罚,也就是惩罚权重的平方值,在NN文献中有时候也叫做权重衰减,因为这个惩罚项的导数扮演着将权重强制推向0的行为。

L1惩罚,这里损失函数是一个 “V”字形。所以这里我们所要作的就是惩罚权重的绝对值。这个方法的一个妙处在于可以使得许多的权重更接近于0,这有助于解释(很像权重稀疏化)。如果只有一点非0的权重留下,那么就更容易懂得网络会发生什么。

【参见ML系列线性分类】

使用噪音作为正则化

在这部分中,会介绍另一个约束NN网络能力的方法。可以通过不论是在权重还是在激活值上增加噪音。开始的部分会介绍,如果在一个简单的线性网络的输入部分增加噪音,然后试图对平方误差进行最小化,也就是等于在网络的权重上使用L2惩罚。然后介绍在更复杂的网络中有关噪音权重的用处,最后介绍一个近来的发现:在激活值上极端的噪音同样可以作为一个很好的正则化器。

首先先介绍当在一个简单的NN的输入部分添加高斯噪音会发生什么事情。

噪音的方差可以通过通过与下一层隐藏层中的连接的平方权重来进行放大。如果我们有个很简单的网络,只有一个线性输出单元去直接与输入相连,那么这个放大的噪音就会加到输出上。

如上图右边部分,

首先是一个输入Xi和额外的采样自0均值和方差sigma的平方的高斯的高斯噪音,这个额外的噪音是通过平方权重与其相乘的。

然后输出到神经元 j 上,所以神经元 j 的输出前的部分(就是经过激活函数前的部分,这里不确定是前还是后,个人倾向于前)就是 yj + 有着0均值和wi平方乘以sigma i 平方的高斯噪音。额外的方差使得对平方误差来说有额外的贡献,可以认为这像pythagoras 理论,也就是平方误差是由yj和额外的噪音导致的平方误差的和,因为这个噪音与yj之间是独立的。如果它是个噪音-free系统,那么当我们最小化总的平方误差的时候,就能出现平方误差的最小化值。

另外,我们还会对第二项进行最小化,也就是会最小化第二项的期望平方值,而这个期望平方值就是Wi2乘以sigma i2(就是上图中输出单元部分的高斯方差),所以这也相对应于一个在wi上和sigma i2上的L2惩罚。

在更复杂的网络中,我们可以通过在权重上增加高斯噪音的方式来约束模型的能力,这不完全等于一个L2惩罚,但是这看上去有更好的效果,特别是在递归网络中。所以AlexGrave近来在他的识别手写数字的递归网络的权重上增加噪音,实验表明效果更好了。

我们可以同样地在激活值上使用噪音作为一个正则化器,所以假设我们使用BP去训练一个有着逻辑隐藏单元的多层网络。如果我们在前馈中使单元是二值化和随机的,但是在后向传播上就像使用正常的确定性直传中使用实值那么会发生什么事情。所以我们是将逻辑单元在前馈中当成随机二值神经元,也就是我们计算逻辑P的输出,然后将P视为输出 1 的概率。在前馈中,使用的是概率随机来决策是否输出是1还是0。但是在后向路径中,使用p的实值作为后向传播的导数来通过这些隐藏单元。这不是很准确,但是它很接近一个为了随机系统所做的正确的事情,如果所有的单元都对上层的每个单元都有很小的贡献。

这么做的话,在训练集上的效果会更差,而且训练相对来说更慢了而且是几倍的慢。但是在测试集上它很明显的会更好。这也是当前一个没公开发表的结果。

第四个方法

贝叶斯方法的介绍

这部分将会介绍贝叶斯的方法去拟合模型,通过使用一个简单的抛硬币的例子来讲解。贝叶斯的原理是不使用模型的参数最可能的设置,而是考虑所有可能的参数设置然后试着对每个可能的设置找出在给定数据下它的概率。

(略)

权重衰减的贝叶斯解释

这部分将会介绍权重衰减的贝叶斯解释。在全贝叶斯方法中,我们试图计算模型中每个可能的参数集合下的后验概率,但是那是一个贝叶斯方法的相当简约的形式。简单的说去寻找一个单一参数集合,能够在先验概率和数据的之间最好的比较下的值,也被称为最大后验学习(MAP)。这也可以用来解释当使用权重衰减去控制模型能力的时候到底发生了什么。

[Hinton] Neural Networks for Machine Learning - Bayesian

这里会介绍当在有监督最大似然学习的过程中最小化平方误差的时候会发生什么。即:找到一个权重向量去最小化平方残差(就是目标值和网络的预测值之间的差异)等于找到一个权重向量去最大化有关正确解的log似然密度。【logistic的感觉】

为了找到这样的等式,我们需要假设这个正确值是由网络的输出加上高斯噪音形成的。所以原理就是:我们首先在基于输入的情况下运行一次这个网络得到一个预测值,然后加上高斯噪音,然后我们就会问了,这样做的正确的答案的概率是什么?

所以模型的输出就是高斯的中间(上图右边的图),我们所关心的就是希望在基于高斯的情况下目标值的概率最高,因为这个概率会生成 t ,这样的情况下网络会给出一个输出,即 y 是当高斯的中心在y 的时候 t 的 概率密度。

[Hinton] Neural Networks for Machine Learning - Bayesian

所以数学上看上去是这样的:假设基于训练样本c的网络的输出为yc,这个输出是由作用在输入c上的权值W一起生成的。那么基于输出值的情况下的目标值的概率就是在输出yc上加上由高斯中心在yc上的高斯噪音(上图第二个式子)。所以我们对基于高斯中心位于网络的输出的情况下目标值的概率密度很感兴趣。在上图第二个式子的右边部分,就是有着均值为yc的高斯分布,并也假设一些方差,在随后介绍。如果我们现在使用log函数,然后使用负号,那么就得到上图第三个式子,一个在给定网络输出yc的情况下目标值tc的概率 负log函数,是一个来自于对高斯的标准化的常数项加上指数的log项(上图第三个式子的右边部分)。即如果我们的损失韩式是关于正确解的负log分布,也就转换成最小化一个平方距离(上面第三个式子右边的tc-yc),这有助于了解当在使一个平方误差最小的时候,可以找到一个概率的解释,在这个概率解释中,就可以在基于高斯的情况下最大化log概率。

[Hinton] Neural Networks for Machine Learning - Bayesian

所以合适的贝叶斯方法就是找到基于所有可能的权重向量的情况下的全后验分布。如果有很多权重,那么当有个非线性网络的时候,这就变得即没希望而且很困难。贝叶斯有许多方法来逼近这个分布,比如Monte Carlo 方法,但是这次,我们试图让事情变得更简单一些。

【以下是重点】

让我们找到这个最可能的权重向量,所以这个单一权重设置就是在知道先验知识的时候和数据的时候,找最可能的值。所以我们要做的就是找到W的最优值,

通过使用随机权重向量初始化,

然后将权重进行调整使得能够提升在给定数据的时候权重的概率;它有可能是个局部最优值。

现在在log领域工作会比概率更容易,所以如果我们想要最小化一个损失,那么就是用负的log函数【这就是logstic收敛的问题】。

[Hinton] Neural Networks for Machine Learning - Bayesian

所以,最后可以得到关于权重衰减或者权重惩罚的基本的解释。

我们试图最小化在给定数据的时候权重的负log概率,这涉及到最小化依赖权重转变的一项,即我们如何转移目标并且确定这只依赖于权重。从给定权重的输出的log概率中推出,如果我们假设高斯噪音被加在网络的输出上,然后log概率是基于被缩小2倍乘以高斯噪音方差网络的的输出值和目标值之间的平方距离。相似的,如果我们假设一个权重的高斯先验,这个基于先验的权重log概率就是被缩小2倍乘以这个高斯先验方差的权重的平方值。

所以,现在将上图中第二个式子进行化简,得到第三个式子,将两边乘以2×数据方差的平方,我们就得到了一个新的损失函数:

    • 第一项就是当我们乘的过程中得到的简单的所有训练样本得到的预测值与目标值差异平方的和,这就是我们通常说的平方误差。
    • 第二项现在变成了两个方差的比率乘以权重平方的和,

所以,你所看到的就是这两个方差的比率就是权重惩罚,所以我们最初的权重惩罚的想法就是一个试图让网络效果更好的数值,这里你需要通过使用验证集合来拟合权重惩罚的值,但是现在所见的就是如果我们使用这个高斯的解释,即高斯先验,那么对于这种关于网络输出与目标值关联的高斯模型,权重惩罚是由这些高斯方差决定的,而这只是这些高斯的比率罢了,这不是基于所有这些框架的一个随机值。

MacKay的固定权重损失的快速和脏方法

这部分,介绍一个由David Mackay在1990年提出的方法,为了决定在一个没有使用验证集的NN中的权重惩罚。这是基于我们可以将权重惩罚解释成映射估计使得权重惩罚的大小与基于权重的先验分布的tightness(不知道怎么翻译合适)有关的。

Mackay的方法说明我们可以经验性的拟合权重惩罚和假设在NN的输出中的噪音两个项去。

为了得到不需要验证集和而且拟合权重的方法,这样就能允许我们可以在不同的子集上拥有不同的权重惩罚去作为NN中的连接,这些链接在验证集合上的代价很大。mackay 在使用这种方法赢得了比赛。

这里介绍一个由David Mackay提出的简单的,实用的方法,即我们可以将权重惩罚解释成两个方差的比率。在我们学到一个模型去最小化平方误差的时候,我们就能找到关于输出方差的最好的值,这个最好的值是通过简单的残差误差的方差来找到的。

我们同样可以子权重的高斯先验中估计这个方差,我们需要猜测这些方差应该是什么值来作为开始,然后做一些学习,然后使用一个非常脏的技巧,被称之为“经验性贝叶斯”。我们将我们的先验的方差设置成学到的模型的权重的方差,因为这个方差可以让这些权重最相似。这真的违反了许多贝叶斯方法的前提。我们使用数据去决定我们的先验置信该是什么。所以一旦我们学到了权重,我们使用一个0均值的高斯去拟合学到的权重的一维分布。然后我们考虑这个高斯的方差,然后将它作为我们的先验。现在一个美妙的事情就是,不同的权重子集。就像在不同的层中一样,例如,我们可以从不同的层中学习不同的方差。我们不需要验证集和,所以我们可以使用所有非测试数据去训练这个模型,因为我们不需要验证集和去决定不同层中的惩罚项,所以我们实际上可以有许多不同的权重惩罚。而这是很难用验证集和来得到的。

所以这就是Mackay的方法,以猜测噪音方差的值和权重先验方差的值作为起始。实际上,所有你所需要做的就是猜测这个比率。

然后做一些梯度下降学习去改善这些权重。然后从新设置这些噪音方差成为残差误差的方差,并从新设置权重的先验方差成为实际学到的权重的分布的方差。

然后回到这个循环的开始部分再来一遍。所以这在实际中是很实用的。Mackay用这种方法赢得了一些比赛。

全贝叶斯学习

(略)

第三种方法

模型的结合

这部分将介绍为什么当我们进行预测的时候,想要将许多模型结合起来。如果我们只有一个模型,我们不得不对这个模型选择某些能力:【经典总结】

    • 如果我们选择的能力太少,那么模型可以在训练数据中拟合规律;
    • 如果我们选择过多的能力,那么就有可能拟合到具体训练数据集合中的采样误差。

通过使用一些模型,我们就能对拟合真实规律性和过拟合采用误差之间进行权衡。

在这部分开始的时候,会展示当你对模型进行平均化的时候,你可以得到比任何单一模型更好的期望结果。而且当每个模型之间的预测有很大不同的时候这个结果是最显著的;在本部分的结尾,会介绍几种不同的方法来鼓励不同的额模型进行非常不同的预测。

就像以前我们所认为的那样,当我们的训练数据量是受约束的,那么就倾向于会过拟合。如果我们对许多不同的模型的预测结果进行平均化,那么就能减少过拟合的现象。当每个模型的预测结果有很大的不同的时候这是非常有帮助的。

对于回归来说,平方误差可以被分解成 "一个偏置项 + 一个方差项",这有助于我们分析会发生什么。

如果这个模型只有很少的能力去拟合数据(欠拟合),那么偏置项会很大,它可以用来测量这个模型逼近真实函数的poorly程度;

如果模型有着过多的能力去拟合具体训练数据集中的采样误差(过拟合),那么这个方差项会很大,它之所以称之为方差,是因为如果我们从同样的分布中取得同样尺寸的另一个训练数据集,我们的模型会对这个训练数据集拟合出不同的情况(因为有着不同的采样误差)。所以我们会以这种方式得到模型拟合不同训练集和的方差。

如果我们对所有模型一起进行平均化,我们所作的就是希望将这个方差给平均化掉,这个原理可以让我们使用那些有着高能力和因而具有的高方差模型。这些高能力模型通常都有着低偏置,所以我们可以通过均化来避免高方差,从而得到没有高方差但却有着低偏置的结果。

【主要是这三个概念:Bagging, Random forests, Boosting】

[Hinton] Neural Networks for Machine Learning - Bayesian

专家混合系统

在这部分将会介绍专家混合系统模型,是在1990年被提出的。这个模型的想法是先训练一些NN,每个NN在数据的不同部分都是专家。也就是说,我们假设有一个来自于不同制度(这个词为regimes在第七课中有出现,当时翻译成制度,虽然还是觉得规则比较好,直接翻译成政权肯定怪怪的)的数据集,然后我们去训练一个系统,在这个系统中每个NN在每个制度中是专业的,还有一个管理NN用来观察输入数据并且决定将数据给哪个专家。这种系统对于数据的利用来说并不高效,因为这些数据被所有的不同的NN所划分了,所以对于小数据集来说,也就不期望能够有多好的效果了;但是随着数据集合的变大,这种系统将会表现的越来越好,因为它能够极好的使用这些数据。

【专家投票机制,就是Bagging】

Dropout

现在想要介绍一种高效的方法去均化大量的NN,这是一种代替正确贝叶斯的方法。这个可选的方法可惜不能像正确的贝叶斯那样得到很好的结果,但是它却更实用。

所以,考虑一个只有一层隐藏层的NN(上图右边的网络),每一次我们输送一个训练样本到这个结构中,然后,以0.5的概率随机忽略隐藏层中的隐藏单元,所以,这里就相当于剔除了三个隐藏单元,我们运行这个样本通过NN的时候是让这几个隐藏单元缺席的,意思就是我们从2^H个不同的结构中随机采样,这里的h就是隐藏单元的个数,可以看得出来这是一个巨大的数字。当然所有的这些结构共享权重,也就是但我们使用一个隐藏单元的时候,它得到的权重与其他结构中是一样的。

【相当于整合了更多的相对较弱的模型】

所以我们可以认为dropout是模型均化的一种形式。我们从2^H个模型中进行采样,事实上大多数的模型将不会被采样到,而且这些采样到的模型也只得到了一个训练样本。这是对于bagging来说是极端的存在。

这个训练集合对于这些不同的模型来说是非常不同的,但是他们同样很小。

基于所有模型的权重共享意味着每个模型是被其他模型强烈正则化的,而且这是一个比L2或者L2这样的惩罚更好的正则化器,这些L2或者L2惩罚会将权重推向0。但是与其他模型的共享权重来说,是从那些倾向于将权重拉向正确值的正则化模型。

那么对于输入层来说呢,我们可以使用同样的技巧。

我们在输入上使用dropout,但是我们使用一个更高概率来保持一个输入单元。这个技巧在被称为消噪自动编码器系统中已经使用了,是由pascal  Vincent、 Hugo Laracholle 和 Yoshua  bengio在Montreal大学中提出的,它效果很好。

[Hinton] Neural Networks for Machine Learning - Bayesian