深度学习(2):梯度下降

文章目录

  • 梯度下降
    • 梯度是什么
    • 常见梯度下降算法
  • 代码实现
    • 批量梯度下降

梯度下降

梯度是什么

类似y = ax + b这种单变量的函数来说,导数就是它的斜率,这种情况下可以说梯度就是导数。
但在多变量函数中,梯度是一个向量,其分量是各个单一变量的偏导数。这个向量指向函数增长最快的方向,其向量的模(大小)表示在那个方向上的最大变化率。

所以我们沿着梯度的反方向走,这就是下降最快的方向,这样就能够使得损失函数最快的下降了

常见梯度下降算法

  1. 批量梯度下降(Batch Gradient Descent)

    • 原理:在每次迭代中,使用整个训练集计算损失函数的梯度,然后更新参数。
    • 优点
      • 全局最优:每次更新都基于全数据,方向稳定。
      • 收敛稳定:梯度的方向一致,易于收敛。
    • 缺点
      • 计算开销大:对于大型数据集,计算梯度耗时长。
      • 缺乏在线学习能力:无法实时更新模型。
  2. 随机梯度下降(Stochastic Gradient Descent, SGD)

    • 原理:在每次迭代中,只使用一个样本计算梯度并更新参数。
    • 优点
      • 计算效率高:每次更新只需计算一个样本的梯度。
      • 在线学习:适合流式数据处理。
    • 缺点
      • 收敛不稳定:梯度受单个样本影响,可能产生较大波动。
      • 可能陷入局部最优:由于更新方向不稳定。
  3. 小批量梯度下降(Mini-batch Gradient Descent)

    • 原理:在每次迭代中,使用一小批样本(如32、64、128个)计算梯度并更新参数。
    • 优点
      • 权衡计算效率和稳定性:比批量方法快,比随机方法稳。
      • 利用矩阵运算:可充分利用GPU等硬件加速。
    • 缺点
      • 需要选择合适的批量大小:批量过小或过大会影响性能。
  4. 动量法(Momentum)

    • 原理:在参数更新中引入动量项,累计之前梯度的指数加权平均,公式为:

在这里插入图片描述

  • 优势
    • 加速收敛:在一致的梯度方向上加速移动。
    • 减少振荡:在梯度变化方向上抑制波动。
  1. Nesterov加速梯度(Nesterov Accelerated Gradient, NAG)

    • 原理:在动量法的基础上,先对参数进行一步预估,然后计算预估位置的梯度,公式为:
      在这里插入图片描述

    • 优势

      • 提前感知:对未来位置的梯度进行评估,提高了更新的准确性。
      • 更快收敛:比标准动量法具有更好的收敛速度。
  2. AdaGrad(Adaptive Gradient)

    • 原理:为每个参数适应性地调整学习率,累积梯度的平方和,公式为:

在这里插入图片描述

  • 优势

    • 自适应学习率:对频繁更新的参数降低学习率,稀疏参数仍保持较大学习率。
    • 适合稀疏数据:在自然语言处理等领域表现良好。
  • 缺点

    • 学习率单调递减:可能导致后期学习过慢或停止。
  1. RMSProp

    • 原理:对AdaGrad进行改进,采用梯度平方的指数加权移动平均,公式为:

在这里插入图片描述

  • 优势
    • 防止学习率过快下降:保持学习率在较为稳定的范围内。
    • 适合非平稳目标:在处理递归神经网络等问题时表现良好。
  1. Adam(Adaptive Moment Estimation)

    • 原理:结合Momentum和RMSProp,同时计算梯度的一阶和二阶矩的估计,公式为:

在这里插入图片描述

  • 优势
    • 自适应学习率:对每个参数进行动态调整。
    • 快速收敛:在实践中表现出优秀的性能和稳定性。
    • 广泛适用:已成为深度学习中最常用的优化算法之一。

代码实现

批量梯度下降

import matplotlib.pyplot as plt# 准备数据集,线性关系
x_data = [1.0, 2.0, 3.0]
y_data = [2.0, 4.0, 6.0]# 随机的初始化权重 
w = 1.0# 找线性模型
def forward(x):return x * w# 损失函数MSE
def loss(xs, ys):cost = 0 # 储存loss ^ 2的和for x, y in zip(xs, ys):y_pred = forward(x)cost += (y_pred - y) ** 2return cost / len(xs) # MSE# 批量梯度下降:选取所有的样本做梯度下降
# 获取当前的梯度是多少
def gradient(xs, ys):grad = 0for x, y in zip(xs, ys):grad += 2 * x * (x * w - y)return grad / len(xs)epoch_list = []
loss_list = []
print('predict (before training)', 4, forward(4))
for epoch in range(100):cost_val = loss(x_data, y_data)grad_val = gradient(x_data, y_data)w -= 0.01 * grad_val  # 0.01 学习率print('epoch:', epoch, 'w=', w, 'loss=', cost_val)epoch_list.append(epoch)loss_list.append(cost_val)print('predict (after training)', 4, forward(4))
plt.plot(epoch_list, loss_list)
plt.ylabel('cost')
plt.xlabel('epoch')
plt.show()

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

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

相关文章

时间序列LSTM实现

这个代码参考了时间序列预测模型实战案例(三)(LSTM)(Python)(深度学习)时间序列预测(包括运行代码以及代码讲解)_lstm预测模型-CSDN博客 结合我之前所学的lstm-seq2seq里所学习到的知识对其进行预测 import time import numpy as np import pandas as pd import torch import…

STM32F407之超声波模块使用

#include "sys.h" #include "delay.h" #include "usart.h" #include "includes.h" #include "HC_SR04.h"int main() {OS_ERR err;//错误uart_init(9600);//串口初始化//超声波初始化HC_SR04();//OS初始化 他是第一个运行的函…

Karmada新版本发布,支持联邦应用跨集群滚动升级

摘要:本次升级支持联邦应用跨集群滚动升级,使用户版本发布流程更加灵活可控;透明同事karmadactl 新增了多项运维能力,提供独特的多集群运维体验。 本文分享自华为云社区 《Karmada v1.11 版本发布!新增应用跨集群滚动升…

nfs版本问题导致挂载失败

一、系统环境 环境版本操作系统Linux Mint 22 Wilma内核版本6.8.0-44-genericgcc 版本arm-none-linux-gnueabihf-gcc (GNU Toolchain for the A-profile Architecture 9.2-2019.12 (arm-9.10)) 9.2.1 20191025uboot 版本2020.01开发板Linux版本5.4.31 二、问题描述 内核通过…

Unity开发绘画板——03.简单的实现绘制功能

从本篇文章开始,将带着大家一起写代码,我不会直接贴出成品代码,而是会把写代码的历程以及遇到的问题、如何解决这些问题都记录在文章里面,当然,同一个问题的解决方案可能会有很多,甚至有更好更高效的方式是…

微信小程序——引入 iconfont 矢量图标,如何使用引用阿里巴巴矢量图标

本文介绍如何在小程序中加入图标,效果如下图: 1、访部iconfont-阿里巴巴矢量图标库 找到需要的图标,然后添加入库 将增加好的图标添加到项目中 2、点击更新生成代码 生成后如下图 3、打开生成的css样式文件 4、在小程序中新建/static/iconfon…

AI大模型助力数据消费,构建数据飞轮科学、高效的体系

随着互联网的技术高速发展,越来越多的应用层出不穷,伴随着数据应用的需求变多,为快速响应业务需求,很多企业在初期没有很好的规划的情况下,存在不同程度的烟囱式的开发模式,这样会导致企业不同业务线的数据…

**CentOS7安装redis**

CentOS7安装redis 首先解压压缩包 redis-7.0.0.tar.gz tar -xvf redis-7.0.0.tar.gz接着进入到redis中 cd redis-7.0.0.tar.gz执行make命令编译 make接着执行安装命令 make install之后编译安装完后 程序都会在/usr/local/bin目录下 这里需要将在redis目录中redis.conf配置…

Kubernetes从零到精通(14-Storage)

存储简介 在Kubernetes中,存储是一个关键的部分,用于持久化应用程序的数据。Kubernetes的存储模型支持多种存储类型,并且能根据应用程序的需求动态地提供存储资源。以下是Kubernetes存储的基本概念和机制。 Kubernetes支持很多类型的卷。Pod可…

【Java面向对象高级一08】继承_使用继承的好处

前言 一、继承是什么? 二、使用继承的好处 总结 前言 继承的学习 一、继承是什么? Java中提供了一个关键字extends,用这个关键字,可以让一个类和另一个类建立起父子关系。extends(中文意思就是继承)。 继承的意思是&#xf…

Redis实战--Redis的数据持久化与搭建Redis主从复制模式和搭建Redis的哨兵模式

Redis作为一个高性能的key-value数据库,广泛应用于缓存、消息队列、排行榜等场景。然而,Redis是基于内存的数据库,这意味着一旦服务器宕机,内存中的数据就会丢失。为了解决这个问题,Redis提供了数据持久化的机制&#…

C语言 | Leetcode C语言题解之第434题字符串中的单词数

题目&#xff1a; 题解&#xff1a; int countSegments(char * s){int count 0; //count用来记录单词个数for(int i0; i < strlen(s); i){ //遍历字符串 if((i 0 || s[i-1] ) && s[i] ! ) //一个…

Python | Leetcode Python题解之第434题字符串中的单词数

题目&#xff1a; 题解&#xff1a; class Solution:def countSegments(self, s):segment_count 0for i in range(len(s)):if (i 0 or s[i - 1] ) and s[i] ! :segment_count 1return segment_count

【计网】从零开始掌握序列化 --- 实现网络计算器项目

​​​请各位保持头脑清醒&#xff0c; ​​​读些好书&#xff0c;做点有用的事&#xff0c; ​​​快快乐乐地生活。 ​​​ --- 斯蒂芬金 《肖申克的救赎》--- 从零开始掌握序列化 1 知识回顾2 服务器框架3 客户端框架4 运行测试 1 知识回顾 前面两篇文章学习中基础知识…

ROS第六梯:ROS+VSCode+C++消息发布和订阅

第一步&#xff1a;创建ROS工作空间&#xff0c;并在工作空间下创建名为srr_pkg的功能包&#xff0c;具体步骤参考第二章。 第二步&#xff1a;在src下创建publisher.cpp作为发布节点代码文件&#xff0c;创建subscriber.cpp作为订阅节点代码文件&#xff1a; 主要步骤是&#…

数字通云平台智慧政务 login 存在登录绕过

0x01 漏洞描述&#xff1a; 数字通云平台智慧政务OA产品是基于云计算、大数据、人工智能等先进技术&#xff0c;为政府部门量身定制的智能化办公系统。该系统旨在提高政府部门的办公效率、协同能力和信息资源共享水平&#xff0c;推动电子政务向更高层次发展。 数字通云平台 智…

【高分系列卫星简介——高分五号卫星(GF-5)】

高分五号卫星&#xff08;GF-5&#xff09; 高分五号&#xff08;GF-5&#xff09;卫星是中国高分辨率对地观测系统重大专项系列中的一颗重要卫星&#xff0c;主要承担着遥感、测绘等任务。以下是对高分五号卫星的详细介绍&#xff1a; 一、基本信息 国籍&#xff1a;中国研…

Android JNI 调用流程

为啥要用JNI&#xff0c;我个人理解是&#xff0c;Java 代码效率不够高&#xff0c;代码调用底层逻辑隔着一层Java 虚拟机&#xff0c;不能直接操控底层硬件&#xff0c;而C/C 可以直接操控硬件设备&#xff0c;对于需要效率更高的操作&#xff0c;就需要通过C/C 完成。。 比如…

GNU链接器(LD):存储命令(MEMORY)用法及实例解析

0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分&#xff1a; &#xff08;1&#xff09;编译器 &#xff08;2&#xff09;汇编器 &#xff08;3&#xff09;链接器 &#xff08;4&#xff09;lib库 在GNU工具链中&…

最小花费爬楼梯(动态规划)问题

目录 一题目&#xff1a; 二思路&#xff1a; 三代码&#xff1a; 一题目&#xff1a; 最小花费爬楼梯_牛客题霸_牛客网 二思路&#xff1a; 思路&#xff1a;动态规划找前后规律化简题意&#xff1a;此题想要的结果其实就是能上到顶楼也就是&#xff1a; 分为&#xff1…