神经网络之反向传播算法(自适应学习率调整算法Adadelta)
创始人
2025-05-31 08:58:48

文章目录

  • 自适应学习率调整算法(Adadelta)
  • 1、算法原理
  • 2、算法实现
    • 2.1 训练过程
    • 2.2 测试过程及结果
  • 3、参考源码及数据集

自适应学习率调整算法(Adadelta)

自适应学习率调整算法(Adadelta)可以视作是自适应梯度算法(Adagrad)的一种扩展,自适应梯度法在迭代过程中累加了过去所有的梯度平方,而自适应学习率调整算法与均方根反向传播算法(RMSProp)类似,在这一阶段引入了衰减系数来对梯度累积平方公式进行调整。但是与均方根反向传播算法相比,这两种算法在学习率的设置上也有很大区别,均方根反向传播算法主要使用全局学习率对参数调整步长进行控制,而在自适应学习率调整算法中,使用了专门的移动步长项来代替全局学习率。

自适应梯度算法(Adagrad)原理参考:
神经网络之反向传播算法(自适应梯度算法Adagrad)
均方根反向传播算法(RMSProp)原理参考:
神经网络之反向传播算法(均方根反向传播算法RMSProp)

1、算法原理

自适应学习率调整算法的累计梯度的计算方式与均方根反向传播算法(RMSProp)相同,假设对某个参数计算的梯度值为g,累积梯度的计算公式如下:
在这里插入图片描述

其中ρ为衰减系数。
梯度g的计算原理参考:
神经网络之反向传播算法(梯度、误差反向传播算法BP)

移动步长项的计算公式如下:
在这里插入图片描述

其中θ_(t+1)表示第t+1次迭代时参数的移动步长值,θ_t表示第t次迭代时参数的移动步长值,此移动步长的初始值为0,ρ为衰减系数,v_t表示第t次迭代时参数的更新量。
对参数进行更新时,具体的更新量的计算公式如下:
在这里插入图片描述

其中r_(t+1)表示第t+1次迭代时的累计梯度平方,g_(t+1)表示第t+1次迭代时的梯度值,ε为避免出现分母为0的情况而设置的极小值。
将自适应梯度算法应用于神经网络反向传播过程时的算法步骤如下:

  1. 随机初始化神经网络中所有的参数;
  2. 设置累积梯度和移动步长项计算公式中的衰减系数,初始化梯度的累积平方与移动步长项为0;
  3. 输入数据,按照前向传播过程计算网络的输出;
  4. 使用损失函数计算误差值;
  5. 根据误差值计算出隐含层、输出层每个参数的梯度项;
  6. 计算梯度累积平方,移动步长项;
  7. 利用梯度累积平方、移动步长项计算参数更新量,之后更新参数;
  8. 重复步骤3到步骤7,当满足停止迭代条件时输出训练后的参数。

参数初始化方法参考:
神经网络基础知识之参数初始化

2、算法实现

以数据预测为例,下面介绍自适应学习率调整算法的实现过程,将自适应学习率调整算法应用于普通的三层神经网络(输入层、隐含层、输出层)的反向传播过程。
选用某省市的表层土壤重金属元素数据集作为实验数据,该数据集总共96组,随机选择其中的24组作为测试数据集,72组作为训练数据集。选取重金属Ti的含量作为待预测的输出特征,选取重金属Co、Cr、Mg、Pb作为模型的输入特征。

2.1 训练过程

#库的导入
import numpy as np
import pandas as pd#激活函数tanh
def tanh(x):return (np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))
#激活函数偏导数
def de_tanh(x):return (1-x**2)#梯度累积平方计算函数,0.9为衰减系数,0.1为1-衰减系数的计算结果,输入参数r为累积梯度平方,delta为当前梯度
def accumulation(r,delta):r = 0.9 * r + 0.1 * (delta**2)return  r
#参数更新计算函数,输入参数w为原参数值,r为累积梯度值,delta为梯度值,c为移动步长项
def adjust(w,r,delta,c):#0.000001是为了避免出现分子、分母为0的情况change1 =(0.000001+c)/(0.000001+r)#change为参数更新量change =(change1**0.5)*deltaw = w - change#0.9为衰减系数,0.1为1-衰减系数的计算结果c = 0.9 * c + 0.1 * (change**2)return w,cmaxepochs = 1000  #迭代训练次数
errorfinal = 0.65*10**(-3)  #停止训练误差阈值
samnum = 72  #输入数据数量
indim = 4  #输入层节点数
outdim = 1  #输出层节点数
hiddenunitnum = 8  #隐含层节点数#输入数据的导入
df = pd.read_csv("train.csv")
df.columns = ["Co", "Cr", "Mg", "Pb", "Ti"]
Co = df["Co"]
Co = np.array(Co)
Cr = df["Cr"]
Cr = np.array(Cr)
Mg=df["Mg"]
Mg=np.array(Mg)
Pb = df["Pb"]
Pb =np.array(Pb)
Ti = df["Ti"]
Ti = np.array(Ti)
samplein = np.mat([Co,Cr,Mg,Pb])
sampleout = np.mat([Ti])
#数据归一化,将输入数据压缩至0到1之间,便于计算,后续通过反归一化恢复原始值
sampleinminmax = np.array([samplein.min(axis=1).T.tolist()[0],samplein.max(axis=1).T.tolist()[0]]).transpose()
sampleoutminmax = np.array([sampleout.min(axis=1).T.tolist()[0],sampleout.max(axis=1).T.tolist()[0]]).transpose()
sampleinnorm = (2*(np.array(samplein.T)-sampleinminmax.transpose()[0])/(sampleinminmax.transpose()[1]-sampleinminmax.transpose()[0])-1).transpose()
sampleoutnorm = (2*(np.array(sampleout.T)-sampleoutminmax.transpose()[0])/(sampleoutminmax.transpose()[1]-sampleoutminmax.transpose()[0])-1).transpose()
sampleinmax = np.array([sampleinnorm.max(axis=1).T.tolist()]).transpose()
sampleinmin = np.array([sampleinnorm.min(axis=1).T.tolist()]).transpose()#为归一化后的数据添加噪声
noise = 0.03*np.random.rand(sampleoutnorm.shape[0],sampleoutnorm.shape[1])
sampleoutnorm += noise
sampleinnorm = np.mat(sampleinnorm)#利用归一化后的输入数据初始化参数w1、b1、w2、b2
dvalue = sampleinmax-sampleinmin
valuemid=(sampleinmin+sampleinmax)/2
wmag=0.7*(hiddenunitnum**(1/indim))
rand1=np.random.rand(hiddenunitnum,outdim)
rand2=np.random.randn(hiddenunitnum,indim)
rand1=rand1*wmag
rand2=rand2*wmag
b1=rand1-np.dot(rand2,valuemid)
for i in range(hiddenunitnum):for j in range(indim):rand2[i][j]=(2*rand2[i][j])/dvalue[j]
w1=rand2
w2 = np.random.uniform(low=-1, high=1, size=[outdim,hiddenunitnum])
b2 = np.random.uniform(low=-1, high=1, size=[outdim,1])#参数w1、b1、w2、b2均为矩阵形式参与计算,其形状依次为8*4,8*1,1*8,1*1
w1 = np.mat(w1)
b1 = np.mat(b1)
w2 = np.mat(w2)
b2 = np.mat(b2)#errhistory存储每次训练后的预测值与真实值的误差
errhistory = []#rw1、rb1,rw2,rb2分别保存参数w1、b1、w2、b2的累积梯度,其形状与w1、b1、w2、b2一一对应
rw2 = np.zeros((1,8))
rb2 = np.zeros((1,1))
rw1 = np.zeros((8,4))
rb1 = np.zeros((8,1))#cw1、cb1,cw2,cb2分别保存参数w1、b1、w2、b2的移动步长项,其形状与w1、b1、w2、b2一一对应
cw2 = np.zeros((1,8))
cb2 = np.zeros((1,1))
cw1 = np.zeros((8,4))
cb1 = np.zeros((8,1))for i in range(maxepochs):#前向传播#计算隐含层输出hiddenout,输出层输出networkouthiddenout = tanh((np.dot(w1,sampleinnorm).transpose()+b1.transpose())).transpose()networkout = np.dot(w2,hiddenout).transpose()+b2.transpose()for j in range(samnum):networkout[j,:] = tanh(networkout[j,:])networkout = networkout.transpose()#计算损失函数err = sampleoutnorm - networkoutloss = np.sum(np.abs(err))/samnumsse = np.sum(np.square(err))#判断是否满足停止训练条件errhistory.append(sse)if sse < errorfinal:break#反向传播#利用损失函数计算结果和激活函数偏导数,来计算参数w1、b1、w2、b2的梯度值delta2 = np.zeros((outdim,samnum))for n in range(samnum):delta2[:,n] = (-1) * err[:,n] * de_tanh(networkout[:,n])delta1 = np.zeros((hiddenunitnum,samnum))for e in range(samnum):for f in range(hiddenunitnum):delta1[f,e] = w2[:,f] * delta2[:,e] * de_tanh(hiddenout[f,e])dw2now = np.dot(delta2,hiddenout.transpose()) #1*8db2now = np.dot(delta2,np.ones((samnum,1))) #1*1dw1now = np.dot(delta1,sampleinnorm.transpose()) #8*4db1now = np.dot(delta1,np.ones((samnum,1))) #8*1dw2now = dw2now/samnumdb2now = db2now/samnumdw1now = dw1now/samnumdb1now = db1now/samnum# 先更新输出层参数# w2更新,依次更新w2的梯度累积平方、w2、w2的当前移动步长项for m in range(hiddenunitnum):rw2[:,m] = accumulation(rw2[:,m],dw2now[:,m])w2[:,m],cw2[:,m]= adjust(w2[:,m],rw2[:,m],dw2now[:,m],cw2[:,m])#b2更新,依次更新b2的梯度累积平方、b2、b2的当前移动步长项rb2 = accumulation(rb2,db2now)b2,cb2 = adjust(b2,rb2,db2now,cb2)#更新隐含层参数#w1更新,依次更新w1的梯度累积平方、w1、w1的当前移动步长项for a in range(hiddenunitnum):for b in range(indim):rw1[a,b] = accumulation(rw1[a,b],dw1now[a,b])w1[a,b],cw1[a,b] = adjust(w1[a,b],rw1[a,b],dw1now[a,b],cw1[a,b] )#b1更新,依次更新b1的梯度累积平方、b1、b1的当前移动步长项for n in range(hiddenunitnum):rb1[n,:] = accumulation(rb1[n,:],db1now[n,:])b1[n,:],cb1[n,:] = adjust(b1[n,:],rb1[n,:],db1now[n,:],cb1[n,:])print("the generation is:",i,",the loss is:",loss)#达到最大训练次数,保存此时的参数w1、b1、w2、b2
np.save("w1.npy",w1)
np.save("b1.npy",b1)
np.save("w2.npy",w2)
np.save("b2.npy",b2)

2.2 测试过程及结果

测试过程只需要利用训练过程生成的相关参数,对测试数据执行一次前向传播过程来获得预测值,之后可使用相关的误差指标对预测值进行评价,详细的测试过程源码见参考源码及数据集。
在这里插入图片描述

3、参考源码及数据集

参考源码及数据集

相关内容

热门资讯

郎酒,在端午奏响一曲“心曲” 赤水河畔,端午风暖。 5月31日,郎酒庄园内,一年一度的端午制曲大典如期而至。今年端午的郎酒庄园,格...
蔚来公司5月交付新车23231... 新京报贝壳财经讯 6月1日,据蔚来官方微博消息,2025年5月,蔚来公司交付新车23231台,同比增...
智慧轨道交通运维监控解决方案         交通作为国民经济和社会发展的基础性、先行性产业,在整个社会经济、民生发...
GIT版本控制工具 Git版本控制工具 第一章 版本控制工具简介 1.版本控制工具的发展历史经过: 原始人工维护状态&#...
d的模板别名问题 原文 struct Matrix(S, size_t M, size_t N){}alias Vec...
Visual Studio更改... 目录:问题描述一、进入VS界面二、更改并下载.Net Framework目标框架三、N...
鲁政委:贸易环境缓和,产需指数... 鲁政委 郭于玮 张励涵(鲁政委系兴业银行首席经济学家、中国首席经济学家论坛理事)PMI5月制造业、服...
RK3588 Android1... 调试前先找模块厂获取相关资料Kernel修改:供电引脚,我是自己写的驱动...
SQL:exists/not ... exists/not existsselect * from table_name where [n...
mysql-windows安装... 下载 https://mirrors.tools.huawei.com/mysql/Download...
C++IO流(1) @TOC C++IO流 C++流 流就是若干字节组成字节序...
燕翔:5月份PMI数据点评:P... 燕翔 朱成成 许茹纯 杨文吉(燕翔 系方正证券首席经济学家、中国首席经济学家论坛理事)核心结论5月份...
高瑞东:“抢出口”带动制造业P... 高瑞东 刘星辰(高瑞东 系光大证券首席经济学家、中国首席经济学家论坛理事)核心观点事件:2025年5...
GuLi商城-SpringCl... 当微服务数量很庞大时,将所有配置都书写到一个配置文件中,显然不是太合适。...
1.freertos应用系列之... freertos应用全系列(写完关联更新) 01.freertos应用系...
CSS的浮动(上) 🌟所属专栏:前端只因变凤凰之路🐔作者简介:...
上市首秀后,霸王茶姬能睡个好觉... 5月30日晚,不久前赴美上市的霸王茶姬发布了上市以来首份季度财报,GMV、净收入和利润等关键经营数据...
AI工具(ChatGPT)常用... 要国内使用AI工具,关注:码视野,回复:10...
工业控制系统背景与概述 工业控制系统背景与概述工业控制系统的背景工业控制系统的重要性工业控制系统的应用工业控制系统的未来发展...
分布式Id的5种应用场景 UUID优点:(1)使用简单(2࿰...
1.5亿就能帮大厂改命了? 1... 出品|虎嗅黄青春频道作者|商业消费主笔黄青春题图|视觉中国5月27日港股盘后,快手向市场递上2025...
循环神经网络(二)(简单循环神... 文章目录简单循环神经网络模型定义模型特点理解简单循环神经网络NumPy 实现keras 实现Refe...
让项目干系人满意的3大要点         1、提升核心干系人的体验         关于项目干系人的分析识别以及相关权利利益矩...
八旬老人花105万买基金亏了3... 红星资本局6月1日消息,近日,裁判文书网披露的一份终审民事判决书显示,一位年过八旬的投资者在2021...
【算法系列之回溯算法】leet... 39. 组合总和 力扣题目链接 给你一个 无重复元素 的整数数组 candidates 和一个目标整...
js值的比较 值的比较 前言: 本篇文章主要介绍了 js 类型值的比较以及相等性检查,...
美国贸易代表办公室延长对中国3... 政策速递经济观察网讯 当地时间5月31日,美国贸易代表办公室宣布,延长对中国在技术转让、知识产权和...
机器学习的模型评估 模型评估 模型分为分类模型 和回归模型 模型简介 类别评估方法简介分类模型准确率(Ac...
赤诚生物终止北交所IPO 原拟... 中国经济网北京6月1日讯 北交所网站2025年5月30日披露关于终止对五峰赤诚生物科技股份有限公司(...
赛事运动激活文旅经济,产业升级... 中国商报(记者 王怡菲)5月15日,国务院召开的做强国内大循环工作推进会强调,要“以国内大循环的内在...