【第十三章】改进神经网络学习方式-其他正则化技术

L1正则化

除了L2正则化之外,还有许多正则化技术。事实上,已经开发出了如此多的技术,以至于我不可能总结它们。在本节中,我简要介绍了三种减少过拟合的其他方法:L1正则化、dropout和人为增加训练集大小。我们不会像之前那样深入研究这些技术。相反,目的是熟悉主要思想,并体会到可用的正则化技术的多样性。

L1正则化:在这种方法中,我们通过添加权重的绝对值之和来修改未正则化的损失函数:
C = C 0 + λ n ∑ w ∣ w ∣ . (95) C = C_0 + \frac{\lambda}{n} \sum_w |w|.\tag{95} C=C0+nλww∣.(95)

直觉上,这与L2正则化类似,惩罚大的权重,倾向于使网络偏好小的权重。当然,L1正则化项并不同于L2正则化项,因此我们不应该期望得到完全相同的行为。让我们试着理解使用L1正则化训练的网络的行为与使用L2正则化训练的网络有何不同。

为了做到这一点,我们将查看损失函数的偏导数。对(95)进行微分,我们得到:
∂ C ∂ w = ∂ C 0 ∂ w + λ n s g n ( w ) , (96) \frac{\partial C}{\partial w} = \frac{\partial C_0}{\partial w} + \frac{\lambda}{n} \, {\rm sgn}(w), \tag{96} wC=wC0+nλsgn(w),(96)

其中sgn(w)是w的符号,即如果w为正则为+1,如果w为负则为−1。利用这个表达式,我们可以轻松地修改反向传播,以使用L1正则化进行随机梯度下降。L1正则化网络的更新规则如下:
w → w ′ = w − η λ n s g n ( w ) − η ∂ C 0 ∂ w , (97) w \rightarrow w' = w-\frac{\eta \lambda}{n} {sgn}(w) - \eta \frac{\partial C_0}{\partial w}, \tag{97} ww=wnηλsgn(w)ηwC0,(97)

与通常情况一样,如果我们希望,可以使用小批量平均来估计∂C0/∂w。与L2正则化的更新规则进行比较(参见方程(93)),

w → w ′ = w ( 1 − η λ n ) − η ∂ C 0 ∂ w . (98) w \rightarrow w' = w\left(1 - \frac{\eta \lambda}{n} \right)- \eta \frac{\partial C_0}{\partial w}.\tag{98} ww=w(1nηλ)ηwC0.(98)

在这两个表达式中,正则化的效果都是使权重收缩。这符合我们的直觉,即两种类型的正则化都惩罚大的权重。但权重收缩的方式是不同的。在L1正则化中,权重以恒定的量朝0方向收缩。而在L2正则化中,权重以与w成比例的量收缩。因此,当特定权重具有较大的幅度|w|时,L1正则化使权重收缩的程度要比L2正则化小得多。相反,当|w|很小时,L1正则化使权重收缩得比L2正则化更多。总的结果是,L1正则化倾向于将网络的权重集中在相对较少数量的高重要性连接中,而其他权重则被推向零。

在上述讨论中,我忽略了一个问题,即当w=0时,偏导数∂C/∂w未定义。原因是函数|w|在w=0处具有尖锐的“角”,因此在该点不可微。不过,这没关系。我们将在w=0时使用通常的(未正则化的)随机梯度下降规则。直观地说,正则化的效果是使权重收缩,显然不能收缩已经为0的权重。更精确地说,我们将使用方程(96)和(97),其中sgn(0)=0的约定。这给了我们一个简洁的规则,用于使用L1正则化进行随机梯度下降。

Dropout(随机失活)

Dropout是一种完全不同的正则化技术。与L1和L2正则化不同,dropout不依赖于修改成本函数。相反,在dropout中,我们修改网络本身。让我描述一下dropout的基本原理,然后再讨论它的原理以及结果是什么。

假设我们正在尝试训练一个网络
在这里插入图片描述
特别是,假设我们有一个训练输入 x 和相应的期望输出 y。通常情况下,我们会通过网络前向传播 x,然后进行反向传播以确定对梯度的贡献。使用dropout时,这个过程会有所修改。我们首先随机(临时地)删除网络中一半的隐藏神经元,同时保留输入和输出神经元不变。这样做之后,我们得到的网络如下所示。请注意,dropout神经元,即临时删除的神经元,仍然显示在图中:
在这里插入图片描述
我们将输入 x 通过修改后的网络进行前向传播,然后通过修改后的网络进行反向传播。在对一小批样本执行此操作之后,我们更新相应的权重和偏差。然后,我们重复这个过程,首先恢复dropout神经元,然后选择一个新的随机隐藏神经元子集进行删除,估计另一个小批样本的梯度,并更新网络中的权重和偏差。

通过反复执行这个过程,我们的网络将学习到一组权重和偏差。当然,这些权重和偏差是在一半的隐藏神经元被丢弃的情况下学习的。当我们实际运行完整网络时,这意味着有两倍多的隐藏神经元将处于活跃状态。为了补偿这一点,我们将从隐藏神经元传出的权重减半。

这个dropout过程可能看起来奇怪和临时性。为什么我们期望它有助于正则化?为了解释其中的原理,我希望你暂时停止考虑dropout,而是想象以标准方式(不使用dropout)训练神经网络。特别是,想象我们训练了几个不同的神经网络,它们都使用相同的训练数据。当然,这些网络可能一开始并不相同,因此在训练之后它们有时可能会给出不同的结果。当发生这种情况时,我们可以使用某种平均或投票方案来决定接受哪个输出。例如,如果我们训练了五个网络,并且其中三个将一个数字分类为“3”,那么它可能确实是“3”。其他两个网络可能只是犯了一个错误。这种平均方案通常被发现是一种有效的(尽管昂贵)减少过拟合的方法。原因是不同的网络可能以不同的方式过拟合,而平均可能有助于消除这种过拟合。

这与dropout有什么关系?从启发式的角度来看,当我们随机删除不同的神经元集时,就好像我们在训练不同的神经网络。因此,dropout过程就像是对大量不同网络效果进行平均。不同的网络会以不同的方式过拟合,因此,希望dropout的净效果是减少过拟合。

在使用该技术的最早论文之一中给出了有关dropout的一个相关启发式解释:“这种技术减少了神经元的复杂共适应,因为神经元不能依赖于特定其他神经元的存在。因此,它被迫学习更加稳健的特征,这些特征在与其他神经元的许多不同的随机子集一起使用时是有用的。”换句话说,如果我们将我们的网络视为进行预测的模型,那么我们可以将dropout视为确保模型对于丢失任何单个证据都具有稳健性的一种方式。在这方面,它与L1和L2正则化有些相似,后者倾向于减小权重,从而使网络更具稳健性,以抵御在网络中丢失任何单个连接的风险。

当然,dropout的真正衡量标准是它在提高神经网络性能方面取得了巨大成功。最初的论文应用了这项技术到许多不同的任务中。对我们来说,特别有趣的是,他们将dropout应用到了MNIST数字分类中,使用了类似于我们一直在考虑的基本前馈神经网络的模型。该论文指出,截至当时,使用这种架构达到的最佳结果是在测试集上达到了98.4%的分类准确率。他们使用了dropout和一种修改过的L2正则化的组合,将准确率提高到了98.7%。类似的令人印象深刻的结果已经在许多其他任务中获得,包括图像和语音识别以及自然语言处理的问题。dropout在训练大型、深度网络方面特别有用,这些网络往往容易出现过拟合问题。

人为扩展训练数据

我们之前已经看到,当我们只使用1,000个训练图像时,我们的MNIST分类准确率下降到了85%左右。这并不令人意外,因为较少的训练数据意味着我们的网络将接触到更少的人类书写数字的变化方式。让我们尝试使用各种不同大小的训练数据集来训练我们的30个隐藏神经元网络,以查看性能如何变化。我们使用的是小批量大小为10,学习率 η=0.5,正则化参数 λ=5.0,以及交叉熵损失函数进行训练。当使用完整的训练数据集时,我们将进行30个时期的训练,并且在使用较小的训练集时按比例增加时期的数量。为了确保权重衰减因子在各个训练集中保持一致,我们将在使用完整训练数据集时使用正则化参数 λ=5.0,并在使用较小的训练集时按比例减少 λ。
在这里插入图片描述
正如您所看到的,随着我们使用更多的训练数据,分类准确率显着提高。可以推测,如果有更多的数据可用,这种改进可能会进一步持续。当然,从上面的图表可以看出,我们似乎已经接近饱和状态。然而,假设我们使用对数标度重新绘制训练集大小的图表:
在这里插入图片描述
图表显然还在朝着末尾上升。这表明,如果我们使用大量更多的训练数据——比如说,数百万甚至数十亿手写样本,而不仅仅是 50,000 个——那么即使是这个非常小的网络,我们可能会得到更好的性能。

获得更多的训练数据是一个好主意。不幸的是,这可能会很昂贵,因此在实践中并不总是可行的。然而,还有另一个几乎同样有效的方法,那就是人为地扩展训练数据。比如,假设我们拿到了一个 MNIST 的训练图像,上面是一个数字“5”。
在这里插入图片描述
然后将其旋转一小部分,比如说 15 度:
在这里插入图片描述
这个图像仍然可以明显地识别为相同的数字。但在像素级别上,它与MNIST训练数据中的任何图像都有很大不同。将这个图像添加到训练数据中可能有助于我们的网络学习如何对数字进行分类。此外,显然我们不仅限于添加这一个图像。我们可以通过对所有MNIST训练图像进行许多小幅度旋转来扩展我们的训练数据,然后使用扩展的训练数据来提高网络的性能。

这个想法非常强大,已经被广泛应用。让我们来看一些论文中的结果,这篇论文应用了这个想法的几种变体到MNIST数据集中。他们考虑的一个神经网络架构与我们一直在使用的类似,是一个具有800个隐藏神经元并使用交叉熵损失函数的前馈网络。在标准的MNIST训练数据上运行网络时,他们在测试集上实现了98.4%的分类准确率。但后来,他们扩展了训练数据,不仅像我上面描述的旋转,还平移和倾斜了图像。通过在扩展的数据集上进行训练,他们将网络的准确率提高到了98.9%。他们还尝试了他们称之为“弹性扭曲”的技术,这是一种特殊的图像扭曲,旨在模拟手部肌肉中的随机振动。通过使用弹性扭曲来扩展数据,他们实现了更高的准确率,达到了99.3%。实际上,他们通过让网络接触到真实手写中存在的各种变化,来丰富网络的经验。

这个想法的变体可以用于改善许多学习任务的性能,不仅限于手写识别。总的原则是通过应用反映真实世界变化的操作来扩展训练数据。想要做到这一点并不难。例如,假设你正在构建一个用于语音识别的神经网络。我们人类即使在背景噪音等扭曲存在的情况下也能识别语音。因此,您可以通过添加背景噪音来扩展您的数据。我们还可以在语音被加速或减速的情况下进行识别。所以这是我们可以扩展训练数据的另一种方式。这些技术并不总是被使用 - 例如,与其通过添加噪音来扩展训练数据,可能更有效的方法是首先应用噪声减少滤波器来清理网络的输入。然而,记住扩展训练数据的想法,并寻找应用它的机会是值得的。

关于大数据以及比较分类准确度的含义

让我们再次看一下我们的神经网络在不同训练集大小下的准确率变化情况:
在这里插入图片描述
假设我们不是使用神经网络,而是使用其他一些机器学习技术来对数字进行分类。例如,让我们尝试使用支持向量机(SVM),我们在最前面简要介绍过。如果您对SVM不熟悉也不用担心,我们不需要了解其详细信息。相反,我们将使用由scikit-learn库提供的SVM。下面是SVM性能随着训练集大小变化的情况。我也绘制了神经网络的结果,以便进行比较。
在这里插入图片描述
这张图的第一印象可能是我们的神经网络在每个训练集大小下都优于SVM。这很好,尽管您不应过多解读,因为我只是使用了scikit-learn的SVM的默认设置,而我们在改进我们的神经网络时做了大量工作。这张图更微妙但更有趣的一点是,如果我们使用50,000张图像来训练我们的SVM,那么它的性能实际上会更好(准确率为94.48%),而我们的神经网络在使用5,000张图像进行训练时的性能则不及它(准确率为93.24%)。换句话说,更多的训练数据有时可以弥补机器学习算法之间的差异。

更有趣的情况可能会发生。假设我们正在尝试使用两种机器学习算法A和算法B来解决一个问题。有时候,算法A在一个训练数据集上的表现会优于算法B,而算法B在另一个训练数据集上的表现则会优于算法A。我们在上面的图中没有看到这种情况 - 它需要两个图交叉 - 但它确实会发生。对于问题“算法A是否比算法B更好?”的正确回答实际上是:“您正在使用哪个训练数据集?”

所有这些都是需要谨记的警示,无论是在开发过程中还是在阅读研究论文时。许多论文侧重于发现新的技巧,以在标准基准数据集上提高性能。“我们的新技术在标准基准Y上使性能提高了X个百分点”是研究论断的一个典型形式。这样的论断通常确实很有趣,但必须理解为仅适用于特定训练数据集的情况。想象一下一个另类历史,在这个历史中,最初创建基准数据集的人有了更大的研究经费。他们可能会利用额外的资金来收集更多的训练数据。完全有可能,“由于这个新技术带来的”改进“在更大的数据集上会消失。换句话说,所谓的改进可能只是历史的偶然事件。要特别注意的是,在实际应用中,我们需要的是更好的算法和更好的训练数据。寻找更好的算法是可以的,但确保你不是只关注更好的算法而忽视了获取更多或更好的训练数据这一简单的胜利。

总结一下:我们已经完成了对过拟合和正则化的深入探讨。当然,我们会再次回到这个问题上。正如我多次提到的,过拟合是神经网络中的一个重大问题,特别是随着计算机变得更加强大,我们有能力训练更大的网络。因此,迫切需要开发强大的正则化技术来减少过拟合,而这是当前工作中非常活跃的一个领域。

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

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

相关文章

在ComfyUI中,IP-Adapter的一大堆模型应该怎么放?

🎁背景介绍 IP-Adapter有一大堆的模型,那么这个模型在ComfyUI中,这些模型到底应该怎么放呢?这篇文章简单介绍一下。 首先,大家需要到huggingface上找到对应的模型,把所有的模型先下载下来。 huggingface…

技术工作报告-基于linux的信息转二维码图像方法的研究

一、摘要: 本报告旨在介绍基于Linux的信息转二维码图像方法的研究。通过对二维码技术的背景和相关研究的调研,我们提出了一种基于Linux平台的信息转二维码图像方法,并进行了实验验证。本方法可以在Linux系统上实现高效、准确的信息转二维码图…

数据分析的具体流程

1.导入 表格导入数据时要注意数据的格式问题非表格导入 可以先将文档放入word中 将换行符(^p)替换为|||,选择特殊格式中的段落标记 进行全部替换 以每一列最后的数据/平,作为换行的标志 将所整理的信息导入excel,对数据进行分列 选…

大数据 - Spark系列《十四》- spark集群部署模式

Spark系列文章: 大数据 - Spark系列《一》- 从Hadoop到Spark:大数据计算引擎的演进-CSDN博客 大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置-CSDN博客 大数据 - Spark系列《三》- 加载各种数据源创建RDD-CSDN博客 大数据 - Spark系列《…

Git版本管理工具

前言: 本文记录学习使用 Git 版本管理工具的学习笔记,通过阅读参考链接中的博文和实际操作,快速的上手使用 Git 工具。 本文参考了引用链接博文里的内容。 引用: Git使用教程-配置管理 git reset详解-CSDN博客 3、Git使用不完全指南&am…

二维数组应用案例

大家好: 衷心希望各位点赞。 您的问题请留在评论区,我会及时回答。 考试成绩统计 案例描述:有三名同学(张三、李四、王五),在一次考试中成绩分别如下表,请分别输出三名同学的总成绩。 成绩表 语…

全面整理!机器学习常用的回归预测模型(表格数据)

文章目录 一、前言二、线性模型三、非线性模型 🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 回归预测建模的核心是学习输入 X X X 到输出 y y y (其中 y y y 是连续值向量)的映射关系。条件期望 E ( Y ∣ X x…

直播预约丨《袋鼠云大数据实操指南》No.1:从理论到实践,离线开发全流程解析

近年来,新质生产力、数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮,持续冲击并革新着企业数字化转型的观念视野,昭示着一个以数据为核心驱动力的新时代正稳步启幕。 面对这些引领经济转型的新兴概念,为了更好地服务于客户…

c/c++ 深拷贝和浅拷贝

深拷贝与浅拷贝 深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是对象复制的两种不同方式,它们涉及到对象成员数据的复制方式和内存管理。 浅拷贝(Shallow Copy): 浅拷贝是指将一个对象的…

C++:继承:面向对象编程的重要特性

(❁◡❁)(●◡●)╰(*▽*)╯(*/ω\*)(^///^)(❁◡❁)(❁◡❁)(●◡●)╰(*▽*)╯(*/ω\*)(❁◡❁)(●’◡’●)╰(▽)╯(/ω\)(///) C:继承:面向对象编程的重要特性 前言**继承**1.继承的概念及定义1.1继承的概念1.2继…

算法笔记p251队列循环队列

目录 队列循环队列循环队列的定义初始化判空判满入队出队获取队列内元素的个数取队首元素取队尾元素 队列 队列是一种先进先出的数据结构,总是从队尾加入元素,从队首移除元素,满足先进先出的原则。队列的常用操作包括获取队列内元素的个数&a…

【Godot4.2】颜色完全使用手册

概述 本篇简单汇总Godot中的颜色的构造和使用,内容包括了: RGB、RGBA,HSV以及HTML16进制颜色值、颜色常量等形式构造颜色颜色的运算以及取反、插值用类型化数组、紧缩数组或PNG图片形式存储多个颜色 构造颜色 因为颜色是一种视觉元素&…

Jmeter接口测试步骤

一、使用工具测试 1、使用Jmeter对接口测试 首先我们说一下为什么用Posman测试后我们还要用Jmeter做接口测试,在用posman测试时候会发现的是一个接口一个接口的测试,我们每次测试成功后的数据,在工具中是无法保存的,再次测试的时…

【蓝桥杯入门记录】继电器、蜂鸣器及原理图分析

一、继电器、继电器概述 (1)蜂鸣器原理 蜂鸣器的发声原理由振动装置和谐振装置组成,而蜂鸣器又分为无源他激型与有源自激型,蜂鸣器的发声原理为: 1、无源他激型蜂鸣器的工作发声原理是:方波信号输入谐振装置转换为声…

Vue.js开发基础

单文件组件 使用Vite创建Vue项目后,目录结构中包含一些扩展名为.vue的文件,每个.vue文件都可用来定义一个单文件组件。Vue中的单文件组件是Vue组件的文件格式。每个单文件组件由模板、样式和逻辑3个部分构成。 运行结果: 1.模板 模板用于搭建…

PyTorch 深度学习(GPT 重译)(一)

第一部分:PyTorch 核心 欢迎来到本书的第一部分。在这里,我们将与 PyTorch 迈出第一步,获得理解其结构和解决 PyTorch 项目机制所需的基本技能。 在第一章中,我们将首次接触 PyTorch,了解它是什么,解决了…

爬虫基础:HTTP基本原理

爬虫基础:HTTP基本原理 前言HTTP基本原理URI 和 URLHTTP 和 HTTPSHTTP 请求过程请求与响应HTTP请求HTTP响应请求与响应的交互过程 HTTP 2.0二进制传输多路复用Header压缩服务器端提前响应内容安全 前言 了解 HTTP的基本原理,了解从往测览器中输人 URL到获…

算法沉淀——贪心算法四(leetcode真题剖析)

算法沉淀——贪心算法四 01.最长回文串02.增减字符串匹配03.分发饼干04.最优除法 01.最长回文串 题目链接:https://leetcode.cn/problems/longest-palindrome/ 给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。 …

YOLOV5 改进:修改网络结构--C2f 模块

1、前言 YOLOV5 采用C3模块,类似于残差结构的思想 class C3(nn.Module):# CSP Bottleneck with 3 convolutionsdef __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5): # ch_in, ch_out, number, shortcut, groups, expansionsuper().__init__()c_ = int(c2 * e) #…

Linux中,运行程序,顺便将打印信息存储在Log文件中查看

前言 如题,原本打算在代码中自己写一个类去管理将打印信息收集到log日志中,忽然想到,其实也可以写sh脚本 简单demo1 #!/bin/bash# 启动应用程序 test,并将标准输出和标准错误输出都追加到 log 文件中 ./test >> output.log…