十三、机器学习进阶知识:神经网络之反向传播算法(自适应矩估计算法Adam变形形式之Adamax、Nadam)

本文介绍了Adam算法的两种变形——Adamax和Nadam,详细阐述了它们的原理,并以三层神经网络为例,展示了如何在数据预测中应用这两种算法。通过对某省市土壤重金属元素数据集的训练和测试,分析了算法效果。
摘要由CSDN通过智能技术生成

自适应矩估计算法(Adam)的两种变形形式

自适应矩估计算法的基础上还进一步提出了两种变形,一种变形的英文名称为Adamax,另一种变形的英文名称为Nadam。
自适应矩估计算法原理参考:
神经网络之反向传播算法(自适应矩估计算法Adam)

1、Adamax算法原理

Adamax主要对最后参数的更新量计算公式进行了调整,原式中的分母部分为对二阶矩估计进行如下开方:
在这里插入图片描述
而Adamax采用了下列公式进行该部分的确定:
在这里插入图片描述
ρ_2为衰减率,g_t为当前第t次迭代时的梯度值。
梯度g的计算原理参考:
神经网络之反向传播算法(梯度、误差反向传播算法BP)

之后采用下列公式对参数的调整量进行计算:
在这里插入图片描述

此算法的主要特点在于为学习率提供了一个更加简单的上限范围。

2、Nadam算法原理

Nadam相对Adamax来说更加简单,此算法相当于将Nestrov动量法的临时梯度思想引入了自适应矩估计算法之中,在每次对梯度进行计算时先获得一个参数临时更新量,对参数进行临时更新后计算获得临时梯度,利用临时梯度对一阶矩与二阶矩进行估计,并使用临时一阶矩与二阶矩来计算参数的更新量。
Nestrov动量法原理参考:
神经网络之反向传播算法(加入Nesterov动量的误差反向传播算法)

3、算法实现

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

3.1 Adamax训练过程

#库的导入
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)

#用于计算一阶矩估计与二阶矩估计的函数,其中s为一阶矩估计,r为二阶矩估计,delta为梯度值,
#,0.9和0.999分别表示两个衰减系数,0.1为1-衰减系数的计算结果
def accumulation(s,r,delta):
    s = 0.9 * s + 0.1 * delta
    r = max((0.999*r),abs(delta))
    return  s,r
#参数更新函数,w为待更新参数,s与r分别为修正后的一阶矩估计和二阶矩估计
def adjust(s,r,w):
    change1 =r + 0.000001
    change2 =s/change1
    change = (-0.001)*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(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)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

七层楼的疯子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值