乐趣区

关于机器学习:梯度下降算法

概述

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

梯度降落原理

山谷问题

梯度降落,简略的来说就是要找到最小的点,而所谓找到最小的点,就相似向山谷中走,每次都心愿找到那山谷中的 最低点,而后如何确定走到最低点的门路的问题。

当初假如,咱们并 不能间接看到最低点,只能看到本人四周的一小部分,要一步一步的找到最低点。

所以当初就以本人的地位为基准,找到 最平缓 的方向 (即切线方向),而后沿 降落方向 走一步;再找到 最平缓的方向,再走一步。直到走到最低点。

梯度

梯度理论就是多变量微分的一般化:

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

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

梯度降落

在损失函数中,个别状况下有两种参数:管制信号量的权重(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 = array([
    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/

退出移动版