【深度学习】5-4 与学习相关的技巧 - 正则化解决过拟合(权值衰减,Dropout)

news2024/11/18 7:29:24

机器学习的问题中,过拟合是一个很常见的问题。过拟合指的是只能拟合训练数据,但不能很好地拟合不包含在训练数据中的其他数据的状态。机器学习的目标是提高泛化能力,即便是没有包含在训练数据里的未观测数据也希望模型可以进行正确的识别

发生过拟合的原因,主要有以下两个:

  • 模型拥有大量参数、表现力强。
  • 训练数据少。

那么如何来抑制过拟合
正则化是有效方法之一,它不仅可以有效降低高方差,还有利于降低偏差。何为正则化?在机器学习中,很多被显式地用来减少测试误差的策略,统称为正则化。正则化旨在减少泛化误差而不是训练误差。
下面是几张与正则化相关的图片
在这里插入图片描述

权值衰减
权值衰减是一直以来经常被使用的一种抑制过拟合的方法。该方法通过在学习的过程中对大的权重进行惩罚,来抑制过拟合。很多过拟合原本就是因为权重参数取值过大才发生的。

复习一下,神经网络的学习目的是减小损失函数的值。这时,例如为损失函数加上权重的平方范数(L2范数)。这样一来,就可以抑制权重变大。
实现L2正则化时,Ω(w)的表达式为:
在这里插入图片描述

用符号表示的话,如果将权重记为,L2范数的权值衰减就是 1 2 \frac{1}{2} 21 λ \lambda λ W 2 W^{2} W2,然后将这个 1 2 \frac{1}{2} 21 λ \lambda λ W 2 W^{2} W2加到损失函数上。这里, λ \lambda λ是控制正则化强度的超参数。设置得越大,对大的权重施加的惩罚就越重。此外,开头的二分之一是用于将 1 2 \frac{1}{2} 21 λ \lambda λ W 2 W^{2} W2的求导结果变成
λ \lambda λ W 2 W^{2} W2对于所有权重,权值衰减方法都会为损失函数加上 1 2 \frac{1}{2} 21 λ \lambda λ W 2 W^{2} W2。因此,在求权重梯度的计算中,要为之前的误差反向传播法的结果加上正则化项的导数 λ \lambda λ W 2 W^{2} W2
L2范数相当于各个元素的平方和

权值衰减的实现代码如下:

def loss(self, x, t):
    y = self.predict(x)

    weight_decay = 0
    for idx in range(1, self.hidden_layer_num + 2):
        W = self.params['W' + str(idx)]
        weight_decay += 0.5 * self.weight_decay_lambda * np.sum(W ** 2)

    return self.last_layer.forward(y, t) + weight_decay

实验代码最核心的部分是MultiLayerNet类添加了weight_decay_lambda参数,代码如下:

network = MultiLayerNet(input_size=784, hidden_size_list=[100, 100, 100, 100, 100, 100], output_size=10,
                        weight_decay_lambda=weight_decay_lambda)

其他部分和其他实验代码相差不大
得到的结果如下:
在这里插入图片描述
虽然训练数据的识别精度和测试数据的识别精度之间有差距,但是与没有使用权值衰减的结果相比,差距变小了。这说明过拟合受到了抑制。此外,还要注意,训练数据的识别精度没有达到100%

Dropout
Dropout是一种在学习的过程中随机删除神经元的方法。训练时,随机选出隐藏层的神经元,然后将其删除。被删除的神经元不再进行信号的传递。
训练时,每传递一次数据,就会随机选择要删除的神经元然后,测试时,虽然会传递所有的神经元信号,但是对于各个神经元的输出要乘上训练时的删除比例后再输出
在这里插入图片描述

关于Dropout的实现,可以参考Chainer中的实现

class Dropout:
	def __init__(self,dropout_ratio=0.5):
		self.dropout_ratio = dropout_ratio
		self.mask = None

	def forward(self, x, train_flg = True):
		if train_flg:
			self.mask = np.random.rand(*x.shape) > self.dropout_ratio
			return x * self.mask
		else:
			return x * (1.0 - self.dropout_ratio)

	def backward(self, dout):
		return dout * self.mask

这里的要点是,每次正向传播时,self.mask中都会以False的形式保存删除的神经元。setf.mask会随机生成和x形状同的数组,并将值比dropout_ratio大的元素设为True。反向传播时的行为和ReLU相同。也就是说正向传播时传递了信号的神经元,反向传播时接原样传递信号;正向传播时没有传递信号的神经元,反向传播时信号将停在那里。

现在,我们使用MNIST数据集进行验证,代码如下:

# 省略import代码

(x_train, t_train), (x_test, t_test) = load_mnist(normalize=True)

# 为了再现过拟合,减少学习数据
x_train = x_train[:300]
t_train = t_train[:300]

# 设定是否使用Dropuout,以及比例 ========================
use_dropout = True  # 不使用Dropout的情况下为False
dropout_ratio = 0.2
# ====================================================

# 在MultiLayerNetExtend中设置是否使用Dropuout
network = MultiLayerNetExtend(input_size=784, hidden_size_list=[100, 100, 100, 100, 100, 100],output_size=10, 
use_dropout=use_dropout, dropout_ration=dropout_ratio)

trainer = Trainer(network, x_train, t_train, x_test, t_test,
                  epochs=301, mini_batch_size=100,
                  optimizer='sgd', optimizer_param={'lr': 0.01}, verbose=True)
trainer.train()

train_acc_list, test_acc_list = trainer.train_acc_list, trainer.test_acc_list

# 省略绘图代码

测试代码中使用了Trainer类来简化实现

下面是测试的结果:
在这里插入图片描述
和没有使用Dropout的相比
在这里插入图片描述
通过使用Dropout,训练数据和测试数据的识别精度的差变小了。并且,训练数据也没有到达100%的识别精度。像这样,通过使Dropout,即便是表现力强的网络,也可以抑制过拟合。

可以将Dropout理解为,通过在学习过程中随机删除神经元,从而每一次都让不同的模型进行学习。并且,推理时,通过对神经元的输出乘以删除比例(比如,0.5等),可以取得模型的平均值。也就是说,可以理解成Dropout将集成学习的效果(模拟地)通过一个网络实现了。

如何或何时使用Dropout呢?以下是使用的一般原则:

  1. 通常**丢弃率控制在20%~50%**比较好,可以从20%开始尝试。如果比例太低则起不到效果,比例太高则会导致模型的欠学习。
  2. 在大的网络模型上应用。当Dropout用在较大的网络模型时,更有可能得到效果的提升,模型有更多的机会学习到多种独立的表征。
  3. 在输入层和隐藏层都使用Dropout。对于不同的层,设置的keep_prob也不同,一般来说,神经元较少的层,会设keep_prob为1.0或接近于1.0的数;神经元多的层,则会将keep_prob设置的较小,如0.5或更小。
  4. 增加学习速率和冲量。把学习速率扩大10~100倍,冲量值调高到0.9~0.99
  5. 限制网络模型的权重。大的学习速率往往导致大的权重值。对网络的权重值做最大范数的正则化,可以提升模型性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/670358.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

皓文电子 | 智能制造领先企业的安全服务经验分享

皓文电子是一家为客户提供设计、生产、销售高端开关电源及各类功率变换产品的国家级高新技术企业,是国内智能制造领域的代表企业。其核心产品能与国际主流电源厂商竞争,达到国内外领先水平,并在国家多个重点项目中批量生产装备。 遭遇安全事件…

2023年湖北孝感初、中级工程师职称报名条件和要求是什么?启程别

2023年湖北孝感初、中级工程师职称报名条件和要求是什么?启程别 初级职称对于找工作很有帮助。现在,学历越来越高,仅有学历已经不能满足应聘需求。初级职称的获得并不难,有了职称也会让自己在找工作时更有竞争力。威信公号搜一下启…

2023年最新智能优化算法之——IBI逻辑优化算法(IBL),附MATLAB代码

今天给大家带来一个有意思的智能优化算法,IBL算法。 先说效果:在CEC2005函数集测试,基本上毫无压力,把把都能预测的很准确,而且速度极快。大家可以自行尝试哈。 为啥说这个算法有意思呢,大家看IBL的英文全…

史上最大图灵测试实验完成150万人类参与1000万次对话,判断对面是人还是AI

本文 介绍 了AI 21实验室推出了一个好玩的社交图灵游戏——「人类还是机器人?」 【导读】这个「人类还是AI?」的游戏一经推出,就被广大网友们玩疯了!如今全世界已有150万人参与,网友们大方分享自己鉴AI的秘诀。 历上规模最大的…

解决:torch.cuda.is_available()一直返回False,显卡是NVIDA GeForce MX250

目录 1. 背景2. 发现问题根源3. 解决问题 1. 背景 AI时代了,之前一直不怎么用到的小米笔记本Pro的 NVIDA GeForce MX250独显,就想着让它发挥余热,免得买了这么多年,一直闲置,浪费。 无脑按照chatGPT给的例子&#x…

为什么Django要引入CSRF令牌?答:主要是为了防止跨站伪造请求攻击,那么什么是跨站伪造请求攻击呢?

“CSRF”的英文全称是:“Cross-Site Request Forgery”,翻译过来就是:“跨站请求伪造”。 那么什么是跨站伪造请求攻击呢?看下面这张图就够了。 注意:看上面这张图请按图中标注的1到6的顺序阅读。 Django通过引入CS…

一文详解!接口自动化的关键思路和解决方案

目录 引言 正文 一.接口传参 二. 外部数据源 三. 测试断言 四. 环境切换 五. 批量测试 总结 一.接口自动化的工具思维和测试思维 二.贯穿整个接口自动化项目的三个基本思路: 引言 与UI相比,接口一旦研发完成,通常变更或重构的频率…

使用nps搭建内网穿透服务

使用nps搭建内网穿透服务 如何使用nps搭建内网穿透服务前提准备操作流程配置服务端配置客户端 P2P模式,大流量低延迟 正式开始之前呢,先介绍一下什么是内网穿透: 内网穿透(NAT穿透)是一种技术,它允许您通过…

软件测试简历编写以及软件测试面试题大全

目录 前言: 一、简历重要性以及编写原则 二、简历模板 三、简历包装 四、互联网公司常用接口测试面试题 五、互联网公司常面自动化测试面试题 前言: 软件测试是软件开发过程中必不可少的一环,也是一个不断发展和变化的领域。在寻找软件测试职…

广角积分球均匀光源

现阶段,摄影测量技术已涉及多行多业,其在交通、考古以及景物三维重建中的应用尤为显著,但是普通相机取景范围有限,不能全面捕获整个空间信息,因此一种新型相机--全景相机逐步被应用到实际当中。80年代初,国…

场景解析丨活用PDCA循环,让你的项目管理更高效!

聚焦制造业共性项目管控难题 结合装备制造行业特性, 从PDCA循环角度, 通过痛点、解决方案、实际案例的剖析, 看企业如何做好项目管理。 本期干货内容分享 1. 计划的可执行性 计划要达成共识,打造合理三级计划体系 2. 执行的…

Android预装apk

预装APK到system/app目录 注:APK名字不能含有中文、空格等特殊字符。 在 驱动路径/android/vendor/aw/public/prebuild/apk 创建一个目录存放对应的APK将所需预装的APK放入该目录中在该目录中创建 Android.mk文件,并编译 # 文件名 LOCAL_PATH : $(call…

supervisor简介

1、概述 supervisor是一个用python语言编写的进程管理工具,它可以很方便的监听、启动、停止、重启一个或多个进程。当一个进程意外被杀死,supervisor监听到进程死后,可以很方便的让进程自动恢复,不再需要程序员或系统管理员自己编…

回调函数(callback)是什么?一文理解回调函数(callback)

这里写目录标题 一、什么是回调函数1.1、回调函数的定义和基本概念1.2、回调函数的作用和使用场景 二、回调函数的实现方法2.1、函数指针2.2、函数对象/functor2.3、匿名函数/lambda表达式 三、回调函数的应用举例四、回调函数的优缺点五、回调函数与其他编程概念的关系5.1、回…

性能提升30%!袋鼠云数栈基于 Apache Hudi 的性能优化实战解析

Apache Hudi 是一款开源的数据湖解决方案,它能够帮助企业更好地管理和分析海量数据,支持高效的数据更新和查询。并提供多种数据压缩和存储格式以及索引功能,从而为企业数据仓库实践提供更加灵活和高效的数据处理方式。 在金融领域&#xff0…

Mysql高阶语句(一)

Mysql高阶语句(一) 一、MySQL高级进阶SQL 语句1、SELECT斜体样式2、DISTINCT3、WHERE4、AND、OR5、IN6、BETWEEN7、通配符、LIKE8、ORDER BY9、| | 连接符10、GROUP BY11、HAVING 二、函数1、数学函数2、聚合函数3、字符串函数4、日期时间函数 一、MySQL…

短视频矩阵源码

短视频矩阵源码的开发部署其实并不难,主要依托于抖音平台各种开放权限进行研发,市面上常见的源码功能构建也是大同小异,主要处理还在于细节及产品优化上。 如: 1. 视频制作板块,文字转语音功能,当然各种云&…

【人工智能技术专题】「入门到精通系列教程」零基础带你进军人工智能领域的全流程技术体系和实战指南(NLP、GPT-Pre-Training和数据标注都是什么)

零基础带你进军人工智能领域的全流程技术体系和实战指南(NLP、GPT-Pre-Training和数据标注都是什么) 前言专栏介绍专栏说明学习大纲前提条件面向读者学习目标核心内容NLP自然话言理解指的是什么定义概念涉及到的领域技术与应用关系 重要性语言结构剖析分…

AI已在职场大规模应用,求职者被要求熟练使用ChatGPT

“能熟练使用ChatGPT、Midjourney等AI软件生产高质量文图内容完成辅助工作。”当这条岗位要求悄然出现在今夏的应聘季,时光仿佛被拉回到数十年前,那个要求“会使用Word、Excel等计算机软件”的求职年代。 彼时,因为计算机的逐渐普及&#xf…

Linux服务器Jenkins部署打包Android

程序猿日常 记Jenkins部署打包Android介绍 Jenkins 自动打包 Android 应用,后面介绍打包Flutter应用,然后介绍打包Android原生Flutter混合应用 准备工作 1.jenkins服务器地址 账户密码 2.项目git地址 访问账号密码 3.ssh 链接服务器账户密码 安装An…