08线性回归

8.1线性回归
- 如何在美国买房
- 看中一个房子,参观了解
- 估计一个价格,出价
房屋基本信息:

房屋实景:

- 房价预测
历史的房价走势:

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

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

- 假设2:成交价是关键因素的加权和
权重和偏差的实际值在后面决定
- 线性模型
- 给定 n 维输入 $\boldsymbol {x} = [x_1,x_2,…, x_n]^T$
- 线性模型有一个 n 维权重和一个标量偏差
- 输出是输入的加权和
向量版本:$y = <\boldsymbol {w}, \boldsymbol {x}> + b$
- 线性模型可以看作是单层的神经网络

- 神经网络源于神经科学

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

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

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

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

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


参考
PyTorch疑难杂症(1)——torch.matmul()函数用法总结
X 的产生:从均值为 0 ,方差为 1 的分布,也就是正态分布中进行采样,行数是 num_examples , 列数是 true_w 的列数,也就是特征数量。
y 是 X 和 w 进行矩阵相乘后,加上偏置 b 后实现的,也就是先将 [1000, 2] 的矩阵和 [1, 2] 的矩阵进行矩阵的相乘(使用了广播机制)。
y 添加噪音的方式是噪音元素和 y 元素的元素级相加。
features中的每一行都包含一个二维数据样本,labels中的每一行都包含一位标签值(一个标量)

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

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


- 定义初始化模型参数

- 定义模型

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

- 定义优化算法

- 训练过程

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

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

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

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

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

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

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

- 实例化
SGD实例

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

- 比较误差
