机器学习中使用的神经网络第九讲笔记

Posted Marcovaldo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习中使用的神经网络第九讲笔记相关的知识,希望对你有一定的参考价值。

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份(记为S1SN)用来作训练集和验证集:每次选择其中一份作验证集Si,其余N-1份作训练集,然后计算出在验证集上的错误率Ei。这里SiS1遍历到SN,从而得到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有时被称之为权值衰减,因为该惩罚项的导数一直限制着权值变大。下图给出了损失函数的公式,其中权值平方和的系数λ称之为权值损失(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)。贝叶斯方法的主要思想不是直接去寻找模型最可能的参数设置,而是考虑所有可能的参数设置,并根据已有数据来得出每种参数设置的可能性有多大。下图给出了贝叶斯框架:

技术分享

这里用抛硬币的例子来介绍贝叶斯方法。

先发上来,剩下的部分明天再更吧

The Bayesian interpretation of weight decay

MacKay’s quick and dirty method of setting weight costs

以上是关于机器学习中使用的神经网络第九讲笔记的主要内容,如果未能解决你的问题,请参考以下文章

Stanford机器学习---第九讲. 聚类

第九讲:工业网络——搭建单环冗余网络

第九讲:工业网络——搭建单环冗余网络

Android第九讲笔记(xUtils框架,Gson框架)

Hulu机器学习问题与解答系列 | 第九弹:循环神经网络

机器学习中使用的神经网络第六讲笔记