深度学习入门笔记(9)—— Regularization to avoid overfitting 用正则化来避免过拟合

在这里插入图片描述
在这里插入图片描述

在维基百科的词条中,正则化就是让答案变得更简单的,目的是防止过拟合。在分类上可以分为显式正则化(对目标函数添加先验、惩罚、约束、成本)和隐式正则化(所有其他形式的正则化如提前停止、集成学习、Dropout 等)。

在这里插入图片描述
在深度学习中最为常用的是 Dropout 方法。

在这里插入图片描述

提高模型泛化性能的各种方法,这里我们主要介绍数据增强和正则化的方法。

首先是数据增强,使用 imgaug 库对图片进行数据增强的方法可以看我的这篇博客,更为简便的,是直接在 PyTorch 使用 torchvision 中的 transforms 模块,详细用法可以看说明文档和各种变换的效果展示。下面的代码展示了如何用 transforms 的 Compose 组合需要进行的各种变换,然后输入到 datasets 最后再送入 DataLoader 中。

training_transforms = torchvision.transforms.Compose([torchvision.transforms.Resize(size=(32, 32)),torchvision.transforms.RandomCrop(size=(28, 28)),torchvision.transforms.RandomRotation(degrees=30, interpolation=PIL.Image.BILINEAR),torchvision.transforms.ToTensor(),torchvision.transforms.Normalize(mean=(0.5,), std=(0.5,)),# normalize does (x_i - mean) / std# if images are [0, 1], they will be [-1, 1] afterwards
])test_transforms = torchvision.transforms.Compose([torchvision.transforms.ToTensor(),torchvision.transforms.Resize(size=(32, 32)),torchvision.transforms.CenterCrop(size=(28, 28)),torchvision.transforms.Normalize(mean=(0.5,), std=(0.5,)),
])train_dataset = datasets.MNIST(root='data', train=True, transform=training_transforms,download=True)test_dataset = datasets.MNIST(root='data', train=False, transform=test_transforms)train_loader = DataLoader(dataset=train_dataset, batch_size=BATCH_SIZE, shuffle=True)test_loader = DataLoader(dataset=test_dataset, batch_size=BATCH_SIZE, shuffle=False)

在这里插入图片描述
在这里插入图片描述
然后是提前停止,思路很简单,将数据集划分为训练集、验证集和测试集,使用验证集来进行模型选择,在这里就相当于是训练轮数 Epochs 的超参数调整,选择模型在验证集上的性能顶点作为最优的训练轮数。但是这个方法不常用,因为有论文指出模型的损失存在双重下降的现象,即先下降后上升然后又一次下降,对于大模型而言这种现象更为明显,如下面的两张图所示:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
使用 L1 / L2 范数的正则化,常用于线性回归,L1 正则化对应的是 LASSO 回归,L2 正则化对应的是岭回归。

在这里插入图片描述
Logistic Regression 中的 L2 正则化,损失函数 L 就是二元交叉熵,则目标函数就是损失函数 + L2 正则化项,L2 正则化项就是对参数 w 求平方和,前面再乘以一个超参数 λ(越大正则化程度越高)。

在这里插入图片描述
在几何上理解 L2 正则化,如图所示,两条轴是两个参数(特征)的值,其中椭圆等高线(红色)代表线性回归的损失函数(MSE),它的优化目标就是下降到红色点;圆形(紫色)代表正则化(惩罚)项,它的优化目标就是下降到紫色点。这两者加起来就是带 L2 正则化的线性回归,两者折衷的目标就是下降到绿色点。

在这里插入图片描述

L2 正则化应用到神经网络中,就是给损失函数加上对于每层参数求取的平方和。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在梯度下降中也就只是加上正则化项的偏导数,利用 PyTorch 自己实现 L2 正则化的方法就是写两行公式,如果用 SGD 直接提供超参数 λ 即可。

在这里插入图片描述

最后是 Dropout 方法,实际上就是随机地丢弃隐藏层中的神经元,默认概率为 0.5

在这里插入图片描述
丢弃的实现方法,就是对于每一层中的各个神经元,假设有 5 个神经元,则进行 5 次的伯努利抽样,得到的值都是 0 到 1,然后抽样值小于 p 的就变为 0,大于 p 的就变为 1,再用它乘上神经元对应的输出(激活值)即可。

在这里插入图片描述

Dropout 只在训练时使用,在测试(推理)时不使用,因为不想得到随机的测试结果。还有就是 Dropout 随机丢弃某一层的神经元,则后面的神经元的输入会偏小,例如 2;而在测试时是没有 Dropout 的,此时后面神经元的输入会变大,例如 4,所以应该在测试时给神经元的输出(激活值)乘上一个系数 1 - p,让后面神经元的输入范围相同。

在这里插入图片描述
对 Dropout 的一种解释,就是它可以让模型不依赖于某些特定的神经元,使得更多的神经元可以被利用到。Dropout 的超参数只有一个,就是概率,在不同层进行 Dropout 可以取不同的概率。

在这里插入图片描述

另一种解释,Dropout 相当于一种集成学习的方法,假设有 h 个隐藏层的节点,则每个节点是否丢弃就有 2 种可能,即共有 2h{2^h}2h 个模型,但这些模型是受到约束的(前一个模型更新后的权重会传给下一个模型)。在测试(推理)时如果使用所有这些模型的预测平均值,就可以得到很好的结果,但是代价很大。

在这里插入图片描述
在这里插入图片描述

因为预测输出大多为概率,所以取的是几何平均数,即相乘再开方。而 Dropout 中使用最后一个模型并且缩放 1 - p 的做法,就是对这个几何平均数的一种近似。

在这里插入图片描述
目前在大多数深度学习框架中,实现的是 Inverted Dropout,实际上就只是把在推理阶段乘以系数 1 - p 的过程,变为在训练阶段乘以系数 11−p{1 \over {1 - p}}1p1,这样做是因为推理的次数远多于训练,要减少推理过程的计算消耗。

在这里插入图片描述
PyTorch 实现 Dropout 的代码,实际上就是在激活函数后加上 torch.nn.Dropout,对于 ReLU 这个激活函数来说,在它之前或者之后用 Dropout 都是一样的,因为它输入 0 时输出也为 0,但是对于 Sigmoid 这样的激活函数,如果在它之前用 Dropout,即使输入变为 0,其输出也是 0.5 不等于 0

在这里插入图片描述

必须养成习惯,明确模型是处于 train 模式还是 eval 模式,Dropout 只在训练模式下生效。

在这里插入图片描述
如果模型没有过拟合,就不需要使用 Dropout,反而应该提高模型的复杂度,使其过拟合之后,再使用 Dropout,这样的效果会优于直接使用一个没有过拟合的简单模型。

在这里插入图片描述
在这里插入图片描述
DropConnect 是 Dropout 的泛化方法,也就是随机丢弃权重,但是实际效果不如 Dropout

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

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

相关文章

蓝桥杯-填空题-购物单

一:题目 **** 180.90 88折 **** 10.25 65折 **** 56.14 9折 **** 104.65 9折 **** 100.30 88折 **** 297.15 半价 **** 26.75 65折 **** 130.62 半价 **** 240.28 …

C# 中 System.Index 结构体和 Hat 运算符(^)的全新用法

翻译自 John Demetriou 2019年2月17日 的文章 《C# 8 – Introducing Index Struct And A Brand New Usage For The Hat Operator》今天我们要讲的是 Hat 运算符(^)。目前为止,Hat 运算符(^)已经被用作布尔类型的异或运算符,以及字节、整型类型的按位异或…

Lagrange Multipliers 拉格朗日乘数法(含 KKT 条件)

最优化问题通常是指对于给定的某一函数,求其在指定作用域上的全局最小值,一般情况下,最优化问题一般分为三种情况: (1)无约束条件 对于无约束条件的优化问题中,如果一个函数 f 是凸函数&#…

蓝桥杯-代码-数字三角形

一:题目 二:代码 #include <iostream> #include<vector> using namespace std; int main() {/**思路:1.确定dp数组的定义以及下标的含义dp[i][j] 表示的是一条路径到达下标i和j时&#xff0c;的最大值 2.确定dp数组的状态转移公式我们当前位置的最大值其实是由右上…

ABP VNext从单体切换到微服务

注&#xff1a;此处的微服务只考虑服务部分&#xff0c;不考虑内外层网关、认证等。ABP VNext从单体切换到微服务&#xff0c;提供了相当大的便利性&#xff0c;对于各模块内部不要做任何调整&#xff0c;仅需要调整承载体即可。ABP can help you in that point by offerring a…

dotnet 在 UOS 国产系统上使用 Xamarin Forms 创建 xaml 界面的 GTK 应用

在前面几篇博客告诉大家如何部署 GTK 应用&#xff0c;此时的应用是特别弱的&#xff0c;大概只是到拖控件级。尽管和 WinForms 一样也能写出特别强大的应用&#xff0c;但是为了提升一点开发效率&#xff0c;咱开始使用 xaml 神器写界面。本文告诉大家如何在 UOS 国产系统上&a…

赛码-编程题-打字

一:题目 二&#xff1a;上码 #include<bits/stdc.h> using namespace std;int main() {int n;vector<int> v1;cin >> n;for(int i 0; i < n; i) {string str;int count 0;cin >> str;for (int j 0; j < str.size(); j) {int num int(str[j]…

Python 中的 with 语句用法和 Pytorch 中的 with torch.no_grad() 解析

Python 中的 with 语句适用于对资源进行访问的场合&#xff0c;确保不管使用过程中是否发生异常都会执行必要的“清理”操作&#xff08;异常处理&#xff09;&#xff0c;释放资源&#xff0c;比如文件使用后自动关闭&#xff0f;线程中锁的自动获取和释放等。例如下面是文件读…

遍历 Dictionary,你会几种方式?

一&#xff1a;背景 1. 讲故事昨天在 StackOverflow 上看到一个很有趣的问题&#xff0c;说: 你会几种遍历字典的方式&#xff0c;然后跟帖就是各种奇葩的回答&#xff0c;挺有意思&#xff0c;马上就要国庆了&#xff0c;娱乐娱乐吧&#xff0c;说说这种挺无聊的问题?????…

PyTorch 中各种操纵维度的函数比较 view() reshape() squeeze() unsqueeze() flatten()

首先&#xff0c;假设我们有一个三行四列的张量 X&#xff1a; view() 和 reshape() 函数都可以指定并改变张量的维度&#xff0c;它们本质上是相同的&#xff0c;只有两点区别&#xff1a; 1、view() 函数返回的是原始张量的视图&#xff0c;而 reshape() 函数返回的是原始张…

.NET Core 下的 API 网关

网关介绍网关其实就是将我们写好的API全部放在一个统一的地址暴露在公网&#xff0c;提供访问的一个入口。在 .NET Core下可以使用Ocelot来帮助我们很方便的接入API 网关。与之类似的库还有ProxyKit&#xff0c;微软也发布了一个反向代理的库YARP。关于网关的介绍不多说了&…

leetcode剑指 Offer 29. 顺时针打印矩阵

一&#xff1a;题目 二:上码 class Solution { public:vector<int> spiralOrder(vector<vector<int>>& matrix) {//判空处理 否则会出现空指针异常if(matrix.size() 0 || matrix[0].size() 0){return {};}int m matrix.size();// 行int n matrix[0].…

VS也可以这样进行快捷安装

前言记录带新人的那些事&#xff0c;主要是一些工作技巧上的分享部门老大&#xff1a;阿元&#xff0c;明天有几个实习生新人开发来入职&#xff0c;你负责带一下他们阿元&#xff1a;明天吗&#xff1f;哦&#xff0c;好的&#xff0c;顺便问下&#xff1a;男的女的&#xff1…

蓝桥杯-卡片-填空题

一:题目 二:思路 1是最快消耗完的计算1的个数即可 三&#xff1a;上码 #include <iostream> using namespace std; int main() {int ans 0;int count 0;for(int i 1; i < 20000; i) {string str to_string(i);// cout << str << endl;for(int j …

跟我一起学.NetCore之Swagger让前后端不再烦恼及界面自定义

前言随着前后端分离开发模式的流行&#xff0c;接口对接、联调成为常事&#xff0c;前端同事会经常问&#xff1a;我需要调哪个接口&#xff1f;这个接口数据格式是啥&#xff1f;条件都传啥&#xff1f; 对于一些紧急接口可能会采取沟通对接&#xff0c;然后补文档&#xff0c…

由浅入深,带你搞懂 Pytorch 中的张量 tensor 是什么

目录1、tensor 是什么&#xff1f;2、tensor 的三个属性2.1 Rank 秩2.2 Axis&#xff08;复数 为 Axes&#xff09; 轴2.3 Shape 形状3、Pytorch 中 torch.Tensor 的三个属性3.1 torch.dtype3.2 torch.device3.3 torch.layout4、创建张量的两种方法4.1 从现有数据创建张量4.2 凭…

蓝桥杯-排序-填空题

一:题目 二:上码 #include <iostream> using namespace std; int main() {// 请在此输入您的代码/**/**冒泡排序中:我们考虑到最坏的情况,那就是全都是逆序 那么就需要交换 N(N-1)/2; 那么100次 最起码需要 15个字符&#xff0c;而15个字符完全逆序的话 需要交换 105次…

打造钉钉事件分发平台之钉钉审批等事件处理

前言上讲和上上讲我们说到了钉钉的审批和钉钉通讯录的一个简单示例&#xff0c;这次我们讲下如何快速打造一个自己的钉钉事件分发平台。让你能够通过监听用户在钉钉上的操作&#xff0c;然后进行对应的业务处理&#xff0c;比如钉钉流程审批完后业务处理、通讯录员工增加后对应…

Pytorch 中 Dataset 和 DataLoader,以及 torchvision 的 datasets 完全理解

目录1、torch.utils.data.Dataset()2、torch.utils.data.Sampler()3、torch.utils.data.DataLoader()4、torchvision.datasets.ImageFolder()5、例子 torchvision.datasets.FashionMNIST()1、torch.utils.data.Dataset() 首先最基础的&#xff0c;是 torch.utils.data.Dataset…

蓝桥杯-成绩分析-编程题

一:题目 二&#xff1a;上码 #include<bits/stdc.h> using namespace std;int main() {int n;cin >> n;vector<int> v(n,0);for (int i 0; i < n; i) {cin >> v[i];}sort(v.begin(),v.end());double sum accumulate(v.begin(),v.end(),0);double…