3-3 超参数

3-3 超参数

什么是超参数
超参数也是一种参数,它具有参数的特性,比如未知,也就是它不是一个已知常量。是一种手工可配置的设置,需要为它根据已有或现有的经验,指定“正确”的值,也就是人为为它设定一个值,它不是通过系统学习得到的。
超参=在开始机器学习之前,就人为设置好的参数。
模型参数=通过训练得到的参数数据。
通常情况下,需要对超参数进行优化,给学习机选择-组最优超参数,以提高学习的性能和效果
超参数有哪些
在这里插入图片描述

什么是学习率?

在机器学习中,特别是训练神经网络时,学习率是一个非常关键的超参数。它决定了模型在每一步更新参数时,更新的幅度有多大。可以把它理解为**“步伐大小”**。

学习率的比喻

想象一下你在一个山谷中找寻最低点(这是我们的目标,类似于我们想要找到的最佳模型参数)。学习率就像是你每次走一步时的步幅大小。

  • 大步伐(高学习率):你可以很快地接近山谷底部,但如果步子太大,你可能会错过最低点,甚至来回跳跃,无法稳定下来。
  • 小步伐(低学习率):你会非常谨慎地一步一步走,虽然不会跳过最低点,但前进的速度会很慢,有时可能需要很长时间才能到达目标。

为什么学习率很重要?

  1. 收敛速度

    • 学习率决定了模型训练的收敛速度。合适的学习率可以帮助模型更快地找到最佳解。
  2. 稳定性

    • 如果学习率太高,模型可能会在训练过程中震荡甚至发散,无法稳定在最优点。
    • 如果学习率太低,模型的训练时间会非常长,且可能会陷入局部最优解而不是全局最优解。

调整学习率

在实际训练中,找到一个合适的学习率通常需要一些尝试。以下是常见的策略:

  1. 逐步减少学习率

    • 开始时使用较大的学习率,以便快速接近最优解,然后逐步减小学习率,以更精细地调整参数。这种方法通常用于“学习率调度”或“学习率衰减”。
  2. 使用自适应学习率方法

    • 方法如 Adam、RMSprop 等,可以动态调整学习率,使其在训练过程中自动适应。

我们来写一段代码理解以下学习率

import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.datasets import mnist
from tensorflow.keras.optimizers import SGD, Adam
from tensorflow.keras.callbacks import LearningRateScheduler
import matplotlib.pyplot as plt# 1. 加载和预处理数据
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0  # 归一化数据# 2. 构建简单的神经网络模型
def create_model():model = Sequential([Flatten(input_shape=(28, 28)),Dense(128, activation='relu'),Dense(10, activation='softmax')])return model# 3. 定义不同的学习率策略# (a) 固定学习率
fixed_lr = 0.01
model_fixed_lr = create_model()
model_fixed_lr.compile(optimizer=SGD(learning_rate=fixed_lr),loss='sparse_categorical_crossentropy',metrics=['accuracy'])# (b) 学习率衰减
initial_lr = 0.1
def decay_schedule(epoch):return initial_lr * np.exp(-0.1 * epoch)model_decay = create_model()
model_decay.compile(optimizer=SGD(learning_rate=initial_lr),loss='sparse_categorical_crossentropy',metrics=['accuracy'])
lr_scheduler = LearningRateScheduler(decay_schedule)# (c) 自适应学习率(使用 Adam)
model_adaptive = create_model()
model_adaptive.compile(optimizer=Adam(),loss='sparse_categorical_crossentropy',metrics=['accuracy'])# 4. 训练模型并记录历史# (a) 固定学习率
history_fixed_lr = model_fixed_lr.fit(x_train, y_train, epochs=10,validation_data=(x_test, y_test),verbose=0)# (b) 学习率衰减
history_decay = model_decay.fit(x_train, y_train, epochs=10,validation_data=(x_test, y_test),callbacks=[lr_scheduler],verbose=0)# (c) 自适应学习率
history_adaptive = model_adaptive.fit(x_train, y_train, epochs=10,validation_data=(x_test, y_test),verbose=0)# 5. 可视化训练结果plt.figure(figsize=(12, 6))# 绘制损失函数
plt.subplot(1, 2, 1)
plt.plot(history_fixed_lr.history['val_loss'], label='Fixed LR')
plt.plot(history_decay.history['val_loss'], label='Decay LR')
plt.plot(history_adaptive.history['val_loss'], label='Adaptive LR')
plt.xlabel('Epoch')
plt.ylabel('Validation Loss')
plt.title('Validation Loss vs. Epoch')
plt.legend()# 绘制准确率
plt.subplot(1, 2, 2)
plt.plot(history_fixed_lr.history['val_accuracy'], label='Fixed LR')
plt.plot(history_decay.history['val_accuracy'], label='Decay LR')
plt.plot(history_adaptive.history['val_accuracy'], label='Adaptive LR')
plt.xlabel('Epoch')
plt.ylabel('Validation Accuracy')
plt.title('Validation Accuracy vs. Epoch')
plt.legend()plt.tight_layout()
plt.show()

训练结果如下
在这里插入图片描述
从图表中,我们可以看到三种不同的学习率策略在模型训练和验证中的表现:

左图:验证损失 vs. 迭代次数 (Validation Loss vs. Epoch)

固定学习率(Fixed LR)
  • 表现趋势: 固定学习率的验证损失逐渐下降,虽然下降较慢,但非常稳定。到第 10 个 epoch 时,验证损失仍然在持续降低。
  • 特点: 固定学习率的优势在于其稳定性和可预测性。在没有明显过拟合或欠拟合的情况下,它可以提供持续的优化。然而,它的速度较慢,在某些情况下可能无法充分利用训练数据。
学习率衰减(Decay LR)
  • 表现趋势: 学习率衰减策略的验证损失快速下降,并在前几个 epoch 内达到相对稳定的较低水平。在最初的几个 epoch 中,损失下降得比固定学习率更快。
  • 特点: 该策略结合了高初始学习率的快速收敛和低学习率的精细调优优势。通过逐渐降低学习率,模型可以在早期快速学习到大部分重要的特征,而在后期更加专注于微调和优化。这使得它在综合性能上往往优于固定学习率。
自适应学习率(Adaptive LR)
  • 表现趋势: 使用自适应学习率的 Adam 优化器在最初几个 epoch 中迅速降低了验证损失,并且在整个训练过程中保持在一个非常低的水平。
  • 特点: Adam 通过自适应调整每个参数的学习率,使其能够在不同梯度尺度下进行优化。这通常使得 Adam 在处理稀疏梯度或高度变化的梯度时非常有效,因此验证损失曲线在初期迅速下降,并能较长时间保持在低位。

右图:验证准确率 vs. 迭代次数 (Validation Accuracy vs. Epoch)

固定学习率(Fixed LR)
  • 表现趋势: 固定学习率的验证准确率逐步上升,尽管上升较慢,但较为稳定。到第 10 个 epoch 时,准确率仍在上升,但没有达到特别高的水平。
  • 特点: 固定学习率在整个训练过程中提供了稳定但渐进的学习步伐。这种稳定性可以在某些情况下防止模型发生大的波动,但也可能导致在相同的 epoch 内,模型的提升速度较慢。
学习率衰减(Decay LR)
  • 表现趋势: 学习率衰减策略在前几个 epoch 内迅速提高了验证准确率,并在随后的 epoch 中逐渐达到并保持在一个相对较高的水平。
  • 特点: 高初始学习率帮助模型快速捕捉全局模式,而衰减后的低学习率帮助模型细化学习。该策略通常在较短的时间内提供高性能,是处理中短期训练的有效方法。
自适应学习率(Adaptive LR)
  • 表现趋势: 自适应学习率的验证准确率在前几个 epoch 内迅速上升,并在后续 epoch 中迅速达到最高水平。与学习率衰减相比,Adam 优化器在早期和中期表现更优。
  • 特点: 自适应学习率的优势在于其高效和智能的参数调整能力。这使得模型能够在短时间内获得非常高的准确率,特别适合处理具有复杂梯度分布的问题。

综合分析

  1. 训练效率: 从这两幅图中可以看出,自适应学习率(Adam)在前几个 epoch 内的表现最为优越,快速降低了损失并提高了准确率。这表明 Adam 优化器非常适合快速训练和复杂模型的优化。

  2. 长期性能: 学习率衰减策略在验证损失和准确率上的表现较为平衡,在较短的时间内也能提供良好的性能。它通过逐步减小学习率,平衡了快速收敛和精细调优的需求,是处理中长期训练的有效策略。

  3. 稳定性: 固定学习率尽管收敛较慢,但表现非常稳定。它适用于稳定性要求较高的任务,尤其是当模型需要在整个训练过程中保持一致的优化步伐时。

总结

  • Adam 优化器:在短期内提供了最快的收敛速度和最高的验证准确率,适合快速迭代和处理复杂梯度的问题。
  • 学习率衰减:在训练的早期具有快速收敛的优势,同时在中期和后期也能保持稳定的性能提升,是一种非常有效的策略。
  • 固定学习率:提供了稳定的优化过程,尽管在训练速度和性能上可能稍逊于前两者,但它的可预测性和简单性使其在某些情况下仍然具有吸引力。

根据这些结论,选择适合具体任务和数据的学习率策略,可以显著提高模型训练的效率和性能。

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

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

相关文章

Linux系统的服务——以Centos7为例

一、Linux系统的服务简介 服务是向外部提供对应功能的进程,其运行在系统后台,能够7*24小时持续不断的提供外界随时发来的服务请求,且服务进程常驻在内存中,具有固定的端口号,通过端口号就能找到服务内容。 提供服务的一…

2000-2022年地级市数字经济指数(含控制变量)

2000-2022年地级市数字经济指数(含控制变量) 目录 数字经济对区域经济发展的影响实证研究 一、引言 二、文献综述 三、数据来源与变量说明 四、实证模型 五、程序代码与运行结果 数字经济对区域经济发展的影响实证研究 摘要: 本文旨在…

Ubuntu防火墙相关内容

Ubuntu防火墙相关的命令,主要用于日常使用过程中,忘记命令时查找方便,不用再去各种地方搜索了。以下命令均已root用户执行,如果是非root用户,需要添加sudo 查看防火墙的启用状态 ufw status 说明是启用状态。 启用防…

Fish Speech: 开源文本转语音技术(TTS)的新里程碑

简介 Fish Speech 是一个全新的文本转语音(TTS)解决方案,该项目由fishaudio开发。当前模型使用约十五万小时三语数据训练,对中文支持非常的完美。 能够熟练处理和生成中文、日语和英语的语音,语言处理能力接近人类水平,并且声音…

代码随想录算法训练营第4天|LeetCode24,19,02,07,142

24.交换链表结点 题目链接:24. 两两交换链表中的节点 - 力扣(LeetCode) 文章链接:代码随想录 (programmercarl.com) 视频链接:代码随想录算法公开课 | 最强算法公开课 | 代码随想录 第一想法 正常模拟,先画…

算法金 | 欧氏距离算法、余弦相似度、汉明、曼哈顿、切比雪夫、闵可夫斯基、雅卡尔指数、半正矢、Sørensen-Dice

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 抱个拳,送个礼 在算法模型构建中,我们经常需要计算样本之间的相似度,通常的做法是计算样本之间的距…

性价比蓝牙耳机排行榜前十名有哪些?十大性价比蓝牙耳机榜单盘点

作为使用真无线蓝牙耳机长达5-6年的资深爱好者,我始终对音频技术和产品的创新保持着浓厚的兴趣,最近,我投入了一笔不小的资金,超过大几千元,用于深入测试和评估市面上多款来自各大品牌的真无线蓝牙耳机(包括…

EtherCAT转Profinet网关配置说明第一讲:配置软件安装及介绍

网关XD-ECPNS20为EtherCAT转Profinet协议网关,使EtherCAT协议和Profinet协议两种工业实时以太网网络之间双向传输 IO 数据。适用于具有EtherCAT协议网络与Profinet协议网络跨越网络界限进行数据交换的解决方案。 本网关通过上位机来进行配置。 首先安装上位机软件 一…

用递归解决冒泡排序问题

冒泡排序是种很简单的排序方式. 如果用循环方式, 通常就是两层循环. 由于两层循环都是与元素个数 N 线性相关, 所以可以简单估算出它的时间复杂度是 O(N2), 通常而言, 这是较糟糕的复杂度. 当然, 这也几乎是所有简单方式的宿命, 想简单就别想效率高! 前面篇章说到递归也是一种循…

基于Java技术的人事管理系统

你好,我是专注于计算机科学领域的小野。如果你对人事管理系统感兴趣或有相关需求,欢迎私信交流。 开发语言: Java 数据库: MySQL 技术: B/S模式、Java技术、SpringBoot 工具: Eclipse、MySQL、浏览…

【C++:类的基础认识和this指针】

C的类与C语言的struct结构体有啥区别? 默认的访问限定符不同 类的简要 关键字:class{}里面是类的主体,特别注意:{}后面的;不可以省略类中的变量叫做成员变量,类中的函数叫做成员函数类中访问有三种访问权限…

HTML5使用<blockquote>标签:段落缩进

使用<blockquote>标签可以实现页面文字的段落缩进。这一标签也是每使用一次&#xff0c;段落就缩进一次&#xff0c;并且可以嵌套使用&#xff0c;以达到不同的缩进效果。语法如下&#xff1a; <blockquote>文字</blockquote> 【实例】使用<blockquote&…

谷粒商城----通过缓存和分布式锁获取数据。

高并发下缓存失效的问题 高并发下缓存失效的问题--缓存穿透 指查询一个一定不存在的数据&#xff0c;由于缓存是不命中&#xff0c;将去查询数据库&#xff0c;但是数据库也无此记录&#xff0c;我们没有将这次查询的不写入缓存&#xff0c;这将导致这个不存在的数据每次请求…

工厂模式之简单工厂模式

文章目录 工厂模式工厂模式分为工厂模式的角色简单工厂模式案例代码定义一个父类&#xff0c;三个子类定义简单工厂客户端使用输出结果 工厂模式 工厂模式属于创造型的模式&#xff0c;用于创建对象。 工厂模式分为 简单工厂模式&#xff1a;定义一个简单工厂类&#xff0c;根…

VuePress 的更多配置

现在&#xff0c;读者应该对 VuePress、主题和插件等有了基本的认识&#xff0c;除了插件&#xff0c;VuePress 自身也有很多有用的配置&#xff0c;这里简单说明下。 ‍ ‍ VuePress 的介绍 在介绍了 VuePress 的基本使用、主题和插件的概念之后&#xff0c;我们再来看看官…

【MySQL】1.初识MySQL

初识MySQL 一.MySQL 安装1.卸载已有的 MySQL2.获取官方 yum 源3.安装 MySQL4.登录 MySQL5.配置 my.cnf 二.MySQL 数据库基础1.MySQL 是什么&#xff1f;2.服务器&#xff0c;数据库和表3.mysqld 的层状结构4.SQL 语句分类 一.MySQL 安装 1.卸载已有的 MySQL //查询是否有相关…

vue事件参数

事件参数 事件参数可以获取event对象和通过事件传递数据 获取event对象 <template> <buttonclick"addCount">点击</button><p>count is: {{ count }}</p><p>{{ coutent_e }}</p> </template> <script>expor…

昇腾910B部署Qwen2-7B-Instruct进行流式输出【pytorch框架】NPU推理

目录 前情提要torch_npu框架mindsport框架mindnlp框架 下载模型国外国内 环境设置代码适配&#xff08;非流式&#xff09;MainBranch结果展示 代码适配&#xff08;流式&#xff09; 前情提要 torch_npu框架 官方未适配 mindsport框架 官方未适配 mindnlp框架 官方适配…

25.【C语言】循环结构之for 上

1.基本使用 类比while 在while循环中&#xff0c;有三个不可或缺的部分&#xff1a;初始化&#xff0c;判断部分&#xff0c;调整部分 int i 0;//初始化 while (i < 10)//判断部分 {……i;//调整部分 }三个部分太分散&#xff0c;用for循环可集为一体&#xff0c;简洁 …

如何使用uer做多分类任务

如何使用uer做多分类任务 语料集下载 找到这里点击即可 里面是这有json文件的 因此我们对此要做一些处理&#xff0c;将其转为tsv格式 # -*- coding: utf-8 -*- import json import csv import chardet# 检测文件编码 def detect_encoding(file_path):with open(file_path,…