• 【笔记】如何确定梯度计算的准确性以及调试梯度下降法


    如何确定梯度计算的准确性以及调试梯度下降法

    如何调试梯度

    关于梯度的调试的方法的思想

    对于一根曲线,我们求其在某一个点的相应的梯度值,我们就要求这个导数值,那么这个导数对应的就是这个点上的相切的直线的斜率,那么我们可以试着模拟这个直线的斜率,方式是在这个点的正方向的附近取一个点,在负方向上同样的也取一个点,那么我们就说这两点的连线的斜率和我们在这个点的切线的斜率是大致相同的,这个间距越小,越接近相同,思想类似于导数的定义,在很小的时候取一个极限,那么我们就能将这个直线的斜率算出来,作为这个切线的取代值,那么我们就得到了模拟计算斜率的式子

    这个模拟也是适合高维的场景,如果theta是个n维向量,那么我们想要求出theta对应的梯度的话,我们就要使这个函数对theta中的每一个分量进行求导,那么对每一个分量去求导,以此类推,这样我们就可以得到梯度,但是这是很麻烦的,这仅仅作为是个调试手段,使用小数据量来进行结果的推导

    (在notebook中)

    同样的将需要的加载好,X的样本数为1000,我们设置成有十个维度,我们先设置好真的theta值,这里设置十一个数,有了真的theta值以后,我们先求出来对应的X_b,之后如果真的在x和y之间有线性关系并且是被true_theta给划了的话,那么就使y为X_b.dot(true_theta),同时加上一个噪音

      import numpy as np
      import matplotlib.pyplot as plt
    
      np.random.seed(666)
      X =np.random.random(size=(1000,10))
    
      true_theta = np.arange(1,12,dtype=float)
    
      X_b = np.hstack([np.ones((len(X),1)),X])
      y = X_b.dot(true_theta) + np.random.normal(size=1000)
    

    其中X.shape为

    相应的y.shape为

    其中的true_theta为

    首先我们先设置一个函数,这个函数可以求解出相应损失函数

      def J(theta, X_b, y):
          try:
              return np.sum((y - X_b.dot(theta)) ** 2) / len(X_b)
          except:
              return float('inf')
    

    然后在使用数学推导的方式来求梯度

      def dJ_math(theta, X_b, y):
          return X_b.T.dot(X_b.dot(theta) - y) * 2. / len(y)
    

    相应的,设置一个调试方式来求梯度,因为返回的是一个等长的向量,因此设置成len(theta),然后进行循环,每一次求梯度的一个维度的对应的值,我们取两个值,最后进行计算即可得相应的值,返回对应的点的导数值

      def dJ_debug(theta,X_b,y,epsilon=0.01):
          res = np.empty(len(theta))
          for i in range(len(theta)):
              theta_1 = theta.copy()
              theta_1[i] += epsilon
              theta_2 = theta.copy()
              theta_2[i] -= epsilon
              res[i] = (J(theta_1,X_b,y) - J(theta_2,X_b,y)) / (2*epsilon)
          return res
    

    使用批量梯度下降法来进行验证

      def gradient_descent(dJ,X_b, y, initial_theta, eta, n_iters=1e4, epsilon=1e-8):
    
          theta = initial_theta
          cur_iter = 0
      
          while cur_iter < n_iters:
              gradient = dJ(theta, X_b, y)
              last_theta = theta
              theta = theta - eta * gradient
              if (abs(J(theta, X_b, y) - J(last_theta, X_b, y)) < epsilon):
                  break
    
              cur_iter += 1
    
          return theta
    

    要想使用,首先要先得出X_b,其次在取全0的theta值,学习率为0.01,然后就可以调用了,首先我们使用调试的方法,得出结果并计时

      X_b = np.hstack([np.ones((len(X),1)),X])
      initial_theta = np.zeros(X_b.shape[1])
      eta = 0.01
    
      %time theta = gradient_descent(dJ_debug,X_b,y,initial_theta,eta)
      Theta
    

    结果如下

    使用数学推导的方法并计时

      %time theta = gradient_descent(dJ_math,X_b,y,initial_theta,eta)
      theta
    

    结果如下

    这说明了两件事

    第一件事是使用debug的方法来求梯度是可以的,最终是可以得到结果
    第二件事就是使用这种方法来进行求值的话,会慢很多

    因此在遇到含有梯度的求法的机器学习算法的时候,我们完全可以先使用debug的方法来作为梯度的算法,通过这个方式,我们可以先得到我们想要的正确的结果,然后我们再来推导公式,来计算这个相应的数学解

    之后我们将数学解带入到算法中,通过使用的的结果来对比debug的结果,看看是否一样,来验证我们推导的数学解是否是正确的,debug函数是基于当前的函数来debug的,可以不用看J的情况,所以很多时候我们都可以使用这个方法

    关于梯度下降法的更多以及总结

    批量梯度下降法是每一次都要对所有的样本看一遍才能求出梯度,相对来讲,这个方法每一次会比较慢,但是很稳定,一定向着损失函数下降最快的方向进行前进

    随机梯度下降法是每一次只用看一个样本就可以求出相应的梯度,相对来讲,虽然这个方法很快,但是不稳定,每一次的方向都是不确定的,甚至有可能反方向前进

    综合二者的优缺点,我们就可以得到小批量梯度下降法,什么是小批量呢,我们每一次都不要看所有的样本,但是也不能只看一个样本,我们每次只看k个样本,这样既提升了速度有上升了精度,其中的梯度推导的思想和上面是一样的,只是多了一个超参数k

    随机在机器学习的领域是十分重要的,对于一个复杂的函数来说,它可以通过随机的方式来跳出局部最优解,同时可以获取到更快的运行速度,机器学习领域很多的算法都会使用随机的特点,例如随机搜索,随机森林算法,蒙特卡洛树等,由于机器学习本身就是解决在不确定的世界中不确定的问题,其本身很有可能就没有一个固定的最优解,因此,随机是很重要的

    感谢观看,文笔有限,博客不出彩,还请多多见谅
  • 相关阅读:
    Pig设计模式概要以及与SQL的设计模式的对比
    Pig设计模式概要以及与SQL的设计模式的对比
    ArcGIS API for Silverlight 学习笔记
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
    xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!
  • 原文地址:https://www.cnblogs.com/jokingremarks/p/14289321.html
Copyright © 2020-2023  润新知