当前位置: 首页 > news >正文

李宏毅机器学习课程笔记03 | 类神经网络优化技巧

文章目录

  • 类神经网络优化技巧
    • 局部最小值local minima 与 鞍点saddle point
      • Saddle Point 的情况更常见
    • Tips for training:Batch and Momentum
    • 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 pointsaddle 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 MinimaSaddle Point处停住。但在真实世界,由于惯性,球会一直滚。

问题:是否可以将真实世界的概念融入到Gradient Descent里?

复习:一般的Gradient Descent

参数移动方法说明:梯度的方向是函数值增加最快的方向,那么梯度的反方向是函数值减少最快的方向,所以我们要往反方向更新参数

Gradient Descent + Momentum

解读方向1:动量(新移动的方向) = 前一步Update的方向 + 梯度的反方向

解读方向2:当前n的动量=之前算出来(n-1)个gradient的weighted sum

Adaptive Learning Rate 自动调整学习率技术

技术核心:给每一个参数不同的Learning Rate

问题引入

训练的时候很少卡在Critical pointCritical 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=λmit1ηgt1为了增加历史的惯性
update的步伐学习效率 η \eta η不同的参数需要不同的学习效率
σ i t \sigma_i^t σit
RMS、RMSProp、不同的方法计算不一样缓和步伐的大小,让步伐的变化效果受梯度的影响
Learning rate scheduling学习效率 η \eta η学习效率 η t \eta^t ηt本章介绍了:Warm UpLearning Rate Decay η \eta η和训练时间有关,而不是一个常量

说明

  • Momentum是将梯度加起来,所以Momentum有考虑方向。
  • σ \sigma σ计算时,由于梯度取了平方,所以只考虑梯度的大小并不考虑梯度的方向。
  • λ \lambda λ是一个超参数。

相关文章:

李宏毅机器学习课程笔记03 | 类神经网络优化技巧

文章目录 类神经网络优化技巧局部最小值local minima 与 鞍点saddle pointSaddle Point 的情况更常见 Tips for training&#xff1a;Batch and MomentumSmall Batch vs Large Batch回顾&#xff1a;optimization优化 找到参数使L最小问题&#xff1a;为什么要用Batch&#xff…...

简洁明快git入门及github实践教程

简洁明快git入门及github快速入门实践教程 前言git知识概要&#xff1a;一&#xff1a;什么是 Git&#xff1f;二&#xff1a;安装 Git三&#xff1a;配置 Git配置git的用户名和邮箱地址创建仓库 四&#xff1a;Git实践五&#xff1a;远程仓库操作&#xff08;基于git命令使用G…...

Python使用socket实现简易的http服务

在接触的一些项目中&#xff0c;有时为了方便可视化一些服务状态&#xff08;请求数很少&#xff09;&#xff0c;那么很容易想到使用http服务来实现。但开源的web后端框架&#xff0c;例如flask&#xff0c;fastapi&#xff0c;django等略显沉重&#xff0c;且使用这些框架会有…...

【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&#xff0c;sar&#xff0c;sysstat&#xff08;默认没有&#xff0c;安装过可以跳跃&#xff09; iostat 和 sar&#xff1a; 同样&#xff0c;iostat 和 sar 是 sysstat 软件包的一部分。使用以下命令安装&#xff1a;sudo yum install sysstat解释…...

Blazor中Syncfusion图像编辑器组件使用方法

Blazor中Syncfusion图像编辑器组件是一个功能丰富的图像处理工具&#xff0c;支持多种编辑、操作和交互方式&#xff0c;帮助用户高效处理图像。以下是该组件的主要功能总结&#xff1a; 主要功能&#xff1a; 图像打开与保存 图像编辑器允许用户通过简单的点击操作打开支持的…...

电动汽车V2G技术Matlab/Simulink仿真模型

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

C++中的unordered_set和unordered_map的模拟实现

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

Spring Boot 2 学习指南与资料分享

Spring Boot 2 学习资料 Spring Boot 2 学习资料 Spring Boot 2 学习资料 在当今竞争激烈的 Java 后端开发领域&#xff0c;Spring Boot 2 凭借其卓越的特性&#xff0c;为开发者们开辟了一条高效、便捷的开发之路。如果你渴望深入学习 Spring Boot 2&#xff0c;以下这份精心…...

(一)QSQLite3库简介

1、SQLite数据库 SQLite数据库&#xff0c;作为一个轻量级的关系型数据库管理系统&#xff0c;广泛应用于移动设备和桌面应用程序中。由于其简单易用、无需配置的特点&#xff0c;它为开发者提供了极大的便利。然而&#xff0c;正是由于其应用广泛&#xff0c;随着用户对于系统…...

《计算机网络》课后探研题书面报告_网际校验和算法

网际校验和算法 摘 要 本文旨在研究和实现网际校验和&#xff08;Internet Checksum&#xff09;算法。通过阅读《RFC 1071》文档理解该算法的工作原理&#xff0c;并使用编程语言实现网际校验和的计算过程。本项目将对不同类型的网络报文&#xff08;包括ICMP、TCP、UDP等&a…...

hot100_240. 搜索二维矩阵 II

hot100_240. 搜索二维矩阵 II 直接遍历列减行增 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性&#xff1a; 每行的元素从左到右升序排列。 每列的元素从上到下升序排列。 示例 1&#xff1a; 输入&#xff1a;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"每月基本工资&#xff1a;").pack() e1 Entry(root) e1.pack() Label(…...

vulnhub靶场【Raven系列】之2 ,对于mysql udf提权的复习

前言 靶机&#xff1a;Raven-2&#xff0c;IP地址为192.168.10.9 攻击&#xff1a;kali&#xff0c;IP地址为192.168.10.2 都采用虚拟机&#xff0c;网卡为桥接模式 文章所用靶机来自vulnhub&#xff0c;可通过官网下载&#xff0c;或者通过链接:https://pan.quark.cn/s/a65…...

基于vite+vue3+mapbox-gl从零搭建一个项目

下面是基于 Vite、Vue 3 和 Mapbox GL 从零搭建一个项目的完整步骤&#xff0c;包括环境搭建、依赖安装、配置和代码示例。 1. 初始化项目 首先&#xff0c;使用 Vite 快速创建一个 Vue 3 项目&#xff1a; npm create vuelatest vue3-mapboxgl --template vue cd vue3-mapbo…...

向harbor中上传镜像(向harbor上传image)

向 Harbor 中上传镜像通常分为以下几个步骤&#xff1a; 1、登录 Harbor 2、构建镜像 3、标记镜像 4、推送镜像到 Harbor 仓库 1、登录 Harbor 首先&#xff0c;确保你已经能够访问 Harbor&#xff0c;并且已经注册了账户。如果还没有 Harbor 账户&#xff0c;你需要先注册一…...

【线性代数】行列式的性质

行列式性质定理讲义 一、行列式的基本性质 性质 1&#xff1a;行列互换 对于任意一个 n n n \times n nn 的方阵 A A A&#xff0c;其行列式 ∣ A ∣ |A| ∣A∣ 满足&#xff1a; ∣ A ∣ ∣ A T ∣ |A| |A^T| ∣A∣∣AT∣ 其中&#xff0c; A T A^T AT 是 A A A 的…...

智能家居企业如何通过设计师渠道打造第二曲线?

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

Unity3d 实时天气系统基于UniStorm插件和xx天气API实现(含源码)

前言 实时天气在Unity3d三维数字沙盘中的作用非常重要&#xff0c;它能够增强虚拟环境的真实感和互动性&#xff0c;实时天气数据的应用可以提供更为精准和直观的天气信息支持&#xff0c;如果真实的数据加上特效、声音和模型反馈会提高产品档次&#xff0c;提高真实感。 目前…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

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

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

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

MODBUS TCP转CANopen 技术赋能高效协同作业

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

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; 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…...