在模型出现过拟合时再用正则化处理,
而非一味的使用正则化,正如 Donald Knuth的曾说“过早的优化是万恶之源”
直觉化正则化
在机器学习中,正则化是一种用于规避高方差的方法,换句话说,学习模型的问题以重现数据,而不是问题的底层语义。以类似于人类的学习方式,该想法是构建作业问题以测试和积累知识,而不是简单地死记硬背:例如,识记乘法表而不是学习如何乘法。
这种现象在神经网络的学习中尤为普遍:具有强大的学习能力就很容易记住,而且我们的实践者有责任指导深度学习模型吸收我们的问题,而不是我们的数据。你们中的许多人过去曾经遇到过这些方法,并且可能已经对不同的正则化方法如何影响结果产生了自己的直觉。
希望本文中的数字及其解释有助于您对应用正则化在模型参数影响方面的理解,并产生应用正则化的直觉。
在本文中,我将介绍L2和丢弃作为标准形式的正则化。
所有的图形和模型都是使用标准的科学Python堆栈制作,例如numpy,matplotlib,scipy,sklearn。文中神经网络模型是使用PyTorch构建的
开发复杂的函数
深度学习的核心原则之一是深度神经网络具有通用函数逼近拟合能力。
深度学习的核心原则之一是深度神经网络具有通用函数逼近拟合能力。神奇的是,无论是疾病传播,自动驾驶汽车,还是天文学等等,您所感兴趣的一切想法都可以通过自动学习模型抽象并表达。无论您感兴趣的问题是否可以表达为某种解析函数f,通过自动学习模型抽象并表达。无论您感兴趣的问题是否可以表达为某种解析函数f,通过训练设定机器学习模型条件,所用参数θ可以使模型近似训练函数f 。
我们将查看一些相对简单的数据进行解释:在理想情况下,如果一维的东西复杂复杂到原先曲线难以拟合,但并不到需要做出抽象函数的程度。因此,我将创建一个模拟周期信号的任意复杂函数,但还要添加一些离散项。
函数将以如下方程式实现:
其中A,B,C是从不同高斯分布中采样的随机数。每一个值的作用是在非常相似的函数之间加滞后,以便它们随机加在一起来生成非常不同的f值。我们会还将白噪声(高斯噪声)添加到数据中,以模拟实际收集的数据效果。
让我们随机可视化这些数据样本:在本文剩下部分,我们将通过小型神经网络重现此曲线。
可视化“复杂”函数,对应于X和Y一维数组,每个数组长10,000个元素。
为了进行模型训练,我们将其分为训练/验证集。为此我将在sklearn.model_selection中应用极为便利的train_test_split函数。让我们列出训练和验证集:
蓝点表示测试数据,红色表示训练数据。
正如我们在图中所看到的,这两个集合在表示整体曲线方面做得非常好:如果我们要删除一个或另一个,则可以或多或少地收集到数据表示的相同图片。这是交叉验证的重要方面!
开发我们的模型
现在我们有了一个数据集,我们将需要一个相对简单的模型来尝试重新模拟数据,为此,我们将要处理一个包含单个输入和输出值的四层神经网络。具有三个隐藏层,每个隐藏层具有64个神经元。
简化图:奇异值输入和输出,具有三个隐藏层,每个隐藏层包含64个神经元,每个神经元的宽度都不宽(图中没有绘制所有神经元)
为了方便起见,每个隐藏层都有一个LeakyReLU激活函数,输出上带有ReLU激活函数。理论上这些函数无关紧要,但是测试实践并非如此。有时模型很难学习一些“复杂”函数,尤其是当其使用像tanh或者sigmoid激活函数时
对本文而言,此模型的细节并不重要:重要的是它是一个完全连接的神经网络,具有学习近似函数的能力。
为了证明该模型有效
为了证明该模型有效,我使用均方误差(MSE)损失和ADAM优化器执行了通常的训练/验证周期,在没有进行任何形式的正则化情况下,得出了以下结果:
此模型的训练和验证效果很好:
没有出现高方差或偏差的情况,并且两种损失在100个训练过程中都单调递减。
当我们使用此模型的预测功能时:
我们的模型基本上完美地获得了近似函数!除了曲率快速变化的区域(x = 11附近)之外,该模型还很好地再现了我们的“复杂”函数!
现在,你可能疑惑:如果模型运行良好,为什么要进行正则化?为了演示的目的,我们的模型是否过拟合并不重要:我想解释的是正则化将如何影响模型;在我们的案例中,它甚至可能对完美工作的模型产生有害影响。在某种意义上,发挥预警作用:
在模型出现过拟合时再用正则化处理,而非一味的使用正则化,正如 Donald Knuth的曾说“过早的优化是万恶之源”。
正则化如何影响您的参数
既然我们已经弄清了所有样本内容,那么我们就可以开始讨论本文的真正内容了!我们本文的重点产生一种直觉:不同的正则化方式是如何影响我们的简单模型。
具体从以下三方面阐释:
1,训练/验证损失会发生什么?
2,我们的模型性能如何?
3,实际参数会怎样?
虽然前两点很简单,但是许多人可能不熟悉如何量化第三点。在本演示中,我将使用核密度估计来测量参数值的扩展/变化:对于那些熟悉Tensorboard的人,你可能已经看到过这样的图;对于不熟悉Tensorboard的人来说,你可以将它们视为复杂的直方图。我们的目标是直观呈现我们的模型参数是如何随正则化而变化,下面的图显示了训练前后的θ分布:
简单模型的模型参数θ的内核密度估计。
蓝色曲线被标记为“均匀”,因为它表示的是用均匀分布数据初始化的模型参数:您可以看到它基本上表现为高顶函数,并且在整个中心具有相等的概率。这与训练后的模型参数形成对比:训练后,模型需要不均匀的θ值才能真正表达我们的功能。
L2正则化
最简单的正则化方法之一就是所谓的L2正则化:L2是指我们在参数矩阵中实际上使用L2范数函数。从线性代数,矩阵的范数由下式给出:
任意Lpq范数的一般表达
在神经网络之前的机器学习中,参数通常表示为向量而不是矩阵/张量,这只是欧几里得范数;在深度学习中,我们更常见的是处理矩阵/高维张量和欧几里得范数 L2范数实际上是上述方程式的一种特殊情况,其中p = q = 2,被称为Frobenius或Hilbert-Schmidt范数,它推广为无穷维( 即希尔伯特空间)。
Frobenius / Hilbert-Schmidt(L2)规范
在深度学习应用中,应用L2正则化的一般形式是在成本函数J的末尾附加一个“惩罚”因子:
我们的成本函数:第一部分是预测值与实际值之间的均方差,而右边的部分是我们的L2正则化项。
很简单,此等式将成本函数J定义为MSE损失以及L2范数。L2范数对成本的影响乘以该系数λ;在许多实现中,这称为“权重衰减”超参数,通常在0到1之间。由于它控制正则化的量,我们需要了解这对我们的模型有什么作用!
在一系列实验中,我们将重复之前相同的训练/验证/可视化周期,但是在一系列λ值上进行。首先,它对训练有何影响?
L2正则化对模型训练的影响
L2正则化对模型训练的影响
让我们分解上面的图。红色的深阴影对应于较大的λ值,将训练损失的痕迹显示为MSE损失的对数。请记住我们的非正规模型, 这里,曲线单调弯曲。在这里,随着我们增加λ的值,最终训练误差将显着增加,并且早期时期的损失减少也不会那么剧烈,当我们尝试使用这些模型来预测我们的功能时会发生什么?
使用指定的λ值训练的模型进行预测
我们可以看到,在λ较小的情况下,函数仍可以很好地表示,转折点似乎在λ= 0.01左右,此处复制曲线的定性形状,而不是复制实际数据点。从λ> 0.01 ,该模型只是预测似乎是整个数据集的平均值,就好像我们只是尝试进行线性回归一样。如果我们针对训练损失进行解释,这也就不足为奇了,损失就不再减少了,所以说,用直线可以做很多事情!
参数的分布如何?
每个训练模型的参数分布,
具有不同的λ值,分布的峰值被截断。
从低到高λ,我们看到参数值的分布受到了很大的阻碍;与均匀分布相比,参数值的分布越来越接近零,而当λ= 1.0时,θ的分布看起来只是就像Dirac delta函数在零处一样。由此,我们可以消除L2正则化约束参数空间的作用-迫使θ非常稀疏并接近零。
随机丢失
另一种流行且有效的正则化优化方法是随机丢弃。其想法是,每次通过模型时,根据一些概率p将其权重设置为零来停用许多神经元。换句话说,我们应用一个布尔值掩码,每次通过不同神经单元数据都会被激活。其背后的原理是将模型学习分布在整个网络中,而不是专门针对一层或两层/神经元。
对于我们的实验,我们将在每个隐藏层之间包括随机丢弃项,并将丢弃概率p从0调整为1。前者,我们应该只有一个非正规模型;后者,我们应该使学习能力有所下降,因为每个隐藏层都被停用。
针对一系列随机失活概率模拟训练损失
我们看到了与L2正则化非常相似的效果:总体而言,模型的学习能力降低了,并且随着随机丢弃概率的值越大,最终损失就成比例地越大。
当我们尝试使用这些模型来预测我们的函数时:
从p = 0.1开始,我们可以看到模型对预测的预测开始变得不稳定:最有趣的是它似乎大致跟踪了我们的数据,包括噪声!
在p = 0.2和0.3时,这在x = 11时更明显,回想一下,我们的非正则模型很难正确地确定函数的这一区域,我们看到带有随机丢弃的预测实际上使该区域变得非常模糊,连模型图像都好像在告诉我们它是不准确的。
从p = 0.4开始,似乎模型的容量受到了很多的阻碍,除了第一部分以外,它无法重现大多数曲线。在p = 0.6时,看起来预测几乎接近数据集平均值 ,这似乎也发生在L2正则化的较大值上。
那我们的模型参数呢?
模型参数的分布作为随机失活概率的函数。
将此与我们的L2范数结果进行比较:没有采用随机丢弃方法,我们的参数分布要宽得多,这增加了模型的表达能力.p = 1.0除外,似乎随机丢弃的概率的实际值不会怎么影响参数的分布。p = 1.0时,我们的模型无法学习任何东西,只是类似于均匀分布。在p减小的情况下,模型仍可以设法以较低的速率学习。
结论
从我们的简单实验中,我希望你能从三个角度,开发出一些思维模型,以研究这两种正则化方法如何影响神经网络模型。
L2正则化非常简单,只需一个超参数即可进行调整。随着L2罚值的加权增加,对于大值(0.01–1),参数空间的变化以及模型的容量会迅速减小。较小的值,即使绘制出θ的分布会很明显,甚至可能看不到模型预测的差异。
Dropout是一种更复杂的正则化方法,因为现在必须处理超参数复杂性:p对于不同的层可以具有不同的值。根据您的看法,这实际上可以提供模型表达的另一个维度:以模型不确定性的形式。
在这两种方法中,我们都看到正则化会增加最终的训练损失。这些人为的正则化形式的代价是它们会降低模型的能力:这一般来说不是您想要的。如果模型一定需要正则化,请包括在内。但是,通过本指南,现在应该知道这两种形式是怎样影响你的模型。
领取专属 10元无门槛券
私享最新 技术干货