深度学习梯度下降算法简单理解

0x1,梯度下降简介:

可能简单的说:f(x)=y,x1=x-y导数,不停的求梯度。

首先,我们有一个可微分的函数。这个函数就代表着一座山。我们的目标就是找到这个函数的最小值,也就是山底。根据之前的场景假设,最快的下山的方式就是找到当前位置最陡峭的方向,然后沿着此方向向下走,对应到函数中,就是找到给定点的梯度 ,然后朝着梯度相反的方向,就能让函数值下降的最快!因为梯度的方向就是函数之变化最快的方向。

深度学习梯度下降算法简单理解_第1张图片

0x2,简单的例子

1,由最简单的y=wx+b+eps(eps为可能的误差)。通常会给出数据,其中数据有干燥点,这里我们来算出最合理的w和b的值。

2,为了排除负数的影响,用loss=(y-wx-b)?,这里loss函数的极小值对应的w,b即为我们要求的。

3,代码:(关键已经注释)

import torch
import numpy as np

#y=wx+b
def compter_error_for_line_given_points(b,w,points):
    totalError=0
    for i in range(0,len(points)):
        x=points[i,0] #对于数据取x值
        y=points[i,1] #对于数据取取y值
        totalError+=(y-(w*x+b))**2 #数据差进行迭代
    return totalError/float(len(points))
def step_radient(b_current,w_current,points,learningRate):#求梯度
    b_gradient=0 
    w_gradient=0
    N=float(len(points))
    for i in range(0,len(points)):
        x=points[i,0]
        y=points[i,1]
        b_gradient+=-(2/N)*(y-((w_current*x)+b_current)) #对b求导
        w_gradient+=-(2/N)*x*(y-((w_current*x)+b_current)) #对w求导
    new_b=b_current-(learningRate*b_gradient)
    new_m=w_current-(learningRate*w_gradient)
    return [new_b,new_m]
def gradient_descent_runner(points,starting_b,starting_m,learning_rate,num_iterations):
    b=starting_b  #配合上面函数使用,求解出最后的w和b
    m=starting_m
    for i in range(num_iterations):
        b,m=step_radient(b,m,np.array(points),learning_rate)
    return [b,m]

def run():
    points=np.genfromtxt("data.csv",delimiter=",")#开始初始化各种数据和赋值
    learning_rate=0.0001
    initial_b=0
    initial_m=0
    num_iterations=1000
    print("Starting gradient descent at b={0},m={1},error={2}"
          .format(initial_b,initial_m,
                  compter_error_for_line_given_points(initial_b,initial_m,points))
          )
    print("Running.....")
    [b,m]=gradient_descent_runner(points,initial_b,initial_m,learning_rate,num_iterations)
    print("After {0} iterations b = {1}, m = {2}, error = {3}".
          format(num_iterations, b, m,
                 compter_error_for_line_given_points(b, m, points))
          )
if  __name__=='__main__':
    run()

运行结果,结束。

你可能感兴趣的:(深度学习梯度下降算法简单理解)