共计 4358 个字符,预计需要花费 11 分钟才能阅读完成。
作者 |Kelvin Lee
编译 |Flin
起源 |towardsdatascience
取得对正则化的直观意识
在机器学习中,正则化是一种用来反抗高方差的办法——换句话说,就是模型学习再现数据的问题,而不是对于问题的潜在语义。与人类学习相似,咱们的想法是构建家庭作业问题来测试和构建常识,而不是简略的死记硬背:例如,学习乘法表,而不是学习如何乘。
这种景象在神经网络学习中尤为广泛——学习能力越强,记忆的可能性就越大,这取决于咱们这些实践者如何疏导深度学习模型来排汇咱们的问题,而不是咱们的数据。你们中的许多人在过来都曾遇到过这些办法,并且可能曾经对不同的正则化办法如何影响后果造成了本人的直观意识。为你们中那些不晓得的人(甚至为那些晓得的人!)本文为正则化神经网络参数的造成提供了直观的领导。将这些方面可视化是很重要的,因为人们很容易将许多概念视为天经地义;本文中的图形和它们的解释将帮忙你直观地理解,当你减少正则化时,模型参数的理论状况。
在本文中,我将把 L2 和 dropouts 作为正则化的规范模式。我不会探讨其余办法(例如收集更多数据)如何扭转模型的工作形式。
所有的图形和模型都是用规范的迷信 Python 堆栈制作的:numpy
、matplotlib
、scipy
、sklearn
,而神经网络模型则是用 PyTorch 构建的。
开发简单函数
深度学习的外围准则之一是深度神经网络作为通用函数迫近的能力。无论你感兴趣的是什么,疾病流传,主动驾驶汽车,天文学等,都能够通过一个自学习模型来压缩和表白,这种想法相对是令人惊奇的!只管你感兴趣的问题实际上是是否能够用解析函数 f 来示意这些问题,但当你通过训练来调整机器学习模型时,该模型采纳的参数 θ 容许模型近似地学习 f*。
出于演示的目标,咱们将查看一些绝对简略的数据: 现实状况下,一维中的某些数据足够简单,足以使老式曲线拟合变得苦楚,但还不足以使形象和了解变得艰难。我要创立一个简单的函数来模仿周期信号,然而要退出一些乏味的货色。上面的函数实现如下方程:
其中 A,B,C 是从不同高斯分布中采样的随机数。这些值的作用是在十分类似的函数之间加上滞后,使得它们随机地加在一起产生十分不同的 f 值。咱们还将在数据中增加红色(高斯)噪声,以模仿所收集数据的成果。
让咱们将随机生成的数据样本可视化:在本文的其余部分中,咱们将应用一个小的神经网络来重现这条曲线。
为了进行咱们的模型训练,咱们将把它分成训练 / 验证集。为此,我将在 sklearn.model_selection
中应用极其不便的 train_test_split
性能。让咱们设计训练和验证集:
正如咱们在图中看到的,这两个汇合在示意整个曲线方面都做得相当好:如果咱们删除其中一个,咱们能够或多或少地收集到数据表示的雷同图片。这是穿插验证的一个十分重要的方面!
开发咱们的模型
当初咱们有了一个数据集,咱们须要一个绝对简略的模型来尝试复制它。为了达到这个目标,咱们将要解决一个四层的神经网络,它蕴含三个暗藏层的单个输出和输入值,每个暗藏层 64 个神经元。
为了不便起见,每个暗藏层都有一个 LeakyReLU 激活,输入上有 ReLU 激活。原则上,这些应该不那么重要,然而在测试过程中,模型有时无奈学习一些“简单”的性能,特地是当应用像 tanh 和 sigmoid 这样容易饱和的激活函数时。在本文中,这个模型的细节并不重要:重要的是它是一个齐全连贯的神经网络,它有能力学习迫近某些函数。
为了证实模型的有效性,我应用均方误差(MSE)损失和 ADAM 优化器执行了通常的训练 / 验证周期,没有任何模式的正则化,最初失去了以下后果:
当咱们应用此模型来预测:
除了曲率变动很快的区域(靠近 x =11)之外,这个模型很好地再现了咱们的“简单”函数!
当初,我能够听到你在问:如果模型运行良好,我为什么要做任何正则化?在本演示中,咱们的模型是否过拟合并不重要:我想要了解的是正则化如何影响一个模型; 在咱们的例子中,它甚至会对一个完满的工作模型产生不利影响。在某种意义上,你能够把这了解为一个正告: 当你遇到适度拟合时要解决它,但在此之前不要解决。用 Donald Knuth 的话说,“不成熟的优化是万恶之源”。
正则化如何影响参数
当初咱们曾经实现了所有的样板文件,咱们能够进入文章的外围了! 咱们的重点是建设对正则化的直观意识,即不同的正则化办法如何从三个角度影响咱们的简略模型:
- 训练 / 验证的损失会怎么?
- 咱们的模型性能会产生什么变动?
- 理论的参数会怎么呢?
尽管前两点很简略,然而很多人可能不相熟如何量化第三点。在这个演示中,我将应用核密度评估来测量参数值的变动: 对于那些相熟 Tensorboard 的人来说,你将看到这些图; 对于那些不晓得的人,能够把这些图看作是简单的直方图。指标是可视化咱们的模型参数如何随正则化而变动,下图显示了训练前后 θ 散布的差别:
蓝色曲线被标记为“平均的”,因为它代表了咱们用均匀分布初始化的模型参数: 你能够看到这基本上是一个顶帽函数,在核心具备相等的概率。这与训练后的模型参数造成了显明的比照:经过训练,模型须要不平均的 θ 值能力表白咱们的性能。
L2 正则化
正则化最间接的办法之一是所谓的 L2 正则化:L2 指的是应用参数矩阵的 L2 范数。由线性代数可知,矩阵的范数为:
在前神经网络机器学习中,参数通常用向量而不是矩阵 / 张量来示意,这就是欧几里得范数。在深度学习中,咱们通常解决的是矩阵 / 高维张量,而欧几里德范数并不能很好地扩大(超过欧几里德几何)。L2 范数实际上是上述方程的一个特例,其中 p =q= 2 被称为 Frobenius 或 Hilbert-schmidt 范数,它能够推广到有限维度(即 Hilbert 空间)。
在深度学习利用中,利用这种 L2 正则化的个别模式是在代价函数 J 的开端附加一个“惩办”项:
很简略,这个方程定义了代价函数 J 为 MSE 损失,以及 L2 范数。L2 范数的影响代价乘以这个前因子 λ;这在许多实现中被称为“权值衰减”超参数,通常在 0 到 1 之间。因为它管制了正则化的数量,所以咱们须要理解这对咱们的模型有什么影响!
在一系列的试验中,咱们将反复与之前雷同的训练 / 验证 / 可视化周期,然而这是在一系列的 λ 值上。首先,它是如何影响咱们的训练的?
让咱们来剖析一下。更深的红色对应于更大的 λ 值(只管这不是一个线性映射!), 将训练损失的痕迹显示为 MSE 损失的日志。记住,在咱们的非正则化模型中,这些曲线是枯燥递加的。在这里, 当咱们减少 λ 的值,最终训练误差大大增加, 并且晚期损失的缩小也没有那么显著。当咱们试图应用这些模型来预测咱们的性能时,会产生什么?
咱们能够看到,当 λ 值很小时,函数依然能够很好地表白。转折点仿佛在 λ =0.01 左近,在这里,曲线的定性形态被再现,但不是理论的数据点。从 λ >0.01,模型只是预测整个数据集的平均值。如果咱们把这些解释为咱们在训练上的损失,那么损失就会进行,这也就难能可贵了。
那么参数的散布呢?
咱们看到, 参数值的流传大大碰壁, 正如咱们的 λ 从低到高。与均匀分布相比,参数值的扩大越来越接近于零,λ=1.0 时,θ 的散布看起来就像一个在 0 处的狄拉克 δ 函数。由此,咱们能够打消 L2 正则化作用于束缚参数空间——强制 θ 十分稠密并且靠近零。
dropouts 呢?
另一种风行且老本高效的正则化办法是在模型中蕴含 dropouts。这个想法是,每次模型通过时,一些神经元通过依据概率 p 将它们的权值设置为 0 来失活。换句话说,咱们对参数利用一个布尔掩码,每次数据通过不同的单元时都被激活。这背地的基本原理是将模型学习散布在整个网络中,而不是特定的一层或两层 / 神经元。
在咱们的试验中,咱们将在每个暗藏层之间退出 dropout 层,并将 dropout 概率 p 从 0 调整为 1。在前一种状况下,咱们应该有一个非正则化的模型,而在后一种状况下,咱们各自的学习能力应该有所降落,因为每一个暗藏层都被停用了。
咱们看到了与 L2 正则化十分类似的成果: 总体而言,模型的学习能力降落,并且随着 dropout 概率值的增大,最终损失的比例也增大。
当咱们试图应用这些模型来预测咱们的性能时:
如图,咱们逐渐减少了 dropout 概率。从 p =0.1 开始,咱们能够看到咱们的模型对于它的预测开始变得相当不牢靠: 最乏味的是,它仿佛近似地跟踪了咱们的数据,包含乐音!
在 p =0.2 和 0.3 时,这一点在 x =11 时更加显著——回忆一下,咱们的非正则化模型很难失去正确的函数区域。咱们看到,带 dropout 的预测实际上使这一区域难以置信的含糊,这简直就像模型通知咱们,它是不确定的!(前面会具体介绍)。
从 p =0.4 开始,模型的能力仿佛受到了极大的限度,除了第一局部之外,它简直无奈再现曲线的其余局部。在 p =0.6 时,预测后果仿佛靠近数据集的平均值,这仿佛也产生在 L2 正则化的大值上。
咱们的模型参数呢?
将此后果与咱们的 L2 范数后果进行比拟: 对于 dropout,咱们的参数散布更广,这减少了咱们的模型表白的能力。除 p =1.0 外,dropout 概率的理论值对参数的散布影响不大,如果有影响的话。在 p =1.0 时,咱们的模型没有学到任何货色,只是相似于均匀分布。在 p 值升高时,只管速度升高了,模型依然可能学习。
最初
从咱们简略的试验中,我心愿你曾经从咱们摸索的三个角度,对这两种正则化办法如何影响神经网络模型造成了一些直观意识。
L2 正则化非常简单,只须要调整一个超参数。当咱们减少 L2 惩办的权重时,因为参数空间的变动,对于大的值(0.01-1),模型容量降落得十分快。对于较小的值, 你甚至可能不会看到模型预测有什么变动。
Dropouts 是一种更简单的正则化办法,因为当初必须解决另一层超参数复杂性(p 能够为不同的层提供不同的值)。尽管如此,这实际上能够提供模型表白的另一个维度: 模型不确定性的模式。
在这两种办法中,咱们看到正则化减少了最终的训练损失。这些人工模式的正则化 (与获取更多的训练数据相同) 的代价是它们会升高模型的容量: 除非你确定你的模型须要正则化,否则在这样的后果下,你不会心愿正则化。然而,通过本指南,你当初应该晓得这两种模式如何影响你的模型!
如果你感兴趣,能够在 Binder 上(https://mybinder.org/v2/gh/la…)运行一些代码。我不须要运行 torch
模型(这会耗尽它们的资源),然而你能够应用它在 notebook 中查看代码。
原文链接:https://towardsdatascience.co…
欢送关注磐创 AI 博客站:
http://panchuang.net/
sklearn 机器学习中文官网文档:
http://sklearn123.com/
欢送关注磐创博客资源汇总站:
http://docs.panchuang.net/