李宏毅机器学习课程笔记03 | 类神经网络优化技巧
文章目录
- 类神经网络优化技巧
- 局部最小值local minima 与 鞍点saddle point
- Saddle Point 的情况更常见
- Tips for training:Batch and Momentum
- Small Batch vs Large Batch
- 回顾:optimization优化 找到参数使L最小
- 问题:为什么要用Batch,Batch对训练的帮助
- 考虑并行计算:不同batch size的消耗
- noisy的gradient可以帮助训练
- Momentum(动量):对抗local minima
- 求 σ \sigma σ的一种常见方法:Root Mean Square均方根
- 另外一种方法:RMSProp 调整当前步梯度与历史梯度的重要性
- Learning Rate Scheduling => 让 η \eta η与训练时间有关
- 最常见的策略:Learning Rate Decay
- 策略2(黑科技):Warm Up
- Optimization的总结
笔记内容对应视频章节
类神经网络优化技巧
本章介绍的优化思路是:当Error Surface
非常崎岖时,我们需要比较好的方法做optimization
=> 我们怎么走才能走得更好
下一次的优化思路是:将Error Surface
铲平 => 让路更好走,更好训练
局部最小值local minima 与 鞍点saddle point
主题:讨论在Optimization时怎么把gradient descent做得更好
问题: 为什么Optimization的时候会失败?
情况1: 发现deep network没有比linear model、比较shallow network做得更好,所以对loss不满意。
情况2: 模型训练不出来,不管怎么更新参数loss都不降低
猜想: 参数对loss的微分(gradient梯度)为0,Gradient descent
不会再更新参数了,训练停止,loss也不会再下降了。
=> 局部最小值local minima
和鞍点saddle point
统称为critical point
关键点,critical point
都可能导致gradient=0
如何确定是local minima还是saddle point导致梯度接近0
这里推荐B站的国防科技大学高数教程,这部分在多元函数的极值
问题:假设因为critical point
导致gradient
接近0,如何确定时local minima
还是saddle point
- 如果卡在
local minima
,那么暂时没有路可以走了,因为四周都比该点的loss高 - 如果卡在
saddle point
,saddle point
周围存在比该点loss更低的点
假设给定参数 θ ′ \theta' θ′,在其附近的loss function可以表示为 L ( θ ) ≈ L ( θ ′ ) + ( θ − θ ′ ) T g + 1 2 ( θ − θ ′ ) T H ( θ − θ ′ ) L(\theta) \approx L(\theta') + (\theta-\theta')^Tg+\frac{1}{2}(\theta-\theta')^TH(\theta-\theta') L(θ)≈L(θ′)+(θ−θ′)Tg+21(θ−θ′)TH(θ−θ′)(tayler series approximation)
右边的式子是 θ ′ \theta' θ′某领域内 θ \theta θ的函数值 L ( θ ) L(\theta) L(θ)的近似计算公式,目的是用更高的精确度去逼近函数 L ( θ ) L(\theta) L(θ)
如果走到了critical point
(驻点或稳定点),梯度为0,右边第二项结果为0
=> L ( θ ) ≈ L ( θ ′ ) + 1 2 ( θ − θ ′ ) T H ( θ − θ ′ ) L(\theta) \approx L(\theta') +\frac{1}{2}(\theta-\theta')^TH(\theta-\theta') L(θ)≈L(θ′)+21(θ−θ′)TH(θ−θ′)
- 如果Hessian正定,则 θ ′ \theta' θ′为极小值点
- 如果Hessian负定,则 θ ′ \theta' θ′为极大值点
- 如果Hessian不定,则 θ ′ \theta' θ′为鞍点
如果发现卡住的地方 θ ′ \theta' θ′为鞍点,说明loss还可以下降 => 利用H的特征向量确定参数的更新方向
u ⃗ \vec{u} u为H的特征向量, λ \lambda λ为 u ⃗ \vec{u} u的特征值, 在 θ ′ \theta' θ′的位置加上 u ⃗ \vec{u} u,沿著 u ⃗ \vec{u} u的方向做update得到 θ \theta θ,新的 θ \theta θ可以0让loss变小。
但由于需要算H需要求特征值特征向量,实际上很少采用这种方法逃离Saddle point
Saddle Point 的情况更常见
直觉:在一维中是Local Minima的点,在二维上,该点会不会是鞍点?
经验:Loss在一个维度很高的空间中,往往只会遇到鞍点而几乎不会遇到局部极小值点
Tips for training:Batch and Momentum
Small Batch vs Large Batch
回顾:optimization优化 找到参数使L最小
第一讲中,我们在构建模型的第三步optimization优化,找到参数使L最小。
实际上, 不会一次性将全部数据用于训练一个L,而是将全部资料分成n个batch(这里的n也是一个超参数)去训练n个L。
shuffle:1个epoch之后,会重新再分一次Batch,所以每轮的Batch不是完全一样。
问题:为什么要用Batch,Batch对训练的帮助
假设有20笔资料
- 左边需要看完所有资料更新一次参数,每次更新参数需要花费时间长,但参数更新结果比较精确。
- 右边一个样本就更新一次参数,每次更新参数的时间短, 用一笔资料算出来的 Loss,显然是比较 Noisy 的,所以 Update 的方向是曲折的 。
直觉上我们认为大batch size更新一次参数的时间 > 小batch size更新一次参数的时间
考虑并行计算:不同batch size的消耗
batch size大的不一定比小的batch size花的时间长,由于可以并行运算,即使需要一次看20笔资料,也可以并形成20个1笔
现象:
- Batch Size 是从1到1000,所需要的时间几乎是一样的,
- 增加到 10000,乃至增加到60000的时候,一个 Batch所要耗费的时间,确实有随着 Batch Size 的增加而逐渐增长
原因:
- 有 GPU,可以做并行运算,所以1000笔资料所花的时间,并不是一笔资料的1000倍
- GPU 平行运算的能力还是有它的极限,当你的 Batch Size 真的非常非常巨大的时候,GPU 在跑完一个 Batch,计算出 Gradient 所花费的时间,还是会随著 Batch Size 的增加,而逐渐增长
总时间:
由于可以并行计算。
实际上,小 Batch Size 跑完一个 Epoch(更新20次参数)的时间 > 大 Batch Size 跑完一个epoch的时间。
noisy的gradient可以帮助训练
发现batch size 越大,验证的正确率越差 => Optimization优化的问题
结论1:为什么小batch size会在traning set上得到比较好的结果?为什么noisy的update、noisy的gradient会在训练时得到较好的结果。
解释:不同的Batch 求得的Loss略有差异,可以避免局部极小值“卡住”
结论2: 为什么小的batch size对testing有帮助?
解释:这个解释不一定权威?
假设在training loss上存在多个local minima,local minima也有好坏之分
- 坏的local minima在峡谷里(尖锐最小值)
- 好的local minima在平原上(平坦最小值)
假设training loss 和 testing loss存在mismatch(可能training跟testing的distribution不一样,也可能是其他原因)
- 对于平坦最小值来说,在training和testing上的结果不会相差太大
- 对于尖锐最小值来说,在training和testing上的结果相差太大
大的batch size倾向于走到峡谷里,小的batch size倾向于走到盆地里
总结:BatchSize是一个需要调整的参数,它会影响训练速度与优化效果。
Momentum(动量):对抗local minima
假设Error Surface
误差曲线(loss 曲线)是一个真正的斜坡,参数是一个球。将球从斜坡上滚下来。Gradient Descent
会在Local Minima
和Saddle Point
处停住。但在真实世界,由于惯性,球会一直滚。
问题:是否可以将真实世界的概念融入到Gradient Descent
里?
复习:一般的Gradient Descent
参数移动方法说明:梯度的方向是函数值增加最快的方向,那么梯度的反方向是函数值减少最快的方向,所以我们要往反方向更新参数
Gradient Descent + Momentum
解读方向1:动量(新移动的方向) = 前一步Update
的方向 + 梯度的反方向
解读方向2:当前n的动量=之前算出来(n-1)个gradient的weighted sum
Adaptive Learning Rate 自动调整学习率技术
技术核心:给每一个参数不同的Learning Rate
问题引入
训练的时候很少卡在Critical point:Critical point
不是训练过程中最大的阻碍
现象1:训练停滞(Loss不再下降)不一定是梯度很小导致的
现象2: 如果参数使用固定的学习率,即使是在凸面体的优化,都会让优化的过程非常困难 ⇒ 不同的参数需要不同的学习率
客制化的Learning Rate
原则
- 某个方向gradient的值很小(平坦),learning rate调大一点,这样可以移动的远一点
- 某个方向gradient的值很大(陡峭),learning rate调小一点,这样可以移动的近一点
做法
案例只放某一个参数update的式子。
假设有一个参数 θ i \theta_i θi,i用来标识是哪一个参数,在第t次更新时值为 θ i t \theta_i^t θit。
求 σ \sigma σ的一种常见方法:Root Mean Square均方根
对本次的梯度及之前算出每一次更新的梯度求均方根
缺陷:同一个参数的learning rate需要随着时间而改变,该方法不能实时考虑梯度的变化情况
另外一种方法:RMSProp 调整当前步梯度与历史梯度的重要性
在RMS里面, σ \sigma σ的值取本次及历史梯度的均方值,说明每一个梯度同等重要。
在RMSProp添加参数 α \alpha α( α \alpha α是一个超参数,不随迭代变化),越大说明过去的梯度信息更重要
- α设很小趋近於0,就代表这一步算出的$ g_i $相较於之前所算出来的gradient而言比较重要
- α设很大趋近於1,就代表现在算出来的$ g_i $比较不重要,之前算出来的gradient比较重要
RMSProp方法比之前的RMS方法灵敏度更高,对梯度的变化敏感
最常见optimization的策略:Adam = RMSProp + Momentum
代码中直接引入Adam,使用Pytorch中预设的参数就能够得到比较好的结果。
Learning Rate Scheduling => 让 η \eta η与训练时间有关
加上Adaptive Learning Rate
之后上述案例的训练过程
最常见的策略:Learning Rate Decay
核心:让 η \eta η和训练时间有关,而不是一个常量
思路:随着时间进行,让 η \eta η越来越小, η t \eta^t ηt
开始训练的时候离终点很远,随着参数不断update
,距离终点越来越近,减小learning rate
,让参数的更新慢下来
策略2(黑科技):Warm Up
思路: η \eta η先变大后变小
变到多大,变小的速率怎么样,这些都是超参数,需要手动调整
解释
σ \sigma σ指示某一个方向它到底有多陡/多平滑,这是一个统计的结果,要看得够多笔数据以后才精准,所以一开始我们的统计是不精准。
一开始learning rate比较小,是让它探索收集一些有关error surface的情报,在这一阶段使用较小的 η \eta η,限制参数不会走的离初始的地方太远
等到 σ \sigma σ统计得比较精准以后再让 η \eta η慢慢爬升。
Optimization的总结
原始梯度下降的方法: θ i t + 1 \theta_i^{t+1} θit+1 <- θ i t − η g i t \theta_i^t - \eta g_i^t θit−ηgit
优化后的方法: θ i t + 1 \theta_i^{t+1} θit+1 <- θ i t − η t σ i t m i t \theta_i^t - \frac{\eta^t}{\sigma_i^t} m_i^t θit−σitηtmit
优化 | 原来的做法 | 优化后的做法 | 公式 | 作用 |
---|---|---|---|---|
更新update的方向:Momentum | 沿着逆梯度的方法更新参数 | $ m_i^t = $ 前一步Update 的方向 + 梯度的反方向 | m i t = λ m i t − 1 − η g t − 1 m_i^t=\lambda{m_i^{t-1}}-\eta{g^{t-1}} mit=λmit−1−ηgt−1 | 为了增加历史的惯性 |
update的步伐 | 学习效率 η \eta η | 不同的参数需要不同的学习效率 σ i t \sigma_i^t σit | RMS、RMSProp、不同的方法计算不一样 | 缓和步伐的大小,让步伐的变化效果受梯度的影响 |
Learning rate scheduling | 学习效率 η \eta η | 学习效率 η t \eta^t ηt | 本章介绍了:Warm Up 与Learning Rate Decay | 让 η \eta η和训练时间有关,而不是一个常量 |
说明
- Momentum是将梯度加起来,所以Momentum有考虑方向。
- σ \sigma σ计算时,由于梯度取了平方,所以只考虑梯度的大小并不考虑梯度的方向。
- λ \lambda λ是一个超参数。
相关文章:

李宏毅机器学习课程笔记03 | 类神经网络优化技巧
文章目录 类神经网络优化技巧局部最小值local minima 与 鞍点saddle pointSaddle Point 的情况更常见 Tips for training:Batch and MomentumSmall Batch vs Large Batch回顾:optimization优化 找到参数使L最小问题:为什么要用Batchÿ…...
简洁明快git入门及github实践教程
简洁明快git入门及github快速入门实践教程 前言git知识概要:一:什么是 Git?二:安装 Git三:配置 Git配置git的用户名和邮箱地址创建仓库 四:Git实践五:远程仓库操作(基于git命令使用G…...
Python使用socket实现简易的http服务
在接触的一些项目中,有时为了方便可视化一些服务状态(请求数很少),那么很容易想到使用http服务来实现。但开源的web后端框架,例如flask,fastapi,django等略显沉重,且使用这些框架会有…...

【Hive】海量数据存储利器之Hive库原理初探
文章目录 一、背景二、数据仓库2.1 数据仓库概念2.2 数据仓库分层架构2.2.1 数仓分层思想和标准2.2.2 阿里巴巴数仓3层架构2.2.3 ETL和ELT2.2.4 为什么要分层 2.3 数据仓库特征2.3.1 面向主题性2.3.2 集成性2.3.3 非易失性2.3.4 时变性 三、hive库3.1 hive概述3.2 hive架构3.2.…...
linux系统监视(centos 7)
一.系统监视 1.安装iostat,sar,sysstat(默认没有,安装过可以跳跃) iostat 和 sar: 同样,iostat 和 sar 是 sysstat 软件包的一部分。使用以下命令安装:sudo yum install sysstat解释…...
Blazor中Syncfusion图像编辑器组件使用方法
Blazor中Syncfusion图像编辑器组件是一个功能丰富的图像处理工具,支持多种编辑、操作和交互方式,帮助用户高效处理图像。以下是该组件的主要功能总结: 主要功能: 图像打开与保存 图像编辑器允许用户通过简单的点击操作打开支持的…...

电动汽车V2G技术Matlab/Simulink仿真模型
今天给大家更新关于V2G技术的仿真,不是研究这个方向的,可能会对这个名称比较陌生,那么,什么是“V2G”? V2G全称:Vehicle-to-Grid,即车网互动,利用电动汽车特有的储能功能与电网“双…...

C++中的unordered_set和unordered_map的模拟实现
一、封装基本结构 与map和set的封装过程很想,unordered_set和unordered_map也需要用MapKeyOfT和SetKeyOfT创建哈希表类型,借此获取对应的key值来使用; 因此,在哈希表中也一样需要用参数class T来替代set中的key和map中的pair<…...

Spring Boot 2 学习指南与资料分享
Spring Boot 2 学习资料 Spring Boot 2 学习资料 Spring Boot 2 学习资料 在当今竞争激烈的 Java 后端开发领域,Spring Boot 2 凭借其卓越的特性,为开发者们开辟了一条高效、便捷的开发之路。如果你渴望深入学习 Spring Boot 2,以下这份精心…...
(一)QSQLite3库简介
1、SQLite数据库 SQLite数据库,作为一个轻量级的关系型数据库管理系统,广泛应用于移动设备和桌面应用程序中。由于其简单易用、无需配置的特点,它为开发者提供了极大的便利。然而,正是由于其应用广泛,随着用户对于系统…...

《计算机网络》课后探研题书面报告_网际校验和算法
网际校验和算法 摘 要 本文旨在研究和实现网际校验和(Internet Checksum)算法。通过阅读《RFC 1071》文档理解该算法的工作原理,并使用编程语言实现网际校验和的计算过程。本项目将对不同类型的网络报文(包括ICMP、TCP、UDP等&a…...

hot100_240. 搜索二维矩阵 II
hot100_240. 搜索二维矩阵 II 直接遍历列减行增 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1: 输入:matrix [[1,4,7,1…...
78_Redis网络模型
1.Redis网络模型概述 1.1 Redis网络模型介绍 Redis 7.x的网络模型基于epoll的Reactor模式实现,这是一个高效的事件驱动模型。在Redis中,所有的网络事件(如连接、读写等)都由一个事件循环(Event Loop)来处理。这个事件循环负责监听套接字上的事件,并根据事件类型调用相…...
python范围
用户图形界面-工资计算器 from tkinter import *def f():w int(e1.get()) int(e2.get()) - int(e3.get())wage.insert(0,w)root Tk() root.title("工资计算器") Label(root, text"每月基本工资:").pack() e1 Entry(root) e1.pack() Label(…...

vulnhub靶场【Raven系列】之2 ,对于mysql udf提权的复习
前言 靶机:Raven-2,IP地址为192.168.10.9 攻击:kali,IP地址为192.168.10.2 都采用虚拟机,网卡为桥接模式 文章所用靶机来自vulnhub,可通过官网下载,或者通过链接:https://pan.quark.cn/s/a65…...

基于vite+vue3+mapbox-gl从零搭建一个项目
下面是基于 Vite、Vue 3 和 Mapbox GL 从零搭建一个项目的完整步骤,包括环境搭建、依赖安装、配置和代码示例。 1. 初始化项目 首先,使用 Vite 快速创建一个 Vue 3 项目: npm create vuelatest vue3-mapboxgl --template vue cd vue3-mapbo…...
向harbor中上传镜像(向harbor上传image)
向 Harbor 中上传镜像通常分为以下几个步骤: 1、登录 Harbor 2、构建镜像 3、标记镜像 4、推送镜像到 Harbor 仓库 1、登录 Harbor 首先,确保你已经能够访问 Harbor,并且已经注册了账户。如果还没有 Harbor 账户,你需要先注册一…...
【线性代数】行列式的性质
行列式性质定理讲义 一、行列式的基本性质 性质 1:行列互换 对于任意一个 n n n \times n nn 的方阵 A A A,其行列式 ∣ A ∣ |A| ∣A∣ 满足: ∣ A ∣ ∣ A T ∣ |A| |A^T| ∣A∣∣AT∣ 其中, A T A^T AT 是 A A A 的…...

智能家居企业如何通过设计师渠道打造第二曲线?
随着智能家居行业的迅速发展和消费者需求的不断升级,企业的营销策略也在不断变化。传统的B2C营销模式逐渐让位于更加精细化、定制化的B2B2C模式,其中设计师渠道的开发与合作,成为智能家居企业布局市场、提升品牌影响力的关键。 智能家居推广的…...

Unity3d 实时天气系统基于UniStorm插件和xx天气API实现(含源码)
前言 实时天气在Unity3d三维数字沙盘中的作用非常重要,它能够增强虚拟环境的真实感和互动性,实时天气数据的应用可以提供更为精准和直观的天气信息支持,如果真实的数据加上特效、声音和模型反馈会提高产品档次,提高真实感。 目前…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
Swagger和OpenApi的前世今生
Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章,二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑: 🔄 一、起源与初创期:Swagger的诞生(2010-2014) 核心…...

有限自动机到正规文法转换器v1.0
1 项目简介 这是一个功能强大的有限自动机(Finite Automaton, FA)到正规文法(Regular Grammar)转换器,它配备了一个直观且完整的图形用户界面,使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...