深度学习笔记(十六)正则化(L2 dropout 数据扩增 Earlystopping)

本文主要是介绍深度学习笔记(十六)正则化(L2 dropout 数据扩增 Earlystopping),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如果训练的模型过拟合,也就是高方差,我们首先想到的是正则化。高方差的解决方法有准备充足的数据,但是有时候我们无法找到足够的数据。下文详细说明正则化方法,包括L2正则化(菲罗贝尼乌斯)、dropout机制、数据扩增、Early stopping。

一、逻辑回归中的正则化

需要求得损失函数 J ( w , b ) J(w,b) J(w,b)的最小值,已知
J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) J(w,b)=\frac{1}{m} \sum_{i=1}^m L(\widehat{y}^{(i)},y^{(i)}) J(w,b)=m1i=1mL(y (i),y(i))
在此基础上添加正则化参数 λ \lambda λ
J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) + λ 2 m ∣ ∣ w ∣ ∣ 2 2 J(w,b)=\frac{1}{m} \sum_{i=1}^m L(\widehat{y}^{(i)},y^{(i)})+\frac{\lambda}{2m}||w||_2^2 J(w,b)=m1i=1mL(y (i),y(i))+2mλw22
其中 w w w的欧几里得范数的平方等于元素平方和
L 2 r e g u l a r i z a t i o n : ∣ ∣ w ∣ ∣ 2 2 = ∑ j = 1 n x w j 2 = w T w L2 regularization:||w||_2^2=\sum_{j=1}^{n_x} w_j^2=w^Tw L2regularization:w22=j=1nxwj2=wTw
为什么省略b,因为w通常是一个高维参数矢量,已经可以表达高方差的情况,b对参数影响并不显著。
L 1 : λ 2 m ∑ j = 1 n x ∣ w j ∣ = λ 2 m ∣ ∣ w ∣ ∣ 1 L1:\frac{\lambda}{2m} \sum_{j=1}^{n_x}|w_j|=\frac{\lambda}{2m}||w||_1 L1:2mλj=1nxwj=2mλw1
如果用L1正则化,W向量会很稀疏,会有很多0,有人说利于压缩模型,实际上并没有降低很多内存。我们更倾向于L2正则化。顺便说, λ \lambda λ这个参数也是一个超参数,需要尝试哪个取值才是最优取值,为了方便编程,在Python中 λ \lambda λ是保留字段,编程通常写作lambd作为正则化参数变量。

二、神经网络中的L2正则化

J ( w , b ) = 1 m ∑ i = 1 m L ( y ^ ( i ) , y ( i ) ) + λ 2 m ∑ l = 1 L ∣ ∣ w [ l ] ∣ ∣ F 2 J(w,b)=\frac{1}{m} \sum_{i=1}^m L(\widehat{y}^{(i)},y^{(i)})+\frac{\lambda}{2m}\sum_{l=1}^L ||w^{[l]}||_F^2 J(w,b)=m1i=1mL(y (i),y(i))+2mλl=1Lw[l]F2
其中,
∣ ∣ w [ l ] ∣ ∣ F 2 = ∑ i = 1 n [ l − 1 ] ∑ j = 1 n [ 1 ] ( w i j [ l ] ) 2 ||w^{[l]}||_F^2=\sum_{i=1}^{n^{[l-1]}}\sum_{j=1}^{n^{[1]}}(w_{ij}^{[l]})^2 w[l]F2=i=1n[l1]j=1n[1](wij[l])2
L2范数,按照惯例称之为:Frobenius 菲罗贝尼乌斯范数,即矩阵中所有元素的平方和。

反向传播
d w [ l ] = ( f r o m b a c k p r o p ) + λ 2 m w [ l ] dw^{[l]}=(from backprop)+\frac{\lambda}{2m}w^{[l]} dw[l]=(frombackprop)+2mλw[l]

w [ l ] = w [ l ] − α d w [ l ] w^{[l]}=w^{[l]}-\alpha dw^{[l]} w[l]=w[l]αdw[l]

L2正则化被称作权重衰减的原因
w [ l ] = w [ l ] − α [ ( f r o m b a c k p r o p ) + λ 2 m w [ l ] ] w^{[l]}=w^{[l]}-\alpha[(from backprop)+\frac{\lambda}{2m}w^{[l]}] w[l]=w[l]α[(frombackprop)+2mλw[l]]

w [ l ] = w [ l ] − α λ 2 m w [ l ] − α ( f r o m b a c k p r o p ) w^{[l]}=w^{[l]}-\frac{\alpha \lambda}{2m}w^{[l]}-\alpha(frombackprop) w[l]=w[l]2mαλw[l]α(frombackprop)

从上面的式子可以看到,不管w是什么,总是试图使w变得更小。实际上是给w矩阵乘上了小于1的系数 1 − α λ 2 m 1-\frac{\alpha \lambda}{2m} 12mαλ

三、为什么正则化可以防止过拟合?

在这里插入图片描述
直觉经验告诉我们, λ \lambda λ足够大的时候,使得w权重小到0,那么神经网络中的隐藏单元失效(在初始化权重那一课有讲),这样网络结构更趋近于逻辑回归,所以防止了高方差(过拟合)的情况。

在这里插入图片描述
λ \lambda λ足够大的时候,w会变得很小,z同样会变得很小,在激活函数上落在近似线性的部分上。(在激活函数使用非线性那一课中讲到)隐藏层的激活函数是线性的,这个网络就是线性网络,不管网络有多深,实际上起不到更好的训练效果,模型趋近于逻辑回归,不会发生过拟合的情况。

为了调试梯度下降,务必使用新定义的J函数,包含正则化项,否则J可能不会在所有调幅范围内都单调递减。

四、dropout

除了L2正则化方法,还有非常使用的正则化方法——dropout(随机失活)
dropout会遍历网络每一层,并设置消除神经网络中节点的概率。通过前面的内容,一定很容易理解为什么dropout可以防止过拟合了,因为随机扔弃一部分节点后,网络结构变得更小,更趋近线性拟合,过拟合的可能性更小。
在这里插入图片描述

Inverted dropout的实现

keep_prob = 0.8
d3 = np.random.rand(a3.shape[0], a3.shape[1]) < keep_prob
a3 = np.multiply(a3, d3)
a3 /= keep_prob

反向随机失活最后除以keep_prob确保a3的期望值不变。

五、dropout深入理解

在这里插入图片描述

  • 每一层有不同的keep_prob保留值,根据每一层具体情况,参数多容易过拟合应当降低keep_prob的取值
  • 输入层应尽可能接近1,因为是输入的是所需特征
  • 缺点是为了使用交叉验证,需要搜索更多超级参数
  • dropout在计算机视觉CV中应用频繁,维度很大但是数据较少
  • 除非过拟合,我们不应该使用dropout
  • 缺点还有代价函数很难明确定义(要求加入正则化项后J函数单减),通常做法是关闭dropout,将keep_prob设置为1.0后运行代码确保函数递减,再打开dropout函数。

六、其他正则化方法

数据扩增

  • 水平翻转
  • 随意裁剪
    在这里插入图片描述
  • 随意旋转
  • 扭曲数字
    在这里插入图片描述
    Early stopping
    在这里插入图片描述
    考虑两方面:
  • 选择算法优化代价函数J
    • 梯度下降
    • Momentum
    • RMSprop
    • Adam
  • 回避过拟合问题
    • 正则化
    • 扩增数据

提前停止训练不能同时解决如上两个问题。L2正则化通过尝试不同的正则化参数,但是需要承担很大的计算代价,如果不能承受很大的计算代价,early stopping也可以得到相似的结果。

这篇关于深度学习笔记(十六)正则化(L2 dropout 数据扩增 Earlystopping)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)

《使用Java解析JSON数据并提取特定字段的实现步骤(以提取mailNo为例)》在现代软件开发中,处理JSON数据是一项非常常见的任务,无论是从API接口获取数据,还是将数据存储为JSON格式,解析... 目录1. 背景介绍1.1 jsON简介1.2 实际案例2. 准备工作2.1 环境搭建2.1.1 添加

MySQL中删除重复数据SQL的三种写法

《MySQL中删除重复数据SQL的三种写法》:本文主要介绍MySQL中删除重复数据SQL的三种写法,文中通过代码示例讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下... 目录方法一:使用 left join + 子查询删除重复数据(推荐)方法二:创建临时表(需分多步执行,逻辑清晰,但会

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

详谈redis跟数据库的数据同步问题

《详谈redis跟数据库的数据同步问题》文章讨论了在Redis和数据库数据一致性问题上的解决方案,主要比较了先更新Redis缓存再更新数据库和先更新数据库再更新Redis缓存两种方案,文章指出,删除R... 目录一、Redis 数据库数据一致性的解决方案1.1、更新Redis缓存、删除Redis缓存的区别二

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结

Node.js 中 http 模块的深度剖析与实战应用小结

《Node.js中http模块的深度剖析与实战应用小结》本文详细介绍了Node.js中的http模块,从创建HTTP服务器、处理请求与响应,到获取请求参数,每个环节都通过代码示例进行解析,旨在帮... 目录Node.js 中 http 模块的深度剖析与实战应用一、引言二、创建 HTTP 服务器:基石搭建(一

更改docker默认数据目录的方法步骤

《更改docker默认数据目录的方法步骤》本文主要介绍了更改docker默认数据目录的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1.查看docker是否存在并停止该服务2.挂载镜像并安装rsync便于备份3.取消挂载备份和迁

不删数据还能合并磁盘? 让电脑C盘D盘合并并保留数据的技巧

《不删数据还能合并磁盘?让电脑C盘D盘合并并保留数据的技巧》在Windows操作系统中,合并C盘和D盘是一个相对复杂的任务,尤其是当你不希望删除其中的数据时,幸运的是,有几种方法可以实现这一目标且在... 在电脑生产时,制造商常为C盘分配较小的磁盘空间,以确保软件在运行过程中不会出现磁盘空间不足的问题。但在

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines