吴恩达机器学习笔记:(三)梯度下降法

梯度下降法

知识点:

偏导数、微积分、局部最优解
吴恩达机器学习笔记:(三)梯度下降法_第1张图片
吴恩达机器学习笔记:(三)梯度下降法_第2张图片
吴恩达机器学习笔记:(三)梯度下降法_第3张图片
吴恩达机器学习笔记:(三)梯度下降法_第4张图片
吴恩达机器学习笔记:(三)梯度下降法_第5张图片
吴恩达机器学习笔记:(三)梯度下降法_第6张图片
吴恩达机器学习笔记:(三)梯度下降法_第7张图片

概念介绍

梯度下降法目的是为了“下降”,下降的方法是按照“梯度”。比如你在一座山上,当前你只能迈出一步,如何走才能使你的高度下降的最多呢,根据梯度的理论,我们沿着当前梯度的反方向走,会让我们的下降幅度最大。
上述例子中,山就是一个函数,在山上的你就是函数中待优化的变量,人的坐标表示变量初始值,我们要 求的是函数最小值即到达山底,人该如何走即如何迭代变量。所以我们只要沿着函数梯度的反方向,就能最快的到达我们要去的地方。
梯度下降是一种更新参数的方法,具体如何更新跟原函数的在某点的梯度有关。不会改变要求的最优解。
我们可以利用梯度下降法求最大值和最小值,求最大值沿着梯度方向走即可,求最小值则沿着梯度的反方向走。

公式

抽象的公式就一个
吴恩达机器学习笔记:(三)梯度下降法_第8张图片

吴恩达机器学习笔记:(三)梯度下降法_第9张图片

代码实现:

import numpy as np


row = 20
x0 = np.zeros((row,1))
x1 = np.arange(0,row+0).reshape(row,1)
x2 = np.arange(10,row+10).reshape(row,1)
x3 = np.arange(21,row+21).reshape(row,1)
x = np.hstack((x1,x2,x3))
y = 2*x1 +3*x2 + 4*x3 + np.random.random(row).reshape(row,1)

#定义代价函数
def error_function(theta, x, y):
    diff = np.dot(x, theta) - y
    return (1./2*row) * np.dot(np.transpose(diff), diff)

#求梯度的函数
def gradient_function(theta, x, y):
    diff = np.dot(x, theta) - y
    return (1./row) * np.dot(np.transpose(x), diff)


#利用梯度下降法不断迭代参数
def gradient_descent(x, y, alpha):
    theta = np.array([1, 1, 1]).reshape(3, 1)
    gradient = gradient_function(theta, x, y)
    while not np.all(np.absolute(gradient) <= 1e-5):
        theta = theta - alpha * gradient
        gradient = gradient_function(theta, x, y)
        # print(gradient)
    return theta

alpa = 0.001
theta = gradient_descent(x,y,alpa)
print(theta)

result:

[[1.        ]
 [1.97155845]
 [2.96137676]
 [4.05017691]]

上述代码中 ,学习率为0.001,把学习率改成1会发生什么呢,自己试试看,会发现程序会一直运行不停止,打印出梯度会发现,梯度一直增加最终变成了无限大。
这是因为,如果学习率过大,会导致不收敛,因为跨的步数太大,会越过那个最低点,并一直震荡。至于为什么梯度会变得越来越大以至于无限大;
举个例子
吴恩达机器学习笔记:(三)梯度下降法_第10张图片
在A(10,200)点,梯度为40,所以下一时刻到B点的横坐标为10-140= -30,
在B(-30,1800)点,梯度为-120,所以下一时刻到达的点的横坐标为-30+1120=90,这样会导致离最优值越来越远。
所以:

学习率太大会导致不收敛
学习率太小会导致到达最低点的迭代次数太大,费时

你可能感兴趣的:(机器视觉,Deep,learning,机器学习)