机器学习的主要任务是在学习时寻找最优参数,神经网络作为实现机器学习的一种方法,也必须在学习时找到最优参数(权重和偏置),这里所说的参数一般是指损失函数取得最小值时的参数,但是,损失函数一般都很复杂,参数空间维度很高,非常庞大,我们不知道它在何处能取得最小值,而通过巧妙地使用梯度来寻找函数最小值地方法就是梯度法。
梯度法中,函数的取值从当前位置沿着梯度方向前进一定距离,然后再新的地方重新求梯度,再沿着新的梯度方向前进,如此反复,不断地沿梯度方向前进,下面我们以图形化几何的角度,来说明三维空间中梯度的物理意义.
1. 
函数图像为:
梯度图像:
2.
三维图像:
梯度图像:
3.z=x+y
三维图像
梯度图像:
3.
梯度图
4.
梯度图像:
同样,此函数在另一个二维区间的梯度图形是:
绘制梯度代码:
# 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的最低处,就像指南针一样,所有的箭头都指向同一点,仔细观察还发现,离最低处越远,箭头越大。
虽然在函数
中,梯度指向了最低处,但是指向性并非是最低处的充分条件,实际上,梯度会指向各点处的函数值降低的方向,更严格的讲,梯度指示的方向是各点处的函数值减小最多的方向,但是,某点处的减小最多的方向,并不一定是全局的减小最多的方向。
函数哪些地方的梯度为0呢?函数梯度为0的点在函数的极小值,最小值以及被称为鞍点的地方,极小值是局部最小值,也就是在限定的某个范围内的最小值,鞍点是从某个方向上看是极大值,从另一个方向上看则是极小值的点,虽然梯度法是要寻找梯度为0的点,但是那个地方不一定就是最小值,此外,当函数很复杂且成扁平状时,梯度下降可能会进入一个几乎平台的区域,梯度很小,几乎快要消失,在机器学习中被称为“学习高原”,无法进行高效的训练学习。