梯度下降算法

概述

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

梯度下降原理

山谷问题

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

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

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

image.png

梯度

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

image.png

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

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

梯度下降

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

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

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

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

image.png

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

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

梯度下降过程

1.循环所有样本数据

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

2.更新权重和偏差

(1) 使用上面第(2)、(3)步所得到的结果,计算所有样本的权重偏差梯度的平均值
(2) 使用下面的式子,更新每个样本的权重值偏差值
image.png
重复上面的过程,直到损失函数收敛不变。

梯度下降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.效果图

image.png

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


参考:

https://zhuanlan.zhihu.com/p/68468520
https://blog.csdn.net/qq_41800366/article/details/86583789
https://www.w3cschool.cn/tensorflow_python/


朴世超
个人学习总结与项目实战问题记录
345 声望
21 粉丝
0 条评论
推荐阅读
多神经元简单神经网络的实现
数据集首先数据集选择使用Cifar-10。这个数据集合包含十个类的图片,每类6000张32 x 32的图片,共计60000张图片,其中50000训练图片,10000张测试图片。这里下载了python对应的版本:读取文件在Cifar-10的网站,...

喵先生的进阶之路1阅读 1.5k

TOPI 简介
这是 TVM 算子清单(TOPI)的入门教程。 TOPI 提供了 numpy 风格的通用操作和 schedule,其抽象程度高于 TVM。本教程将介绍 TOPI 是如何使得 TVM 中的代码不那么样板化的。

超神经HyperAI1阅读 90.7k

编译 MXNet 模型
本篇文章译自英文文档 Compile MXNet Models。作者是 Joshua Z. Zhang,Kazutaka Morita。更多 TVM 中文文档可访问 →TVM 中文站。本文将介绍如何用 Relay 部署 MXNet 模型。首先安装 mxnet 模块,可通过 pip 快速...

超神经HyperAI1阅读 49.7k

编译 PyTorch 模型
本篇文章译自英文文档 Compile PyTorch Models。作者是 Alex Wong。更多 TVM 中文文档可访问 →TVM 中文站。本文介绍了如何用 Relay 部署 PyTorch 模型。首先应安装 PyTorch。此外,还应安装 TorchVision,并将其...

超神经HyperAI1阅读 93k

横向对比 11 种算法,多伦多大学推出机器学习模型,加速长效注射剂新药研发
内容一览:长效注射剂是解决慢性病的有效药物之一,不过,该药物制剂的研发耗时、费力,颇具挑战。对此,多伦多大学研究人员开发了一个基于机器学习的模型,该模型能预测长效注射剂药物释放速率,从而提速药物整...

超神经HyperAI1阅读 38.6k

封面图
科罗拉多州立大学发布CSU-MLP模型,用随机森林预测中期恶劣天气
内容一览:近期,来自美国科罗拉多州立大学与 SPC 的相关学者联合发布了一个基于随机森林的机器学习模型 CSU-MLP,该模型能够对中期 (4-8天) 范围内恶劣天气进行准确预报。目前该成果刊已发表在《Weather and For...

超神经HyperAI阅读 56.6k

封面图
利用 UMA 使硬件加速器可直接用于 TVM
本篇文章译自英文文档 Making your Hardware Accelerator TVM-ready with UMA作者是 Michael J. Klaiber,Christoph Gerum,Paul Palomero Bernardo。更多 TVM 中文文档可访问 →TVM 中文站本节介绍通用模块化加速器...

超神经HyperAI阅读 94.1k

345 声望
21 粉丝
宣传栏