机器学习(深度学习)缓解过拟合的方法——正则化及L1L2范数详解

本文主要是介绍机器学习(深度学习)缓解过拟合的方法——正则化及L1L2范数详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

机器学习(深度学习)缓解过拟合的方法——正则化

    • L1范数和L2范数
      • L1范数
      • L2范数

过拟合的本质:模型对于噪声过于敏感,把训练样本里的噪声当做特征进行学习,以至于在测试集的表现不好,加入正则化后,当输入有轻微的改动,结果受到的影响较小。
正则化的方法主要有以下几种:

  1. 参数范数惩罚,比较好理解,将范数加入目标函数(损失函数),常见的有一范数,二范数
  2. 数据集增强
  3. 添加噪声
  4. earlystopping,当验证集的效果下降,而训练集还未收敛,提前终止训练
  5. 模型的融合,bagging方法
  6. Dropout(类似于bagging多个神经网络)
  7. Batch Normalization
  8. 简化网络结构
    本文接下来将详细介绍L1范数和L2范数,其他的正则化方法比较好理解,就不在详述

L1范数和L2范数

有监督的机器学习问题主要有两个任务:最小化误差和规则化参数。最小化误差主要是为了让模型拟合我们的训练数据,规则化参数是防止模型过分拟合训练数据。因为参数太多,会导致我们的模型复杂度上升,容易过拟合,也就是我们的训练误差会很小。但训练误差小并不是我们的最终目标,我们的目标是希望模型的测试误差小,也就是能准确的预测新的样本。所以,我们需要保证模型“简单”的基础上最小化训练误差,这样得到的参数才具有好的泛化性能(也就是测试误差也小),而模型“简单”就是通过规则函数来实现的。

L1范数

L1范数是指向量中各个元素绝对值之和,并且有使权值稀疏的特点。从数学的角度来讲,任何的规则化算子,如果他在Wi=0的地方不可微,并且可以分解为一个“求和”的形式,那么这个规则化算子就可以实现稀疏。这说是这么说,W的L1范数是绝对值,|w|在w=0处是不可微。
参数稀疏最大的好处在于特征的选择。一般来说,xi的大部分元素(也就是特征)都是和最终的输出yi没有关系或者不提供任何信息的,在最小化目标函数的时候考虑xi这些额外的特征,虽然可以获得更小的训练误差,但在预测新的样本时,这些没用的信息反而会被考虑,从而干扰了对正确yi的预测。稀疏规则化算子的引入就是为了完成特征自动选择,它会学习地去掉这些没有信息的特征,也就是把这些特征对应的权重置为0。

L2范数

L2范数的一个最大的特点是可以解决过拟合的问题。L2范数是指向量各元素的平方和然后求平方根。我们让L2范数的规则项||W||2最小,可以使得W的每个元素都很小,都接近于0,但与L1范数不同,它不会让它等于0,而是接近于0,这里是有很大的区别的哦。而越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象。为什么越小的参数说明模型越简单?我的理解是:比如模型把噪声考虑进去,会导致过拟合,但是噪声通常都是很小的,为了让噪声在模型的拟合中起作用,需要对噪声项乘以一个很大的系数。而二范数就避免了这种事情的发生。L2正则化之后w更新的时候前面的系数是小于1的,所以是权重衰减,而过拟合的函数变化都比较剧烈,所以局部导数大,即系数大,而L2可以衰减系数,所以有正则化效果
L2范数还要一个好处是可以解决优化过程中矩阵求逆很困难的情况,其实道理也很简单,之前求解矩阵逆的时候,为了追求精度,权值w会无限制的取很大,但是当结果稍微改变一丁点的时候,为了尽可能的拟合,W也会改变很大。加入二范数限制权值的大小,可以很好地缓解这个问题。

我们从几何的概念来考虑一下
在这里插入图片描述
如上图所示,L1范数和每个坐标相交的地方都有“角”出现,注意在角的位置会产生稀疏,而L2范数没有“角”,所以产生稀疏的概率就比较小了。
总结一下:L1会趋向于产生少量的特征,而其他的特征都是0,而L2会选择更多的特征,这些特征都会接近于0。Lasso在特征选择时候非常有用,而Ridge是一种规则化。

这篇关于机器学习(深度学习)缓解过拟合的方法——正则化及L1L2范数详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/875355

相关文章

Redis 的 SUBSCRIBE命令详解

《Redis的SUBSCRIBE命令详解》Redis的SUBSCRIBE命令用于订阅一个或多个频道,以便接收发送到这些频道的消息,本文给大家介绍Redis的SUBSCRIBE命令,感兴趣的朋友跟随... 目录基本语法工作原理示例消息格式相关命令python 示例Redis 的 SUBSCRIBE 命令用于订

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Python中 try / except / else / finally 异常处理方法详解

《Python中try/except/else/finally异常处理方法详解》:本文主要介绍Python中try/except/else/finally异常处理方法的相关资料,涵... 目录1. 基本结构2. 各部分的作用tryexceptelsefinally3. 执行流程总结4. 常见用法(1)多个e

SpringBoot日志级别与日志分组详解

《SpringBoot日志级别与日志分组详解》文章介绍了日志级别(ALL至OFF)及其作用,说明SpringBoot默认日志级别为INFO,可通过application.properties调整全局或... 目录日志级别1、级别内容2、调整日志级别调整默认日志级别调整指定类的日志级别项目开发过程中,利用日志

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

MySQL8 密码强度评估与配置详解

《MySQL8密码强度评估与配置详解》MySQL8默认启用密码强度插件,实施MEDIUM策略(长度8、含数字/字母/特殊字符),支持动态调整与配置文件设置,推荐使用STRONG策略并定期更新密码以提... 目录一、mysql 8 密码强度评估机制1.核心插件:validate_password2.密码策略级

深度解析Python中递归下降解析器的原理与实现

《深度解析Python中递归下降解析器的原理与实现》在编译器设计、配置文件处理和数据转换领域,递归下降解析器是最常用且最直观的解析技术,本文将详细介绍递归下降解析器的原理与实现,感兴趣的小伙伴可以跟随... 目录引言:解析器的核心价值一、递归下降解析器基础1.1 核心概念解析1.2 基本架构二、简单算术表达

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2