实验三:神经网络之网络基础、第4关:优化方法:梯度下降

文章目录

  • 任务描述
  • 相关知识
    • 优化算法概述
    • 编程要求
    • 测试说明
  • 答案

任务描述

本关任务:通过学习梯度下降法的相关知识,编写一个计算指定函数取得极值时对应的x的值的程序。

相关知识

为了完成本关任务,你需要掌握:

  1. 优化算法概述;
  2. 梯度下降法;
  3. 梯度消失。

优化算法概述

优化算法的作用是通过不断改进模型中的参数使得模型的损失最小或准确度更高。在神经网络中,训练的模型参数主要是内部参数,包括权值(W)和偏置(B) 。
模型的内部参数在有效训练模型和产生准确结果方面起着非常重要的作用。常见的优化算法分为两类。

  1. 一阶优化算法。
    该算法使用参数的梯度值来最小化损失值。最常用的一阶优化算法是梯度下降。函数梯度可以采用导数dxdy​的多变量表达式进行表达,用于表示 y 相对于 x 的瞬时变化率 。 通常为了计算多变量函数的导数,用梯度代替导数,并使用导数来计算梯度 。
  2. 二阶优化算法。
    二阶优化算法使用二阶导数(也称为 Hessian 方法)来最小化损失值,以 Newton 法和Quasi-Newton 法为代表的二阶优化算法目前最大的困难在于计算复杂度 , 正是由于二阶导数的计算成本较高,因此该方法未得到广泛应用。
    梯度下降法

梯度下降法( Gradient Descent)是机器学习中最常用的优化方法,常常用于求解目标函数的极值。梯度是一个向量,表示函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向变化最快、变化率最大,这个方向即为此梯度的方向,变化率即为该梯度的模 。
梯度下降是一种基于不断迭代的运算方法,每一步都是在求解目标函数的梯度向量,在当前位置的负梯度方向作为新的搜索方向,从而不断迭代。之所以采用在当前位置上的梯度反方向,是由于在该方向上的目标函数下降最快,可以找到局部最小值:同理, 要是沿着梯度的正方向作为新的搜索方向,则找到的是局部最大值。

例如,对于输入(x1​,x2​)分别表示人的身高和体重,通过f(x1​,x2​)输出的是偏胖或不偏胖的结果。现给定一堆的(x1​,x2​)集合,通过训练使得f(x1​,x2​)对于输入的值都能够判定其属于偏胖或不偏胖。拟合函数可以采用如下公式 :

Loss(θ)=21​i=1∑n​[(f(xi​)−yi​]2

训练的过程则是找到有效的f(x)函数,使得训练中的样本均满足f(x)的输出结果 。 因此可以定义一个误差函数如下所示,误差函数表达的是预测值与真实值差的平方和的一半:

Loss(θ)=∂θj​∂​21​(f(x)−y)2=2×21​(f(x)−y)×∂θj​∂​(f(x)−y)=(f(x)−y)×∂θj​∂​(i=0∑n​θi​xi​−y)=(f(x)−y)xi​​

其 中 xi​表示第 i 个输入样本,yi​表示训练样本的期望输出,f(xi​)是实际训练结果的输出 。
对于整个系统而言 ,误差函数越小,则表示对训练样本的拟合程度越高,因此可以将问题转换为对Loss(θ)求解极小值(极小值时误差最小),换言之,则为当θ1​,θ2​,θ3​取何值时,整个系统的误差最小 。 因此需要求解Loss(Θ)的梯度,即依次对θ1​,θ2​,θ3​进行求偏导数 ,如下推导公式:

实验三:神经网络之网络基础、第4关:优化方法:梯度下降_第1张图片

在求得偏导数之后,θ需要在当前梯度位置的反方向调整,公式如下:

θj​=θj​×η∂θj​∂Loss​

其中η为学习速率。 经过多次选代即可得到最优的θ1​,θ2​,θ3​ ,即在这些参数之下,f(x)训练的样本整体误差值最小 。
梯度消失

梯度消失问题( Gradient Vanishing Problem )在神经网络层数相对较多时可能会遇到, 且随着神经网络层数的不断增加,发生的概率越明显。
对于梯度消失问题,可以通过图1进行说明。

实验三:神经网络之网络基础、第4关:优化方法:梯度下降_第2张图片

针对包含 n层的隐藏层的神经网络, 一般情况下第 n个隐藏层的权值还可以正常更新,但是相对于第 1 层和第 2 层的隐藏层,可能存在层的权值更新几乎不变,基本和初始的权值相差较小,这个时候则是发生了梯度消失问题 。 尤其在η较大时,发生梯度消失的概率更高,此刻第 1 层和第 2层隐藏层只是被当作了 一个映射层,并没有发挥其层次结构的价值。
归纳而言,由于在反向传播算法过程中 ,使用的是矩阵求导的链式法则,即通过一系列的连乘,且连乘的数字在每层都小于 1 ,因此梯度越来越小,最终导致梯度消失 。
从梯度消失的角度而言,可以说明并不是网络结构设计的深度越深越好,但是理论上网络结构的深度越深,表达能力和抽象能力就越强,因而对于梯度消失问题,需要从激活函数以及网络层次结构设计上着手解决,例如激活函数可以考虑用 ReLU 函数代替 Sigmoid 函数 。
与梯度消失问题相反的则是梯度爆炸(Exploding Gradient),如果在反向传播算法过程中,连乘的数字在每层都大于 1 ,则梯度会越来越大,从而导致梯度爆炸问题的发生。梯度爆炸问题相对容易解决,可以通过简单地设置阀值来避免梯度爆炸。

编程要求

根据提示,在右侧编辑器 Begin-End 区间补充代码,计算y=(x+3)2+10取得极值时所对应的x的值。

测试说明

平台会对你编写的代码进行测试:

测试输入:无
预期输出:
True

提示:

实验三:神经网络之网络基础、第4关:优化方法:梯度下降_第3张图片

学习速率(lr)的初始值为0.4,迭代次数(epochs)的初始值为100,你也可以自己修改学习速率和迭代次数。

开始你的任务吧,祝你成功!

答案



def set_learning_rate():
    """
    你可以自己设定学习速率
    :return:  求解过程的学习速率
    """
    ########## Begin ##########
    lr = 0.4
    ########## End ##########
    return lr

def set_epochs():
    """
    你可以自己设定迭代次数
    :return: 求解过程的迭代次数
    """
    ########## Begin ##########
    epochs = 100
    ########## End ##########
    return epochs

def iterate(x,lr,epochs):
    """
    求解过程
    :param x: 随机输入
    :param lr: 学习速率
    :param epochs: 迭代次数
    :return: 指定函数取得极值时所对应的x的值
    """
    ########## Begin ##########
    # f(x) = x^2 + 6x + 19
    # fx_dao = 2x + 6 
    while epochs:
        x = x - (2*x + 6)*lr 
        epochs -=1
    ########## End ##########
    return x



你可能感兴趣的:(人工智能原理,神经网络,人工智能)