多层神经网络 ——小批量梯度下降法

2023-05-16

在前面的课程中,我们知道为了实现非线性分类的任务,需要使用多层神经网络,多层神经网络的损失函数不再是凸函数,而是一种比较复杂的不规则函数,这类函数求导数非常困难,在求解极值问题时很难通过计算得到解析解,因此,通常采用梯度下降法得到数值解。

梯度下降法有着三种不同的形式,分别是批量梯度下降、随机梯度下降和小批量梯度下降。

下面,就来详细的介绍下这三种方法。为了便于理解,我们以一元线性回归为例,下图为一元线性回归的平方损失函数,
在这里插入图片描述
这里的 n 表示样本数。

批量梯度下降法

在这三种形式中,批量梯度下降法是最原始的形式。每一次迭代更新权值时,都使用所有样本来计算偏导数。
在这里插入图片描述
采用这种方法由所有样本确定梯度方向,可以保证每一步都是准确地向着极值点的方向趋近,收敛的速度最快,所需要的迭代次数最少,当目标函数是凸函数时,一定能够收敛于全局最小值,如果目标函数是非凸函数,则会收敛到某个局部极小值点。

对所有样本的计算,可以利用向量运算进行并行计算来提升运算速度。

对于小规模数据集,通常采用这种批量梯度下降法进行训练,例如,在前面介绍的所有例程中使用的都是这种方法,但是在神经网络和深度学习中,样本的数量往往非常大,可能有数万个或者数百万个,甚至上亿个样本,每个样本中,属性的个数也可能非常的大,采用批量梯度下降法,在每一步迭代时,都需要用到所有的样本,计算量可能会大的惊人,即使使用向量运算,也需要花费大量的时间。

例如,数据集中有 20 万个样本,那么每次迭代都需要使用这 20 万个样本进行计算才能对参数进行一次更新,假设达到极小值需要进行10次迭代,那么就一共需要200万次计算,才能达到收敛。

其实,在大规模数据集中,通常会有大量冗余数据,也没有必要使用整个训练集来计算梯度,因此,批量梯度下降法并不适合大规模数据集。为了实现更快的计算,可以使用随机梯度下降法。

随机梯度下降法

在这种方法中,每次迭代时只使用一个样本来训练模型,也就是说每次只使用一个样本去计算代价函数的梯度并迭代更新模型的参数,使模型的输出值尽可能逼近这个样本真实的标签值。

当训练误差足够小时,结束本次训练,再输入下一个新的样本,显然使用前面样本训练出的网络参数,不一定能够使得后面的新样本误差最小,所以这个新样本需要再重新训练网络,这个样本训练结束之后,再输入下一个样本,再次训练网络,直到使用所有样本训练一遍为止,这个过程也被称为一轮。

例如,对于一个有20万个样本的数据集,训练一轮就是依次使用这 20 万个样本训练一遍网络。因为每次训练只使用了一个样本,因此每次训练速度非常快,可以想到在训练一轮之后,整个网络的模型参数对最后一个样本的误差达到了最小。但是对前面的样本就不好说了。因为后面样本调整了网络参数,又可能会使得前面样本的效果变坏。而我们需要网络对所有样本的误差和足够小,因此,往往需要再进行下一轮的训练。直到所有样本的误差达到预期为止。

采用随机梯度下降法,虽然每次训练只使用一个样本,单次迭代的速度很快,但是通过单个样本计算出的梯度不能够很好的体现全体样本的梯度。各个样本各自为政,横冲直撞,不同样本的训练结果,往往会互相抵消,导致参数更新非常的频繁,因此,可能会走很多的弯路,在最优点附近晃来晃去,却无法快速收敛,即使损失函数是凸函数,也无法做到线性收敛,而且采用这种方法,每次只使用一个样本,也不利于实现并行计算。

实际上这种方法很少使用,现在我们所说的随机梯度下降通常是指小批量梯度下降算法。

小批量梯度下降法

小批量梯度下降算法是前面两种的折中方案,也称为小批量随机梯度下降算法。

这种算法把梯度称为若干个小批量,也叫做小批量。也就是每次迭代只使用其中一个小批量来训练模型。下图为小批量梯度下降法的损失函数的计算公式:
在这里插入图片描述
其中, t 是每一批中样本的数量,通常为 1 到几百。

下图为小批量梯度下降法的参数更新迭代公式,
在这里插入图片描述
在小批量梯度下降法中,每个批中的所有样本共同决定了本次迭代中梯度的方向,这样训练起来就不会跑偏,也就减少了随机性。

将所有的批次都执行一遍,就称之为一轮。

因为各个批的样本之间也会存在训练结果互相抵消的问题,因此通常也需要经过多轮训练才能够收敛。

使用这种方法的好处是,无论整个训练集的样本数量有多少,每次迭代所使用的训练样本数量都是固定的。

例如,某个训练集中有 2000 个样本,分成 10 批,每个批次中的样本数量是200,那么每次训练就使用1个批中的 200 个样本,每一轮需要进行 10 次训练,如果训练样本增加到 200000 个,分成 1000 批,每个批次中的样本数量是200,那么每次训练同样也是使用1个批中的 200 个样本。

和批量梯度下降法相比,这样显然可以大大的加快训练速度,另外,和批量梯度下降法一样,这种方法也可以实现并行计算。因此。在训练大规模数据集时,通常首选小批量梯度下降算法。

抽样

小批量梯度下降算法是基于统计学中抽样的思想,无论训练样本是数字、图片还是语音,我们从中随机抽取出来一部分样本,它们的特征可以在一定程度上代表整个完整数据集的特征。就像归纳总结人的特征,其实并不需要将世界上所有的人都进行一遍调查,只需要抽取有代表性的一部分样本,覆盖所有的人种、年龄、性别等特征,再对它们进行归纳就可以了。

因此从理论上来说,每次所构建的小批量样本都应该是独立同分布的,能够代表整个样本集的特征。但是,在实际实现时,是很难做到这一点的,每次随机抽取的小批量样本的特征和整体样本的特征存在差别。

例如,有 1000 个小球,分别标记1 — 1000 的数字,
在这里插入图片描述
拿出其中所有的小球计算它们的平均值,那就是 500.5,但是从中随机抽取 100 个小球去计算平均值,那么就会出现偏差,结果不会正好是 500.5 ,

同样采用小批量样本计算出的梯度和使用全体样本计算出的标准梯度之间存在偏差,因此,不能保证每次迭代都是向着损失值下降最快的方向前进,也可能会绕远,但是总体来说,还是会向着最优的方向前进。另一方面,小批量中这种梯度偏差就好像是给样本中增加了噪声,会在一定程度上提高模型的泛化能力。

假设下图为某种二元损失函数及其对应的曲面图,
在这里插入图片描述
这个曲面中不同的颜色对应不同的函数值,也就是 z 轴坐标。

梯度下降法就是从某个随机点出发,逐步到达全局最小值点,或者某个局部极小值点。

在 xoy 平面上,做出这个函数的等高线,
在这里插入图片描述
其中,每一个圆圈或者曲线上的高度值都相同。

下面就来借助于等高线来更加直观的看一下这几种梯度下降法的迭代过程。

假设这个函数的损失函数是一个凸函数,这些蓝色的封闭曲线是等高线,下图红色的点为全局最小值点,
在这里插入图片描述
在使用批量梯度下降法时,参数更新,每一步都沿着梯度方向向着最小值点前进,迭代次数最少。但是每次迭代所花费的时间非常长,
在这里插入图片描述
在使用随机梯度下降法时,虽然每次迭代速度很快,但是它们并不都是向着最小值点的方向前进的,会出现剧烈的振荡。算法会在这种振荡中逐渐走向最小值的位置。
在这里插入图片描述
但是也可能会在最小值的周围左右徘徊,始终无法到达。

而使用小批量梯度下降算法,虽然也不是每一次都向着最小值点的方向前进,但是也不会绕着太远。所需要的迭代次数也远远小于随机梯度下降法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多层神经网络 ——小批量梯度下降法 的相关文章

  • [转]STM32 串口传输处理方式 FreeRTOS+队列+DMA+IDLE (二)

    紧接着上一篇文章 xff0c 如何合理处理多个串口接收大量数据 此种方法 xff0c 很厉害 xff0c 很NB xff0c 首先 xff0c 利用DMA 可节省大量CUP资源 其次 xff0c 利用IDLE空闲中断来接收位置个数的数据 最
  • [转]FreeRTOS消息队列、信号量、事件标志组、任务通知

    功能及区别列表 消息队列 xff08 需要传递消息时使用 xff09 在任务与任务间 中断和任务间传递信息 xff0c 可以数据传输 事件标志组 xff08 多个事件同步 xff0c 不需要传递消息时使用 xff09 实现任务与任务间 中断
  • ubuntu 终端打不开解决办法

    由于ubuntu自带的是python3 5 在新安装了python3 6以后 xff0c 开机突然发现无论是点击图标还是使用快捷键终端都无法打开 xff0c 解决办法如下 xff1a xff11 xff0e 按Ctrl 43 Alt 43
  • Jack server already installed in "/***/.jack-server" 异常

    xff08 1 xff09 在新增新用户后 xff0c 进行android编译 xff0c 出现如下异常 xff1a Ensure Jack server is installed and started FAILED bin bash c
  • gstreamer移植qnx(二):交叉编译glib

    一 简介 这里以glib的2 63 0版本 xff0c QNX系统的版本是 xff1a 6 6 这里是为了编译gstreamer的依赖库 xff0c 也就是说最终目标 xff0c 是将gstreamer移植到QNX6 6系统上 我选择的是g
  • repo安装与简单使用

    一 概述 当一个大的项目需要拆分成很多的子项目 xff0c 或者说一个软件系统拆分成多个子系统 每一个子项目或者子系统都对应一个git repository 这种需求在实际项目当中是很常见的 xff0c 有的可能就直接写一个shell脚本来
  • 通过qemu-img命令将raw image转换成VMware虚拟硬盘vmdk

    为了在VMware中跑QNX系统 xff0c 我需要想办法将编译BSP生成的img文件固化到VMware的虚拟硬盘中去 xff0c 之前一直找不到方法 xff0c 到渐渐的只能用很笨的方法几次中专 将生成的img文件通过win32DiskI
  • WSL2 Ubuntu安装Qt(包括QtCreator)

    最近因为需要在Linux下使用qtcreator做一些界面开发的预研和学习 xff0c 主要是因为要交叉编译Qt 但又不想再使用虚拟机了 xff0c 真的太消耗内存了 于是就想着直接使用Windows10 下面的WSL2 怎么安装WSL2这
  • 架构师成长之路工具篇(1):markdown撰写文档

    今天笔者想说的工具就是markdown xff0c 正所谓工欲善其事必先利其器 xff0c 选择高效的工具自然能提升工作效率 笔者使用的markdown工具是 xff1a typora word太重 xff0c 太复杂 xff0c 在写文档
  • Artifact xxxx:Web exploded: Error during artifact deployment. See server log........

    从Git上拉取了一个新项目到idea xff0c 结果一运行就报错 xff0c 错误下图 看大家的解决方法基本都是重新部署Tomcat Maven或者项目 xff0c 还有什么jar包冲突要删除的 xff0c 齐齐试了一遍 xff0c 并没
  • 如何优雅的退出qemu虚拟环境

    在console环境下 xff0c 先 按 ctrl 43 a xff0c 释放之后再按 x 键 既可terminate qemu 注 xff1a 1 a 和 x 均为小写 2 必须先释放ctrl 43 a 之后 再按x键
  • xmake经验总结1:解决c++ future/promise抛出std::system_error的问题

    1 背景 1 1 场景 编译器 xff1a gcc 9 4 运行系统 xff1a Ubuntu 20 04 4 LTS xmake v2 6 7 场景 xff1a 其大致场景是使用c 43 43 的future promise功能 xff0
  • 神经网络实现手写数字识别(MNIST)

    一 缘起 原本想沿着 传统递归算法实现迷宫游戏 gt 遗传算法实现迷宫游戏 gt 神经网络实现迷宫游戏的思路 xff0c 在本篇当中也写如何使用神经网络实现迷宫的 xff0c 但是研究了一下 xff0c 感觉有些麻烦不太好弄 xff0c 所
  • 从高考到吃“软”饭

    上大学之前 xff0c 我是一个连本科和专科都分不清的农村小娃 那时的我天真的以为 xff0c 专科就是教授比较专业的知识 xff0c 而本科就是学得比较广而不深 上大学之后 xff0c 我算是开眼界了 xff0c 各种社团真是百花齐放 对
  • 解决visio对象在word中显示不全的问题

    作为一个软件工程师 xff0c 编写技术文档是常有的事情 xff0c 使用visio绘制各种图形 如 xff0c 流程图 xff0c 结构图 xff0c 框架图 xff0c 状态图等等 也是再正常不过的事情 如果我们在word中撰写文档时
  • git submodule使用以及注意事项

    一 背景 在平时的软件开发过程中常常会有这样的场景 xff0c 自己负责的某个模块会依赖其他模块或者第三方的library 这时你自己的模块是一个独立的代码仓库 xff0c 你想要实现这样一种功能 xff0c 当你从你的模块的代码仓库里把代
  • Webpack5 - 基本使用

    一 webpack有何作用 webpack是一个Javascript应用程序的模块打包器 它可以递归地构建一个应用程序的模块依赖关系图 xff0c 然后将所有模块打包在一起 为什么需要模块打包器 xff1a 现在的应用程序模块文件很多 xf
  • Vue.js - VueRouter的Hash与History模式 / 手写VueRouter

    一 Hash与History模式 Hash模式History模式url地址外观http localhost 8081 abouthttp localhost 8080 about原理基于锚点 xff0c 监听锚点变化时触发的onhashch
  • Vue.js - Vue.js响应式原理(1/2)

    一 数据驱动 数据响应式 xff1a 数据改变 xff0c 则视图改变 xff0c 避免频繁的Dom操作 xff0c 提高运行效率 双向绑定 xff1a 数据改变 xff0c 则视图改变 xff1b 视图改变 xff0c 则数据也随之改变
  • Vue.js - 模拟Vue.js响应式原理(2/2)

    项目仓库 xff1a https gitee com big right right vue responsive tree master L8 一 类的说明 Vue类 xff1a 保存传入的选项数据 xff0c 把选项data中的成员注入

随机推荐

  • OpenFlow Switch Specification 1.3.0 (三)

    六 OpenFlow 安全通道 xff08 OpenFlow Channel xff09 OpenFlow 通道是连接每一个交换到控制器的接口 通过这个接口 xff0c 控制器配置和管理交换机 xff0c 从交换机接收事件 xff0c 向交
  • MATLAB并行加速方法

    用MATLAB运行计算任务时 xff0c 有时会遇到程序中有很多重复计算部分 xff0c 多次循环中 xff0c 每一次的计算之间无相互依赖 xff08 即后一次的计算不需要使用到前一次的计算结果 xff09 xff0c 可能仅改变了输入参
  • 一名本科毕业女程序员的2013总结

    姓名 xff1a XXX 性别 xff1a 女 学历 xff1a 大学本科 毕业时间 xff1a 2013 06 31 参加工作 xff1a 2013 07 03 单位 xff1a 北京 某国企下属单位 职位 xff1a 程序员 1 初始
  • .NET用NCO连接SAP RFC---写数据到SAP

    1 环境 xff1a a win7 43 64位操作系统 b VS2012 c nco3 0 xff08 64bit 下载网址 xff1a http www dllbang com dll sapnco dll xff09 xff0c d
  • .NET Framwork,C#入门开发教程,零基础必看

    初识 NET Framwork和开发过程 一 什么是 NET Framework NETFramework是一个开发平台 xff0c 可以在其上使用多种语言开发程序 xff1a 如C xff0c VB xff0c C 43 43 xff08
  • 如何清除IIS缓存

    问题描述 xff1a 在IIS的默认网站下创建了一个虚拟目录名A xff0c 然后删除这个虚拟目录 后来需要重新创建一个同名虚拟目录 xff0c 映射的还是原来的项目文件 xff0c 只是项目文件的物理路径发生了变化 xff0c 这个新虚拟
  • jqGrid 多选复选框 编辑列

    1 首先看一下效果 2 html代码 lt table id 61 34 grid table 34 gt lt table gt 3 在 function 方法中 xff0c 写如下方法 xff0c 用json数据填充jqGrid xff
  • Asp.net WebApi 项目示例(增删改查)

    1 WebApi是什么 ASP NET Web API 是一种框架 xff0c 用于轻松构建可以由多种客户端 xff08 包括浏览器和移动设备 xff09 访问的 HTTP 服务 ASP NET Web API 是一种用于在 NET Fra
  • C# 多线程 用委托实现异步_调用委托的BeginInvoke和EndInvoke方法

    1 C 中的每一个委托都内置了BeginInvoke和EndInvoke方法 xff0c 如果委托的方法列表里只有一个方法 xff0c 那么这个方法就可以异步执行 xff08 不在当前线程里执行 xff0c 另开辟一个线程执行 xff09
  • Vue2 模板template的四种写法

    lt div id 61 34 app 34 gt lt h1 gt 我是直接写在构造器里的模板1 lt h1 gt lt div gt lt template id 61 34 demo3 34 gt lt h1 style 61 34
  • 计算机组成原理(四):计算机性能指标

    一 存储器容量相关知识 1 总容量的计算公式 xff1a 总容量 xff08 位bit xff09 61 存储单元个数 存储字长 总容量 xff08 字节Byte xff09 61 存储单元个数 存储字长 8 2 K 61 2 10 M 6
  • C++多线程——三种线程实现方式的区别与实际应用建议

    三种创建线程的方法分别在上述文章中已介绍 xff0c 分别为 xff1a CreateThread xff0c AfxBeginThread xff0c beginthread beginthreadex 区别 xff1a CreateTh
  • 安装.NET2003时,显示"安装程序无法访问Windows安装程序组件,安装程序无法继续"的解决办法

    确信 net框架 NET Framework 的没有安装到客户机器上 xff0c 将部分已安装的在控制面版中删除 将在安装光盘中的dotnetfx exe文件拷贝到C盘的根目录下 点击 开始 菜单的 运行 xff0c 输入 c dotnet
  • vscode_启动加速策略(插件冗余问题)/编辑卡慢问题

    文章目录 perfacedisable all installed Extensionsenable extensions you always use in every project path for every project by
  • C++与Java的语法区别

    C 43 43 与Java的语法区别 首先 xff0c 两个大的不同是主函数和怎样编译的不同 xff0c 接下来是许多小的区别 main 函数 C 43 43 自由浮动的函数 int main int argc char argv prin
  • [Linux] Linux系统权限644、755、777权限详解 & chmod 权限命令详细用法

    引入 首先来看看常见的Linux系统文件权限 xff1a 644 rw r r 700 rwx 755 rwxr xr x 777 rwxrwxrwx 数字部分 xff1a 从左至右 xff0c 每1位代表这个后面3位字母的和 字母部分 x
  • git clone 子模块(module)

    工作开发场景 xff1a 使用gitlab进行版本控制开发工作 xff0c 对git的使用并不是知道的很多 xff0c 第一次把项目整个gitclone 下来 xff0c 但是死活git clone不了子模块里面的代码 xff0c 这里做下
  • 数据挖掘之matplotlib入门

    简单介绍 matplotlib库是Python数据挖掘中的库之一 xff0c 主要用于2D绘图 xff0c 简单的3D绘图 xff0c 数据可视化的库 简单使用 xff08 一 xff09 画根直线 代码 xff1a span class
  • C++ 双冒号表示作用域运算符

    为什么会学习到双冒号作用域运算符 xff0c 是因为在 QT 中使用到通过 C 语言调用函数 open 和 close 来操作LED设备文件时 xff0c 需要在open 和 close 的前面加上 先看一个事例 xff1a span cl
  • 多层神经网络 ——小批量梯度下降法

    在前面的课程中 xff0c 我们知道为了实现非线性分类的任务 xff0c 需要使用多层神经网络 xff0c 多层神经网络的损失函数不再是凸函数 xff0c 而是一种比较复杂的不规则函数 xff0c 这类函数求导数非常困难 xff0c 在求解