李宏毅机器学习笔记:【6.Optimization、Adaptive Learning Rate】

Optimization

  • 1.Adaptive Learning Rate
  • 2.不同的参数需要不同的学习率
  • 3.Root Mean Square
  • 4.RMSProp
  • 5.Adam
  • 6.learning rate scheduling
  • 7.warm up
  • 总结

critical point不一定是你在训练一个network时候遇到的最大的障碍。

1.Adaptive Learning Rate

也就是我们要给每个参数不同的Learning rate

往往在训练一个network的时候,你会把他的loss记录下来,随着你参数不断的update,你的loss呢不再下降了,就卡住了。。那多数时候这个时候大家就会猜说诶,那是不是走到了critical point,因为gradient等于零的关系,所以我们没有办法再更新参数。

当我们说走到critical point的时候,意味着gradient非常的小,但是你有确认过,当你的loss不再下降的时候,gradient真的很小吗?其实并不然。

下面这个例子,当我们的loss不再下降的时候,gradient的这个向量并没有真的变得很小,在最后训练的最终结的时候,loss几乎没有在减少了,但是gradient却突然还上升了一下。这个是我们的error surface,现在的gradient在error surface的两个谷壁间不断的来回的震荡,这个时候你的loss不会再下降,所以你会觉得看到这样子的状况,但是实际上他真的卡到了critical point、卡到了settle point、卡到了local minima吗?不是的。它的gradient仍然很大,只是loss不见得在减小了。

所以当你今天你训练个network,后来发现loss不再下降的时候,可能只是单纯的loss没有办法在下降,而不是卡在了那些点上。
在这里插入图片描述

我们在训练的时候其实很少卡到settle point或者是local minima,多数时候training在还没有走到critical point的时候,就已经停止了,但这并不代表说critical point不是一个问题,我们真正当你用gradient descent来做optimization的时候,你真正应该怪罪的对象往往不是critical point,而是其他的原因。
那为什么如果今天critical point不是问题的话,为什么我们的training会卡住呢,我这边举一个非常简单的例子。

你会发现说就连这种convex的error surface,形状这么简单的error surface,你用gradient descent都不见得能把它做好
学习率= 1 0 − 2 10^-2 102,时候,在震荡没有办法慢慢的滑到山谷里面,这时试着去调整了这个learning rate
学习率= 1 0 − 7 10^-7 107终于不再震荡了,终于从这个地方滑滑滑滑滑滑到山谷底,然后终于左转了,但是你发现说这个训练永远走不到终点,因为我的learning rate已经太小了,在这个很斜的地方,这个坡度很陡gradient的值很大,所以还能够前进一点,左转后的这个地方坡度已经非常的平滑了,这么小的learning rate根本没有办法再让我们的训练前进,,

gradient descent这个工具连这么简单的error surface都做不好,那如果难的问题,他又怎么有可能做好呢

在这里插入图片描述
那怎么把gradient descent做得更好呢?在之前我们的gradient descent里面,所有的参数都是设同样的learning rate,这显然是不够的,learning rate应该要为每一个参数特制化。

2.不同的参数需要不同的学习率

大原则:如果在某一个方向上gradient的值很小,在某一个方向上非常的平坦,那我们会希望learning rate调大一点;如果在某一个方向上非常的陡峭,某一个方向上坡度很大,那我learning rate可以设的小一点。
之前在讲gradient descent的时候,往往是讲所有参数update的式子,为了简化问题,我们现在只看一个参数,你完全可以把这个方法推广到所有参数的状况。
在这里插入图片描述
不同的参数我们要给它不同的sigma,同时他也是iteration dependent的,不同的iteration我们也会有不同的sigma。
如何计算这个sigma呢?
一个常见的类型是算gradient的Root Mean Square

3.Root Mean Square

在这里插入图片描述

这样的话坡度比较大的时候learning rate就减小,坡度比较小的时候learning rate就放大。

坡度比较小的时候如 θ 1 \theta_1 θ1,g小–> σ \sigma σ小—>learning rate就大(你在update的时候的量啊就比较大)
坡度比较大的时候如 θ 2 \theta_2 θ2,g大–> σ \sigma σ大—>learning rate就小

所以有了 σ \sigma σ这一项以后,你就可以随着gradient的不同,每个参数gradient的不同,来自动的调整learning rate的大小
在这里插入图片描述
上面的这个参数不会随时间改变,我们刚才的假设是同一个参数,它的gradient的大小就会固定是差不多的值,如果来看这个新月型的error surface,考虑横轴的话,有的地方地方坡度比较平滑,有的地方地方坡度比较陡峭,所以就算是同个参数,同一个方向,我们也期待说learning rate是可以动态的调整的。
所以就有了RMSProp

在这里插入图片描述

4.RMSProp

这个方法没有论文。
这个方法的第一步跟刚才讲的算Root Mean Square一模一样
第二步算 σ 1 \sigma_1 σ1的方法和算Root Mean Square的时候不一样,上一个的每一个gradient都有同等的重要性,但在RMSProp你可以自己调整现在的这个gradient的重要性,
如果我 α \alpha α设很小趋近于零,就代表说我觉得g1相较于之前所算出来的gradient而言比较重要;如果我 α \alpha α设很大趋近于1,那就代表说我觉得现在算出来的g1比较不重要。

这个 α \alpha α就会决定现在刚算出来的 g t g_t gt它有多重要
在这里插入图片描述
如果你用RMSProp的话,你就可以动态调整 σ 1 \sigma_1 σ1这一项.
比如下面的黑线,是我们的error surface,开始小球一路平坦,说明G算出来很小,G算出来很小,就代表说这个 σ \sigma σ算出来很小, σ \sigma σ算出来很小,就代表说现在update参数的时候,我们会走比较大的步伐;
当滚到斜坡时候,我们gradient变大了,如果是Adam的话,它反应比较慢;但如果你用RMSProp,把 α \alpha α设小,就是让新看到的gradient影响比较大,那你就可以很快的让 σ \sigma σ的值变大,然后很快让你的步伐呢变小。
又走到平滑的地方时候,调整 α \alpha α,让他比较看重于最近算出来的gradient,所以你gradient变小,它的这个 σ \sigma σ的值变大值呢就变小了,然后呢你走的步伐呢就变大了。
在这里插入图片描述

5.Adam

最常用optimization的策略就是Adam:RMSProp+Momentum
在这里插入图片描述

我们再看开始的例子,用了第二个的方法后做起来是这个样子的。这个gradient都取平方,再平均再开根号,然后接下来在左转的时候,刚才我们update了10万次卡住了,现在可以继续走下去,因为这个左右的方向的这个gradient很小,所以learning rate会自动调整,左右这个方向learning rate会自动变大,所以这个步伐呢就可以变大。

但走着走着突然爆炸了,为什么走到这边突然爆炸了呢?因为我们在算这个 σ \sigma σ的时候是把过去所有看到的gradient都拿来做平均,所以这个纵轴的这个方向,这个纵轴的方向虽然在初始的这个地方感觉gradient很大,但是这边走了很长一段路以后,这个纵轴的方向gradient算出来都很小,所以纵轴的这个方向就累积了小的 σ \sigma σ,累积到一个地步以后,这个step就变很大,然后就暴走就喷出去了,,

不过喷出去后走到gradient比较大的地方以后, σ \sigma σ又慢慢的变大, σ \sigma σ变大以后,这个参数update的距离,update的这个步伐大小又慢慢的变小,所以就发现说诶走着走着突然往左右喷了一下,但是这个喷这个喷了一下,不会永远就是震荡,不会做简谐运动,他这个左这个这个力道会慢慢变小,让它慢慢的慢慢的又回到中间这个峡谷了。

这样怎么办呢?有一个方法也许可以解决这个问题,这个叫做learning rate schedule

在这里插入图片描述

6.learning rate scheduling

我们这个式子还有个参数 η \eta η,他要是跟时间有关的,我们不要把它当成一个常数。

最常见的策略啊叫做learning rate decay,也就是说随着时间不断的进行,随着参数不断的update,我们这个 η \eta η让它越来越小,让这个learning rate越来越小。
为什么要让这个learning rate越来越小呢?因为一开始我们距离终点很远,随着参数不断update,我们距离终点越来越近,我们参数的更新要能够慢慢的慢下来。

所以刚才那个状况,如果加上learning rate decay的话,我们就可以很平顺的走到终点。因为在后面这个 η \eta η已经变得非常的小了,虽然说他本来想要左右乱喷,但是会乘上这个非常小的 η \eta η,那就停下来了,就可以慢慢的走到终点。
在这里插入图片描述
除了learning rate decay以外,还有另外一个经典非常常用的learning rate schedule的方式叫做warm up。

7.warm up

这个warm up的方法是说我们这个learning rate要先变大后变小

在这里插入图片描述
Residual Network这边特别注明它反其道而行,一开始要设0.01,接下来设0.1,还特别加个注解
在这里插入图片描述
同时warm up在transformer里面也用一个式子提了它好,你实际上把它的把这个方程画出来,就会发现它就2learning rate会先增加,然后接下来再递减。

所以发现说warm up这个技术,在很多知名的network里面都有被当做一个黑科技,就论文里面不解释说为什么要用这个,但就偷偷在一个小地方,你没有注意到。

在这里插入图片描述
那为什么需要warm up呢?这个仍然是今天一个可以研究的问题了。

这边有一个可能的解释是说,当我们在用Adam、RMSProp时候,我们要计算 σ \sigma σ,这个sigma它是一个统计的结果,告诉我们说某一个方向他到底有多陡或者是多平滑,那这个统计的结果要看了够多笔数据以后,这个统计才精准,所以我们一开始呢 σ \sigma σ不精准,所以开始不要让我们的参数走离初始的地方太远,一开始让learning rate比较小,是让他探索搜集一些有关error surface的情报,等sigma统计比较精准以后,再把让learning ray呢慢慢的爬升,这是一个解释为什么我们需要warm up的可能性。

如果你想要学更多有关warm up的东西的话,可以看RAdam。

在这里插入图片描述

总结

有关optimization的部分,我们从最原始的gradient descent进化到下面这个版本
在这里插入图片描述

这个版本我们有momentum,也就是说我们现在不是完全顺着这个时间点算出来gradient的方向来更新参数的,而是把过去所有算出来的规定的方向做一个加总,当做update方向,这个是momentum。
那接下来到底应该要update多大的步伐呢?我们要除掉gradient的root mean square。

疑问:这个momentum是考虑过去所有的gradient,这个 σ \sigma σ也是考虑过去所有的gradient,一个放在分子,一个放在分母,都考虑过去所有的gradient不就是正好抵消了吗?

其实这个momentum和 σ \sigma σ他们在使用过去所有gradient的方式是不一样的。
momentum是直接把所有的gradient通通都加起来,他有考虑方向,考虑gradient的正负号,考虑gradient是往左走还是往右走。
但是root mean square,它不考虑gradient的方向了,它只考虑gradient的大小,我们在算 σ \sigma σ时候都要取平方向,把gradient取一个平方向,是把平方的结果加起来,所以我们只考虑gradient的大小,不考虑它的方。
所以momentum跟这个 σ \sigma σ算出来的结果并不会互相抵消掉。

最后我们还会加上一个learning rate的schedule。
这种optimizer除了Adam以外还有各式各样的变形.
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis7——基础篇(三)

前言:此篇文章系本人学习过程中记录下来的笔记,里面难免会有不少欠缺的地方,诚心期待大家多多给予指教。 基础篇: Redis(一)Redis(二) 接上期内容:上期完成了Redis的基本…

[LeetCode]day25 151.翻转字符串里的单词

题目链接 题目链接 给你一个字符串 s ,请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意:输入字符串 s中可能…

Visual Studio Code的下载安装与汉化

1.下载安装 Visual Studio Code的下载安装十分简单,在本电脑的应用商店直接下载安装----注意这是社区版-----一般社区版就足够用了---另外注意更改安装地址 2.下载插件 重启后就是中文版本了

华为昇腾 910B 部署 DeepSeek-R1 蒸馏系列模型详细指南

本文记录 在 华为昇腾 910B(65GB) * 8 上 部署 DeepSeekR1 蒸馏系列模型(14B、32B)全过程与测试结果。 NPU:910B3 (65GB) * 8 (910B 有三个版本 910B1、2、3) 模型:DeepSeek-R1-Distill-Qwen-14B、DeepSeek…

【MySQL排错 】mysql: command not found 数据库安装后无法加载的解决办法

【MySQL排错 】mysql: command not found 数据库安装后无法加载的解决办法 A Solution to Solve Error - mysql: command not found After The Installation of MySQL Community Server By JacksonML 本文简要介绍如何在macOS安装完毕MySQL数据库服务器后,针对无…

Spring-GPT智谱清言AI项目(附源码)

一、项目介绍 本项目是Spring AI第三方调用整合智谱请言(官网是:https://open.bigmodel.cn)的案例,回答响应流式输出显示,这里使用的是免费模型,需要其他模型可以去 https://www.bigmodel.cn/pricing 切换…

用deepseek学大模型08-卷积神经网络(CNN)

yuanbao.tencent.com 从入门到精通卷积神经网络(CNN),着重介绍的目标函数,损失函数,梯度下降 标量和矩阵形式的数学推导,pytorch真实能跑的代码案例以及模型,数据,预测结果的可视化展示, 模型应用场景和优缺点&#xf…

deepseek-v3在阿里云和腾讯云的使用中的差异

随着deepseek在各大云商上线,试用了下阿里云和腾讯云的deepseek服务,在回答经典数学问题9.9和9.11谁大时,发现还是有差异的。将相关的问题记录如下。 1、问题表现 笔者使用的openai的官方sdk go-openai。 因本文中测验主要使用阿里云和腾讯…

React 与 Vue 对比指南 - 上

React 与 Vue 对比指南 - 上 本文将展示如何在 React 和 Vue 中实现常见功能&#xff0c;从基础渲染到高级状态管理 Hello 分别使用 react 和 vue 写一个 Hello World&#xff01; react export default () > {return <div>Hello World!</div>; }vue <…

STM32 HAL库 UART串口发送数据实验

一、实验目标 通过STM32的UART串口发送字符串数据到PC端串口调试助手&#xff0c;验证通信功能。 二、硬件准备 主控芯片&#xff1a;STM32F103C8T6。 串口模块&#xff1a;USB转TTL模块。 接线说明&#xff1a; STM32的USART1_TX&#xff08;PA9&#xff09; → USB-TTL模…

WPF创建自定义类和控件及打包成dll引用

WPF创建自定义类和控件及打包成dll引用 一、前言二、创建自定义类和控件并生成dll文件2.1创建类库项目2.2创建自定义类和控件2.3生成dll文件 三、在其他项目中引用3.1添加dll文件引用3.2cs文件中引用命名空间3.3XAML文件中引用命名空间 一、前言 出于一些代码复用的需求&#…

平板作为电脑拓展屏

有线串流&#xff08;速度更快&#xff09; spacedesk 打开usb对安卓的连接 用usb线直接连接电脑和平板 无线串流&#xff08;延迟高&#xff0c;不推荐&#xff09; todesk pc和手机端同时下载软件&#xff0c;连接后可以进行远程控制或扩展屏幕 spacedesk 连接到同一个…

深度学习05 ResNet残差网络

目录 传统卷积神经网络存在的问题 如何解决 批量归一化BatchNormalization, BN 残差连接方式 ​残差结构 ResNet网络 ResNet 网络是在 2015年 由微软实验室中的何凯明等几位大神提出&#xff0c;斩获当年ImageNet竞赛中分类任务第一名&#xff0c;目标检测第一名。获得CO…

【ClickHouse】Ubuntu下离线安装ClickHouse数据库并使用DBeaver连接

目录 0. 安装前准备1 安装ClickHouse1.1 下载安装包1.2 离线安装1.3 配置密码1.4 启动ClickHouse服务 2 DBeaver连接配置2.1 下载ClickHouse驱动2.2 DBeaver配置2.2.1 配置主要参数2.2.2 配置驱动 2.3 常见问题处理2.3.1 修改远程登录配置2.3.2 更新驱动配置 0. 安装前准备 有…

缓存三大问题及其解决方案

缓存三大问题及其解决方案 1. 前言 ​ 在现代系统架构中&#xff0c;缓存与数据库的结合使用是一种经典的设计模式。为了确保缓存中的数据与数据库中的数据保持一致&#xff0c;通常会给缓存数据设置一个过期时间。当系统接收到用户请求时&#xff0c;首先会访问缓存。如果缓…

千峰React:脚手架准备+JSX基础

组件化->封装性 React提供函数组件实现组件化 React和传统JS的区别就是JS需要手动管理DOM操作&#xff0c;React: 采用组件化开发&#xff0c;通过虚拟DOM提升性能。 MVC 是一种软件设计模式&#xff0c;全称为 Model-View-Controller&#xff08;模型-视图-控制器&#x…

springmvc(13/158)

太感动了&#xff0c;搞了半天以为是 这个dispatcherservlet报错的问题&#xff0c;结果是我第一次改springmvc-servlet.xml里面的后缀出了问题。 <servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.D…

节目选择器安卓软件编写(针对老年人)

文章目录 需求来源软件界面演示效果源码获取 对爬虫、逆向感兴趣的同学可以查看文章&#xff0c;一对一小班教学&#xff1a;https://blog.csdn.net/weixin_35770067/article/details/142514698 需求来源 由于现在的视频软件过于复杂&#xff0c;某客户想开发一个针对老年人、…

图解循环神经网络(RNN)

目录 1.循环神经网络介绍 2.网络结构 3.结构分类 4.模型工作原理 5.模型工作示例 6.总结 1.循环神经网络介绍 RNN&#xff08;Recurrent Neural Network&#xff0c;循环神经网络&#xff09;是一种专门用于处理序列数据的神经网络结构。与传统的神经网络不同&#xff0c…

深入解析Qt事件循环

在Qt开发中&#xff0c;QApplication::exec()这行代码是每个开发者都熟悉的“魔法咒语”。为什么GUI程序必须调用它才能响应操作&#xff1f;为何耗时操作会导致界面冻结&#xff1f;本文将以事件循环为核心&#xff0c;揭示Qt高效运转的底层逻辑&#xff0c;探讨其设计哲学与最…