十三、机器学习进阶知识:神经网络之反向传播算法(加入动量momentum的误差反向传播算法)

本文介绍了动量momentum在深度学习中的应用,它能加速梯度下降并避免局部最优。文章详细阐述了动量算法的原理,即通过指数加权平均历史梯度来调整参数,并给出了结合动量的误差反向传播算法的步骤。此外,还以数据预测为例,展示了在三层神经网络中应用该算法的训练和测试过程。
摘要由CSDN通过智能技术生成

1、动量momentum

在普通的梯度下降法中,一般将梯度值定义对参数进行优化时的调整方向,将学习率定义为朝向调整方向上的移动步长,参数的梯度值的变化曲线通常是波动的不规则曲线,其中存在着多个较低的梯度值,若此时使用学习率对参数进行调整,容易出现陷入局部最优之中,但如果结合历史梯度值对参数进行调整,则可以对参数的优化方向进行调整,以此加快收敛速度并避免陷入局部最优,深度学习的动量(momentum)算法便是以此为目的而提出的。
动量这个概念起源于牛顿运动定律,在此定律中,动量是与物体的质量和速度相关的物理量,而一个物体的动量指的是这个物体在它运动方向上保持运动的趋势。深度学习中的动量则是引入了“速度”这一概念,以变量v作为参数在调整过程中的调整方向和速率,将变量v与学习率相乘并作为每次迭代中参数的调整量,其计算公式为:
在这里插入图片描述

其中μ为学习率,而变量v是通过对梯度值进行指数加权平均计算而来,因此在理解变量v之前首先需要对指数加权平均的原理进行了解。
通常我们通过计算n个数的和之后再除以n,以获得这些数的平均值,这个平均值为它们的算数平均值,而在对许多实际问题进行求平均值时,还需要考虑到每个数据的重要程度,即需要根据这些数据的重要程度来获取它们的加权值,进而通过求和、相除以获得加权平均值,算术平均值一般可以视作是加权平均值的一种特殊形式,即此时每个数据的重要程度是一模一样的。
在上述描述中,变量v是随着迭代的次数而在不断变化的,属于时间序列数据,它反映了变量v随着时间在不断变化的趋势,因此倘若对此类数据求平均值,则需要使用加权移动平均来描述它变化的趋势。指数加权平均又可被称为指数加权移动平均,可以被视作是加权移动平均的改进,是一种常见的序列处理方式。
在梯度下降法中引入动量算法的重要步骤之一就是对参数的梯度值进行指数加权平均,这也是变量v的计算方式,其公式如下:
在这里插入图片描述

其中变量v的初始值为0,ρ为动量参数,g为参数的梯度值。
结合上述两个公式可以看出,在迭代过程中,由于动量项主要是对历史梯度信息的加权平均,因此梯度值将主要受到前一段时刻的影响,当梯度值前一段时刻保持相同方向时,动量项将在此方向上逐渐增大,当梯度值前一段时刻方向发生改变时,动量项将会随之减小,这一现象可以在梯度值出现反复波动时帮助其跳出局部最优,达到更好的收敛效果。
梯度g的计算原理参考:
神经网络之反向传播算法(梯度、误差反向传播算法BP)

2、结合momentum的误差反向传播算法

将加入动量法的误差反向传播算法应用于神经网络参数优化时的算法步骤如下:

  1. 随机初始化神经网络中所有的参数;
  2. 设置学习率、动量参数,设置变量v的初始值为0;
  3. 输入数据,按照前向传播过程计算网络的输出;
  4. 使用损失函数计算误差值;
  5. 根据误差值计算出隐含层、输出层每个参数的梯度值;
  6. 利用梯度项计算变量v;
  7. 利用变量v对参数进行更新;
  8. 重复步骤3到步骤7,当满足停止迭代条件时输出训练后的参数。

误差反向传播算法BP原理参考:
神经网络之反向传播算法(梯度、误差反向传播算法BP)
参数初始化方法参考:
神经网络基础知识之参数初始化

3、算法实现

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

3.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为动量系数
def accumulation(v,delta):
    v = 0.9 * v + 0.1 * delta
    return  v

# 参数更新函数
def adjust(w,v):
    change = (-0.01)*v
    w = w + change
    return w

#输入数据的导入
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
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

七层楼的疯子

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

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

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

打赏作者

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

抵扣说明:

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

余额充值