均方根反向传播算法(RMSProp)
自适应梯度算法(Adaptive gradient algorithm,Adagrad)让每个参数在迭代过程中按照不同的学习率进行自适应调整,但其本身仍存在问题,由于该算法对梯度值进行不断的累积平方,因此无论数据特征如何,在达到一定的迭代次数后,累积平方会累加到一个较大值,此时计算得到的学习率将会变得极小,并会导致每次参数的更新量变得极小,最后更新速度停滞,训练也会随之结束。
为解决上述问题,研究者们在该算法的基础上提出了均方根反向传播算法(Root mean square BackPropagation,RMSProp)。
自适应梯度算法(Adagrad)原理参考:
神经网络之反向传播算法(自适应梯度算法Adagrad)
1、算法原理
均方根反向传播相较于自适应梯度算法的主要改进点为对累积梯度的计算方式进行了调整,具体的计算公式如下:
其中ρ为衰减系数。
梯度g的计算原理参考:
神经网络之反向传播算法(梯度、误差反向传播算法BP)
在对梯度平方进行累积时,主要目的在于对过去历史梯度信息的获取,而上述计算公式中衰减系数的加入则可以控制历史梯度信息获取量的多少,它相当于采用了一个变量均方根来记录历史更新次数里的梯度平方的平均值,并以此作为对学习率进行调整的主要依据。采用此方法最大的一个优点在于无论迭代多少次,参数的调整量是以历史梯度信息的平均值作为参考依据,因此其参数的更新量相对来说更加缓和,也不会出现更新速度停滞、训练提前结束的情况。
综上所述,均方根反向传播算法的算法核心思想可以视作给每一个参数设置一个均方值来计算历史梯度平方的平均值,之后再以全局学习率除以该均方值来获得此迭代次数下学习率,最后以此学习率与当下梯度值相乘获得参数的更新量。
将均方根反向传播算法应用于神经网络反向传播过程时的算法步骤如下:
- 随机初始化神经网络中所有的参数;
- 设置全局学习率μ、参数δ及衰减系数ρ,初始化梯度的累积平方;
- 输入数据,按照前向传播过程计算网络的输出;
- 使用损失函数计算误差值;
- 根据误差值计算出隐含层、输出层每个参数的均方值;
- 根据每个参数对应均方值、全局学习率计算其更新量;
- 利用更新量对参数进行更新;
- 重复步骤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为当前梯度,另外0.01为学习率
def adjust(w,r,delta):
change1 =(0.000001+r) ** (0.5)
change2 =delta/change1
change = (-0.01)*change2
w = w + change
return w
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"]
Cr = np.array