03.1线性回归
文章目录
- 3.1 线性回归
- 3.1.1 线性回归的基本元素
- 3.1.1.1 线性模型
- 3.1.1.2 损失函数
- 3.1.1.3. 解析解
- 3.1.1.4. 随机梯度下降
- 3.1.1.5. 用模型进行预测
- 3.1.2. 矢量化加速
- 3.1.3. 正态分布与平方损失
- 3.1.4. 从线性回归到深度网络
- 3.1.4.1. 神经网络图
- 3.1.4.2. 生物学
- 3.1.5. 小结
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'
矢量化代码通常会带来数量级的加速。
减少了出错的可能性
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. 小结
-
机器学习模型中的关键要素是训练数据、损失函数、优化算法,还有模型本身。
-
矢量化使数学表达上更简洁,同时运行的更快。
-
最小化目标函数和执行极大似然估计等价。
-
线性回归模型也是一个简单的神经网络。