0%

08线性回归

08线性回归

image-20231212124321900

8.1线性回归

  • 如何在美国买房
    • 看中一个房子,参观了解
    • 估计一个价格,出价

房屋基本信息:

image-20231212124510969

房屋实景:

image-20231212124539159

  • 房价预测

历史的房价走势:

image-20231212124737102

当你以一定的价格购入本套房屋之后,过了一段时间,再次给出房价走势,就可以看出你的盈亏情况。

image-20231212124913782

  • 一个简化模型
  • 假设1:影响房价的关键因素是卧室个数,卫生间个数和居住面积,记为:$x_1, x_2, x_3$

image-20231212125228395

  • 假设2:成交价是关键因素的加权和

权重和偏差的实际值在后面决定

  • 线性模型
    • 给定 n 维输入 $\boldsymbol {x} = [x_1,x_2,…, x_n]^T$
    • 线性模型有一个 n 维权重和一个标量偏差
  • 输出是输入的加权和

向量版本:$y = <\boldsymbol {w}, \boldsymbol {x}> + b$

  • 线性模型可以看作是单层的神经网络

image-20231212125932995

  • 神经网络源于神经科学

image-20231212130138271

  • 衡量预估质量
    • 比较真实值和预估值,例如房屋售价和估价
    • 假设 $y$ 是真实值,$\hat {y}$ 是估计值,我们可以比较

这个叫做平方损失

  • 训练数据
    • 收集一些数据点来决定参数值(权重和偏差),例如过去6个卖的房子
    • 这被称之为训练数据
    • 通常越多越好
    • 假设我们有 n 个样本,记
  • 参数学习
    • 训练损失
  • 最小化损失来学习参数
  • 显式解
    • 将偏差加入权重 $\boldsymbol {X} \longleftarrow [\boldsymbol {X}, \boldsymbol {1}] \space \boldsymbol {w} \longleftarrow [\boldsymbol {w}, b]^T$
  • 损失是凸函数(意味着最优解就在梯度等于0的地方),所以满足最优解
  • 总结
    • 线性回归是对 n 维输入的加权,外加偏差
    • 使用平方损失来衡量预测值于真实值的差异
    • 线性回归有显示解
    • 线性回归可以看作是单层神经网络

8.2基础优化算法

image-20231212223951202

  • 梯度下降(当一个模型没有显式解
    • 挑选一个初始值 $\boldsymbol {w}_0$
    • 重复迭代参数 t = 1, 2, 3
  • 沿着梯度方向将增加损失函数值

  • 学习率:步长的超参数

二次函数等高线

分析这个例子,二次函数的等高线如上,首先挑选一个初始值 $\boldsymbol {w}_0$ ,然后计算它此处的梯度,也就是当前点处函数增长最快的方向,那么负梯度,就是函数下降最快的方向,我们要求出那个最优解,也就是谷底的位置,就要沿着某条路线不断接近这个最优点,而每一处的梯度为我们指明了方向。

  • 如何选择学习率

image-20231212225822368

  • 小批量随机梯度下降
    • 在整个训练集上计算梯度太贵了
      • 一个深度神经网络模型可能需要数分钟至数小时
    • 我们可以随机采样 b 个样本 $i_1, i_2, …, i_b$ 来近似损失
  • b是批量大小,另一个重要的超参数
  • 选择批量大小
    • 不能太小:每次计算量太小,不适合并行最大利用计算资源
    • 不能太大:内存消耗增加,浪费计算,例如:如果所有样本嗾使相同的
  • 总结
    • 梯度下降通过不断沿着繁体都方向更新参数求解
    • 小批量随机梯度下降是深度学习的求解算法
    • 两个重要的超参数是批量大小和学习率

8.3线性回归的从零开始实现

  • 我们将从零开始实现整个方法,包括数据流水线、模型、损失函数和小批量随机梯度下降优化器

image-20231213125158033

  • 根据带有噪声的线性模型构造一个人造数据集,我们使用线性模型参数$\boldsymbol {w} = [2, -3.4]^T$、$b = 4.2$ 和噪声$\xi$生成数据集及其标签:

image-20231217121341803

image-20231217121408819

参考

torch.normal()的用法

PyTorch疑难杂症(1)——torch.matmul()函数用法总结

Python numpy函数:reshape()

X 的产生:从均值为 0 ,方差为 1 的分布,也就是正态分布中进行采样,行数是 num_examples , 列数是 true_w 的列数,也就是特征数量。

y 是 X 和 w 进行矩阵相乘后,加上偏置 b 后实现的,也就是先将 [1000, 2] 的矩阵和 [1, 2] 的矩阵进行矩阵的相乘(使用了广播机制)。

y 添加噪音的方式是噪音元素和 y 元素的元素级相加。

  • features中的每一行都包含一个二维数据样本,labels中的每一行都包含一位标签值(一个标量)

image-20231217123328347

  • 通过生成第二个特征features[:, 1]labels的散点图, 可以直观观察到两者之间的线性关系。

image-20231217124441242

  • 在下面的代码中,我们[定义一个data_iter函数, 该函数接收批量大小、特征矩阵和标签向量作为输入,生成大小为batch_size的小批量]。 每个小批量包含一组特征和标签。

image-20231217130008390

Python shuffle() 函数

python中yield的用法详解——最简单,最清晰的解释

image-20231217130201345

  • 定义初始化模型参数

image-20231217130249921

  • 定义模型

image-20231217130350962

  • 定义损失函数

因为需要计算损失函数的梯度,所以我们应该先定义损失函数。 这里我们使用 :numref:sec_linear_regression中描述的平方损失函数。 在实现中,我们需要将真实值y的形状转换为和预测值y_hat的形状相同。

image-20231217130607942

  • 定义优化算法

image-20231217131537328

  • 训练过程

image-20231217131731388

  • 比较真实参数和通过训练学到的参数来评估训练的成功程度

image-20231217132033441

8.4线性回归的简洁实现

  • 通过使用深度学习框架来简洁地实现 线性回归模型 生成数据集

image-20231217155518330

  • 调用框架中现有的 API 来读取数据

image-20231217155711824

我们可以这样使用数据集,迭代方式是:

image-20231217155833142

  • 使用框架的预定义好的层

image-20231217155906459

可以直接使用 PyTorch中的 nn模块,里面有神经网络的容器函数 nn.Sequential(),里面填入一个nn.Linear(2, 1) 等价于我们的线性函数,输入维度为 2 输出维度是 1。

image-20231217160340171

  • 计算均方误差使用的是 MSELoss类,也称为平方范数

image-20231217160520473

  • 实例化SGD实例

image-20231217160618366

  • 训练过程代码于我们从零开始的实现时所做的非常相似

image-20231217160836903

  • 比较误差

image-20231217160946721

8.5QA