李宏毅机器学习课程笔记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 λ是一个超参数。

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

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

相关文章

K8s 集群 IP 地址管理指南(K8s Cluster IP Address Management Guide)

K8s 集群 IP 地址管理指南 概述 你是否在小型初创公司或大型企业工作&#xff0c;并正在为公司评估 Kubernetes&#xff1f;你可能正在考虑运行十几个或更多的 Kubernetes (K8s) 集群。你期望每个集群支持几百个 K8s 节点&#xff0c;每个节点可能有 50 到 100 个 K8s Pod。这…

鸿蒙-点击Notification通知并打开App的具体页面

意图通知 获取router事件中传递参数并跳转 目前点击通知消息打开应用的指定页面&#xff0c;通过为通知添加行为意图的方式。也就是在wants的parameters中设置自定义参数&#xff0c;然后在UIAbility的onNewWant或者onCreate方法中 解析配置的自定义参数信息判断跳转不同页面&a…

go语言实现UTF8与GB2312内码转换

使用Go语言做个UTF-8转GB2312的代码,输入utf-8编码的文本&#xff0c;输出转换后的国标编码的hex内码 package mainimport ("fmt""os""strings""golang.org/x/text/encoding/simplifiedchinese""golang.org/x/text/transform&quo…

使用AKTools本地部署AKShare财经数据接口库

使用AKTools部署AKShare财经数据接口库&#xff0c;AKShare的介绍见&#xff1a;基于 Python 的财经数据接口库&#xff1a;AKShare-CSDN博客 AKTools 是一款用于快速搭建 AKShare HTTP API 的工具&#xff0c;通过 AKTools 可以利用一行命令来启动 HTTP 服务&#xff0c;从而…

FreeType 介绍及 C# 示例

FreeType 是一个开源的字体渲染引擎&#xff0c;用于将字体文件&#xff08;如 TrueType、OpenType、Type 1 等&#xff09;转换为位图或矢量图形。它广泛应用于操作系统、图形库、游戏引擎等领域&#xff0c;支持高质量的字体渲染和复杂的文本布局。 FreeType 的核心功能 字体…

winform监听全局鼠标事件

如果您希望监听全局鼠标事件&#xff0c;即使在其他应用程序&#xff08;如浏览器或其他软件&#xff09;中按下鼠标按钮也能捕捉到这些事件&#xff0c;您需要使用低级别的Windows API钩子。WinForms本身并不直接支持全局事件监听&#xff0c;但通过调用Windows API&#xff0…

如何学习网络安全?有哪些小窍门?

学好网络安全其实没有所谓的捷径&#xff0c;也没有什么小窍门。 入门网络安全首先要有浓厚的学习兴趣&#xff0c;不然很容易就变成了从入门到放弃了。 其次要能静下心&#xff0c;踏踏实实的打好基础。如果你是零基础&#xff0c;建议从Web安全入手&#xff0c;课程难度相对…

测试工程师的linux 命令学习(持续更新中)

1.ls """1.ls""" ls -l 除文件名称外&#xff0c;亦将文件型态、权限、拥有者、文件大小等资讯详细列出 ls -l等同于 ll第一列共10位&#xff0c;第1位表示文档类型&#xff0c;d表示目录&#xff0c;-表示普通文件&#xff0c;l表示链接文件。…

C++实现设计模式---享元模式 (Flyweight)

享元模式 (Flyweight) 享元模式 是一种结构型设计模式&#xff0c;它通过共享对象来减少内存使用和对象创建的开销。当系统中有大量相似对象时&#xff0c;享元模式可以避免重复创建相同对象&#xff0c;从而节省内存。 意图 通过共享相同对象来减少内存消耗。用于系统中存在…

如何在gitlab cicd中实现每月10号上午执行

在 GitLab CI/CD 中&#xff0c;可以通过设置定时触发器&#xff08;Schedules&#xff09;和脚本中的时间判断逻辑结合&#xff0c;确保任务只在每月 10 号的上午运行。 以下是实现的步骤&#xff1a; 1. 设置定时触发器 GitLab 提供了 Schedules 功能&#xff0c;可以指定每…

K8S 亲和性与反亲和性 深度好文

今天我们来实验 pod 亲和性。官网描述如下&#xff1a; 假设有如下三个节点的 K8S 集群&#xff1a; k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8-alpine docker pull nginx…

安装指南:LLaMA Factory、AutoGPTQ 和 vllm

安装指南&#xff1a;LLaMA Factory、AutoGPTQ 和 vllm 在本文中&#xff0c;我们将详细介绍如何安装 LLaMA Factory、AutoGPTQ 和 vllm&#xff0c;这些工具在大型语言模型&#xff08;LLMs&#xff09;和视觉语言模型&#xff08;VLMs&#xff09;的微调和量化中非常有用。我…

Nginx三种不同类型的虚拟主机(基于域名、IP 和端口)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; Nginx-从零开始的服务器之旅专栏&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2025年1月15日13点14分 目录 1. 基于域名的虚拟主机 …

解析OVN架构及其在OpenStack中的集成

引言 随着云计算技术的发展&#xff0c;虚拟化网络成为云平台不可或缺的一部分。为了更好地管理和控制虚拟网络&#xff0c;Open Virtual Network (OVN) 应运而生。作为Open vSwitch (OVS) 的扩展&#xff0c;OVN 提供了对虚拟网络抽象的支持&#xff0c;使得大规模部署和管理…

C#异步和多线程,Thread,Task和async/await关键字--12

目录 一.多线程和异步的区别 1.多线程 2.异步编程 多线程和异步的区别 二.Thread,Task和async/await关键字的区别 1.Thread 2.Task 3.async/await 三.Thread,Task和async/await关键字的详细对比 1.Thread和Task的详细对比 2.Task 与 async/await 的配合使用 3. asy…

doris:导入概览

Apache Doris 提供了多种导入和集成数据的方法&#xff0c;您可以使用合适的导入方式从各种源将数据导入到数据库中。Apache Doris 提供的数据导入方式可以分为四类&#xff1a; 实时写入&#xff1a;应用程序通过 HTTP 或者 JDBC 实时写入数据到 Doris 表中&#xff0c;适用于…

【Flink系列】9. Flink容错机制

9. 容错机制 在Flink中&#xff0c;有一套完整的容错机制来保证故障后的恢复&#xff0c;其中最重要的就是检查点。 9.1 检查点&#xff08;Checkpoint&#xff09; 9.1.1 检查点的保存 1&#xff09;周期性的触发保存 “随时存档”确实恢复起来方便&#xff0c;可是需要我…

《Keras 3 在 TPU 上的肺炎分类》

Keras 3 在 TPU 上的肺炎分类 作者&#xff1a;Amy MiHyun Jang创建日期&#xff1a;2020/07/28最后修改时间&#xff1a;2024/02/12描述&#xff1a;TPU 上的医学图像分类。 &#xff08;i&#xff09; 此示例使用 Keras 3 在 Colab 中查看 GitHub 源 简介 设置 本教程将介…

Axios 封装:处理重复调用与内容覆盖问题

问题描述&背景 下拉选择框&#xff0c;支持搜索&#xff0c;搜索时携带参数调用接口并更新下拉选项下拉选择连续进行多次搜索&#xff0c;先请求但响应时间长的返回值会覆盖后请求但响应时间短的举例&#xff1a; 搜索后先清空选项&#xff0c;再输入内容进行搜索。清空后…

openssl s_server源码剥离

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys&#xff0c;所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的&#xff0c;可以在任何平台上使用。 源码指引&#xff1a;github源…