深度学习笔记(六):如何运用梯度下降法来解决线性回归问题

简介: 这篇文章介绍了如何使用梯度下降法解决线性回归问题,包括梯度下降法的原理、线性回归的基本概念和具体的Python代码实现。

1.梯度下降法

梯度下降法是一种常用的迭代方法,其目的是让输入向量找到一个合适的迭代方向,使得输出值能达到局部最小值。在拟合线性回归方程时,我们把损失函数视为以参数向量为输入的函数,找到其梯度下降的方向并进行迭代,就能找到最优的参数值。

我们看下面这个二维平面:
在这里插入图片描述
也就是说我们要运用梯度下降法顺利且快速的找到全局最优解,也就是最低的地方,我们运用的公式如下:

在这里插入图片描述
W1为上一层的权值,α为学习率,后面这个比值是y对w进行求导之和,通过我后面给的代码可以很清楚的看出来。
这时候最关键的地方就是学习率的大小了,要了解学习率的大小对于找全局最优解的影响可以看我上一篇博客:
https://developer.aliyun.com/article/1624220
然后通过调整学习率可以有效的找到我们全局最优解,也就是下图:
在这里插入图片描述
找到全局最优之后就可以得到我们最优的w和b,从而得到最优的loss(衡量预测值和真实值的差异)。由于导数(对应的斜率)是矢量,也就是y对w的比值是有正负的,所以如果学习率得当,那么当小球(假装从山顶向下找最优解的是小球)达到最底端之后就会一直在这个附近徘徊,也就是我们要找的最优解,但是这里很有可能不是全局最优,而是局部最优,就好似山坡上有许多坑,从小球来看它并不会知道哪个是最低的。

这时候我们就会考虑如何才能够避免局部最优点的困扰

  • 方法1.不同的初始权值进行训练,选择最好的结果。假定误差曲面是个坑坑洼洼的曲面,我们尝试第一次降落到随机的起点,然后再开始摸索前进,也许会有运气好的一次,能够不落在某个小坑附近,多次尝试权重,可能会找到好的全局点。

  • 方法2.使用随机梯度下降代替真正的梯度下降。可以这样理解,每次针对单个数据样例进行摸索前进时,本质上是在一个样例形成的误差曲面上摸索前进,而每个样例的曲面大体类似,又不尽相同,当你掉入一个坑里时,往往能被别的曲面拽出来。

  • 方法3.模拟退火法(允许在当前点的一定范围内寻找其他点,选择最优的)

2.线性回归问题

所谓的线性回归,也就是y和x的关系是线性的,就像我们平常见到的y=ax+b
在神经网络中表示的是y=wx+b,如果是多特征,我们的y就可以表示为:y=b+w1x1+w2x2+w3x3…+wnxn,其中n代表特征的个数。

3.具体代码

搞懂这个代码对于计算loss和理解梯度下降帮助很大的,请仔细欣赏。

import numpy as np

"""
主要为3步,
1.计算loss,通过定义了一个计算总损失的函数、
2.计算和更新梯度,定义了一个用于更新w和b的函数,
3.循环迭代,还有一个用于进行迭代的函数,这个迭代的函数会不断去执行更新w和b的函数,
然后把得到的w和b传入到总损失的函数去计算,最终得到一个最适宜的损失,损失函数的求解方法就是通过wx+b-y得到,
也就是说下一层的输入值减去上一层的输出值得到的差值就叫做loss。
"""
# 计算总loss
def compute_loss(w_start,b_start,points):
    w = w_start
    b = b_start
    n = float(len(points))
    totleloss = 0
    for i in range(len(points)):
        x = points[i,0]
        y = points[i,1]
        totleloss += ((w*x+b)-y)**2
    return totleloss/n

# 通过梯度下降法去更新w和b
def gradient_descent_step(w_start,b_start,points,lr):
    n = len(points)
    for i in range(n):
        x = points[i,0]
        y = points[i,1]
        w_gradient = (2/n)*((w_start*x+b_start)-y)*x
        b_gradient = (2/n)*((w_start*x+b_start)-y)
    w_new = w_start - lr * w_gradient
    b_new = b_start - lr * b_gradient
    return w_new,b_new

# 迭代训练,更新
def gradient_runner(w_start,b_start,points,lr,num):
    w = w_start
    b = b_start
    points = np.array(points)
    # print(points)
    for i in range(num):
        w,b = gradient_descent_step(w,b,points,lr)
    return w,b

def run():
    initial_w = 0
    initial_b = 0
    num = 1000
    lr = 0.0001
    points = np.genfromtxt('data.csv',delimiter=',')
    print('Start gradient descent at w = {0},b = {1},loss = {2}'.format(initial_w,initial_b,compute_loss(initial_w,initial_b,points)))
    print('running................')
    w,b=gradient_runner(initial_w,initial_b,points,lr,num)
    print('after {0} iterations :w = {1},b = {2},loss = {3}'.format(num,w,b,compute_loss(w,b,points)))

if __name__ == '__main__':
    run()

运行结果:
在这里插入图片描述
在迭代次数为1000和学习率为0.0001的时候loss能达到一个最小值,相比以前的loss好了太多了,w和b也找到了最优值。

学习不止是一种能力 更是一种艺术

目录
相关文章
|
2月前
|
机器学习/深度学习 算法 测试技术
深度学习环境搭建笔记(二):mmdetection-CPU安装和训练
本文是关于如何搭建深度学习环境,特别是使用mmdetection进行CPU安装和训练的详细指南。包括安装Anaconda、创建虚拟环境、安装PyTorch、mmcv-full和mmdetection,以及测试环境和训练目标检测模型的步骤。还提供了数据集准备、检查和网络训练的详细说明。
124 5
深度学习环境搭建笔记(二):mmdetection-CPU安装和训练
|
2月前
|
机器学习/深度学习 数据可视化 计算机视觉
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
这篇文章详细介绍了如何通过可视化深度学习中每层特征层来理解网络的内部运作,并使用ResNet系列网络作为例子,展示了如何在训练过程中加入代码来绘制和保存特征图。
67 1
目标检测笔记(五):详细介绍并实现可视化深度学习中每层特征层的网络训练情况
|
10天前
|
机器学习/深度学习 算法 安全
从方向导数到梯度:深度学习中的关键数学概念详解
方向导数衡量函数在特定方向上的变化率,其值可通过梯度与方向向量的点积或构造辅助函数求得。梯度则是由偏导数组成的向量,指向函数值增长最快的方向,其模长等于最速上升方向上的方向导数。这两者的关系在多维函数分析中至关重要,广泛应用于优化算法等领域。
60 36
从方向导数到梯度:深度学习中的关键数学概念详解
|
2月前
|
机器学习/深度学习
深度学习笔记(十二):普通卷积、深度可分离卷积、空间可分离卷积代码
本文探讨了深度可分离卷积和空间可分离卷积,通过代码示例展示了它们在降低计算复杂性和提高效率方面的优势。
180 2
深度学习笔记(十二):普通卷积、深度可分离卷积、空间可分离卷积代码
|
2月前
|
机器学习/深度学习 并行计算 PyTorch
深度学习环境搭建笔记(一):detectron2安装过程
这篇博客文章详细介绍了在Windows环境下,使用CUDA 10.2配置深度学习环境,并安装detectron2库的步骤,包括安装Python、pycocotools、Torch和Torchvision、fvcore,以及对Detectron2和PyTorch代码的修改。
302 1
深度学习环境搭建笔记(一):detectron2安装过程
|
2月前
|
机器学习/深度学习 算法 PyTorch
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
这篇文章详细介绍了多种用于目标检测任务中的边界框回归损失函数,包括IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU和WIOU,并提供了它们的Pytorch实现代码。
272 1
深度学习笔记(十三):IOU、GIOU、DIOU、CIOU、EIOU、Focal EIOU、alpha IOU、SIOU、WIOU损失函数分析及Pytorch实现
|
2月前
|
机器学习/深度学习 自然语言处理 并行计算
深度学习笔记(十四):Transormer知识总结
关于深度学习中Transformer模型的知识总结,涵盖了Self-attention机制、QKV、Multi-head attention、位置编码和并行运算等关键概念,以及如何在PyTorch中实现Self-attention。
65 1
|
9天前
|
机器学习/深度学习 传感器 数据采集
深度学习在故障检测中的应用:从理论到实践
深度学习在故障检测中的应用:从理论到实践
48 5
|
1天前
|
机器学习/深度学习 网络架构 计算机视觉
深度学习在图像识别中的应用与挑战
【10月更文挑战第21天】 本文探讨了深度学习技术在图像识别领域的应用,并分析了当前面临的主要挑战。通过研究卷积神经网络(CNN)的结构和原理,本文展示了深度学习如何提高图像识别的准确性和效率。同时,本文也讨论了数据不平衡、过拟合、计算资源限制等问题,并提出了相应的解决策略。
30 19
|
1天前
|
机器学习/深度学习 传感器 人工智能
探索深度学习在图像识别中的应用与挑战
【10月更文挑战第21天】 本文深入探讨了深度学习技术在图像识别领域的应用,并分析了当前面临的主要挑战。通过介绍卷积神经网络(CNN)的基本原理和架构设计,阐述了深度学习如何有效地从图像数据中提取特征,并在多个领域实现突破性进展。同时,文章也指出了训练深度模型时常见的过拟合问题、数据不平衡以及计算资源需求高等挑战,并提出了相应的解决策略。
29 7