正则化(regularization)技术是机器学习中十分常用的技术,它在不同的模型或者情景中以不同的名字出现,比如以L2正则化为例,如果将L2正则化用于linear regression,那么这就对应了ridge regression;如果将L2正则化用于神经网络(neural network),那么L2对应为权重衰减(weight decay)。

正则化的作用实际上就是防止模型过拟合,提高模型的泛化能力。正则化的种类有很多,这里主要介绍在工程中用得较多的两类正则化,一个是L1正则化,另一个则是L2正则化。为了配合阐述,本文用linear regression的正则化作为例子来贯穿全文。

当我们用linear regression在训练数据集上训练模型时,我们定义一个最优化目标函数:

(1)

式中(x(i),y(i))为训练数据,w为线性模型的参数向量,为了使得模型能够充分拟合训练样本点,我们希望上述目标函数的值尽可能小,即:

(2)

但是由于实际中的训练数据量往往并不大,如果让模型完美拟合训练数据的话,很可能造成模型过拟合,从而使得模型的泛化能力较差。这一点可以从得到的模型参数向量w的各个分量中看出,其中大部分分量的绝对值都非常大,这种现象直观表现在图上就是曲线(曲面)不光滑,凹凸不平,很复杂;相反,如果w的各个分量的绝对值都很小,在0附近,那么曲线(曲面)就会显得很平滑。很显然,在机器学习中,我们更希望拟合出的曲线(曲面)更为平滑,因为这样的曲线(曲面)是具有较好的泛化能力的。那么如何将w各个分量的绝对值降低呢?这就要用到正则化技术了。在用正则化技术估计参数w时,引入了我们对参数的先验认知,即我们认为参数的绝对值应该很小。

正则化技术就是使得式(2)的值尽可能小,与此同时,要保证||w||的值也尽可能小,即:

(3)

在上式中,优化函数的目标变成了两个,w的取值不仅要使得L(w)的值最小,也要使得||w||的值最小。从上式我们可以看出,一方面要使得L(w)的取值最小,必然w的绝对值会取到很大,这样模型才能完美拟合训练样本点;另一方面,当w的绝对值很大时,||w||的值又会变得很大,因此为了权衡,只有使得w取值适当,才能保证式(3)的值取到最优。这样得到的曲线(曲面)比式(2)得到的曲线(曲面)平滑很多,因此具有泛化能力。值得注意的是,式中的t是L(w)与||w||之间的一个Trade-off,如果t过大,那么表明对模型参数w的惩罚越狠,这样得到的模型处于欠拟合状态,如果t过小,那么表明对模型参数w的惩罚越小,这样得到的模型处于过拟合状态,只有选择合适的t,才能使得到的模型具有很好地泛化能力。关于如何选择t的值,工程上一般采取交叉验证的方式来确定一个较合理的t。

我们先来看L2正则化。

(4)

式中,||w||2为w的2范式,平方是为了求解的方便。

我们来看看L2正则化的性质。

1.从式(4)中可以看出,L2正则化对于绝对值较大的权重予以很重的惩罚,对于绝对值很小的权重予以非常非常小的惩罚,当权重绝对值趋近于0时,基本不惩罚。这个性质与L2的平方项有关系,即越大的数,其平方越大,越小的数,比如小于1的数,其平方反而越小。

2.从贝叶斯推导的角度看,我们可以认为式(4)中的第二项为参数w的一个均值为0的高斯先验分布,即,w~N(0,b2)。这也符合我们对于参数w的先验认知:w的绝对值不是很大。

3.从性质2可知,既然w的先验分布服从高斯分布,那么L2正则化的作用实际上就是使得参数向量w的大部分分量的值趋近于0,而不是等于0。这一点在处理具有共线性特征的特征集时非常重要,也是L2在这种情况下胜过L1的原因。

4.由于式(4)是个凸函数,并且函数可微,因此w的值具有解析解:


从解的解析表达式可以看出,w的求解不需要对X-1是否存在作任何假设,因为I为单位矩阵,因此解析式中的逆始终存在。

接下来我们看看L1正则化。

随着海量数据处理的兴起,工程上对于模型稀疏化的要求也随之出现了。这时候,L2正则化已经不能满足需求,因为它只是使得模型的参数值趋近于0,而不是等于0,这样就无法丢掉模型里的任何一个特征,因此无法做到稀疏化。这时,L1的作用随之显现。L1正则化的作用是使得大部分模型参数的值等于0,这样一来,当模型训练好后,这些权值等于0的特征可以省去,从而达到稀疏化的目的,也节省了存储的空间,因为在计算时,值为0的特征都可以不用存储了。

(5)

式(5)为L1正则化的linear regression,也叫lasso regression。式中||w||1为w的1范式,即 。

同样,我们来看看L1正则化的性质。

1.从式(5)中可以看出,L1正则化对于所有权重予以同样的惩罚,也就是说,不管模型参数的大小,对它们都施加同等力度的惩罚,因此,较小的权重在被惩罚后,就会变成0。因此,在经过L1正则化后,大量模型参数的值变为0或趋近于0,当然也有一部分参数的值飙得很高(这一点在性质2解释)。由于大量模型参数变为0,这些参数就不会出现在最终的模型中,因此达到了稀疏化的作用,这也说明了L1正则化自带特征选择的功能,这一点十分有用。

2.从贝叶斯推导的角度看,我们可以认为式(5)中的第二项为参数w的一个均值为0的拉普拉斯先验分布。从高斯概率密度函数和拉普拉斯概率密度函数的图形中可以看出,拉普拉斯概率密度函数的截尾比高斯概率密度函数的截尾更长,也就是说L1正则化更能够接受绝对值较大的参数值。

3.从性质2可知,既然拉普拉斯分布比高斯分布有更长的截尾,那么可以推知L1正则化的鲁棒性要好于L2正则化,也就是说,L1正则化对于绝对值较大的参数没有L2正则化那么敏感,从而能够容忍一些这样的参数留下。

4.由1范式的定义可知,L1正则化在任意权值为0的时候不可导,因此式(5)不能求出w的解析解,同时,基于梯度的优化算法也无法高效地计算出w的值,因此对于L1正则化,一般可以采取坐标下降法求解。

L1正则化和L2正则化在实际应用中的比较。

L1在确实需要稀疏化模型的场景下,才能发挥很好的作用并且效果远胜于L2。在模型特征个数远大于训练样本数的情况下,如果我们事先知道模型的特征中只有少量相关特征(即参数值不为0),并且相关特征的个数少于训练样本数,那么L1的效果远好于L2。比如在文本分类中,如果我们将一篇文章的所有词语作为它的特征,那么很显然,其中绝大部分特征是无关特征,只有很少量的特征是相关特征。这时,如果我们将每篇文章作为训练样本,直接扔进L1正则化的模型,那么可以通过L1的稀疏化性质去掉无关特征,只留下相关特征。从而L1在这里起到了特征选择的作用,也就省去了特征工程这一步,因为特征工程往往还是需要人工干预的,L1的做法则直接让数据说话,避免人工干预。然而,如果模型的特征服从高斯分布,那么从贝叶斯的观点来看,即便特征数远超训练样本数,L2也要优于L1。

然而,需要注意的是,当相关特征数远大于训练样本数时,无论是L1还是L2,都无法取得很好的效果。

从上面的观点可以看出,L1似乎总是好于L2,那么L2还有什么存在的价值呢?然而在实际工程中,L1不总是像万金油一样,随处可用。对于上面文本分类的例子,结合我实际的工程经验谈谈L1的弊端。

在最开始做文本分类的时候,我也是依然毫不犹豫地选择了L1来做特征选择,以此训练出分类模型,但得到的分类模型效果却不尽如人意,训练误差和泛化误差都较高。后来经过分析得知,在进行模型训练时,没有对数据的特征作分析,而盲目地运用L1正则化,从而导致失败。在经过分析后发现,训练数据里的特征很多是共线性的,比方说,有几个特征的共线性很高,并且它们对于分类都很重要,这时L1的做法是随机选择其中一个特征,而扔掉其它的特征。试想,如果训练数据中有很多这样类似的特征,那么经过L1正则化后的模型将会失去很多有用的特征,进而导致模型误差较大。这个时候,我们不得不选择L2正则化了,但由于L2正则化在面对大量无关特征并且特征不是由高斯分布产生时,误差依然很大,因此我们需要在训练模型之前,先进行特征选择,然后再用L2正则化,L2正则化的特点是,在面对几个存在共线性的特征时,它会将权值平分给这些特征,从而使得这些有用的特征都得以留下,从而改进了文本分类的准确率。

也许读者认为,加入了特征工程的L2正则化稍显麻烦,确实是这样的。实践中也可以采取L1+L2结合的方式,即elastic net。这种方式同时兼顾特征选择(L1)和权重衰减(L2)。其公式如下

(6)

上式中,t为正则项与L(w)之间的Trade-off系数,和之前的描述一致,p是elastic net里独有的参数,它是L1和L2之间的一个Trade-off,如果p为0,那么上式退化为L2正则化,如果p为1,那么上式退化为L1正则化。所以当p取值为0到1时(不包含端点),上式兼顾了L1和L2的特点。又由于L1为1范式,L2为2范式,那么elastic net就介于1范式和2范式之间。

关于elastic net的详细内容将不在本文描述。

机器学习中的正则化技术的更多相关文章

  1. ios – Swift中高斯图像金字塔的下采样和上采样

    是否可以在CoreImage或OpenGL自定义过滤器中执行?

  2. Android中的自然语言处理API

    我正在尝试制作类似于thiswebsite的Android应用程序.问题是我对自然语言处理领域很陌生.我不希望实现太多,只是提供用户与应用程序的一些交互,给他一种感觉,他确实在与某人聊天.基本上,我只是捕获用户输入的文本并将其发送到API并显示从API检索的结果.我遇到了http://opennlp.apache.org/和http://gate.ac.uk/,但不知道如何在我的Android应用

  3. python机器学习GCN图卷积神经网络原理解析

    这篇文章主要为大家介绍了GCN图卷积神经网络原理及代码解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  4. 正则化DropPath/drop_path用法示例(Python实现)

    DropPath 类似于Dropout,不同的是 Drop将深度学习模型中的多分支结构随机"失效",而Dropout是对神经元随机"失效"这篇文章主要给大家介绍了关于正则化DropPath/drop_path用法的相关资料,需要的朋友可以参考下

  5. PHP机器学习库php-ml的简单测试和使用方法

    下面小编就为大家带来一篇PHP机器学习库php-ml的简单测试和使用方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  6. PHP实现机器学习之朴素贝叶斯算法详解

    这篇文章主要介绍了PHP实现机器学习之朴素贝叶斯算法,结合实例形式详细分析了朴素贝叶斯算法的概念、原理及php实现技巧,需要的朋友可以参考下

  7. Android Flutter图片处理之高斯模糊的实现

    这篇文章主要为大家详细介绍了如何利用Android Flutter实现高斯模糊效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  8. python机器学习Logistic回归原理推导

    这篇文章主要为大家介绍了python机器学习Logistic回归原理推导,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

  9. 16中Python机器学习类别特征处理方法总结

    类别型特征(categorical feature)主要是指职业,血型等在有限类别内取值的特征。在这篇文章中,小编将给大家分享一下16种类别特征处理方法,需要的可以参考一下

  10. Android 三行代码实现高斯模糊效果

    这篇文章主要介绍了Android 三行代码实现高斯模糊效果,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下

随机推荐

  1. 法国电话号码的正则表达式

    我正在尝试实施一个正则表达式,允许我检查一个号码是否是一个有效的法国电话号码.一定是这样的:要么:这是我实施的但是错了……

  2. 正则表达式 – perl分裂奇怪的行为

    PSperl是5.18.0问题是量词*允许零空间,你必须使用,这意味着1或更多.请注意,F和O之间的空间正好为零.

  3. 正则表达式 – 正则表达式大于和小于

    我想匹配以下任何一个字符:或=或=.这个似乎不起作用:[/]试试这个:它匹配可选地后跟=,或者只是=自身.

  4. 如何使用正则表达式用空格替换字符之间的短划线

    我想用正则表达式替换出现在带空格的字母之间的短划线.例如,用abcd替换ab-cd以下匹配字符–字符序列,但也替换字符[即ab-cd导致d,而不是abcd,因为我希望]我如何适应以上只能取代–部分?

  5. 正则表达式 – /bb | [^ b] {2} /它是如何工作的?

    有人可以解释一下吗?我在t-shirt上看到了这个:它似乎在说:“成为或不成为”怎么样?我好像没找到’e’?

  6. 正则表达式 – 在Scala中验证电子邮件一行

    在我的代码中添加简单的电子邮件验证,我创建了以下函数:这将传递像bob@testmymail.com这样的电子邮件和bobtestmymail.com之类的失败邮件,但是带有空格字符的邮件会漏掉,就像bob@testmymail也会返回true.我可能在这里很傻……当我测试你的正则表达式并且它正在捕捉简单的电子邮件时,我检查了你的代码并看到你正在使用findFirstIn.我相信这是你的问题.findFirstIn将跳转所有空格,直到它匹配字符串中任何位置的某个序列.我相信在你的情况下,最好使用unapp

  7. 正则表达式对小字符串的暴力

    在测试小字符串时,使用正则表达式会带来性能上的好处,还是会强制它们更快?不会通过检查给定字符串的字符是否在指定范围内比使用正则表达式更快来强制它们吗?

  8. 正则表达式 – 为什么`stoutest`不是有效的正则表达式?

    isthedelimiter,thenthematch-only-onceruleof?PATTERN?

  9. 正则表达式 – 替换..与.在R

    我怎样才能替换..我尝试过类似的东西:但它并不像我希望的那样有效.尝试添加fixed=T.

  10. 正则表达式 – 如何在字符串中的特定位置添加字符?

    我正在使用记事本,并希望使用正则表达式替换在字符串中的特定位置插入一个字符.例如,在每行的第6位插入一个逗号是什么意思?如果要在第六个字符后添加字符,请使用搜索和更换从技术上讲,这将用MatchGroup1替换每行的前6个字符,后跟逗号.

返回
顶部