Datawhale X 李宏毅苹果书 AI夏令营 学习笔记(一)

news2024/11/14 1:23:24

局部极小值与鞍点

在优化过程中,模型可能会遇到局部极小值(local minima)或鞍点(saddle point),这些位置梯度为零,使得模型停止进步或训练缓慢。
局部极小值是损失函数的局部最低点,而鞍点则是梯度为零但不是局部极小/极大值的点。

判断一个点是局部极小值还是鞍点需要分析损失函数的海森矩阵(二阶导数矩阵)的特征值。若海森矩阵的所有特征值都为正,则该点为局部极小值;若有正有负,则为鞍点。

形象一点的说法就是可以通过海森矩阵得到这个函数图像的地貌,显而易见下面两种点虽然在各个维度上梯度都为0,但地貌明显不一样。鞍点很明显在两个正交的方向上,一个向上U,一个向下U。而极值点的四周,U均朝上或朝下

在这里插入图片描述
分析海森矩阵可以找到负特征值对应的特征向量,沿着这个方向更新参数可以逃离鞍点。但计算量较大,几乎不使用。

实际上,对于深层次的神经网络,几乎不存在完全的局部极小值点,由于参数量非常大(训练的维度多),可能有几个维度到达它的极小值,但其他维度未达到,仍然可以获得有效梯度并继续降低损失。如果真的训练缓慢时,往往只是遇到了鞍点。所以逃离鞍点就是接下来的优化手段。

批量梯度下降

在实际训练时,会将训练集分为多个batch,如将1000个样本分为8个batch(批),每次拿1个batch即125个样本进行训练。将所有batch(当前为8个)全部训练完一次,就是一个epoch(回合)。每个epoch都会打乱batch顺序。这种方式既可以减少内存每次读入的数据量,也可以利用到并行计算。

如果batch_size=整个训练集,即每次直接用所有样本进行训练,称为批量梯度下降(BGD, Batch Gradient Descent)

如果batch_size=1,即每次拿一个样本训练,称为随机梯度下降法(SGD, Stochastic Gradient Descent)

当然还有折中策略,1<batch_size<整个训练集大小,小批量梯度下降(Mini-Batch Gradient Descent, MBGD)

下图为前两者的对比
红线为批量梯度下降,是较为合理的直线
紫红线为随机梯度下降,总的来看,参数朝着全局最小的方向移动,偶尔也有例外。
在这里插入图片描述

对比:

  1. 一次看20条数据,和一次只看一条数据,后者带来的波动明显会更大(带有更多噪声)。就像看远方走路和只看脚底走路。在非凸优化问题中,其相比批量梯度下降(前者)更容易逃离局部最小值(可能乱走就正好走出局部最小点了)。但相对的,前者在准确率上会更好、方向更稳定。
  2. 虽然批量梯度下降要看全部样本,但是他可以利用并行计算,即同时处理多条数据(参考tensor和ndarray进行矩阵运算等),所以时间不一定比batch_size小的运算更耗时(虽然batch_size大时还是明显更耗时),甚至有时更省时。
  3. 总结一下:大的batch_size能使损失下降的更平缓、更准确,借助并行计算训练反而更快,但在优化上容易出现问题或有过拟合现象。小的batch_size通过引入更多噪音,更能让模型跳出局部最小点,且泛化能力更强,模型效果可能更好。

动量梯度下降

相比较传统的梯度下降,每次计算模型参数的变化值时,除了计算梯度,还使用了上一次的动量,两者之向量和(这里为了表达方便忽略了他们各自的学习率超参数)就是本次的动量(也是动量梯度下降中的模型参数变化值)。

公式虽然只用了上一次下降时的动量,但由于是向量,实际上是用到了历史所有动量的累积影响。

因为动量的累积影响构成的向量和本次梯度的方向可能不一致,当两者夹角小时,动量起到的就是加速的作用,可以越过局部最小点,并加快训练。而两者夹角较大时,则能减少下降幅度(甚至从已经越过的最小值点再折回来),加速收敛。当然,动量也会减少梯度的变化幅度,让乱动的梯度向量与历史动量方向相结合,使变化更稳定平缓。

动量就像是滑雪。如果你滑到平缓的斜坡上(鞍点或局部极小值),没有足够的动量(过去的梯度方向)你就可能停在那里。通过积累动量,你可以滑过这些平坦区域,继续向前。
在这里插入图片描述

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

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

相关文章

Leetcode JAVA刷刷站(80)删除有序数组中的重复项 ||

一、题目概述 二、思路方向 为了解决这个问题&#xff0c;我们可以使用双指针技术。一个指针&#xff08;我们称之为i&#xff09;用于遍历数组&#xff0c;另一个指针&#xff08;我们称之为j&#xff09;用于记录不重复或只重复一次的元素应该放置的位置。同时&#xff0c;我…

创新实践:流媒体服务器如何推动WebRTC支持H.265及JS硬软解码(MSE硬解、WASM软解)

为了实现这一全面的解决方案&#xff0c;我们投入了近半年的时间进行调研与研发。我们的主要目标是&#xff1a;让流媒体服务器能够直接传输H.265编码的视频&#xff0c;而无需将其转码为H.264&#xff0c;从而使Chrome浏览器能够无缝解码并播放H.265视频。 值得注意的是&#…

TinaSDKV2.0 自定义系统开发

TinaSDKV2.0 自定义系统开发 什么是自定义系统&#xff1f; TinaSDK Kconfig界面配置 Tina Linux采用 Kconfig 机制对 SDK 和内核进行配置。 Kconfig 是一种固定格式的配置文件。Linux 编译环境中的 menuconfig 程序可以识别这种格式的配置文件&#xff0c;并提取出有效信息…

Flink常见数据源(source)使用教程(DataStream API)

前言 一个 Flink 程序,其实就是对 DataStream 的各种转换。具体来说,代码基本上都由以下几部分构成,如下图所示: 获取执行环境(execution environment)读取数据源(source)定义基于数据的转换操作(transformations)定义计算结果的输出位置(sink)触发程序执行(exec…

探索上门回收旧衣物系统源码开发的创新与挑战

在当今社会&#xff0c;随着环保意识的日益增强和可持续发展的全球趋势&#xff0c;旧衣物回收与再利用成为了一个备受关注的议题。为了响应这一需求&#xff0c;开发一套高效、便捷的上门回收旧衣物系统&#xff0c;不仅有助于减少环境污染&#xff0c;还能促进资源的循环利用…

[数据集][目标检测]电力场景输电线导线散股检测数据集VOC+YOLO格式3890张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3890 标注数量(xml文件个数)&#xff1a;3890 标注数量(txt文件个数)&#xff1a;3890 标注…

Koa商城项目-商城模块(前端)

项目地址 koa_system: &#x1f525;&#x1f525;&#x1f525;Koa2 React商城项目前端-React Antd前端-Vue2 Element-plus后端-Koa2 Sequelizehttps://gitee.com/ah-ah-bao/koa_system 欢迎大家点击查看,方便的话点一个star~ 项目结构 Vue2Admin和Vue3Admin版本的后台还…

Deep-Live-Cam启动

实验环境 实验时间&#xff1a;2024年8月windows 10 专业版能跟老外对喷的网络环境基于 Anaconda 创建 Python 3.10.x 环境 其它依赖 下载生成工具&#xff1a;https://visualstudio.microsoft.com/zh-hans/visual-cpp-build-tools/安装单个组件&#xff1a;共三个。 安装ffm…

Python酷库之旅-第三方库Pandas(093)

目录 一、用法精讲 396、pandas.Series.to_frame方法 396-1、语法 396-2、参数 396-3、功能 396-4、返回值 396-5、说明 396-6、用法 396-6-1、数据准备 396-6-2、代码示例 396-6-3、结果输出 397、pandas.Series.to_xarray方法 397-1、语法 397-2、参数 397-3、…

算法的学习笔记—二叉树中和为某一值的路径

&#x1f600;前言 在二叉树中寻找和为某一特定值的路径问题是一个经典的面试题&#xff0c;考察了对二叉树的遍历能力以及递归和回溯算法的理解和应用。本文将详细解析这一问题&#xff0c;并提供一个Java实现。 &#x1f3e0;个人主页&#xff1a;尘觉主页 文章目录 &#x1…

Java工具类之字符串类(超详细)

1、 字符串类 字符串是我们在编程中最常使用的一种数据类型&#xff0c;Java中用类来描述字符串&#xff0c;其中最常用的字符串处理类是String&#xff0c;此外还有StringBuffer和StringBuilder。在本节&#xff0c;我们会了解每种字符串处理类的特点&#xff0c;以便能在应用…

C语言基础(十二)

指针的用法&#xff1a; 测试代码1&#xff1a; #include "date.h" #include <stdio.h> // 函数声明&#xff0c;用于交换两个整数的值&#xff0c;通过指针传递 void swap(int *a, int *b); int main() { int time getTime();int nums[3] {3, 1, 4};…

CentOS 7.9 安装部署 EchoMimic

EchoMimic学习地址&#xff1a;https://github.com/BadToBest/EchoMimic CentOS 7.9 安装部署 EchoMimic 1、创建虚拟机2、基础环境准备2.1 安装驱动2.2 下载 Anaconda3-2024.06-1-Linux-x86_64.sh2.3 下载完成后执行2.4 退出客户端重新连一下2.5 查看python版本及cuda版本 3 E…

冷硬缓存——利用缓存滥用绕过 RPC 接口安全

介绍 MS-RPC 是 Windows 操作系统的基石之一。早在 20 世纪 90 年代发布,它就已扎根于系统的大部分部分。服务管理器?RPC。Lsass?RPC。COM?RPC。甚至一些针对域控制器的域操作也使用 RPC。鉴于 MS-RPC 已经变得如此普遍,您可以预料到它已经受到严格的审查、记录和研究。 …

TinyVision 使用 SyterKit 启动 Linux 6.7 主线内核

TinyVision 使用 SyterKit 启动 Linux 6.7 主线内核 SyterKit SyterKit 是一个纯裸机框架&#xff0c;用于 TinyVision 或者其他 v851se/v851s/v851s3/v853 等芯片的开发板&#xff0c;SyterKit 使用 CMake 作为构建系统构建&#xff0c;支持多种应用与多种外设驱动。同时 Sy…

dbeaver数据库工具配置连接openGauss5.0

在DBeaver数据库工具中配置连接openGauss 5.0&#xff0c;可以通过以下步骤进行&#xff1a; 一、准备工作 下载openGauss JDBC驱动&#xff1a; 访问openGauss的官方网站&#xff08;如https://opengauss.org/zh/&#xff09;&#xff0c;下载适用于您操作系统的JDBC驱动。对…

【01】Eclipse中配置spring的xsd 便于从本地加载而非网络

spring xsd 文章目录 spring xsd1.spring的xsd在Eclipse中的配置1.1xsi:schemaLocation1.2Eclipse中设置的key名1.3在本地文件系统中选择xsd文件进行配置1.4在workspace工作空间中选择xsd文件进行配置 2.重点2.1Key的配置2.2spring配置文件中xml的xsi:schemaLocation的配置变更…

Java重修笔记 第三十九天 集合的体系、Collection方法、迭代器遍历集合、增强for循环遍历集合

集合的体系 1. 单列集合 2. 双列集合 Collection的常用方法 1. boolean add(E e) 添加元素&#xff0c;添加基本数据类型的元素有自动装箱的过程 2. boolean remove(Object o) 删除指定元素&#xff0c;删除成功返回true 3. boolean contains(Object o) 查询指定元素&…

深度学习入门-04

PS&#xff1a;基于小土堆视频学习 1、add_image()的使用 读取样本集中的数据 image_path "data/train/ants_image/0013035.jpg" from PIL import Image img Image.open(image_path)在pycharm的控制台中运行该代码&#xff0c;运行后可以发现&#xff1a; 数据格…

前端面试宝典【设计模式】【4】

在前端开发的世界里,每一次面试都是一次机遇,也是一次挑战。 你是否曾因技术深度不够而错失良机? 或是面对最新的技术趋势感到迷茫? 我们的【前端面试宝典】正是为此而来。 由拥有多年一线实战经验的资深工程师亲自授课,结合最新的行业动态与实战案例,旨在全面提升你的技…