Datawhale X 李宏毅苹果书 AI夏令营 -《深度学习详解》Task1

news/2024/9/18 8:59:08/文章来源:https://www.cnblogs.com/zx-demo/p/18377250

深度学习基础

学习目标

  1. 理解深度学习的常见概念。
  2. 掌握优化神经网络的方法。
  3. 找到优化神经网络失败的原因。
  4. 学习调整学习率(lr)的高级方法。

1、局部极小值与鞍点

在局部极小值与鞍点之前,首先了解一个特殊的点-临界点。

1.1 临界点

通常将梯度为零的点统称为“临界点”。什么时候梯度为零?
梯度为零的点通常称为“临界点”,在这些点上,函数的变化率为零。数学上,对于一个多变量函数 $ \ f(x) $,梯度为零的点$ \mathbf{x} $ 满足 \(\nabla f(\mathbf{x}) = 0\)。这意味着在该点,函数在所有方向上的偏导数都为零,表示可能是局部极值点、鞍点或平坦区域的点。

注 :在局部极值点中大家很容易忽略的就是局部极大值,大家习惯性的默认是极小值点。

在下图所示的为一个鞍点,在(0, 0) 是一个临界点,并不是极值点。

image
现在有一个值得思考的问题就是如何区分这个临界点是那种类型的点?
通过百度几乎都是通过海森矩阵来区分的。但是海森矩阵太复杂看不懂!!!!
换个思路,对于低维的函数我们可以去绘制函数图像去分析。面对高维的怎么办?

import numpy as np
from scipy.linalg import eigvalsdef hessian(func, x0, epsilon=1e-5):n = len(x0)hess = np.zeros((n, n))f0 = func(x0)for i in range(n):x0i = x0.copy()x0i[i] += epsilonf0i = func(x0i)for j in range(n):x0ij = x0.copy()x0ij[j] += epsilonf0ij = func(x0ij)x0i_j = x0.copy()x0i_j[j] += epsilonf0i_j = func(x0i_j)hess[i, j] = (f0i_j - f0i - f0ij + f0) / (epsilon**2)return hess# 定义函数分析
def func(x):return x[0]**5 + x[1]**2 - 4*x[0]*x[1] + x[1]**2# 示例点
x0 = np.array([11.0, 2.0])
hess = hessian(func, x0)
eigvals = eigvals(hess)# 判断类型
if np.all(eigvals > 0):print("局部极小值点")
elif np.all(eigvals < 0):print("局部极大值点")
elif np.any(eigvals > 0) and np.any(eigvals < 0):print("鞍点")
else:print("无法确定类型")

看不懂的我求助了AI,让它帮忙生成了代码,嘤嘤嘤

通过上述的例子,了解到鞍点对于学习来说不友好,在高维空间中,鞍点可以让优化过程陷入困境。如何处理鞍点或者“逃离”呢?

  • 随机梯度下降(SGD):由于其随机性,SGD可以通过噪声帮助避免在鞍点附近停滞。

  • 动量方法(Momentum):通过引入历史梯度的加权平均来加速优化过程,减少被鞍点困住的可能性。

  • 自适应学习率方法(如 Adam、RMSprop):通过调整每个参数的学习率,能够更快地离开鞍点。

2、动量

在动量方法中,“动量”指的是历史梯度的加权平均。这个“动量”帮助加速优化过程,同时减少震荡,使得更新更稳定,从而更有效地避免被鞍点困住。

注 :在计算梯度的时候,并不是对所有数据的损失 $L $计算梯度,而是把所有的数据分成一个一个的批量(batch),遍历所有批量的过程称为一个回合(epoch).

在分散数据时,分成每一个批量的大小如何确定?如何限制?
2.1 批量
1、选择批量大小的考虑因素

  • 计算资源:
    内存限制:较大的批量大小会占用更多的内存,因此需要考虑显存(GPU)或内存(CPU)的容量。
    计算效率:较大的批量大小可以利用并行计算加速训练,但过大的批量可能导致内存溢出或计算效率的下降。
  • 模型收敛性:
    小批量:通常会引入更多的噪声,有助于跳出局部最优解,但训练过程可能较慢,收敛路径较为震荡。
    大批量:收敛过程更平滑,训练更加稳定,但可能会导致陷入局部最优解。
  • 训练时间:
    较大的批量大小通常能提高每次迭代的计算效率,从而减少训练的总时间。但是,需要平衡计算资源的利用和收敛速度。

2、 常见选择策略

  • 经验法则:许多实践经验表明,批量大小的选择可以从 32、64、128 等常见值开始尝试。具体的最优值通常需要通过实验和调整确定。

  • 逐步增大:从较小的批量大小开始训练,逐步增加,观察训练稳定性和模型性能。

  • 学习率调整:如果增加批量大小,也可以尝试相应地调整学习率。例如,有研究表明,在批量大小增加时,适当增大学习率有助于更快的收敛

3 梯度下降

梯度下降(Gradient Descent)是一种用于优化模型参数的迭代算法,广泛应用于机器学习和深度学习中。其主要目标是最小化一个损失函数,使得模型的预测与实际值之间的差距最小化。
梯度下降的步骤:

初始化参数:选择初始参数值(通常是随机的)。
计算梯度:根据当前参数值计算损失函数的梯度(即损失函数相对于每个参数的偏导数)。
更新参数:根据计算得到的梯度调整参数值。更新公式为:
\(θ←θ−η∇_θJ(θ)\)
重复:重复计算梯度和更新参数的过程,直到满足停止条件(如损失函数收敛或达到最大迭代次数)。

梯度下降的变体

  1. 批量梯度下降(Batch Gradient Descent):
    在每次迭代中使用整个训练集来计算梯度。适合较小的训练集,但在大规模数据集上计算成本高。

  2. 随机梯度下降(Stochastic Gradient Descent, SGD):
    在每次迭代中仅使用一个样本来计算梯度。虽然每次更新的方向可能比较嘈杂,但通常可以更快地达到收敛。

  3. 小批量梯度下降(Mini-batch Gradient Descent):
    结合了批量梯度下降和随机梯度下降的优点,每次迭代中使用训练集的一部分(小批量)来计算梯度。这样可以在一定程度上平衡计算效率和收敛性。

小批量梯度下降与批量梯度下降的比较
image

4 自适应学习率

一些先进的优化算法可以自动调整学习率,进一步提高训练效率:

  • AdaGrad:根据每个参数的历史梯度调整学习率,使得频繁更新的参数学习率降低,不常更新的参数学习率增加。
  • RMSprop:改进了AdaGrad,通过引入指数衰减来计算梯度的平方均值,防止学习率过快下降。
  • Adam(Adaptive Moment Estimation):结合了动量法和RMSprop的优点,通过计算一阶矩(梯度均值)和二阶矩(梯度平方均值)来调整学习率。

自适应学习率在代码中的使用方法:

  1. TensorFlow/Keras
import torch.optim as optim# 使用Adam优化器
optimizer = optim.Adam(model.parameters(), lr=0.001)# 使用RMSprop优化器
optimizer = optim.RMSprop(model.parameters(), lr=0.001)# 使用Adagrad优化器
optimizer = optim.Adagrad(model.parameters(), lr=0.01)# 在训练过程中使用优化器
for epoch in range(num_epochs):optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()
  1. PyTorch
import torch.optim as optim# 使用Adam优化器
optimizer = optim.Adam(model.parameters(), lr=0.001)# 使用RMSprop优化器
optimizer = optim.RMSprop(model.parameters(), lr=0.001)# 使用Adagrad优化器
optimizer = optim.Adagrad(model.parameters(), lr=0.01)# 在训练过程中使用优化器
for epoch in range(num_epochs):optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, labels)loss.backward()optimizer.step()
  1. scikit-learn
from sklearn.linear_model import SGDClassifier# 使用Adam优化器
model = SGDClassifier(learning_rate='adaptive', eta0=0.001, loss='log')model.fit(X_train, y_train)

在scikit-learn中,通常不直接使用这些自适应学习率算法,但某些模型如SGDClassifier和SGDRegressor支持不同的优化算法。

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

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

相关文章

第二周作业

登录页面示例body { font-family: Arial, sans-serif; display: flex; justify-content: center; align-items: center; height: 100vh; background-color: rgba(247, 247, 247, 1) } .login-container { background-color: rgba(255, 255, 255, 1); padding: 20px; border-rad…

「代码随想录算法训练营」第四十五天 | 图论 part3

目录101. 孤岛的总面积DFS思路BFS思路102. 沉没孤岛103. 水流问题104. 建造最大岛屿 101. 孤岛的总面积题目链接:https://kamacoder.com/problempage.php?pid=1173 文章讲解:https://programmercarl.com/kamacoder/0101.孤岛的总面积.html 题目状态:看题解DFS思路 思路: 代…

carlife

carlife是真的画中画。亿连客户端不是。没去除小房子效果如下:

【专题】2024数智医疗服务时代营销机遇洞察报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37466 如今,人工智能、大数据、物联网等众多智能技术持续且深入地在医药产业中得到应用。这不仅极大地增强了医药产业的创新能力,显著提高了医疗服务的质量与效率,还有力地促进了从预防、诊断、治疗到康复的全链条数字化转型,使市场效率得…

049、Vue3+TypeScript基础,页面通讯之使用mitt在任意组件中通讯

01、main.js代码如下:// 引入createApp用于创建Vue实例 import {createApp} from vue // 引入App.vue根组件 import App from ./App.vue// 引入emitter用于全局事件总线 import emitter from @/utils/emitterconst app = createApp(App);// App.vue的根元素id为app app.mount(…

lua协程实现异步编程模式

异步编程模式只是一个代码结构,c#中的async/await的写法就是异步编程模式,这边就是通过协程来达到和async/await类似的效果。异步编程模式写法1:资源分帧加载 这边运行环境用的是:Unity+xLualua脚本:Assets/Lua/Test9.lua.txtlocal _Time = CS.UnityEngine.Timelocal func…

Echarts可视化大屏框架

效果图展示: 源码:<template><div><!-- Header 部分 --><div class="heads"><h3>大数据可视化分析</h3><span>2023-12-12 12:20:45</span></div><!-- 中间部分 --><div class="middle"&…

可视化表单设计生成器可以实现流程化办公吗?

通过本文可以一起走进低代码技术平台、可视化表单设计生成器的更多优势特点。实现流程化办公一直都是很多客户朋友追求的目标。那么,如何才能实现这一目标?如何为客户提供更优良的产品助力提质、降本、增效?低代码技术平台拥有可视化操作界面、更灵活、更高效、更可靠,是专…

蓝帽杯2020-Misc-签到

蓝帽杯2020-Misc-签到 一、题目 题目名:观色怎么说呢,曲曲折折发现了坑🕳,所以记录下 二、解题 根据自己总结的七大类图片隐写排🕳 1、打开010文件结构查看,本来看着是个jpg,打开是个ps过的gif,未发现附加字符串,foremost没看到其他文件,宽高不涉及修改,IDTA块正常…

Django:Swagger文档的配置

前言 第三方库drf-yasg(Django Rest Swagger)。它是一个为Django Rest Framework提供Swagger/OpenAPI规范支持的库。按照以下步骤进行操作: 安装pip install drf-yasg -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com配置 1、在项目的setting…

REST framework:过滤

一、数据准备 模型类class UserInfo(models.Model):name = models.CharField(max_length=20, verbose_name=用户名)pwd = models.CharField(max_length=18, verbose_name=密码)email = models.EmailField(max_length=40, verbose_name=邮箱)age = models.IntegerField(verbose_…

[消息队列]kafka

Kafka 如何保证消息的消费顺序? 我们在使用消息队列的过程中经常有业务场景需要严格保证消息的消费顺序,比如我们同时发了 2 个消息,这 2 个消息对应的操作分别对应的数据库操作是: 更改用户会员等级。 根据会员等级计算订单价格。 假如这两条消息的消费顺序不一样造成的最…