自适应学习率调整算法(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的情况而设置的极小值。
将自适应梯度算法应用于神经网络反向传播过程时的算法步骤如下:
- 随机初始化神经网络中所有的参数;
- 设置累积梯度和移动步长项计算公式中的衰减系数,初始化梯度的累积平方与移动步长项为0;
- 输入数据,按照前向传播过程计算网络的输出;
- 使用损失函数计算误差值;
- 根据误差值计算出隐含层、输出层每个参数的梯度项;
- 计算梯度累积平方,移动步长项;
- 利用梯度累积平方、移动步长项计算参数更新量,之后更新参数;
- 重复步骤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)*delta
w = w - change
#0.9为衰减系数,0.1为1-衰减系数的计算结果
c = 0.9 * c + 0.1 * (change**2)
return w,c
maxepochs = 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"