首页 > 其他分享 >深度学习(三)1.梯度下降

深度学习(三)1.梯度下降

时间:2024-11-07 20:15:37浏览次数:3  
标签:plot plt 函数 迭代 梯度 学习 values 深度

一、梯度下降 

1.梯度下降是什么 

梯度下降(Gradient Descent)是深度学习中一种至关重要的优化算法,其核心目的是寻找最佳模型参数或权重,从而最小化损失函数。

2.基本原理 

梯度下降算法的基本思想是:通过迭代的方式,不断调整参数值,沿着目标函数(通常是损失函数)负梯度方向(即函数值下降最快的方向)进行搜索,直至收敛至一个局部最小值或全局最小值。

在机器学习和深度学习中,目标函数通常是损失函数,它衡量了模型预测结果与实际结果之间的差异。通过最小化损失函数,可以找到最佳的模型参数,使模型能够更好地拟合训练数据。

 3.对梯度的理解

梯度是一个向量,表示某一函数在该点处的方向导数沿着该方向取得最大值。即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。

在三维空间中,设三元函数f(x, y, z)在空间区域G内具有一阶连续偏导数,则称向量∇f(x, y, z)为函数f在点P的梯度。其中,∇为向量微分算子或Nabla算子。梯度方向与取得最大方向导数的方向一致,而它的模为方向导数的最大值。

为了更好地理解梯度,我们与导数放在一起看一下:

  • 导数:一元函数 f(x) 的导数 f′(x) 表示函数在点 x 处的变化率。
  • 梯度:多元函数 f(θ) 的梯度 ∇f(θ) 是一个向量,表示函数在点 θ 处变化最快的方向。

4.算法步骤

  1. 参数初始化:选择参数初始值,通常是一个随机值或零值。
  2. 选择学习率(步长):选择合适的学习率 α
  3. 计算梯度:根据当前参数值和目标函数,计算目标函数(通常是损失函数)关于参数的梯度。梯度是一个向量,指向函数值增长最快的方向。因此,为了找到函数的最小值,应该沿着梯度的反方向更新参数。
  4. 更新参数:根据梯度和学习率(步长),更新参数值。更新规则通常是:新参数值 = 旧参数值 - 学习率 × 梯度。
  5. 迭代:重复步骤2和步骤3,直到达到预设的迭代次数或目标函数值的变化小于某个阈值为止。

 学习率的选择

  • 过大:可能越过最小值,导致不收敛
  • 过小:收敛速度慢,计算成本高

停止条件

  • 迭代次数达到预设的最大值
  • 梯度的范数足够小
  • 相邻两次损失函数值的差异足够小

这里以f(x)=x²为例演示一下梯度下降算法:

import numpy as np
import matplotlib.pyplot as plt
 
# 定义目标函数和其导数
def f(x):
    return x**2
 
def df(x):
    return 2*x
 
# 初始化
x0 = 10  # 设置梯度下降的起始点 x0为 10。
learning_rate = 0.1  # 学习率
iterations = 20  # 迭代次数
 
# 分别用于存储每次迭代后的 x 值和对应的 f(x) 值。
x_values = [x0]
f_values = [f(x0)]
 
x = x0
for i in range(iterations):
    x = x - learning_rate * df(x)
    x_values.append(x)
    f_values.append(f(x))
 
# 绘制函数曲线和下降过程
x_plot = np.linspace(-10, 10, 400)
y_plot = f(x_plot)
 
plt.figure(figsize=(10, 6))
plt.plot(x_plot, y_plot, label='f(x) = x^2')
plt.scatter(x_values, f_values, color='red', label='Gradient Descent')
plt.plot(x_values, f_values, color='red')
plt.title('Gradient Descent on f(x) = x^2')
plt.xlabel('x')
plt.ylabel('f(x)')
plt.legend()
plt.show()

 

从初始点 X0=10 开始,逐步沿着函数的下降方向移动,最终接近最小值点 x=0

 二、线性回归中的梯度下降 

1.线性回归

线性回归是利用数理统计中的回归分析来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法。其原理是通过拟合一条(或多条)直线(或平面)来预测连续型的因变量。这种关系可以用一个线性方程来表示,即 Y = α + βX + ε,其中 Y 代表因变量,X 代表自变量,α 表示截距,β 表示自变量的系数,ε 表示误差项(ε=Y - (α + βX))。线性回归的目标就是找到合适的截距和系数来最小化误差项,从而使得预测值和观测值之间的差异最小。

  1. 一元线性回归:只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示。
  2. 多元线性回归:包括两个或两个以上的自变量,且因变量和自变量之间是线性关系。

 这个误差(距离)可以直接相减,但是直接相减会有正有负,后续叠加会相互抵消,所以就用差的平方

2.梯度下降

 线性回归模型:y=\theta _{0}+\theta _{1}x
 损失函数:

损失函数前面除2是为了后面更好求梯度。 我理解损失函数就是所有误差相加求均值。

梯度计算: 

参数更新:

\theta _{0t}=\theta _{0t-1}-\alpha\frac{\partial J}{\partial \theta _{0t-1}}

\theta _{1t}=\theta _{1t-1}-\alpha\frac{\partial J}{\partial \theta _{t-1}}

 

三、梯度下降的类型

(1)批量梯度下降(BGD)

  • 优点:方向稳定,易于收敛到全局最小值(在凸优化问题中)。由于使用了整个数据集,梯度估计更加准确。
  • 缺点:计算量大,需要处理整个数据集,对于大数据集来说可能非常耗时。需要将整个数据集加载到内存中,这在数据集非常大时可能不可行。

(2)随机梯度下降(SGD)

  • 优点:计算量小,每次迭代只需要处理一个样本,训练速度快。适用于在线学习或数据流场景,可以实时更新模型。
  • 缺点:梯度估计的噪声较大,可能导致收敛过程不稳定,可能陷入局部最小值或鞍点。由于梯度估计基于单个样本,因此更新方向波动大。

(3)小批量梯度下降(MBGD)

  • 优点:结合了BGD和SGD的优点。相对于BGD,减少了每次迭代的计算量,提高了训练速度。相对于SGD,梯度估计更加稳定,减少了更新方向的波动,有助于更稳定地收敛。可以通过调整批量大小(batch size)来平衡计算量和梯度估计的稳定性。
  • 缺点:需要选择一个合适的批量大小,这可能需要一些实验和调参。仍然需要一定的内存来存储批量中的样本。

 

标签:plot,plt,函数,迭代,梯度,学习,values,深度
From: https://blog.csdn.net/2301_79712009/article/details/143579126

相关文章

  • Code Block学习
      CodeBlock 可以用CodeBlock直接输入数字,字符和公式 调用内置函数我们可以在CodeBlock中直接调用内置函数。比如,在空间中创建一个点,我们可以使用Point.ByCoordinates这样的节点,该节点可以通过输入x,y两个值来确定要创建点的位置。Point.ByCoordinates(10,10)......
  • 架构学习中对微服务架构的学习
    微服务架构目录微服务架构一、定义与特点二、优势三、挑战四、应用场景五、实现方式微服务架构(MicroserviceArchitecture)是一种将大型应用程序拆分成一组小的、独立的服务单元的架构模式。每个服务单元运行在独立的进程中,服务之间通过轻量级的通信机制(如HTTPRESTfulAPI)进行......
  • C语言学习8
    最近学的不是很多,只能更几个C语言小游戏给大家看看。一.猜数字游戏(难)1.随机数的生成要想完成猜数字游戏,⾸先得产⽣随机数,那怎么产⽣随机数呢?2.randC语⾔提供了⼀个函数叫rand,这函数是可以⽣成随机数的,函数原型如下所⽰:intrand(void);rand函数会返回⼀个伪随机数......
  • C# SqlSugar学习笔记
    前言今天介绍一款C#ORM框架什么是ORM?来看一下百度术语:对象关系映射(英语:ObjectRelationalMapping,简称ORM,或O/RM,或O/Rmapping),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换 通俗理解ORM我们只需要知道ORM是一种技术,使用了ORM之后我们就不必在......
  • React学习笔记(六) Create React App
    React学习笔记(六)CreateReactApp 1、介绍CreateReactApp是官方支持的创建单页应用程序的方法,可以帮助我们快速搭建一个繁杂的脚手架我们可以直接使用命令 npminstallcreate-react-app-g 全局安装CreateReactApp然后使用命令 create-react-app<project-na......
  • 高性能的Reactor和Proactor模式学习
    0、引言在上一篇的笔记中,我们学习了操作系统提供的高效I/O管理技术,主要用于解决服务器在高并发场景下的资源浪费和瓶颈问题。但是在实际的代码编写中,要是我们都全部调用底层的I/O多路复用接口来编写网络程序这种面向过程的方式,必然会导致开发的效率不高。于是在这一章节,我们来学......
  • GPU释放威力:在Gymnasium环境中使用稳定基线3在AMD GPU上训练强化学习代理
    GPUUnleashed:TrainingReinforcementLearningAgentswithStableBaselines3onanAMDGPUinGymnasiumEnvironment—ROCmBlogs2024年4月11日作者: DouglasJia.本博客将深入探讨深度强化学习的基本原理,通过一个实用的代码示例,指导您如何利用AMDGPU在Gymnasium......
  • React系统学习之路
    React系统学习之路学习目录第1章:React入门介绍React的基本概念和应用场景安装Node.js和npm创建第一个React应用React的JSX语法组件的基本结构和生命周期第2章:组件与状态管理函数组件与类组件的区别状态(State)和属性(Props)的使用受控组件与非受控组件高阶组件(HOC)的概念和......
  • 机器学习系列----介绍前馈神经网络和卷积神经网络 (CNN)
    前言 在深度学习领域,神经网络是一种模拟人脑神经元结构和功能的数学模型。它通过大量的层次结构和参数调整来实现模式识别、分类、回归等任务。常见的神经网络结构有前馈神经网络(FeedforwardNeuralNetworks,简称FNN)和卷积神经网络(ConvolutionalNeuralNetworks,简称CNN)......
  • 【Java深度揭秘】掌握SPI机制,让你的代码设计更优雅!
    SPI(ServiceProviderInterface)机制是Java中一种服务发现和加载的机制,它允许第三方为应用程序提供实现。SPI机制广泛应用于Java标准库以及各种框架中,如JDBC、JNDI等。SPI机制的基本概念接口定义:首先定义一个接口,这个接口规定了服务提供者需要实现的方法。配置文件:在META-INF/......