精华内容
下载资源
问答
  • 梯度下降算法原理讲解——机器学习

    万次阅读 多人点赞 2019-01-21 20:27:48
    详细来讲讲梯度下降算法的原理,感受数学和程序的魅力吧!!

    1. 概述

    梯度下降(gradient descent)在机器学习中应用十分的广泛,不论是在线性回归还是Logistic回归中,它的主要目的是通过迭代找到目标函数的最小值,或者收敛到最小值。
    本文将从一个下山的场景开始,先提出梯度下降算法的基本思想,进而从数学上解释梯度下降算法的原理,解释为什么要用梯度,最后实现一个简单的梯度下降算法的实例!

    2. 梯度下降算法

    2.1 场景假设

    梯度下降法的基本思想可以类比为一个下山的过程。
    假设这样一个场景:一个人被困在山上,需要从山上下来(找到山的最低点,也就是山谷)。但此时山上的浓雾很大,导致可视度很低;因此,下山的路径就无法确定,必须利用自己周围的信息一步一步地找到下山的路。这个时候,便可利用梯度下降算法来帮助自己下山。怎么做呢,首先以他当前的所处的位置为基准,寻找这个位置最陡峭的地方,然后朝着下降方向走一步,然后又继续以当前位置为基准,再找最陡峭的地方,再走直到最后到达最低处;同理上山也是如此,只是这时候就变成梯度上升算法了
    在这里插入图片描述

    2.2 梯度下降

    梯度下降的基本过程就和下山的场景很类似。

    首先,我们有一个可微分的函数。这个函数就代表着一座山。我们的目标就是找到这个函数的最小值,也就是山底。根据之前的场景假设,最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是找到给定点的梯度 ,然后朝着梯度相反的方向,就能让函数值下降的最快!因为梯度的方向就是函数之变化最快的方向(在后面会详细解释)
    所以,我们重复利用这个方法,反复求取梯度,最后就能到达局部的最小值,这就类似于我们下山的过程。而求取梯度就确定了最陡峭的方向,也就是场景中测量方向的手段。那么为什么梯度的方向就是最陡峭的方向呢?接下来,我们从微分开始讲起:

    2.2.1 微分

    看待微分的意义,可以有不同的角度,最常用的两种是:

    • 函数图像中,某点的切线的斜率
    • 函数的变化率
      几个微分的例子:

    1.单变量的微分,函数只有一个变量时

    d ( x 2 ) d x = 2 x \frac{d(x^2)}{dx}=2x dxd(x2)=2x

    d ( − 2 y 5 ) d y = − 10 y 4 \frac{d(-2y^5)}{dy}=-10y^4 dyd(2y5)=10y4

    d ( 5 − θ ) 2 d θ = − 2 ( 5 − θ ) \frac{d(5-\theta )^2}{d\theta}=-2(5-\theta) dθd(5θ)2=2(5θ)

    2.多变量的微分,当函数有多个变量的时候,即分别对每个变量进行求微分

    ∂ ∂ x ( x 2 y 2 ) = 2 x y 2 \frac{\partial}{\partial x}(x^2y^2) = 2xy^2 x(x2y2)=2xy2

    ∂ ∂ y ( − 2 y 5 + z 2 ) = − 10 y 4 \frac{\partial}{\partial y}(-2y^5+z^2) = -10y^4 y(2y5+z2)=10y4

    ∂ ∂ θ 2 ( 5 θ 1 + 2 θ 2 − 12 θ 3 ) = 2 \frac{\partial}{\partial \theta_{2}}(5\theta_{1} + 2\theta_{2} - 12\theta_{3}) = 2 θ2(5θ1+2θ212θ3)=2

    ∂ ∂ θ 2 ( 0.55 − ( 5 θ 1 + 2 θ 2 − 12 θ 3 ) ) = − 2 \frac{\partial}{\partial \theta_{2}}(0.55 - (5\theta_{1} + 2\theta_{2} - 12\theta_{3})) = -2 θ2(0.55(5θ1+2θ212θ3))=2

    2.2.2 梯度

    梯度实际上就是多变量微分的一般化。
    下面这个例子:

    J ( Θ ) = 0.55 − ( 5 θ 1 + 2 θ 2 − 12 θ 3 ) J(\Theta ) = 0.55 - (5\theta_{1} + 2\theta_{2} - 12\theta_{3}) J(Θ)=0.55(5θ1+2θ212θ3)

    ▽ J ( Θ ) = < ∂ J ∂ θ 1 , ∂ J ∂ θ 2 , ∂ J ∂ θ 3 > = ( − 5 , − 2 , 12 ) \triangledown J(\Theta ) = \left < \frac{\partial J}{\partial \theta_{1}}, \frac{\partial J}{\partial \theta_{2}},\frac{\partial J}{\partial \theta_{3}} \right > =(-5,-2,12) J(Θ)=θ1J,θ2J,θ3J=(5,2,12)

    我们可以看到,梯度就是分别对每个变量进行微分,然后用逗号分割开,梯度是用<>包括起来,说明梯度其实一个向量。

    梯度是微积分中一个很重要的概念,之前提到过梯度的意义

    • 在单变量的函数中,梯度其实就是函数的微分,代表着函数在某个给定点的切线的斜率
    • 在多变量函数中,梯度是一个向量,向量有方向,梯度的方向就指出了函数在给定点的上升最快的方向

    这也就说明了为什么我们需要千方百计的求取梯度!我们需要到达山底,就需要在每一步观测到此时最陡峭的地方,梯度就恰巧告诉了我们这个方向。梯度的方向是函数在给定点上升最快的方向,那么梯度的反方向就是函数在给定点下降最快的方向,这正是我们所需要的。所以我们只要沿着梯度的方向一直走,就能走到局部的最低点!

    2.3 数学解释

    首先给出数学公式:

    Θ 1 = Θ 0 + α ▽ J ( Θ ) → e v a l u a t e d a t Θ 0 {\color{Red} \Theta^1} = {\color{Blue} \Theta^0} + {\color{Green} \alpha} {\color{Purple} \triangledown J(\Theta)}\rightarrow evaluated at \Theta^0 Θ1=Θ0+αJ(Θ)evaluatedatΘ0

    此公式的意义是:J是关于Θ的一个函数,我们当前所处的位置为Θ0点,要从这个点走到J的最小值点,也就是山底。首先我们先确定前进的方向,也就是梯度的反向,然后走一段距离的步长,也就是α,走完这个段步长,就到达了Θ1这个点!
    在这里插入图片描述

    2.3.1 α

    α在梯度下降算法中被称作为学习率或者步长,意味着我们可以通过α来控制每一步走的距离,以保证不要步子跨的太大扯着蛋,哈哈,其实就是不要走太快,错过了最低点。同时也要保证不要走的太慢,导致太阳下山了,还没有走到山下。所以α的选择在梯度下降法中往往是很重要的!α不能太大也不能太小,太小的话,可能导致迟迟走不到最低点,太大的话,会导致错过最低点!

    2.3.2 梯度要乘以一个负号

    梯度前加一个负号,就意味着朝着梯度相反的方向前进!我们在前文提到,梯度的方向实际就是函数在此点上升最快的方向!而我们需要朝着下降最快的方向走,自然就是负的梯度的方向,所以此处需要加上负号;那么如果时上坡,也就是梯度上升算法,当然就不需要添加负号了。

    3. 实例

    我们已经基本了解了梯度下降算法的计算过程,那么我们就来看几个梯度下降算法的小实例,首先从单变量的函数开始,然后介绍多变量的函数。

    3.1 单变量函数的梯度下降

    我们假设有一个单变量的函数

    J ( θ ) = θ 2 J(\theta) = \theta^2 J(θ)=θ2

    函数的微分,直接求导就可以得到

    J ′ ( θ ) = 2 θ J'(\theta) = 2\theta J(θ)=2θ

    初始化,也就是起点,起点可以随意的设置,这里设置为1

    θ 0 = 1 \theta^0 = 1 θ0=1

    学习率也可以随意的设置,这里设置为0.4

    α = 0.4 \alpha = 0.4 α=0.4

    根据梯度下降的计算公式

    Θ 1 = Θ 0 + α ▽ J ( Θ ) → e v a l u a t e d a t Θ 0 {\color{Red} \Theta^1} = {\color{Blue} \Theta^0} + {\color{Green} \alpha} {\color{Purple} \triangledown J(\Theta)}\rightarrow evaluated at \Theta^0 Θ1=Θ0+αJ(Θ)evaluatedatΘ0

    我们开始进行梯度下降的迭代计算过程:

    θ 0 = 1 \theta^0 = 1 θ0=1

    θ 1 = θ 0 − α ∗ J ′ ( θ 0 ) = 1 − 0.4 ∗ 2 = 0.2 \theta^1 = \theta^0 - \alpha*J'(\theta^0)=1 - 0.4*2 = 0.2 θ1=θ0αJ(θ0)=10.42=0.2

    θ 2 = θ 1 − α ∗ J ′ ( θ 1 ) = 0.2 − 0.4 ∗ 0.4 = 0.04 \theta^2 = \theta^1 - \alpha*J'(\theta^1)= 0.2 - 0.4*0.4=0.04 θ2=θ1αJ(θ1)=0.20.40.4=0.04

    θ 3 = 0.008 \theta^3 = 0.008 θ3=0.008

    θ 4 = 0.0016 \theta^4 = 0.0016 θ4=0.0016

    如图,经过四次的运算,也就是走了四步,基本就抵达了函数的最低点,也就是山底
    在这里插入图片描述

    3.2 多变量函数的梯度下降

    我们假设有一个目标函数

    J ( Θ ) = θ 1 2 + θ 2 2 J(\Theta) = \theta_{1}^2 + \theta_{2}^2 J(Θ)=θ12+θ22

    现在要通过梯度下降法计算这个函数的最小值。我们通过观察就能发现最小值其实就是 (0,0)点。但是接下来,我们会从梯度下降算法开始一步步计算到这个最小值!
    我们假设初始的起点为:

    Θ 0 = ( 1 , 3 ) \Theta^0 = (1, 3) Θ0=(1,3)

    初始的学习率为:

    α = 0.1 \alpha = 0.1 α=0.1

    函数的梯度为:

    ▽ J ( Θ ) = < 2 θ 1 , 2 θ 2 > \triangledown J(\Theta ) = \left < 2\theta_{1},2\theta_{2} \right > J(Θ)=2θ1,2θ2

    进行多次迭代:

    Θ 0 = ( 1 , 3 ) \Theta^0 = (1, 3) Θ0=(1,3)

    Θ 1 = Θ 0 − α ▽ J ( Θ ) = ( 1 , 3 ) − 0.1 ∗ ( 2 , 6 ) = ( 0.8 , 2.4 ) \Theta^1 = \Theta^0 - \alpha\triangledown J(\Theta ) = (1,3) - 0.1*(2, 6)=(0.8, 2.4) Θ1=Θ0αJ(Θ)=(1,3)0.1(2,6)=(0.8,2.4)

    Θ 2 = ( 0.8 , 2.4 ) − 0.1 ∗ ( 1.6 , 4.8 ) = ( 0.64 , 1.92 ) \Theta^2 = (0.8, 2.4) - 0.1*(1.6, 4.8)=(0.64, 1.92) Θ2=(0.8,2.4)0.1(1.6,4.8)=(0.64,1.92)

    Θ 3 = ( 0.5124 , 1.536 ) \Theta^3 =(0.5124, 1.536) Θ3=(0.5124,1.536)

    Θ 4 = ( 0.4096 , 1.228800000000001 ) \Theta^4 =(0.4096, 1.228800000000001) Θ4=(0.4096,1.228800000000001)
    ⋮ \vdots
    Θ 10 = ( 0.1073741824000003 , 0.32212254720000005 ) \Theta^{10} =(0.1073741824000003, 0.32212254720000005) Θ10=(0.1073741824000003,0.32212254720000005)
    ⋮ \vdots
    Θ 50 = ( 1.141798154164342 e − 05 , 3.42539442494306 e − 05 ) \Theta^{50} =(1.141798154164342e^{-05}, 3.42539442494306e^{-05}) Θ50=(1.141798154164342e05,3.42539442494306e05)
    ⋮ \vdots
    Θ 100 = ( 1.6296287810675902 e − 10 , 4.8888886343202771 e − 10 ) \Theta^{100} =(1.6296287810675902e^{-10}, 4.8888886343202771e^{-10}) Θ100=(1.6296287810675902e10,4.8888886343202771e10)

    我们发现,已经基本靠近函数的最小值点
    在这里插入图片描述

    4. 代码实现

    4. 1 场景分析

    下面我们将用python实现一个简单的梯度下降算法。场景是一个简单的线性回归的例子:假设现在我们有一系列的点,如下图所示:
    在这里插入图片描述
    我们将用梯度下降法来拟合出这条直线!

    首先,我们需要定义一个代价函数,在此我们选用均方误差代价函数(也称平方误差代价函数)

    J ( Θ ) = 1 2 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 J(\Theta) = \frac{1}{2m}\sum_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})^2 J(Θ)=2m1i=1m(hθ(x(i))y(i))2

    此公式中

    • m是数据集中数据点的个数,也就是样本数
    • ½是一个常量,这样是为了在求梯度的时候,二次方乘下来的2就和这里的½抵消了,自然就没有多余的常数系数,方便后续的计算,同时对结果不会有影响
    • y 是数据集中每个点的真实y坐标的值,也就是类标签
    • h 是我们的预测函数(假设函数),根据每一个输入x,根据Θ 计算得到预测的y值,即

    h Θ ( x ( i ) ) = Θ 0 + Θ 1 x 1 ( i ) h_{\Theta}(x^{(i)}) = \Theta_{0} + \Theta_{1}x_{1}^{(i)} hΘ(x(i))=Θ0+Θ1x1(i)

    我们可以根据代价函数看到,代价函数中的变量有两个,所以是一个多变量的梯度下降问题,求解出代价函数的梯度,也就是分别对两个变量进行微分

    ▽ J ( Θ ) = < δ J δ Θ 0 , δ J δ Θ 1 > \triangledown J(\Theta ) = \left < \frac{\delta J}{\delta \Theta_{0}}, \frac{\delta J}{\delta \Theta_{1}} \right > J(Θ)=δΘ0δJ,δΘ1δJ

    δ J δ Θ 0 = 1 m ∑ i = 1 m ( h Θ ( x ( i ) ) − y ( i ) ) \frac{\delta J}{\delta \Theta_{0}} = \frac{1}{m}\sum_{i=1}^{m}(h_{\Theta}(x^{(i)})-y^{(i)}) δΘ0δJ=m1i=1m(hΘ(x(i))y(i))

    δ J δ Θ 1 = 1 m ∑ i = 1 m ( h Θ ( x ( i ) ) − y ( i ) ) x 1 ( i ) \frac{\delta J}{\delta \Theta_{1}} = \frac{1}{m}\sum_{i=1}^{m}(h_{\Theta}(x^{(i)})-y^{(i)})x_{1}^{(i)} δΘ1δJ=m1i=1m(hΘ(x(i))y(i))x1(i)

    明确了代价函数和梯度,以及预测的函数形式。我们就可以开始编写代码了。但在这之前,需要说明一点,就是为了方便代码的编写,我们会将所有的公式都转换为矩阵的形式,python中计算矩阵是非常方便的,同时代码也会变得非常的简洁。
    为了转换为矩阵的计算,我们观察到预测函数的形式

    h Θ ( x ( i ) ) = Θ 0 + Θ 1 x ( i ) h_{\Theta}(x^{(i)}) = \Theta_{0} + \Theta_{1}x^{(i)} hΘ(x(i))=Θ0+Θ1x(i)

    我们有两个变量,为了对这个公式进行矩阵化,我们可以给每一个点x增加一维,这一维的值固定为1,这一维将会乘到Θ0上。这样就方便我们统一矩阵化的计算

    ( x 1 ( i ) , y ( i ) ) → ( x 0 ( i ) , x 1 ( i ) , y ( i ) ) w i t h x 0 ( i ) = 1 ∀ i (x_{1}^{(i)},y^{(i)})\rightarrow (x_{0}^{(i)},x_{1}^{(i)},y^{(i)}) with x_{0}^{(i)} = 1 \forall _{i} (x1(i),y(i))(x0(i),x1(i),y(i))withx0(i)=1i

    然后我们将代价函数和梯度转化为矩阵向量相乘的形式

    J ( Θ ) = 1 2 m ( X Θ − y ⃗ ) T ( X Θ − y ⃗ ) J(\Theta) = \frac{1}{2m}(X\Theta - \vec{y})^{T}(X\Theta - \vec{y}) J(Θ)=2m1(XΘy )T(XΘy )

    ▽ J ( Θ ) = 1 m X T ( X Θ − y ⃗ ) ) \triangledown J(\Theta) = \frac{1}{m}X^{T}(X\Theta - \vec{y})) J(Θ)=m1XT(XΘy ))

    4. 2 代码

    首先,我们需要定义数据集和学习率

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    # @Time    : 2019/1/21 21:06
    # @Author  : Arrow and Bullet
    # @FileName: gradient_descent.py
    # @Software: PyCharm
    # @Blog    :https://blog.csdn.net/qq_41800366
    
    from numpy import *
    
    # 数据集大小 即20个数据点
    m = 20
    # x的坐标以及对应的矩阵
    X0 = ones((m, 1))  # 生成一个m行1列的向量,也就是x0,全是1
    X1 = arange(1, m+1).reshape(m, 1)  # 生成一个m行1列的向量,也就是x1,从1到m
    X = hstack((X0, X1))  # 按照列堆叠形成数组,其实就是样本数据
    # 对应的y坐标
    y = np.array([
        3, 4, 5, 5, 2, 4, 7, 8, 11, 8, 12,
        11, 13, 13, 16, 17, 18, 17, 19, 21
    ]).reshape(m, 1)
    # 学习率
    alpha = 0.01
    

    接下来我们以矩阵向量的形式定义代价函数和代价函数的梯度

    # 定义代价函数
    def cost_function(theta, X, Y):
        diff = dot(X, theta) - Y  # dot() 数组需要像矩阵那样相乘,就需要用到dot()
        return (1/(2*m)) * dot(diff.transpose(), diff)
    
    
    # 定义代价函数对应的梯度函数
    def gradient_function(theta, X, Y):
        diff = dot(X, theta) - Y
        return (1/m) * dot(X.transpose(), diff)
    

    最后就是算法的核心部分,梯度下降迭代计算

    # 梯度下降迭代
    def gradient_descent(X, Y, alpha):
        theta = array([1, 1]).reshape(2, 1)
        gradient = gradient_function(theta, X, Y)
        while not all(abs(gradient) <= 1e-5):
            theta = theta - alpha * gradient
            gradient = gradient_function(theta, X, Y)
        return theta
    
    
    optimal = gradient_descent(X, Y, alpha)
    print('optimal:', optimal)
    print('cost function:', cost_function(optimal, X, Y)[0][0])
    

    当梯度小于1e-5时,说明已经进入了比较平滑的状态,类似于山谷的状态,这时候再继续迭代效果也不大了,所以这个时候可以退出循环!
    运行代码,计算得到的结果如下:

    print('optimal:', optimal)  # 结果 [[0.51583286][0.96992163]]
    print('cost function:', cost_function(optimal, X, Y)[0][0])  # 1.014962406233101
    

    通过matplotlib画出图像,

    # 根据数据画出对应的图像
    def plot(X, Y, theta):
        import matplotlib.pyplot as plt
        ax = plt.subplot(111)  # 这是我改的
        ax.scatter(X, Y, s=30, c="red", marker="s")
        plt.xlabel("X")
        plt.ylabel("Y")
        x = arange(0, 21, 0.2)  # x的范围
        y = theta[0] + theta[1]*x
        ax.plot(x, y)
        plt.show()
    
    
    plot(X1, Y, optimal)
    

    所拟合出的直线如下
    在这里插入图片描述
    全部代码如下,大家有兴趣的可以复制下来跑一下看一下结果:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    # @Time    : 2019/1/21 21:06
    # @Author  : Arrow and Bullet
    # @FileName: gradient_descent.py
    # @Software: PyCharm
    # @Blog    :https://blog.csdn.net/qq_41800366
    
    from numpy import *
    
    # 数据集大小 即20个数据点
    m = 20
    # x的坐标以及对应的矩阵
    X0 = ones((m, 1))  # 生成一个m行1列的向量,也就是x0,全是1
    X1 = arange(1, m+1).reshape(m, 1)  # 生成一个m行1列的向量,也就是x1,从1到m
    X = hstack((X0, X1))  # 按照列堆叠形成数组,其实就是样本数据
    # 对应的y坐标
    Y = array([
        3, 4, 5, 5, 2, 4, 7, 8, 11, 8, 12,
        11, 13, 13, 16, 17, 18, 17, 19, 21
    ]).reshape(m, 1)
    # 学习率
    alpha = 0.01
    
    
    # 定义代价函数
    def cost_function(theta, X, Y):
        diff = dot(X, theta) - Y  # dot() 数组需要像矩阵那样相乘,就需要用到dot()
        return (1/(2*m)) * dot(diff.transpose(), diff)
    
    
    # 定义代价函数对应的梯度函数
    def gradient_function(theta, X, Y):
        diff = dot(X, theta) - Y
        return (1/m) * dot(X.transpose(), diff)
    
    
    # 梯度下降迭代
    def gradient_descent(X, Y, alpha):
        theta = array([1, 1]).reshape(2, 1)
        gradient = gradient_function(theta, X, Y)
        while not all(abs(gradient) <= 1e-5):
            theta = theta - alpha * gradient
            gradient = gradient_function(theta, X, Y)
        return theta
    
    
    optimal = gradient_descent(X, Y, alpha)
    print('optimal:', optimal)
    print('cost function:', cost_function(optimal, X, Y)[0][0])
    
    
    # 根据数据画出对应的图像
    def plot(X, Y, theta):
        import matplotlib.pyplot as plt
        ax = plt.subplot(111)  # 这是我改的
        ax.scatter(X, Y, s=30, c="red", marker="s")
        plt.xlabel("X")
        plt.ylabel("Y")
        x = arange(0, 21, 0.2)  # x的范围
        y = theta[0] + theta[1]*x
        ax.plot(x, y)
        plt.show()
    
    
    plot(X1, Y, optimal)
    

    5. 小结

    至此,就基本介绍完了梯度下降法的基本思想和算法流程,并且用python实现了一个简单的梯度下降算法拟合直线的案例!
    最后,我们回到文章开头所提出的场景假设:
    这个下山的人实际上就代表了反向传播算法,下山的路径其实就代表着算法中一直在寻找的参数Θ,山上当前点的最陡峭的方向实际上就是代价函数在这一点的梯度方向,场景中观测最陡峭方向所用的工具就是微分 。在下一次观测之前的时间就是有我们算法中的学习率α所定义的。
    可以看到场景假设和梯度下降算法很好的完成了对应!

    本文部分内容来自一位前辈,非常感谢分享!谢谢!

    展开全文
  • 梯度下降

    千次阅读 2019-08-16 10:29:39
    梯度下降 上文 中说了参数的计算,但是实际的应用过程中,参数矩阵并不是可以直接计算的...梯度数学上,梯度的本意是一个向量(矢量),表示一函数该点处的方向导数沿着该方向取得最大值,即函数该点...

    梯度下降

    上文 中说了参数的计算,但是在实际的应用过程中,参数矩阵并不是可以直接计算的,是无解的,此时需要借助计算机的快速运算能力,不断优化参数,得到近似最优解。那么如何进行优化,优化的方向如何呢?这就涉及到了梯度下降和学习率(优化时每次采用的步长)。

    首先来看一下梯度的定义。

    梯度:在数学上,梯度的本意是一个向量(矢量),表示某一函数在该点处的方向导数沿着该方向取得最大值,即函数在该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模),也就是说梯度是使得该函数取得最大值的方向即梯度的方向是函数值增大的方向

    那么梯度下降指的就是梯度的反方向

    梯度下降的常用算法有三种:批量梯度下降算法、随机梯度下降算法和小批量梯度下降算法

    假设目标函数是:均方差损失函数

    J ( θ ) = 1 2 m ∑ i = 1 i = m ( y ( i ) − h θ ( x ( i ) ) ) 2 \begin{aligned}J(\theta) =\frac{1}{2m}\sum_{i =1}^{i = m}(y^{(i)} -h_\theta(x^{(i)}))^2\end{aligned} J(θ)=2m1i=1i=m(y(i)hθ(x(i)))2

    优化目标是使得损失最小。

    使用批量梯度下降时候

    θ \theta θ求导如下

    ∂ J ( θ ) ∂ θ i = − 1 m ∑ i = 1 i = m ( y i − h θ ( x i ) ) x j i \begin{aligned}\frac{\partial J(\theta)}{\partial\theta_i} = -\frac{1}{m}\sum_{i=1}^{i = m}(y^i - h_\theta(x^i))x_j^i\end{aligned} θiJ(θ)=m1i=1i=m(yihθ(xi))xji

    那么

    θ j ′ = θ j − ∂ J ( θ ) ∂ θ i = θ j + 1 m ∑ i = 1 i = m ( y i − h θ ( x i ) ) x j i \begin{aligned}\theta_j&#x27; = \theta_j - \frac{\partial J(\theta)}{\partial\theta_i} =\theta_j + \frac{1}{m}\sum_{i=1}^{i = m}(y^i - h_\theta(x^i))x_j^i\end{aligned} θj=θjθiJ(θ)=θj+m1i=1i=m(yihθ(xi))xji

    批量梯度下降容易得到最优解,但是由于每次都是考虑所有的样本,收敛速度很慢

    使用随机梯度下降的时候

    每次随机取其中的一个样本

    θ j ′ = θ j + ( y i − h θ ( x i ) ) x j i \theta&#x27;_j = \theta_j + (y^i - h_{\theta}(x^i))x_j^i θj=θj+(yihθ(xi))xji

    随机梯度下降算法每次都找一个样本,迭代速度快,但是不一定每次都朝着收敛的方向,样本中的数据可能存在一些错误点,异常点等。

    使用小批量随机梯度下降的时候

    例如每次取10个作为小批量

    θ j ′ = θ j + α 1 10 ∑ k = i i + 9 ( h θ ( ( x k ) − y k ) x j k \begin{aligned}\theta_{j}&#x27; = \theta_j + \alpha\frac{1}{10}\sum_{k = i}^{i+9}(h_\theta((x^k) - y^k)x_j^k\end{aligned} θj=θj+α101k=ii+9(hθ((xk)yk)xjk

    α \alpha α就是学习率,也叫作每次优化更新的步长

    每次更新选择一小部分数据计算,小批量随机梯度下降兼顾了迭代速度和收敛方向,也是最常用的。

    一般设置小批量时取32,64,128,最常用的是32,64.

    学习率(步长)

    学习率的设定会对结果产生巨大的影响,一般设定小一些。如果学习率设置过大,很可能到达的收敛点是局部最小值也就是函数的一个极小值,而不是全局最优解,即全局最小值,甚至有可能使得结果不收敛。学习率设置过小,则收敛速度变慢,如何平衡收敛速度和避免结果不是全局最优解?例如,可以将训练过程分成几部分,0-10000次时采用大一点的学习率0.1,10000-30000次训练时候,学习率设置为0.005,30000次到100000次训练时候,将学习率设置为0.001。

    展开全文
  • 符号变量存入矩阵,便于计算高维函数梯度的求解 定义方式: for i = 1:n x(i) = syms(['x' num2str(i)]);end 以n维Hager函数为例, f=sum(exp(xi)-sqrt(i)*xi) 1 fx = 0; 2 for i = 1:n 3 fx = fx+exp(x(i)...

    符号变量存入矩阵,便于计算高维函数梯度的求解

    定义方式:

    for i = 1:n
         x(i) = syms(['x' num2str(i)]);
    end

    以n维Hager函数为例,

    f=sum(exp(xi)-sqrt(i)*xi)

    1 fx = 0;
    2 for i = 1:n
    3     fx = fx+exp(x(i))-sqrt(i)*x(i);
    4 end

    梯度函数:

    for i = 1:n
        'f_x'num2str(i)  = diff(f,x(i));
    end
    

      此时的梯度函数为符号函数(个人理解即为函数表达式),可用matlabFunction(函数)转化为函数

    for i = 1:n
        'fx' num2str(i) = matlabFunction('f_x' num2str(i));
    end
    

      继而可以求解梯度函数值。

    然而,到此遇到了一个问题,函数的偏导数维数往往不是n,想要求梯度函数在某个点处的值,若将改点坐标直接带入梯度函数fxi(函数f关于xi的偏导函数),会提示参数不匹配,又该如何解决?问题可简述如下,至今没有好的思路,欢迎各路大神指导。

    代码如下:

    clear all
    clc
    syms x1 x2 x3;
    f = x1^2+0.5*x2^2+0.5*x3^;
    X = [1;1;1];
    f_x1 = diff(f,x1);
    f_x2 = diff(f,x2);
    f_x3 = diff(f,x3);
    fx1 = matlabFunction(f_x1);
    fx2 = matlabFunction(f_x2);
    fx3 = matlabFunction(f_x3);
    g1 = [fx1(X(1),X(2),X(3)),fx2(X(1),X(2),X(3)),fx3(X(1),X(2),X(3))];
    

      结果提示最后一行参数不匹配。

    转载于:https://www.cnblogs.com/ibiancheng/p/9897092.html

    展开全文
  • 梯度(Gradient)

    千次阅读 2018-11-08 19:18:35
    设函数平面区域D内具有一阶连续偏导数,则对每一点都可以定出一个向量称为P点处的梯度,记作。 从定义中我们可以得到以下信息:1、梯度是矢量 2、梯度的模与函数点处的偏导数有关。 不难想象,函数几何...

    梯度是机器学习领域中一个非常常用且重要的一个数学概念,但是一直不是特别理解深层含义,于是查阅资料,对梯度进行一个总结说明。

    我们在高数中都学过梯度的定义:

    设函数f(x,y)在平面区域D内具有一阶连续偏导数,则对每一点P(x_{0},y_{0})\in D都可以定出一个向量f_{x}(x_{0},y_{0}) \vec{i} + f_{y}(x_{0},y_{0}) \vec{j}称为f(x,y)在P点处的梯度,记作\vec \triangledown f(x_{0},y_{0})

    从定义中我们可以得到以下信息:1、梯度是矢量     2、梯度的模与函数f(x,y)在点P(x_{0},y_{0})处的偏导数f_{x}(x_{0},y_{0}),f_{y}(x_{0},y_{0})有关。

    不难想象,函数f(x,y)在几何空间中实际上对应的是三维空间(或者是三维平面或者是三维曲面)。那么我们就以三维曲面为例,对梯度进行说明总结。

    首先我们看一幅图片

    preview

    假如我们在山顶,需要走到山谷的湖泊中,我们应该怎么走最快。这里,其实就涉及到了梯度的概念。

    在高数课本中还有这么一个定理是这么说的:梯度的方向与取得最大方向导数的方向一致,模为方向导数的最大值。

    那么,我们先来看看方向导数是什么样的存在。

    什么是方向导数,方向导数就是函数f(x,y)(当然不一定是二元函数)在某点沿特定方向的变化率

    xoy平面上的紫色箭头表示的是特定方向,这个方向是任意的,那么函数f(x,y)在这个方向上的图像如下图所示

                                         preview

    函数f(x,y)在点A处特定方向上存在切线,此时这条红色的切线斜率就是点A处的方向导数

                                          preview

    曲面上的A点投影到xoy面上的点有无数个方向,同样的A点也有无数个方向。

                                                preview

    每个方向上都存在方向导数,而方向导数最大的方向就是梯度的方向,方向导数的最大值就是梯度的值。

    preview

    那么问题来了,方向导数有无数个,那么它一定会存在最大值吗,而且这个最大值是唯一的。我们回到梯度的定义,定义中说到函数f(x,y)在D内有一阶连续偏导数,高数中的知识:偏导连续必可微我们知道,函数f(x,y)是可微的,那么函数f(x,y)各个方向的切线是共面的,即这些方向上的切向组成了在点A处的切平面。                    preview

    此处我们可以想象一下在一块平滑直立的玻璃上流下一滴水,这滴水的轨迹是唯一的,而且这滴水流下的方向就是玻璃上各点处的梯度的方向。所以最大方向导数是唯一的,梯度也是唯一的。

    最后用吴恩达老师在Coursera上的一张图片

            

    回到在山顶走到山谷湖泊的图片,沿着梯度的反方向(因为梯度表达的是增加最快的方向)就是最快到达山谷的方向。

    梯度是机器学习深度学习中求解参数中非常关键的一个概念

                                                       

    这是TensorFlow中的一张流图,可以看到,它就是根据梯度来训练模型的。此图来源于TensorFlow中文社区。

    补充:

    实际上对于一元函数也是存在梯度的,只不过梯度的方向只有沿x轴的正方向和反方向之分,其大小某点处的导数值。

    参考文献:

    1、如何直观形象的理解方向导数与梯度以及它们之间的关系?  https://www.zhihu.com/question/36301367

    2、吴恩达coursera  https://www.coursera.org/lecture/machine-learning/welcome-to-machine-learning-zcAuT

     

    展开全文
  • 梯度运算gradient

    2017-10-02 11:17:49
    向量微积分中,标量场的梯度是一个向量场。标量场中某一点上的梯度指向标量场增长最快...更严格的说,从欧几里得空间Rn到R的函数的梯度Rn某一点最佳的线性近似。这个意义上,梯度是雅可比矩阵的一个特殊情况。
  • 今天小编就为大家分享一篇TensorFlow梯度求解tf.gradients实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 一数学中的方向导数与梯度方向导数为函数沿一指定方向的变化率方向导数的定义为若此时的极限存在其中为与l同方向的单位向量该方向导数就是处沿方向l的变化率进而有其中为方向l的方向余玄 向量称为函数点的梯度记...
  • 梯度的本意是一个向量(矢量),表示一函数该点处的方向导数沿着该方向取得最大值,即函数该点处沿着该方向(此梯度的方向)变化最快,变化率最大(为该梯度的模)。 梯度 函数:z=f(x,y)z=f(x,y)z=f(x,y) ...
  • 梯度,函数在某一点梯度是这样一个向量,它的方向与取得最大方向导数的方向一致,而它的模为方向导数的最大值。 梯度的提出只为回答一个问题: 函数变量空间的某一点处,沿着哪一个方向有最大的变化率? (eg.三...
  • 江南一点

    千次阅读 多人点赞 2019-06-28 09:41:03
    反而不利于大家以后查看,因此我将资源细分了下,确保每一个分享链接不会轻易失效,这些资源都是长期有效的,大家需要时可以随时来松哥公众号中按需索取,如果有一个链接失效了,大家也可以本文末尾留言,我会...
  • 可导函数在某一点处取得极值的必要条件是梯度为0,梯度为0的点称为函数的驻点,这是疑似极值点。需要注意的是,梯度为0只是函数取极值的必要条件而不是充分条件,即梯度为0的点可能不是极值点。 至于是极大值还是极...
  • 梯度概念

    千次阅读 2020-09-12 11:03:28
    函数在某一点梯度是这样一个向量,它的方向与取得最大方向导数的方向一致,而它的模为方向导数的最大值 例如:函数f(x,y)的梯度对应的公式为: 注意: 1、梯度是一个向量,既有大小又有方向 2、梯度的方向是...
  • 梯度 : 表示一函数在一点处变化率最快的方向向量(可理解为这点的导数/偏导数) 样本 : 实际观测到的数据集,包括输入和输出(本文的样本数量用 m 表述,元素下标 i 表示) 特征 : 样本的输入(本文的特征数量用 n 表示,...
  • 深度学习笔记(13) Softmax分类

    万次阅读 2019-06-08 09:24:14
    试图识别一分类时做出预测 或者说是多种分类中的一个,不只是识别两个分类 假设不单需要识别猫,而是想识别猫,狗和小鸡 把猫加做类1,狗为类2,小鸡是类3 如果不属于以上任何一类,就分到“其它”或者说...
  • 曲面上任意取一点M(x0,y0,z0),曲线方程为: 设t=t0时对应点M,那么M点处的切向量为: 切线方程为: M点处的法向量为:, 法线方程为: ,, å上过点M的任何曲线该点的切线都同一平面上,此平面称为该点的...
  • 【机器学习】多元函数梯度的理解

    千次阅读 2020-05-17 15:05:21
    多维空间中,梯度是一个向量,表示某个函数该点处的方向导数沿着该方向取得最大值。 梯度是指增长最快的方向,也就是梯度的方向是方向导数中取到最大值的方向,梯度的值是方向导数的最大值。 ...
  • 神经网络梯度消失和梯度爆炸及解决办法

    万次阅读 多人点赞 2018-04-21 19:48:53
    本文同步更新我的微信公众号中,公众号文章地址:https://mp.weixin.qq.com/s/6xHC5woJND14bozsBNaaXQ目录:(1) 神经网络梯度消失与梯度爆炸(2) 几种激活函数的比较推荐阅读:《神经网络激活函数的...
  • 梯度(Gradient)与梯度下降法(Gradient Descent)

    万次阅读 多人点赞 2017-06-14 13:45:13
    引言  机器学习栏目记录我学习Machine Learning过程的一些心得笔记,涵盖... Andrew Ng老师Coursera的教程以及UFLDL Tutorial,经典书籍例如《统计学习方法》等,同时也参考了大量网上的相关资料(后面列出)。
  • 梯度下降 Gradient Descent 简介 ( 梯度下降过程 | 梯度下降方向 ) II . 梯度下降 示例说明 ( 单个参数 ) III . 梯度下降 示例说明 ( 多个参数 ) IV . 梯度下降 总结 ( 定义损失函数 | 损失函数求导 ) V . 梯度下降...
  • 散度与梯度在图像中的应用

    千次阅读 2018-12-23 20:26:04
    梯度和散度概念 首先回顾一下梯度和散度的概念。这里给出梯度和散度的公式: 对于u = u(x,y,z), 那么u的梯度就为:,梯度操作的是函数,得到的是偏导数作为各分量构成一个向量。 而散度则为 参考: ...
  • 引言  机器学习栏目记录我学习Machine Learning过程的一些心得笔记,涵盖... Andrew Ng老师Coursera的教程以及UFLDL Tutorial,经典书籍例如《统计学习方法》等,同时也参考了大量网上的相关资料(后面列出)。
  • 最近学习深度学习中的梯度下降与反向传播方面的知识。偶有心得,特此记录。若有不足之处,烦请指正赐教。  训练阶段,深度神经网络经过前向传播之后,得到的预测值与先前给出真实值之间存在差距。我们可以使用...
  • 如何理解梯度下降法

    千次阅读 多人点赞 2018-09-02 10:36:57
    从感性认识入手,由浅及深理解清楚梯度下降法,并举例说明梯度下降法的应用。
  • 梯度下降与随机梯度下降概念及推导过程

    万次阅读 多人点赞 2018-11-03 14:43:52
    同这一章的梯度下降部分加起来,才是我们要讲的如何求解多元线性回归.如果写一章中,内容过长,担心有的同学会看不完,所以拆分成两章.[坏笑] 上一章中有提到利用解析解求解多元线性回归,虽然看起来很方便,但是...
  • 数学基础知识(2) 梯度和方向向量

    千次阅读 2021-02-02 01:17:50
    机器学习的过程中,求导是一件重要的基础数学工具。尤其是对于多特征的数据、模型而言...机器学习优化参数的一个重要方法就是方向向量的基础上求其梯度。本文介绍了梯度、方向导数的含义以及其机器学习中的应用。
  • 数学优化入门:梯度下降法、牛顿法、共轭梯度

    万次阅读 多人点赞 2016-10-13 19:45:43
    1、基本概念 1.1 方向导数 1.2 梯度的概念 ...那么,某一点梯度方向是该点坡度最陡的方向,而梯度的大小告诉我们坡度到底有多陡。 对于含有n个变量的标量函数,其梯度表示为 1.3 梯度与方...
  • 关于梯度下降有关的理解及表述

    千次阅读 2018-03-04 00:29:11
    一、写前面 1、首先说明,本人是机器学习小白,刚开始接触这一个领域,很多知识会了解的不是特别全面,今后的学习过程中,会和大家一起努力、进步,本博客中仅仅写梯度下降的相关内容,并不会做相关的拓展。...
  • 梯度算法之梯度上升和梯度下降

    千次阅读 2017-12-13 22:48:02
    第一次看见随机梯度上升算法是看《机器学习实战》这本书,当时也是一知半解,只是大概知道和高等数学中的函数求导有一定的关系。下边我们就好好研究下随机梯度上升(下降)和梯度上升(下降)。
  • 灰度梯度

    2019-09-25 11:34:19
    对应图像中寻找某一点梯度方向即通过计算该点与其8邻域点的梯度角,梯度角最大即为梯度方向。      2.3应用  灰度梯度常用于边缘检测。  随着图像检测技术的发展,视觉检测的...
  • 梯度下一个准确的定义的时候,我们先来假设这样几种情况:(1)有一块金属板,下面有一处定点加热。然而,有一只蚂蚁正好金属板的上面。随着加热的进行,金属板的温度会越来越高,蚂蚁会往凉快的地方爬行。...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,160
精华内容 9,664
关键字:

在某一点的梯度