Press "Enter" to skip to content

梯度下降算法

本站内容均来自兴趣收集,如不慎侵害的您的相关权益,请留言告知,我们将尽快删除.谢谢.

概述

 

梯度下降算法在机器学习中十分广泛。不论是在线性回归还是在逻辑回归中,它的主要目的是通过迭代来找到目标函数的最小值,以最小化损失函数。

 

梯度下降原理

 

山谷问题

 

,简单的来说就是要找到最小的点,而所谓找到最小的点,就类似向山谷中走,每次都希望找到那山谷中的 最低点 ,然后如何确定走到最低点的路径的问题。

 

现在假设,我们并 不能直接看到最低点 ,只能看到自己周围的一小部分,要一步一步的找到最低点。

 

所以现在就以自己的位置为基准,找到 最陡峭 的方向(即切线方向),然后沿 下降方向 走一步;再找到 最陡峭的方向 ,再走一步。直到走到最低点。

 

 

梯度

 

梯度实际就是多变量微分的一般化:

 

 

梯度就是对每个变量进行微分,用 <> 括起来,表示图梯度是个向量。

单变量 函数中,梯度就是该函数的微分,也就是切线的斜率。
多变量 函数中,梯度是一个向量,向量的方向表示 梯度的方向 ,即 下降最快 的方向。

梯度下降

 

在损失函数中,一般情况下有两种参数: 控制信号量的权重(w)调整函数与真实值之间的偏差(b)

 

梯度下降 就是不断的调整 权重w偏差b 的值,使得损失最小。

 

通过对 梯度 的向量方向分析,我们知道了下降的方向,但是每次要 走多少 还不知道。

 

这就需要定义一个新的概念: 学习率(α)

 

 

其中 ωi 表示权重的初始值, ωi+1 表示更新后的权重值。在梯度下降中,会重复这个式子多次,然后直到损失函数收敛不变。

 

对于 α 的选择,不能太大,以防错过了最低点;也不能太小,使下降的速度缓慢。

 

梯度下降过程

 

1.循环所有样本数据

 

(1) 计算第 i 个训练数据的 权重ω偏差b 相对于损失函数的梯度。于是我们最终会得到每一个训练数据的权重和偏差的梯度值。

 

(2) 计算所有训练数据 权重ω梯度的总和

 

(3) 计算所有训练数据 偏差b梯度的总和

 

2.更新权重和偏差

 

(1) 使用上面第 (2)、(3) 步所得到的结果,计算所有样本的 权重偏差梯度的平均值

 

(2) 使用下面的式子, 更新 每个样本的 权重值偏差值

 

 

重复上面的过程,直到 损失函数收敛 不变。

 

梯度下降demo

 

1.定义数据集

 

from numpy import *
# 数据集大小 即20个数据点
m = 20
# x的坐标以及对应的矩阵
X0 = ones((m, 1))  # 生成一个m行1列的向量,也就是x0,全是1
X1 = arange(1, m+1).reshape(m, 1)  # 生成一个m行1列的向量,也就是x1,从1到m
X = hstack((X0, X1))  # 按照列堆叠形成数组,其实就是样本数据
# 对应的y坐标
Y = ([
    3, 4, 5, 5, 2, 4, 7, 8, 11, 8, 12,
    11, 13, 13, 16, 17, 18, 17, 19, 21
]).reshape(m, 1)
# 学习率
alpha = 0.01

 

其中 reshape() 函数将 原数组 重新组织成一个 m行1列二维数组

 

2.代价函数和梯度函数

 

# 定义代价函数
def cost_function(theta, X, Y):
    diff = dot(X, theta) - Y  # dot() 数组需要像矩阵那样相乘,就需要用到dot()
 return (1/(2*m)) * dot(diff.transpose(), diff)
 
# 定义代价函数对应的梯度函数
def gradient_function(theta, X, Y):
    diff = dot(X, theta) - Y
    return (1/m) * dot(X.transpose(), diff)

 

3.梯度下降计算

 

# 梯度下降迭代
def gradient_descent(X, Y, alpha):
    theta = array([1, 1]).reshape(2, 1)
    gradient = gradient_function(theta, X, Y)
    
    while not all(abs(gradient) <= 1e-5):
        theta = theta - alpha * gradient
        gradient = gradient_function(theta, X, Y)
    return theta
    
optimal = gradient_descent(X, Y, alpha)
print('optimal:', optimal)
print('cost function:', cost_function(optimal, X, Y)[0][0])

 

当梯度小于 1e-5 时,表示这时候已经到达 谷底 。这时候迭代就不会取得比较大的效果,所以退出循环,结束迭代。

 

4.画出图像

 

# 根据数据画出对应的图像
def plot(X, Y, theta):
    import matplotlib.pyplot as plt
    ax = plt.subplot(111)   # 绘制子图
    ax.scatter(X, Y, s=30, c="red", marker="s")
    plt.xlabel("X")
    plt.ylabel("Y")
    x = arange(0, 21, 0.2)  # x的范围
 y = theta[0] + theta[1]*x
    ax.plot(x, y)
    plt.show()
plot(X1, Y, optimal)

 

5.效果图

 

 

得到一个样本数据的线性拟合。

 

参考:

 

https://zhuanlan.zhihu.com/p/68468520

 

https://blog.csdn.net/qq_41800366/article/details/86583789

https://www.w3cschool.cn/tensorflow_python/

Be First to Comment

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注