Python 梯度下降法(四):Adadelta Optimize
文章目录
- Python 梯度下降法(四):Adadelta Optimize
- 一、数学原理
- 1.1 介绍
- 1.2 实现流程
- 二、代码实现
- 2.1 函数代码
- 2.2 总代码
- 三、优缺点
- 3.1 优点
- 3.2 缺点
- 四、相关链接
Python 梯度下降法(四):Adadelta Optimize
一、数学原理
1.1 介绍
Adadelta 是一种自适应学习率的优化算法,它是对 Adagrad 算法的改进,旨在解决 Adagrad 学习率单调递减过快的问题。
Adagrad 算法会累积所有历史梯度的平方和,随着迭代次数的增加,学习率会不断减小,最终可能变得非常小,导致参数更新极其缓慢甚至停滞。
Adadelta 算法通过引入梯度平方的指数加权移动平均,只关注近期的梯度信息,避免了学习率的过度衰减。同时,Adadelta 不需要手动设置全局学习率,它通过使用参数更新量的指数加权移动平均来自适应地调整学习率。
1.2 实现流程
设 θ \theta θ是需要优化的参数向量, g t g_{t} gt是在第t次迭代时损失函数关于参数 θ \theta θ的梯度,即 g t = ∇ θ J ( θ t ) g_{t}=\nabla_{\theta}J(\theta_{t}) gt=∇θJ(θt),算法的步骤以及其对应的公式如下:
- 初始化梯度平方的指数加权移动平均 E [ g 2 ] 0 = 0 ⃗ n × 1 E[g^{2}]_{0}=\vec{0}_{n\times_{1}} E[g2]0=0n×1
初始化参数更新量平方的指数加权移动平均 E [ Δ θ 2 ] 0 = 0 ⃗ n × 1 E[\Delta\theta^{2}]_{0}=\vec{0}_{n\times 1} E[Δθ2]0=0n×1
设定衰减率 ρ \rho ρ通常为 0.9 0.9 0.9,无穷小量的常数 ϵ \epsilon ϵ通常为 1 0 − 8 10^{-8} 10−8 - 更新梯度平方的指数加权移动平均: E [ g 2 ] t = ρ E [ g 2 ] t − 1 + ( 1 − ρ ) g t 2 E[g^{2}]_{t}=\rho E[g^{2}]_{t-1}+(1-\rho)g^{2}_{t} E[g2]t=ρE[g2]t−1+(1−ρ)gt2(这里的运算都是使用numpy的广播机制来进行运算的)
计算参数更新量: Δ θ t = − E [ Δ θ 2 ] t − 1 + ϵ E [ g 2 ] t + ϵ ⊙ g t \Delta\theta_{t}=-\frac{\sqrt{ E[\Delta\theta^{2}]_{t-1}+\epsilon }}{\sqrt{ E[g^{2}]_{t}+\epsilon}}\odot g_{t} Δθt=−E[g2]t+ϵE[Δθ2]t−1+ϵ⊙gt(使用numpy的广播机制更好运算)
这里,分子 E [ Δ θ 2 ] t − 1 + ϵ \sqrt{ E[\Delta\theta^{2}]_{t-1}+\epsilon } E[Δθ2]t−1+ϵ可以看作是参数更新量的估计,分母 E [ g 2 ] t − 1 + ϵ \sqrt{ E[g^{2}]_{t-1}+\epsilon} E[g2]t−1+ϵ对梯度进行了归一化处理,从而实现了自适应学习率的调整 - 更新参数: θ t + 1 = θ t + η Δ θ t \theta_{t+1}=\theta_{t}+\eta\Delta\theta_{t} θt+1=θt+ηΔθt
更新梯度平方的指数加权移动平均: E [ Δ θ 2 ] t = ρ E [ Δ θ 2 ] t − 1 + ( 1 − ρ ) Δ θ t 2 E[\Delta\theta^{2}]_{t}=\rho E[\Delta\theta^{2}]_{t-1}+(1-\rho)\Delta\theta^{2}_{t} E[Δθ2]t=ρE[Δθ2]t−1+(1−ρ)Δθt2
二、代码实现
2.1 函数代码
# 定义Adadelta函数
def adadelta_optimizer(X, y, eta, num_iter=1000, rho=0.01, epsilon=1e-8, threshold=1e-8):"""X: 数据 x mxn,可以在传入数据之前进行数据的归一化y: 数据 y nx1eta: 学习率num_iter: 迭代次数rho: 衰减率epsilon: 无穷小threshold: 阈值"""# 初始化参数m, n = X.shapetheta, E_g2, E_theta2, loss_ = np.random.rand(n, 1), np.zeros((n, 1)), np.zeros((n, 1)), [] # n x 1, loss_存储损失率的变化for _ in range(num_iter):# 开始迭代# 使用点积计算预测值h = X.dot(theta)# 计算误差error = h - yloss_.append(np.mean(error ** 2) / 2)# 计算梯度gradient = (1/m) * X.T.dot(error)E_g2 = rho * E_g2 + (1 - rho) * np.pow(gradient, 2) # 更新梯度平方的指数加权移动平均 # 在运算过程中,可能会由于误差的影响,可能会出现负数的情况,使得我们的模型无法运行,增强模型的稳定性E_g2 = np.maximum(E_g2, 0)E_theta2 = np.maximum(E_theta2, 0)delta_theta = - np.multiply(np.sqrt(E_theta2 + epsilon) / np.sqrt(E_g2 + epsilon), gradient) # 计算参数更新量theta = theta + eta * delta_theta # 更新参数E_theta2 = rho * E_theta2 + (1 - rho) * delta_theta ** 2if (_ > 1) and (abs(loss_[-1] - loss_[-2]) < threshold):print(f"Converged at iteration {_ + 1}")breakreturn theta.flatten(), loss_
2.2 总代码
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['Microsoft YaHei'] # 定义Adadelta函数
def adadelta_optimizer(X, y, eta, num_iter=1000, rho=0.01, epsilon=1e-8, threshold=1e-8):"""X: 数据 x mxn,可以在传入数据之前进行数据的归一化y: 数据 y nx1eta: 学习率num_iter: 迭代次数rho: 衰减率epsilon: 无穷小threshold: 阈值"""# 初始化参数m, n = X.shapetheta, E_g2, E_theta2, loss_ = np.random.rand(n, 1), np.zeros((n, 1)), np.zeros((n, 1)), [] # n x 1, loss_存储损失率的变化for _ in range(num_iter):# 开始迭代# 使用点积计算预测值h = X.dot(theta)# 计算误差error = h - yloss_.append(np.mean(error ** 2) / 2)# 计算梯度gradient = (1/m) * X.T.dot(error)E_g2 = rho * E_g2 + (1 - rho) * np.pow(gradient, 2) # 更新梯度平方的指数加权移动平均 # 在运算过程中,可能会由于误差的影响,可能会出现负数的情况,使得我们的模型无法运行,增强模型的稳定性E_g2 = np.maximum(E_g2, 0)E_theta2 = np.maximum(E_theta2, 0)delta_theta = - np.multiply(np.sqrt(E_theta2 + epsilon) / np.sqrt(E_g2 + epsilon), gradient) # 计算参数更新量theta = theta + eta * delta_theta # 更新参数E_theta2 = rho * E_theta2 + (1 - rho) * delta_theta ** 2if (_ > 1) and (abs(loss_[-1] - loss_[-2]) < threshold):print(f"Converged at iteration {_ + 1}")breakreturn theta.flatten(), loss_# 生成一些示例数据
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
# 添加偏置项
X_b = np.c_[np.ones((100, 1)), X]# 超参数
eta = 2 # 通过调试设置的,使其可以更快的移动,进而使得在较小的迭代次数内损失函数可以收敛theta, loss_ = adadelta_optimizer(X_b, y, eta)print("最优参数 theta:")
print(theta)
plt.plot(range(len(loss_)), loss_, label="损失函数图像")
plt.title("损失函数图像")
plt.xlabel("迭代次数")
plt.ylabel("损失值")
plt.show()

三、优缺点
3.1 优点
自适应调整学习率:Adadelta 能够根据参数的梯度变化自适应地调整每个参数的学习率。它通过计算梯度平方的指数加权移动平均和参数更新量平方的指数加权移动平均,动态地为不同参数分配合适的学习率。对于梯度变化较大的参数,学习率会自动减小;对于梯度变化较小的参数,学习率会相对增大。这种自适应机制使得算法在处理不同尺度和变化频率的梯度时表现出色,尤其适用于处理稀疏数据,因为稀疏数据中某些特征的梯度可能很少出现,Adadelta 可以为这些特征的参数提供较大的学习率,促进模型学习。
无需手动设置全局学习率:与一些需要手动精细调整全局学习率的优化算法(如随机梯度下降)不同,Adadelta 不需要用户指定全局学习率。它在算法内部通过自身的机制来确定每个参数的有效学习率,减少了超参数调优的工作量。这对于缺乏经验的使用者或者在大规模实验中快速尝试不同模型时非常方便,降低了调参的难度和时间成本。
缓解学习率衰减问题:Adagrad 算法会累积所有历史梯度的平方和,随着迭代次数的增加,学习率会不断减小,最终可能变得极小,导致参数更新极其缓慢甚至停滞。Adadelta 通过引入指数加权移动平均,只关注近期的梯度信息,避免了学习率的过度衰减。这使得算法在训练后期仍然能够继续更新参数,保持一定的收敛速度,提高了模型的训练效率和最终性能。
收敛相对稳定:Adadelta 在优化过程中,由于自适应学习率的调整,能够在一定程度上避免梯度的剧烈波动,使得参数更新更加平稳。相比一些使用固定学习率的算法,Adadelta 更不容易出现因学习率过大导致的参数震荡发散,或者因学习率过小导致的收敛缓慢问题,能够更稳定地朝着最优解收敛。
3.2 缺点
对衰减率敏感:Adadelta 算法中有一个重要的超参数 ρ \rho ρ(衰减率),它控制着指数加权移动平均中历史信息和当前信息的权重。 ρ \rho ρ的取值会显著影响算法的性能。如果 ρ \rho ρ设置过大,算法会过于依赖历史梯度信息,对当前梯度的变化反应迟钝,可能导致收敛速度变慢;如果 ρ \rho ρ设置过小,算法会过于关注当前梯度,容易受到噪声的影响,使收敛过程不稳定,甚至可能无法收敛到最优解。确定合适的 ρ \rho ρ值通常需要进行大量的实验和调优。
计算复杂度较高:Adadelta 需要维护两个指数加权移动平均,即梯度平方的指数加权移动平均和参数更新量平方的指数加权移动平均。这意味着在每次迭代中,除了计算梯度和更新参数外,还需要额外计算和更新这两个移动平均,增加了计算量和内存开销。对于大规模的深度学习模型,尤其是具有大量参数的模型,这种额外的计算负担可能会导致训练时间显著增加,对计算资源的要求也更高。
四、相关链接
Python 梯度下降法合集:
- Python 梯度下降法(一):Gradient Descent-CSDN博客
- Python 梯度下降法(二):RMSProp Optimize-CSDN博客
- Python 梯度下降法(三):Adagrad Optimize-CSDN博客
- Python 梯度下降法(四):Adadelta Optimize-CSDN博客
- Python 梯度下降法(五):Adam Optimize-CSDN博客
- Python 梯度下降法(六):Nadam Optimize-CSDN博客
- Python 梯度下降法(七):Summary-CSDN博客
相关文章:
Python 梯度下降法(四):Adadelta Optimize
文章目录 Python 梯度下降法(四):Adadelta Optimize一、数学原理1.1 介绍1.2 实现流程 二、代码实现2.1 函数代码2.2 总代码 三、优缺点3.1 优点3.2 缺点 四、相关链接 Python 梯度下降法(四):Adadelta Opt…...
旅行的意义:“诗与远方”和在旅途中找寻真我
原文链接:旅行的意义:“诗与远方”和在旅途中找寻真我 困在格子间,心向远方 清晨,闹钟催促,打工人挣扎起床出门。地铁拥挤,工作繁忙,加班成常态,下班时夜幕已深,满心疲惫…...
leetcode——将有序数组转化为二叉搜索树(java)
给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵 平衡 二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9] 输出:[0,-3,9,-10,null,5] 解释:[0,-10,5,null,-3,null,9] 也将被视为正确答…...
6 齐次坐标模块(homogen.rs)
homogen.rs代码定义了一个名为 HomogeneousVector 的结构体,它是用于表示三维空间中的齐次向量。齐次向量常用于计算机图形学和几何学中,特别是在处理投影和变换时。下面是对这段代码的详细解释和一些关键的代码片段分析: 一、homogen.rs文件…...
007 JSON Web Token
文章目录 https://doc.hutool.cn/pages/jwt/#jwt%E4%BB%8B%E7%BB%8D JWT是一种用于双方之间安全传输信息的简洁的、URL安全的令牌标准。这个标准由互联网工程任务组(IETF)发表,定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。…...
Cursor 背后的技术栈:从 VS Code 到 AI 集成
引言 在当今快速发展的软件开发领域,开发者工具正在经历一场由人工智能(AI)驱动的革命。Cursor 作为一款新兴的智能编程助手,凭借其强大的 AI 能力和高效的开发体验,迅速吸引了大量开发者的关注。Cursor 不仅继承了 V…...
【Python蓝桥杯备赛宝典】
文章目录 一、基础数据结构1.1 链表1.2 队列1.3 栈1.4 二叉树1.5 堆二、基本算法2.1 算法复杂度2.2 尺取法2.3 二分法2.4 三分法2.5 倍增法和ST算法2.6 前缀和与差分2.7 离散化2.8 排序与排列2.9 分治法2.10贪心法1.接水时间最短问题2.糖果数量有限问题3.分发时间最短问题4.采摘…...
前端js高级25.1.30
原型:函数的组成结构 通过这个图我们需要知道。 假设我们创建了一个Foo函数。 规则:Function.protoType是函数显示原型。__proto__是隐式对象。 Function、Object、Foo函数的__proto__指向了Function.protoType说明。这三个都依托function函数来创建。…...
【后端开发】字节跳动青训营之性能分析工具pprof
性能分析工具pprof 一、测试程序介绍二、pprof工具安装与使用2.1 pprof工具安装2.2 pprof工具使用 资料链接: 项目代码链接实验指南pprof使用指南 一、测试程序介绍 package mainimport ("log""net/http"_ "net/http/pprof" // 自…...
云原生(五十二) | DataGrip软件使用
文章目录 DataGrip软件使用 一、DataGrip基本使用 二、软件界面介绍 三、附件文件夹到项目中 四、DataGrip设置 五、SQL执行快捷键 DataGrip软件使用 一、DataGrip基本使用 1. 软件界面介绍 2. 附加文件夹到项目中【重要】 3. DataGrip配置 快捷键使用:C…...
FreeRTOS学习 --- 任务调度
开启任务调度器 作用:用于启动任务调度器,任务调度器启动后, FreeRTOS 便会开始进行任务调度 该函数内部实现,如下: 1、创建空闲任务(优先级最低) 2、如果使能软件定时器,则创建定…...
2025年人工智能技术:Prompt与Agent的发展趋势与机遇
文章目录 一、Prompt与Agent的定义与区别(一)定义(二)区别二、2025年Prompt与Agent的应用场景(一)Prompt的应用场景(二)Agent的应用场景三、2025年Prompt与Agent的适合群体(一)Prompt适合的群体(二)Agent适合的群体四、2025年Prompt与Agent的发展机遇(一)Prompt的…...
区块链 智能合约安全 | 回滚攻击
视频教程在我主页简介和专栏里 目录: 智能合约安全 回滚攻击 总结 智能合约安全 回滚攻击 回滚攻击的本质是”耍赖” 举一个简单的例子,两个人玩石头剪刀布,输了的给对方10块钱,现在A输了,A说这把不算,重来 放在Solidity中,require()函数会检测其中的条件是否满…...
【Go语言圣经】第六节:方法
第六章:方法 6.1 方法声明 在函数声明时,在其名字之前放上一个变量,这就是声明了变量对应类型的一个方法,相当于为这种类型定义了一个独占的方法。 下例为 Point 类型声明了计算两个点之间距离的方法: package mai…...
【JavaEE进阶】图书管理系统 - 壹
目录 🌲序言 🌴前端代码的引入 🎋约定前后端交互接口 🚩接口定义 🍃后端服务器代码实现 🚩登录接口 🚩图书列表接口 🎄前端代码实现 🚩登录页面 🚩…...
TensorFlow 简单的二分类神经网络的训练和应用流程
展示了一个简单的二分类神经网络的训练和应用流程。主要步骤包括: 1. 数据准备与预处理 2. 构建模型 3. 编译模型 4. 训练模型 5. 评估模型 6. 模型应用与部署 加载和应用已训练的模型 1. 数据准备与预处理 在本例中,数据准备是通过两个 Numpy 数…...
docker安装Redis:docker离线安装Redis、docker在线安装Redis、Redis镜像下载、Redis配置、Redis命令
一、镜像下载 1、在线下载 在一台能连外网的linux上执行docker镜像拉取命令 docker pull redis:7.4.0 2、离线包下载 两种方式: 方式一: -)在一台能连外网的linux上安装docker执行第一步的命令下载镜像 -)导出 # 导出镜像…...
Retrieval-Augmented Generation for Large Language Models: A Survey——(1)Overview
Retrieval-Augmented Generation for Large Language Models: A Survey——(1)Overview 文章目录 Retrieval-Augmented Generation for Large Language Models: A Survey——(1)Overview1. Introduction&Abstract1. LLM面临的问题2. RAG核心三要素3. RAG taxonomy 2. Overv…...
LabVIEW透镜多参数自动检测系统
在现代制造业中,提升产品质量检测的自动化水平是提高生产效率和准确性的关键。本文介绍了一个基于LabVIEW的透镜多参数自动检测系统,该系统能够在单一工位上完成透镜的多项质量参数检测,并实现透镜的自动搬运与分选,极大地提升了检…...
什么是Maxscript?为什么要学习Maxscript?
MAXScript是Autodesk 3ds Max的内置脚本语言,它是一种与3dsMax对话并使3dsMax执行某些操作的编程语言。它是一种脚本语言,这意味着您不需要编译代码即可运行。通过使用一系列基于文本的命令而不是使用UI操作,您可以完成许多使用UI操作无法完成的任务。 Maxscript是一种专有…...
Redis|前言
文章目录 什么是 Redis?Redis 主流功能与应用 什么是 Redis? Redis,Remote Dictionary Server(远程字典服务器)。Redis 是完全开源的,使用 ANSIC 语言编写,遵守 BSD 协议,是一个高性…...
128周二复盘(164)学习任天堂
1.设计相关 研究历史上某些武器数值,对一些设定进行参数修改。兼顾真实性,合理性,娱乐性。 学习宫本茂游戏思想,简单有趣-重玩性,风格化个性化-反拟真。对堆难度与内容的反思。 后续将学习岩田聪以及别的任天堂名人的…...
LeetCode:63. 不同路径 II
跟着carl学算法,本系列博客仅做个人记录,建议大家都去看carl本人的博客,写的真的很好的! 代码随想录 LeetCode:63. 不同路径 II 给定一个 m x n 的整数数组 grid。一个机器人初始位于 左上角(即 grid[0][0]…...
VUE之组件通信(一)
1、props 概述:props是使用频率最高的一种通信方式,常用与:父<——>子。 若 父传子:属性值是非函数。若 子传父:属性值是函数。 父组件: <template><div class"father">&l…...
ESP32-S3模组上跑通esp32-camera(41)
接前一篇文章:ESP32-S3模组上跑通esp32-camera(40) 一、OV5640初始化 2. 相机初始化及图像传感器配置 上一回继续对reset函数的后一段代码进行解析。为了便于理解和回顾,再次贴出reset函数源码,在components\esp32-camera\sensors\ov5640.c中,如下: static int reset…...
本地部署DeepSeek R1:打造专属私人AI助手指南
在当今人工智能蓬勃发展的浪潮中,DeepSeek R1模型的本地部署为用户带来了全新的体验。它不仅能够保障数据隐私,还具备与商业AI模型相媲美的出色性能。随着计算能力的不断提升以及开源AI社区的日益壮大,用户如今可以在本地运行高性能AI模型&am…...
Redis-布隆过滤器
文章目录 布隆过滤器的特点:实践布隆过滤器应用 布隆过滤器的特点: 就可以把布隆过滤器理解为一个set集合,我们可以通过add往里面添加元素,通过contains来判断是否包含某个元素。 布隆过滤器是一个很长的二进制向量和一系列随机映射函数。 可以用来检索…...
OpenCV 版本不兼容导致的问题
问题和解决方案 今天运行如下代码,发生了意外的错误,代码如下,其中输入的 frame 来自于 OpenCV 开启数据流的读取 """ cap cv2.VideoCapture(RTSP_URL) print("链接视频流完成") while True:ret, frame cap.rea…...
【视频+图文详解】HTML基础3-html常用标签
图文教程 html常用标签 常用标签 1. 文档结构 <!DOCTYPE html>:声明HTML文档类型。<html>:定义HTML文档的根元素。<head>:定义文档头部,包含元数据。<title>:设置网页标题,浏览…...
【B站保姆级视频教程:Jetson配置YOLOv11环境(五)Miniconda安装与配置】
Jetson配置YOLOv11环境(5)Miniconda安装与配置 文章目录 0. Anaconda vs Miniconda in Jetson1. 下载Miniconda32. 安装Miniconda33. 换源3.1 conda 换源3.2 pip 换源 4. 创建环境5. 设置默认启动环境 0. Anaconda vs Miniconda in Jetson Jetson 设备资…...
