• 03.1线性回归


    3.1 线性回归

    • 回归(regression)是能为一个或多个自变量与因变量之间关系建模的一类方法。
    • 在自然科学和社会科学领域,回归经常用来表示输入和输出之间的关系。
    • 常见例子
      • 预测价格(房屋、股票等)
      • 预测住院时间(针对住院病人等)
      • 预测需求(零售销量等)

    3.1.1 线性回归的基本元素

    线性回归基于几个简单的假设:

    • 首先,假设自变量X和因变量Y之间的关系是线性的,即Y可以表示为X中元素的加权和,这里通常允许包含观测值的一些噪声;
    • 其次,我们假设任何噪声都比较正常,如噪声遵循正态分布。

    常用术语

    • 训练数据集(training data set) 或训练集(training set)
    • 样本(sample)
    • 标签(label)或目标(target)
    • 特征(feature)
    3.1.1.1 线性模型

    线性假设是指目标(房屋价格)可以表示为特征(面积和房龄)的加权和,如下面的式子:
    y = wx +b
    w : 权重
    b :偏置,常数

    寻找最好的模型参数(model parameters)w和b之前, 我们还需要两个东西:

    • 一种模型质量的度量方式;
    • 一种能够更新模型以提高模型预测质量的方法。
    3.1.1.2 损失函数

    损失函数(loss function)能够量化目标的实际值与预测值之间的差距。
    通常我们会选择非负数作为损失,且数值越小表示损失越小,完美预测时的损失为0

    回归问题中最常用的损失函数是平方误差函数。

    3.1.1.3. 解析解
    • 线性回归的解可以用一个公式简单地表达出来, 这类解叫作解析解(analytical solution)
    • 像线性回归这样的简单问题存在解析解,但并不是所有的问题都存在解析解。
    • 解析解可以进行很好的数学分析,但解析解对问题的限制很严格,导致它无法广泛应用在深度学习里。
    3.1.1.4. 随机梯度下降

    梯度下降(gradient descent)这种方法几乎可以优化所有深度学习模型。
    它通过不断地在损失函数递减的方向上更新参数来降低误差。

    • 梯度下降最简单的用法是计算损失函数(数据集中所有样本的损失均值) 关于模型参数的导数(在这里也可以称为梯度)
    • 小批量随机梯度下降(minibatch stochastic gradient descent):通常会在每次需要计算更新的时候随机抽取一小批样本
    • 批量大小和学习率的值通常是手动预先指定,而不是通过模型训练得到的。
    • 以调整但不在训练过程中更新的参数称为超参数(hyperparameter)
    • 调参(hyperparameter tuning)是选择超参数的过程。
    • 超参数通常是我们根据训练迭代结果来调整的, 而训练迭代结果是在独立的验证数据集(validation dataset)上评估得到的。
    • 泛化(generalization):找到一组参数,这组参数能够在我们从未见过的数据上实现较低的损失
    3.1.1.5. 用模型进行预测

    给定特征估计目标的过程通常称为预测(prediction)或推断(inference)

    3.1.2. 矢量化加速

    对计算进行矢量化, 从而利用线性代数库
    实例验证
    我们实例化两个全为1的10000维向量。 在一种方法中,我们将使用Python的for循环遍历向量; 在另一种方法中,我们将依赖对+的调用。

    %matplotlib inline
    import math
    import time
    import numpy as np
    import torch
    from d2l import torch as d2l
    
    n = 10000
    a = torch.ones(n)
    b = torch.ones(n)
    
    # 定义一个计时器
    class Timer:  #@save
        """记录多次运行时间"""
        def __init__(self):
            self.times = []
            self.start()
    
        def start(self):
            """启动计时器"""
            self.tik = time.time()
    
        def stop(self):
            """停止计时器并将时间记录在列表中"""
            self.times.append(time.time() - self.tik)
            return self.times[-1]
    
        def avg(self):
            """返回平均时间"""
            return sum(self.times) / len(self.times)
    
        def sum(self):
            """返回时间总和"""
            return sum(self.times)
    
        def cumsum(self):
            """返回累计时间"""
            return np.array(self.times).cumsum().tolist()
            
    # for循环,每次执行一位的加法
    c = torch.zeros(n)
    timer = Timer()
    for i in range(n):
        c[i] = a[i] + b[i]
    f'{timer.stop():.5f} sec'
    '0.08695 sec'
    
    
    # 重载的+运算符来计算按元素的和
    timer.start()
    d = a + b
    f'{timer.stop():.5f} sec'
    '0.00025 sec'
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54

    矢量化代码通常会带来数量级的加速。
    减少了出错的可能性

    3.1.3. 正态分布与平方损失

    对噪声分布的假设来解读平方损失目标函数

    • 正态分布(normal distribution),也称为高斯分布(Gaussian distribution)
    • 噪声服从正态分布

    3.1.4. 从线性回归到深度网络

    3.1.4.1. 神经网络图

    将线性回归模型描述为一个神经网络。
    需要注意的是,该图只显示连接模式,即只显示每个输入如何连接到输出,隐去了权重和偏置的值。
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wek3m4Za-1662219434913)(https://zh.d2l.ai/_images/singleneuron.svg)]

    对于线性回归,每个输入都与每个输出(在本例中只有一个输出)相连, 将这种变换 称为全连接层(fully-connected layer)或称为稠密层(dense layer)。

    3.1.4.2. 生物学

    在深度学习中的灵感同样或更多地来生物学、自数学、统计学和计算机科学。

    3.1.5. 小结

    • 机器学习模型中的关键要素是训练数据、损失函数、优化算法,还有模型本身。

    • 矢量化使数学表达上更简洁,同时运行的更快。

    • 最小化目标函数和执行极大似然估计等价。

    • 线性回归模型也是一个简单的神经网络。

  • 相关阅读:
    【ai】pycharm设置软件仓库编译运行基于langchain的chatpdf
    Parallels Desktop 18亮点功能改变与变化总整理
    【Hack The Box】linux练习-- Mango
    【OS】第二章 进程
    【云原生】都在说云原生?到底什么是云原生?
    2022-8-18 第七小组 学习日记 (day42)JDBC+练习题
    C语言连续换行输入多组数据怎么解决?
    torch-geometric使用过程中的问题
    linux系统监控prometheus关联Grafana展示数据
    hadoop常用命令
  • 原文地址:https://blog.csdn.net/weixin_45063703/article/details/126684269