当前位置:   article > 正文

深度学习中梯度及梯度法_深度学习 梯度

深度学习 梯度
  • 梯度

简单来说,例如有 y=f(x0,x1)

(fx0,fx1)这样的全部由变量的偏导数组成的向量称为梯度(gradient)。

实际上,梯度会指向各点处的函数值降低的方向。更严格的讲,梯度指示的方向是各点处的函数值减少最多的方向。

为什么这么说,因为方向导数=cos(θ)×梯度,而θ是方向导数的方向和梯度方向的夹角。所以,所有的下降方向中,梯度方向下降的最多。

 

  • 梯度法

   神经网络的主要任务是在学习时找到最优的参数(权重和偏置),这个最优参数也就是损失函数最小时的参数。但是,一般情况下,损失函数比较复杂,参数也很多,无法确定在哪里取得最小值。所以通过梯度来寻找最小值(或者尽可能小的值)的方法就是梯度法

   需要注意的是,梯度表示的是各点处的函数值减少最多的方向,所以梯度的方向并不一定指向最小值。但是沿着它的方向能够最大限度地减少函数的值。因此,在寻找函数的最小值(或者尽可能小的值)的位置的时候,要以梯度的信息为线索,决定前进的方向。

   此时梯度法就派上用场了。在梯度法中,函数的取值从当前位置沿着梯度方向前进一定距离,然后在新的方向重新求梯度,再沿着新梯度方向前进,如此反复。

   像这样,通过不断地沿梯度方向前进,逐渐减小函数值的过程就是梯度法(gradient mothod)。一般来说,神经网络(深度学习)中,梯度法主要是指梯度下降法(gradient descent mothod)。

   现在,我们试着用数学公式表达梯度下降(两个变量情况下):

x0=x0ηfx0, x1=x1ηfx1

其中,η表示更新量,在神经网络的学习中,称为学习率 (learning rate)。学习率决定在一次学习中,应该学习多少,以及在多大程度上更新参数。

   学习率需要事先设定为某个值,比如0.01或0.001。一般而言,这个值过大或过小,都无法抵达一个“好的位置”。在神经网络的学习中,一般会一边改变学习率的值,一边确认学习是否正确进行。

下面,我们用Python来实现梯度下降法。

  1. def gradient_descent(f, init_x, lr=0.01, epoch=100):
  2. x = init_x
  3. for i in range(epoch):
  4. grad = numerical_gradient(f, x) # 求导函数
  5. x -= lr * grad
  6. return x

其中,f是要求的函数,init_x是初始值,lr是learning rate,epoch是梯度法的重复次数,也就是计算多少次。

其中numerical_gradient(f, x)为df(x)dx=f(x+h)f(xh)2h,代码如下:

  1. # 用定义法求导数
  2. def numerical_gradient(f, x):
  3. h = 1e-4
  4. grad = np.zeros_like(x)
  5. for idx in range(x.size):
  6. temp = x[idx]
  7. # 计算f(x+h)
  8. x[idx] = temp + h
  9. fxh1 = f(x)
  10. # 计算f(x-h)
  11. x[idx] = temp - h
  12. fxh2 = f(x)
  13. grad[idx] = (fxh1 - fxh2)/(2 * h)
  14. x[idx] = temp
  15. return grad

例:用梯度法求f(x0,x1)=x02+x12 的最小值.

  1. def function(x):
  2. return x[0]**2 + x[1]**2
  3. inin_x = np.array([-3.0, 4.0])
  4. print(gradient_descent(function, inin_x, lr=0.1, epoch=100))

初始值为(-3,4)可以看出结果很接近(0,0)。实际的最小值点(0,0),所以可以说基本得到了正确的结果。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/427963
推荐阅读
相关标签
  

闽ICP备14008679号