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

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个百分点”是研究论断的一个典型形式。这样的论断通常确实很有趣,但必须理解为仅适用于特定训练数据集的情况。想象一下一个另类历史,在这个历史中,最初创建基准数据集的人有了更大的研究经费。他们可能会利用额外的资金来收集更多的训练数据。完全有可能,“由于这个新技术带来的”改进“在更大的数据集上会消失。换句话说,所谓的改进可能只是历史的偶然事件。要特别注意的是,在实际应用中,我们需要的是更好的算法和更好的训练数据。寻找更好的算法是可以的,但确保你不是只关注更好的算法而忽视了获取更多或更好的训练数据这一简单的胜利。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

四.流程控制(顺序,分支,循环,嵌套)

c刚刚转过来的记得写在public static void main(String[] args)的花括号里 一.顺序结构 二.分支结构 if ,switch 1.if (条件判断) 2.if else 3.if else if else if ... else(它是一个一个否定来一个个执行判断的 4.s…

Gitee 实战配置

一、Gitee 注册帐号 官网:https://gitee.com点击注册按钮。填写姓名。填写手机号。填写密码。点击立即注册按钮 二、安装GIT获取公钥 1.官网下载git下载地址:https://git-scm.com/download/win 2.安装git,双击运行程序,然后一直下…

Android下的匀速贝塞尔

画世界pro里的画笔功能很炫酷 其画笔配置可以调节流量,密度,色相,饱和度,亮度等。 他的大部分画笔应该是通过一个笔头图片在触摸轨迹上匀速绘制的原理。 这里提供一个匀速贝塞尔的kotlin实现: class EvenBezier {p…

SD卡RAW故障解析与数据恢复全攻略

一、SD卡RAW现象解析 SD卡作为现代电子设备中常见的存储介质,其稳定性和可靠性直接关系到我们日常工作和生活的数据安全。然而,有时我们会遇到SD卡突然变成RAW格式的情况,这通常意味着SD卡的文件系统出现了严重的问题,导致无法正…

Python基础介绍 —— 使用pytest进行测试!

​编辑自动化测试 1319 篇文章62 订阅 订阅专栏 Pytest 是 Python 的一种单元测试框架,与 Python 自带的 unittest 测试框架类似,但是比 unittest 框架使用起来更简洁,效率更高。 Pytest 是一个成熟的全功能的 Python 测试工具,…

在VSCode中怎么配置Python开发环境?真的超简单!

前言:VS Code 里是不包括 Python 的,所以你首先得安装一个 Python。 1、终端运行 Python 安装完 python 之后,我们可以用任何一个文本编辑工具开始写 python 代码,然后在 cmd 中运行代码。 在 VS Code 中,在不安装任…

idea maven 项目融合

背景 :项目A 和项目B 是两个独立的多模块项目,项目A 和项目B ,均为独立的数据源 。其中项目B 有两个数据原。 需要将项目B 以多模块的方式融合进项目A。 解决版本。建立项目C,只含有pom的,空项目,项目A和项…

Springboot 整合Mybatis 实现增删改查(二)

续上篇:Springboot整合Mybatis的详细案例图解分析-CSDN博客 mapper层(StudentMapper) //通过id查询student方法Student searchStudentById(int id);//通过id删除student方法int deleteStudentById(int id);//通过id增加student方法int inser…

文件批量管理利器,一键复制备份安全删除原文件,让文件管理更高效!

在数字化时代,我们每天都在与各种文件打交道,从文档、图片到视频、音频,文件的管理和存储变得越来越重要。然而,手动逐个处理文件不仅繁琐,还容易出错。那么,有没有一种方法可以让我们轻松实现文件的批量管…

如何提高Verilog代码编写水平?

在IC设计端的诸多岗位中,只要提到基础知识和必备技能,就一定少不了Verilog。 按照20年芯片设计老兵的说法“1. 知道module的基本框架。2. 知道怎么写assign,和always块。3. 其他没有了。” 也就是说用VerilogHDL做设计不要追求花架子&#…

鸿蒙开发系列教程(二十五)--样式处理(一)

1、样式属性 参考网址:https://developer.harmonyos.com/cn/docs/documentation/doc-references-V3/ts-universal-attributes-text-style-0000001427902436-V3 属性方法以 . 链式调用的方式配置系统组件的样式和其他属性 Entry Component struct Index {build() …

由浅到深认识Java语言(1):前提概要

该文章Github地址:https://github.com/AntonyCheng/java-notes 在此介绍一下作者开源的SpringBoot项目初始化模板(Github仓库地址:https://github.com/AntonyCheng/spring-boot-init-template & CSDN文章地址:https://blog.c…

linux常用命令指南

什么是Linux命令? Linux命令是在Linux操作系统中用于执行特定任务的命令行工具。它们被用于管理文件和目录、执行程序、配置系统设置等。Linux命令通常由一个命令名称和一些选项或参数组成,并且可以通过命令行界面(CLI)或脚本文件…

C语言例3-24:赋值表达式的例子

代码如下&#xff1a; #include<stdio.h> int main(void) {int i1,j;float f2.0f;// printf("fi-1 :%0.1f\n",fi-1); //ff(i-1)2.0// printf("ii>f :%d\n",ii>f); //i>f -->0 -->i0// printf("j!(i1) :%d\n",j…

智能ai文生视频,文生动漫小程序,系统搭建开发

目录 前言&#xff1a; 一、文生动漫系统搭建常规步骤 二、文生漫画是怎么操作的 总结&#xff1a; 前言&#xff1a; 小说推文是继短视频之后的又一个黄金赛道&#xff0c;它最大的特点就是&#xff0c;有一个人观看了你推荐的小说就有一份收益。那么使用系统小说转漫功能…

AI换脸软件rope最新更新的蓝宝石中文版下载

rope换脸软件蓝宝石版下载地址&#xff1a;点击下载 最近AI软件非常的火爆&#xff0c;今天就给大家带来一个可以AI替换人脸的工具rope&#xff0c;得益于机器学习技术的不断发展&#xff0c;rope经过深度神经网络的无数次迭代优化&#xff0c;最终得出的模型可以自动学习和识…

八大排序算法

排序算法 排序的概述排序的分类分为5大类&#xff1a;优点及缺点如何选择排序算法 八种排序之间的关系:一、插入排序直接插入排序动图详解代码实现 希尔排序动图详解代码实现 二、交换排序冒泡排序:动图详解代码实现 快速排序:动图详解代码实现 三、选择排序直接选择排序动图详…

Echo服务器学习__01(基础)

ASIO是一个跨平台&#xff0c;主要用于实现异步网络和其他一些底层I/O操作的C库 可以基于ASIO实现Echo服务端&#xff0c;在这之前&#xff0c;学习一些基础的知识和概念 ​ 1&#xff1a;IO多路复用 简单的来说&#xff0c;一个线程同时监听多个I/O事件就是I/O多路复用。任…

边缘计算+WEB端应用融合:AI行为识别智能监控系统搭建指南 -- 边缘设备图像识别及部署(二)

专栏目录 边缘计算WEB端应用融合&#xff1a;AI行为识别智能监控系统搭建指南 – 整体介绍&#xff08;一&#xff09; 边缘计算WEB端应用融合&#xff1a;AI行为识别智能监控系统搭建指南 -- 边缘图像识别及部署&#xff08;二&#xff09; 前言边缘图像识别与推流整体思路原始…

【人工智能】Gitee AI 天数智芯有奖体验开源AI模型,一定能有所收货,快来体验吧

大家好&#xff0c;我是全栈小5&#xff0c;欢迎阅读小5的系列文章。 这是《人工智能》系列文章&#xff0c;每篇文章将以博主理解的角度展开讲解。 目录 前言两大赛道天数智芯1.模型地址2.天数智芯专区3.选择模型4.模型详情页5.部署模型6.成功部署7.执行例子8.移除模型 千模盲…