不同函数的梯度图像

217 篇文章 30 订阅
98 篇文章 7 订阅

机器学习的主要任务是在学习时寻找最优参数,神经网络作为实现机器学习的一种方法,也必须在学习时找到最优参数(权重和偏置),这里所说的参数一般是指损失函数取得最小值时的参数,但是,损失函数一般都很复杂,参数空间维度很高,非常庞大,我们不知道它在何处能取得最小值,而通过巧妙地使用梯度来寻找函数最小值地方法就是梯度法。

梯度法中,函数的取值从当前位置沿着梯度方向前进一定距离,然后再新的地方重新求梯度,再沿着新的梯度方向前进,如此反复,不断地沿梯度方向前进,下面我们以图形化几何的角度,来说明三维空间中梯度的物理意义.

1.  z=x^3+y^3

函数图像为:

 梯度图像:

 2.z=x^2+y^2

三维图像:

梯度图像:

 3.z=x+y

三维图像

梯度图像:

 3.z=x^4+y^4

梯度图

4.z=x^5+y^5

梯度图像:

同样,此函数在另一个二维区间的梯度图形是:

绘制梯度代码:

# coding: utf-8
# cf.http://d.hatena.ne.jp/white_wheels/20100327/p3
import numpy as np
import matplotlib.pylab as plt
from mpl_toolkits.mplot3d import Axes3D


def _numerical_gradient_no_batch(f, x):
    h = 1e-4 # 0.0001
    grad = np.zeros_like(x)
    
    for idx in range(x.size):
        tmp_val = x[idx]
        x[idx] = float(tmp_val) + h
        fxh1 = f(x) # f(x+h)
        
        x[idx] = tmp_val - h 
        fxh2 = f(x) # f(x-h)
        grad[idx] = (fxh1 - fxh2) / (2*h)
        
        x[idx] = tmp_val # 还原值
        
    return grad


def numerical_gradient(f, X):
    if X.ndim == 1:
        return _numerical_gradient_no_batch(f, X)
    else:
        grad = np.zeros_like(X)
        
        for idx, x in enumerate(X):
            grad[idx] = _numerical_gradient_no_batch(f, x)
        
        return grad


def function_2(x):
    if x.ndim == 1:
        return np.sum(x**(5))
    else:
        return np.sum(x**(5), axis=1)


def tangent_line(f, x):
    d = numerical_gradient(f, x)
    print(d)
    y = f(x) - d*x
    return lambda t: d*t + y
     
if __name__ == '__main__':
    x0 = np.arange(-5, 5, 0.25)
    x1 = np.arange(-5, 5, 0.25)
    X, Y = np.meshgrid(x0, x1)
    
    X = X.flatten()
    Y = Y.flatten()
    
    grad = numerical_gradient(function_2, np.array([X, Y]) )
    
    plt.figure()
    plt.quiver(X, Y, -grad[0], -grad[1],  angles="xy",color="#666666")#,headwidth=10,scale=40,color="#444444")
    plt.xlim([-5, 5])
    plt.ylim([-5, 5])
    plt.xlabel('x0')
    plt.ylabel('x1')
    plt.grid()
    plt.legend()
    plt.draw()
    plt.show()

在上面的例子中,为了更好的理解梯度,我们把一些函数的梯度画在图上,不过,这里我们话的是元素值为负梯度的向量,而负梯度才是梯度下降法中变量的更新方向。以

z=x^2+y^2

为例,观察它的图像,发现梯度指向函数z的最低处,就像指南针一样,所有的箭头都指向同一点,仔细观察还发现,离最低处越远,箭头越大。

虽然在函数

z=x^2+y^2

中,梯度指向了最低处,但是指向性并非是最低处的充分条件,实际上,梯度会指向各点处的函数值降低的方向,更严格的讲,梯度指示的方向是各点处的函数值减小最多的方向,但是,某点处的减小最多的方向,并不一定是全局的减小最多的方向。

函数哪些地方的梯度为0呢?函数梯度为0的点在函数的极小值,最小值以及被称为鞍点的地方,极小值是局部最小值,也就是在限定的某个范围内的最小值,鞍点是从某个方向上看是极大值,从另一个方向上看则是极小值的点,虽然梯度法是要寻找梯度为0的点,但是那个地方不一定就是最小值,此外,当函数很复杂且成扁平状时,梯度下降可能会进入一个几乎平台的区域,梯度很小,几乎快要消失,在机器学习中被称为“学习高原”,无法进行高效的训练学习。


结束!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

papaofdoudou

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

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

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

打赏作者

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

抵扣说明:

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

余额充值