首页 > 编程语言 >聊聊神经网络的优化算法

聊聊神经网络的优化算法

时间:2023-12-18 16:44:07浏览次数:36  
标签:聊聊 self 算法 神经网络 lr key params 参数 grads

优化算法主要用于调整神经网络中的超参数,使得训练数据集上的损失函数尽可能小。其核心逻辑是通过计算损失函数对参数的梯度(导数)来确定参数更新方向。

SGD

Stochastic Gradient Descent(随机梯度下降法):随机梯度下降算法是一种改进的梯度下降方法,它在每次更新参数时,只随机选择一个样本来计算梯度。这样可以大大减少计算量,提高训练速度。随机梯度下降算法在训练大规模数据集时非常有效。

其Python实现是

class SGD:
    """随机梯度下降法(Stochastic Gradient Descent)"""
    def __init__(self, lr=0.01):
        self.lr = lr
    # 更新超参数
    def update(self, params, grads):
        for key in params.keys():
            params[key] -= self.lr * grads[key]

参数lr表示学习率,参数params和grads是字典变量,保存了权重参数(prams['W1'])与梯度(grads['W1']),update方法执行的是超参数的梯度更新。
使用这个SGD类,可以按如下伪代码进行神经网络的参数更新:

network = nn.layernet()
optimizer = SGD()

for i in range(10000):
    x_batch, t_batch = get_batch(..)
    # 获取参数的梯度信息
    grads = network.gradient(x_batch, t_batch)
    # 获取参数
    params = network.params
    optimizer.update(params,grads)

Momentum

Momentum是"动量"的意思,是物理学的概念。其数学表达式如下:


这里新出现的参数,对应物理上的速度。类似小球在斜面上的滚动。
image.png
可以使物体逐渐减速,对应物理上的地面磨擦与空气阻力。其Python实现如下

class Momentum:

    """Momentum SGD"""

    def __init__(self, lr=0.01, momentum=0.9):
        self.lr = lr
        self.momentum = momentum
        self.v = None
    # 更新超参数
    def update(self, params, grads):
        if self.v is None:
            self.v = {}
            for key, val in params.items():                                
                self.v[key] = np.zeros_like(val)
                
        for key in params.keys():
            self.v[key] = self.momentum*self.v[key] - self.lr*grads[key] 
            params[key] += self.v[key]

AdaGrad

在神经网络中,学习率的值很重要。学习率过小会导致学习花费过多的时间;反之,学习率过大会导致学习发散,不能正确进行。
AdaGrad会为参数的每个元素适当的(Adaptive)调整学习率,与此同时进行学习。其数学表达式如下:


参数 保存了以前的所有参数的梯度值的平方和(表示对应矩阵元素的乘法)。更新参数时,通过乘以,调整学习的尺度。即按参数的元素进行学习率衰减,使得变动大的参数的学习率逐渐减小。
其python实现如下:

class AdaGrad:

    """AdaGrad"""

    def __init__(self, lr=0.01):
        self.lr = lr
        self.h = None
        
    def update(self, params, grads):
        if self.h is None:
            self.h = {}
            for key, val in params.items():
                self.h[key] = np.zeros_like(val)
            
        for key in params.keys():
            self.h[key] += grads[key] * grads[key]
            params[key] -= self.lr * grads[key] / (np.sqrt(self.h[key]) + 1e-7)

Adam

Momentum参照小球在碗中滚动的物理规则进行移动,AdaGrad为参数的每个元素适当的调整更新步伐。将两者融合就是Adam方法的基本思路。
Adam算法的公式如下,流程比较复杂,简单的理解就是其基本思路。

  1. 初始化:设 ( t = 0 ),初始化模型参数 ( ),学习率 ( ),以及超参数 ( )。为每个参数 ( ) 初始化一阶矩估计 ( ) 和二阶矩估计 ( )。
  2. 在第 ( t ) 步,计算目标函数 ( ) 对参数 ( ) 的梯度 ( )。
  3. 更新一阶矩估计:( )。
  4. 更新二阶矩估计:()。
  5. 校正一阶矩估计和二阶矩估计中的偏差:( )。
  6. 计算自适应学习率:(
  7. 使用自适应学习率更新模型参数:( )。
  8. ( t = t + 1 ),重复步骤 2-7 直到收敛。
    通过上述公式,Adam算法能够自适应地调整每个参数的学习率,从而在训练过程中加速收敛。

其Python实现:

class Adam:

    """Adam (http://arxiv.org/abs/1412.6980v8)"""

    def __init__(self, lr=0.001, beta1=0.9, beta2=0.999):
        self.lr = lr
        self.beta1 = beta1
        self.beta2 = beta2
        self.iter = 0
        self.m = None
        self.v = None
        
    def update(self, params, grads):
        if self.m is None:
            self.m, self.v = {}, {}
            for key, val in params.items():
                self.m[key] = np.zeros_like(val)
                self.v[key] = np.zeros_like(val)
        
        self.iter += 1
        lr_t  = self.lr * np.sqrt(1.0 - self.beta2**self.iter) / (1.0 - self.beta1**self.iter)         
        
        for key in params.keys():
            self.m[key] += (1 - self.beta1) * (grads[key] - self.m[key])
            self.v[key] += (1 - self.beta2) * (grads[key]**2 - self.v[key])
            params[key] -= lr_t * self.m[key] / (np.sqrt(self.v[key]) + 1e-7)

参考 《深度学习入门:基于python的理解与实现》

标签:聊聊,self,算法,神经网络,lr,key,params,参数,grads
From: https://www.cnblogs.com/zhiyong-ITNote/p/17911599.html

相关文章

  • 代码随想录算法训练营第四天| LeetCode24. 两两交换链表中的节点、19.删除链表的倒数
     LeetCode24.两两交换链表中的节点●今日学习的文章链接和视频链接代码随想录(programmercarl.com)题目链接24.两两交换链表中的节点-力扣(LeetCode)●自己看到题目的第一想法主要是把这个过程想清楚,链表交换的题目主要想明白要动几个指针,指针改变的顺序也要注意,如果......
  • 羚通视频智能分析平台视频智能分析视频监控车辆检测算法识别
    羚通视频智能分析平台是一款先进的视频监控技术,它能够通过车辆检测算法识别来实时监测和管理交通流量。该平台利用先进的计算机视觉技术和深度学习算法,对视频监控画面进行智能分析和处理,从而实现对车辆的准确识别和跟踪。首先,羚通视频智能分析平台通过视频监控设备获取实时的视频......
  • 神经网络优化篇:机器学习基础(Basic Recipe for Machine Learning)
    机器学习基础下图就是在训练神经网络用到的基本方法:(尝试这些方法,可能有用,可能没用)这是在训练神经网络时用到地基本方法,初始模型训练完成后,首先要知道算法的偏差高不高,如果偏差较高,试着评估训练集或训练数据的性能。如果偏差的确很高,甚至无法拟合训练集,那么要做的就是选择一个新......
  • 群智能优化算法测试函数matlab源代码
    globalM;creatematrix(2);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%画ackley图。%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%ackleyxfrom[-55]%x=-5:0.01:5;%[x,y]=meshgrid(x);%temp1=x.^2+y.^2;%temp2=cos(2*pi*x)+cos(2*pi*y);%z=20+exp(1)-20*exp(-0.2*sqrt(te......
  • PINN——加入物理约束的神经网络
    【摘要】基于物理信息的神经网络(Physics-informedNeuralNetwork,简称PINN),是一类用于解决有监督学习任务的神经网络,它不仅能够像传统神经网络一样学习到训练数据样本的分布规律,而且能够学习到数学方程描述的物理定律。与纯数据驱动的神经网络学习相比,PINN在训练过程中施加了物理......
  • 文心一言 VS 讯飞星火 VS chatgpt (158)-- 算法导论12.3 5题
    五、用go语言,假设为每个结点换一种设计,属性x.p指向x的双亲,属性x.succ指向x的后继。试给出使用这种表示法的二叉搜索树T上SEARCH、INSERT和DELETE操作的伪代码。这些伪代码应在O(h)时间内执行完,其中h为树T的高度。(提示:应该设计一个返回某个结点的双亲的子过程......
  • 文心一言 VS 讯飞星火 VS chatgpt (158)-- 算法导论12.3 5题
    五、用go语言,假设为每个结点换一种设计,属性x.p指向x的双亲,属性x.succ指向x的后继。试给出使用这种表示法的二叉搜索树T上SEARCH、INSERT和DELETE操作的伪代码。这些伪代码应在O(h)时间内执行完,其中h为树T的高度。(提示:应该设计一个返回某个结点的双亲的子过程......
  • 算法-01基础算法
    title:(算法基础课)link:(https://www.acwing.com/)cover:(https://cdn.acwing.com/media/activity/surface/log.png)快速排序归并排序二分法......
  • 人工智能-A*算法-最优路径搜索实验
    上次学会了《A*算法-八数码问题》,初步了解了A*算法的原理,本次再用A*算法完成一个最优路径搜索实验。 一、实验内容1.设计自己的启发式函数。2.在网格地图中,设计部分障碍物。3.实现A*算法,搜索一条最优路径。 二、A*算法实现步骤1.初始化:设置起始节点和目标节点,并创建一......
  • Python算法——二叉树遍历
    Python中的二叉树遍历算法详解二叉树是一种常见的树状数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。遍历二叉树是访问树的所有节点并按照特定顺序输出它们的过程。在本文中,我们将讨论二叉树的三种主要遍历算法:前序遍历、中序遍历和后序遍历,并提供相应的Python代码......