学习率调度器简明教程

news2024/12/24 0:33:48

学习率是神经网络训练中最重要的超参数之一,影响学习过程的速度和有效性。学习率过高会导致模型在最小值附近震荡,而学习率过低会导致训练过程非常缓慢甚至停滞。本文直观地介绍了学习率调度程序,它是用于在训练期间调整学习率的技术。

NSDT工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REVIT导出3D模型插件 - 3D模型语义搜索引擎 - Three.js虚拟轴心开发包 - 3D模型在线减面 - STL模型在线切割 

1、什么是学习率?

在机器学习的背景下,学习率(learning rate)是一个超参数,它决定了优化算法(如梯度下降)在尝试最小化损失函数时进行的步长。

现在,让我们继续讨论学习率调度程序。

2、什么是学习率调度器?

学习率调度器(learning rate scheduler)是一种在训练过程中调整学习率的方法,通常会随着训练的进展而降低学习率。这有助于模型在训练开始时当参数远离其最佳值时进行大量更新,并在稍后当参数更接近其最佳值时进行较小的更新,从而允许进行更多微调。

实践中广泛使用了几种学习率调度器。在本文中,我们将重点介绍三种流行的调度器:阶跃衰减、指数衰减和余弦退火。

让我们通过直观的示例深入研究这些调度器中的每一个。

3、阶跃衰减调度器

阶跃衰减(step decay)调度器每隔几个时期将学习率降低一个常数因子。阶跃衰减的形式定义为:

其中:

  • lr_0​ 是初始学习率,
  • d 是衰减率,
  • s 是步长,
  • epoch 是训练周期的索引。

让我们用一个玩具示例来直观地展示这一点:

# Parameters
initial_lr = 1.0
decay_factor = 0.5
step_size = 10
max_epochs = 100

# Generate learning rate schedule
lr = [
  initial_lr * (decay_factor ** np.floor((1+epoch)/step_size)) 
  for epoch in range(max_epochs)
]

# Plot
plt.figure(figsize=(10, 7))
plt.plot(lr)
plt.title('Step Decay Learning Rate Scheduler')
plt.ylabel('Learning Rate')
plt.xlabel('Epoch')
plt.grid()
plt.show()

现在,该图更清楚地展示了步进衰减调度程序的性质,学习率每 5 个时期下降 0.5 倍。

4、指数衰减调度器

让我们修改指数衰减(exponential decay)调度器的参数,使衰减更加明显。我们将使用更大的初始学习率和更大的衰减率。

其中:

  • lr_0​ 是初始学习率,
  • k 是衰减率,
  • epoch 是训练周期的索引。
# Parameters
initial_lr = 1.0
decay_rate = 0.05
max_epochs = 100

# Generate learning rate schedule
lr = [
  initial_lr * np.exp(-decay_rate * epoch) 
  for epoch in range(max_epochs)
]

# Plot
plt.figure(figsize=(10, 7))
plt.plot(lr)
plt.title('Exponential Decay Learning Rate Scheduler')
plt.ylabel('Learning Rate')
plt.xlabel('Epoch')
plt.grid()
plt.show()

该图更清楚地显示了随着 epoch 数量的增加,学习率呈指数衰减。

5、余弦退火调度器

余弦退火(cosine annealing)调度器使用基于余弦的计划降低学习率。余弦退火的形式定义为:

其中:

  • lr_min​ 是最小学习率,
  • lr_max​ 是最大学习率,
  • epoch 和 max_epochs 分别是当前和最大 epoch 数值。
# Parameters
lr_min = 0.001
lr_max = 0.1
max_epochs = 100

# Generate learning rate schedule
lr = [
    lr_min + 0.5 * (lr_max - lr_min) * (1 + np.cos(epoch / max_epochs * np.pi))
    for epoch in range(max_epochs)
]

# Plot
plt.figure(figsize=(10, 7))
plt.plot(lr)
plt.title("Cosine Annealing Learning Rate Scheduler")
plt.ylabel("Learning Rate")
plt.xlabel("Epoch")
plt.show()

如图所示,学习率按照余弦函数下降,从最大学习率开始下降到最小学习率。这是余弦退火学习率调度器的特点。

6、结束语

学习率调度器是机器学习从业者工具包中的一个重要工具,它提供了一种随时间调整学习率的机制,有助于提高训练过程的效率和效果。最佳学习率调度器可能取决于具体问题和数据集,尝试不同的调度器以查看哪种调度器效果最好通常会有所帮助。

在一张图上显示更多的学习率调度函数:

代码如下:

import numpy as np
import matplotlib.pyplot as plt


def polynomial_decay_schedule(initial_lr: float, power: float, max_epochs: int = 100) -> np.ndarray:
    """
    Generate a polynomial decay learning rate schedule.

    Args:
        initial_lr: The initial learning rate.
        power: The power of the polynomial.
        max_epochs: The maximum number of epochs.

    Returns:
        An array of learning rates for each epoch.
    """
    epochs = np.arange(max_epochs)
    lr = initial_lr * ((1 - (epochs / max_epochs)) ** power)
    return lr


def natural_exp_decay_schedule(initial_lr: float, decay_rate: float, max_epochs: int = 100) -> np.ndarray:
    """
    Generate a natural exponential decay learning rate schedule.

    Args:
        initial_lr: The initial learning rate.
        decay_rate: The decay rate.
        max_epochs: The maximum number of epochs.

    Returns:
        An array of learning rates for each epoch.
    """
    epochs = np.arange(max_epochs)
    lr = initial_lr * np.exp(-decay_rate * epochs)
    return lr


def staircase_exp_decay_schedule(initial_lr: float, decay_rate: float, step_size: int, max_epochs: int = 100) -> np.ndarray:
    """
    Generate a staircase exponential decay learning rate schedule.

    Args:
        initial_lr: The initial learning rate.
        decay_rate: The decay rate.
        step_size: The step size.
        max_epochs: The maximum number of epochs.

    Returns:
        An array of learning rates for each epoch.
    """
    epochs = np.arange(max_epochs)
    lr = initial_lr * np.exp(-decay_rate * np.floor((1 + epochs) / step_size))
    return lr


def step_decay_schedule(initial_lr: float, decay_factor: float, step_size: int, max_epochs: int = 100) -> np.ndarray:
    """
    Generate a step decay learning rate schedule.

    Args:
        initial_lr: The initial learning rate.
        decay_factor: The decay factor.
        step_size: The step size.
        max_epochs: The maximum number of epochs.

    Returns:
        An array of learning rates for each epoch.
    """
    epochs = np.arange(max_epochs)
    lr = initial_lr * (decay_factor ** np.floor((1 + epochs) / step_size))
    return lr


def cosine_annealing_schedule(lr_min: float, lr_max: float, max_epochs: int = 100) -> np.ndarray:
    """
    Generate a cosine annealing learning rate schedule.

    Args:
        lr_min: The minimum learning rate.
        lr_max: The maximum learning rate.
        max_epochs: The maximum number of epochs.

    Returns:
        An array of learning rates for each epoch.
    """
    epochs = np.arange(max_epochs)
    lr = lr_min + 0.5 * (lr_max - lr_min) * (1 + np.cos(epochs / max_epochs * np.pi))
    return lr


def exponential_decay_schedule(initial_lr: float, decay_rate: float, max_epochs: int = 100) -> np.ndarray:
    """
    Generate an exponential decay learning rate schedule.

    Args:
        initial_lr: The initial learning rate.
        decay_rate: The decay rate.
        max_epochs: The maximum number of epochs.

    Returns:
        An array of learning rates for each epoch.
    """
    epochs = np.arange(max_epochs)
    lr = initial_lr * np.exp(-decay_rate * epochs)
    return lr


# Define the learning rate schedules
schedules = {
    "Step Decay": step_decay_schedule(initial_lr=1.0, decay_factor=0.5, step_size=10),
    "Exponential Decay": exponential_decay_schedule(initial_lr=1.0, decay_rate=0.05),
    "Cosine Annealing": cosine_annealing_schedule(lr_min=0.01, lr_max=1.0),
    "Polynomial Decay": polynomial_decay_schedule(initial_lr=1.0, power=2),
    "Natural Exp. Decay": natural_exp_decay_schedule(initial_lr=1.0, decay_rate=0.05),
    "Staircase Exp. Decay": staircase_exp_decay_schedule(initial_lr=1.0, decay_rate=0.05, step_size=10),
}

# Define a color palette
colors = ['b', 'g', 'r', 'c', 'm', 'y']

# Plot with defined colors
plt.figure(figsize=(15, 10))
for color, (schedule_name, schedule) in zip(colors, schedules.items()):
    plt.plot(schedule, label=schedule_name, color=color)

plt.title('Learning Rate Schedules', fontsize=20)
plt.ylabel('Learning Rate', fontsize=15)
plt.xlabel('Epoch', fontsize=15)
plt.grid(True, which='both', linestyle='--', linewidth=0.6)
plt.minorticks_on()
plt.legend(prop={'size': 12})
plt.show()

原文链接:学习率调度器 - BimAnt

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

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

相关文章

解决SeaTunnel 2.3.4版本写入S3文件报错问题

在使用Apache SeaTunnel时,我遇到了一个写入S3文件的报错问题。通过深入调试和分析,找到了问题所在,并提出了相应的解决方案。 本文将详细介绍报错情况、参考资料、解决思路以及后续研究方向,希望对大家有帮助! 一、…

江门雅图仕职业技术学校领导一行莅临泰迪智能科技参观调研

7月2日,江门雅图仕职业技术学校总校长肖胜阳、校长许昌、办公室主任任志娟等莅临广东泰迪智能科技股份有限公司产教融合实训中心参观调研。泰迪智能科技董事长张良均、副总经理施兴、产品中心总监周东平、校企合作经理吴桂锋进行热情接待,双方就学校专业…

Python用于处理 DNS 查询库之Dnspython 使用详解

概要 Dnspython 是一个开源的 Python 库,专门用于处理 DNS 查询。它被设计为既简单易用又功能强大,可以满足从简单到复杂的各种 DNS 相关需求。无论是进行基础的 DNS 查询还是进行高级的 DNS 服务器管理,dnspython 都能提供相应的功能。 这个库支持包括 A、AAAA、MX、TXT …

汉光联创HGLM2200N黑白激光多功能一体机加粉及常见问题处理

基本参数: 机器型号:HGLM2200N 产品名称:A4黑白激光多功能一体机 基础功能:打印、扫描、复印 打印速度:22页/分钟 纸张输入容量:150-249页 单面支持纸张尺寸:A4、A5、A6 产品尺寸&#x…

拓展欧几里得和裴蜀定理

裴蜀定理(或贝祖定理)说明了对任何整数a、b和它们的最大公约数d,关于未知数x和y的线性不定方程(称为裴蜀等式):若a,b是整数,且gcd(a,b)d,那么对于任意的整数x,y,axby都一定是d的倍数&#xff0c…

pytorch中的contiguous()

官方文档:https://pytorch.org/docs/stable/generated/torch.Tensor.contiguous.html 其描述contiguous为: Returns a contiguous in memory tensor containing the same data as self tensor. If self tensor is already in the specified memory forma…

音乐发行平台无加密开源源码

适用于唱片公司,用于接收物料,下载物料功能:个人或机构认证,上传专辑和歌曲,版税结算环境要求php7.4Nginx 1、导入数据库 2、/inc/conn.php里填写数据库密码等后台路径/admin(可自行修改任意入口名称&…

Java中子类继承和方法重写_java重写父类方法参数变了怎么改

public(非私有)private私有()构造方法不能继承不能继承成员变量能继承能继承成员方法能继承不能继承 1.也不能继承父类的有参构造方法,具体看构造函数继承特点 2.私有的成员变量相当于从父类拷贝一份拿过来用的,不能直接用,需要get/set方法 继承特点 继承中 成员变量访问特点:如…

重参数化技巧

Q:标准正态分布 P:预期的分布(假设符合正态分布) 学习与 - 手推 Diffusion Model (DDPM) 1/3 :数学原理推导_哔哩哔哩_bilibili

【test】小爱同学通过esp32控制电脑开关

文章目录 一、环境准备二、开关机原理数据传输框架 三、环境搭建1.巴法云平台设置2.米家设置3.windows网络唤醒设置4.搭建esp32开发环境并部署(1)新建项目(2)导入esp32库(3) 添加库(4&#xff0…

透过 Go 语言探索 Linux 网络通信的本质

大家好,我是码农先森。 前言 各种编程语言百花齐放、百家争鸣,但是 “万变不离其中”。对于网络通信而言,每一种编程语言的实现方式都不一样;但其实,调用的底层逻辑都是一样的。linux 系统底层向上提供了统一的 Sock…

君子签区块链+AI,驱动组织实现高效合同管理、精准风险控制

在传统合同签署的过程中,企业、组织、机构都面临着合同签署与管理的诸多问题和挑战:合同种类繁多、数量庞大导致起草效率低下;管理流程繁琐、权限分散使得审批周期冗长且效率低下;合同签订版本难以精准复核,风险防控更…

大型网站软件系统架构演进过程

在我们的生活中,通常会使用大型网站系统,比如购物网站淘宝,京东,阿里1688;大型搜索引擎网站百度,社交类的如腾讯旗下的微信,QQ及新浪旗下的微博等,他们通常都有一下特点: 高并发、大流量:这些系统必须能够处理成千上万甚至数百万的并发用户请求,以及持续…

深入理解pytest fixture:提升测试的灵活性和可维护性!

在现代软件开发中,测试是保证代码质量的重要环节。pytest作为一个强大的测试框架,以其灵活的fixture系统脱颖而出。本文将详细介绍pytest中的fixture概念,通过具体案例展示其应用,并说明如何利用fixture提高测试的灵活性和可维护性…

CVPR 2024最佳论文:“神兵”的组合器 Generative Image Dynamics

CVPR 2024的最佳论文来自谷歌、美国加州大学圣迭戈分校。两篇都来至于视频生成领域,可见今年外界对视频生成领域关注度很高。今天的这篇是“Generative Image Dynamics”,Google Research发布的。它的研究成果令人震惊,从单张RGB图像生成连续…

VIM介绍

VIM(Vi IMproved)是一种高度可配置的文本编辑器,用于有效地创建和更改任何类型的文本。它是从 vi 编辑器发展而来的,后者最初是 UNIX 系统上的一个文本编辑器。VIM 以其键盘驱动的界面和强大的文本处理能力而闻名,是许…

【pytorch14】感知机

单层感知机模型 对于单层的感知机,它的激活函数是一个sigmoid 对于符号的定义做一个规范化,输入层每一层进行一个编号 输入是第0层,上标0表示属于输入层,下标0到n表示一共有n个节点(这里严格来说应该是0~n-1,为了书写…

阿里Qwen2-72B大模型已是开源榜的王者,为什么还要推出其他参数模型,被其他模型打榜?

6 月 27 日,全球知名的开源平台 Hugging Face 的联合创始人兼首席执行官 Clem 在社交平台激动宣布,阿里 Qwen2-72B 成为了开源模型排行榜的王者。 这是一件大好事,说明了我们在大模型领域从先前的追赶,逐渐走向了领导,…

【 VIPKID-注册安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞 …

Redis 7.x 系列【17】四种持久化策略

有道无术,术尚可求,有术无道,止于术。 本系列Redis 版本 7.2.5 源码地址:https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 案例演示2.1 无持久化2.2 RDB2.3 AOF2.4 混合模式2.4.1 方式一:…