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

自适应矩估计算法(Adam)

自适应矩估计算法从其本质上看可以视作是带有动量项的均方根反向传播算法,一方面它使用动量法中的方式来进行参数历史梯度的累积,从而更好地利用历史信息,另一方面利用梯度的一阶矩估计和二阶矩估计来动态调整每个参数的学习率,在获得更快收敛速度的同时使得波动的幅度更小。
动量法原理参考:
神经网络之反向传播算法(加入动量momentum的误差反向传播算法)
均方根反向传播算法原理参考:
神经网络之反向传播算法(均方根反向传播算法RMSProp)

1、算法原理

在自适应矩估计算法中,主要涉及的参数有学习率μ、衰减率ρ_1与ρ_2、时间步t以及避免出现分母为0的情况而设置的极小值ε。其中衰减率ρ_1与ρ_2为分别针对梯度的一阶矩估计和二阶矩估计而设置,一阶矩估计的计算公式如下:
在这里插入图片描述
二阶矩估计的计算公式如下:
在这里插入图片描述
其中g为梯度值。
梯度g的计算原理参考:
神经网络之反向传播算法(梯度、误差反向传播算法BP)

在对梯度进行一阶矩估计与二阶矩估计之后,需要对这两个值进行偏差修正,对一阶矩的修正方式如下:
在这里插入图片描述
其中s_t^'为修正后的一阶矩,s_t为修正前的一阶矩,t作为时间步长,随着迭代次数的增加而增加,一般与迭代次数相同。
对二阶矩的修正方式与一阶矩完全相同,使用r_t^'表示修正后的二阶矩,r_t表示修正前的二阶矩,衰减率选用ρ_2。
以修正后的一阶矩与二阶矩作为计算依据对参数的更新量进行计算,具体的计算方式如下:
在这里插入图片描述
其中μ为学习率,ε为避免分母为0而设置的参数。
将自适应矩估计算法应用于神经网络反向传播过程时的算法步骤如下:

  1. 随机初始化神经网络中所有的参数;
  2. 设置初始一阶矩、二阶矩、全局学习率以及衰减系数等参数;
  3. 通过损失函数计算获得当前梯度值;
  4. 对时间步长进行计算;
  5. 使用当前梯度值对累积梯度更新以进行一阶矩估计;
  6. 使用当前梯度值对累积梯度平方更新以进行二阶矩估计;
  7. 对一阶矩与二阶矩进行偏差修正;
  8. 通过修正后的一阶矩与二阶矩对参数的更新量进行计算;
  9. 对参数进行更新;
  10. 重复上述步骤3到步骤9,当达到最大停止迭代次数时停止迭代,输出此时的参数值。

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

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)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

七层楼的疯子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值