08 线性回归

线性回归的理论

回归(regression)是能为一个或多个自变量与因变量之间关系建模的一类方法。
线性回归可以看作最简单的单层神经网络。

推导过程——以房屋价格预测为例子

房子的线性假设,房屋价格为面积、年龄等因素的加权和,并受到偏置的影响
price=𝑤area⋅area+𝑤age⋅age+𝑏. price=𝑤_{area}⋅area+𝑤_{age}⋅age+𝑏. price=wareaarea+wageage+b.

  • 为什么要使用偏置?偏置是指当所有特征都取值为0时,预测值应该为多少,如果没有偏置,那么模型表达能力会受到限制。因为模型根本上是一个仿射变换,仿射变换的特点是通过加权和对特征进行线性变换(linear transformation), 并通过偏置项来进行平移(translation)。
    预测结果可以表示为:
    𝑦^=𝑤1𝑥1+...+𝑤𝑑𝑥𝑑+𝑏. 𝑦̂ =𝑤_1𝑥_1+...+𝑤_𝑑𝑥_𝑑+𝑏. y^=w1x1+...+wdxd+b.
    将所有特征放到向量 𝐱∈ℝ^𝑑 中, 并将所有权重放到向量 𝐰∈ℝ^𝑑 中。使用点积表示为:
    𝑦^=𝐰⊤𝐱+𝑏 𝑦̂ =𝐰^⊤𝐱+𝑏 y^=wx+b
    一个𝐱表示一个样本的特征,使用矩阵 𝐗∈ℝ𝑛×𝑑 可以很方便地引用我们整个数据集的 𝑛 个样本,每一行是一个样本,每一列是一种特征,使用矩阵-向量乘法(变成了多个样本):
    𝐲^=𝐗𝐰+𝑏 𝐲̂ =𝐗𝐰+𝑏 y^=Xw+b
    线性回归的目标是找到一组权重向量 𝐰 和偏置 𝑏 : 当给定从 𝐗 的同分布中取样的新样本特征时, 这组权重向量和偏置能够使得新样本预测标签的误差尽可能小
  • 损失函数:模型拟合程度的度量方法。
    平方误差函数:常数 12\frac{1}{2}21不会带来本质的差别,主要是为了求导后系数变成1
    l(i)(w,b)=12(y^(i)−y(i))2 l^{(i)}(\mathbf{w}, b)=\frac{1}{2}\left(\hat{y}^{(i)}-y^{(i)}\right)^{2} l(i)(w,b)=21(y^(i)y(i))2
    𝑛 个样本上的损失均值:

L(w,b)=1n∑i=1nl(i)(w,b)=1n∑i=1n12(w⊤x(i)+b−y(i))2 L(\mathbf{w}, b)=\frac{1}{n} \sum_{i=1}^{n} l^{(i)}(\mathbf{w}, b)=\frac{1}{n} \sum_{i=1}^{n} \frac{1}{2}\left(\mathbf{w}^{\top} \mathbf{x}^{(i)}+b-y^{(i)}\right)^{2} L(w,b)=n1i=1nl(i)(w,b)=n1i=1n21(wx(i)+by(i))2
训练中,希望寻找一组参数( 𝐰∗,𝑏∗ ), 这组参数能最小化在所有训练样本上的总损失
𝐰∗,𝑏∗=argmin𝐿(𝐰,𝑏) 𝐰∗,𝑏∗=argmin 𝐿(𝐰,𝑏) w,b=argminL(w,b)

  • 解析解 / 显示解:线性回归的解可以用一个公式简单地表达出来, 这类解叫作解析解(analytical solution)
    我们将偏置 𝑏 合并到参数 𝐰 中,合并方法是在包含所有参数的矩阵中附加一列。我们的预测问题是最小化 ‖𝐲−𝐗𝐰‖2‖𝐲−𝐗𝐰‖^2yXw2 。 这在损失平面上只有一个临界点,这个临界点对应于整个区域的损失极小点。 将损失关于 𝐰 的导数设为0,得到解析解。
    𝐰∗=(𝐗⊤𝐗)−1𝐗⊤𝐲 𝐰∗=(𝐗^⊤𝐗)^{−1}𝐗^⊤𝐲 w=(XX)1Xy

优化方法的理论

  • 随机梯度下降——其它模型的求解方法
    模型没有显示解的时候。
  1. 随机挑选一个初始值w0w_0w0
  2. 进行重复迭代。
    在这里插入图片描述
    更新法则:wt=wt−1−η∂ℓ∂wt−1\mathbf{w}_{t}=\mathbf{w}_{t-1}-\eta \frac{\partial \ell}{\partial \mathbf{w}_{t-1}}wt=wt1ηwt1
    负梯度:沿梯度方向将增加损失函数的值,所以需要寻找负梯度方向。图中的黄线的方向。
    学习率η\etaη 步长的超参数。学习率太大会振荡,学习率太小会造成计算资源过度损耗。
  • 小批量随机梯度下降:最常用的梯度下降方法
    会在每次需要计算更新的时候随机抽取一小批样本, 这种变体叫做小批量随机梯度下降(minibatch stochastic gradient descent)。首先随机抽样一个小批量 BBB,计算小批量的平均损失关于模型参数的导数(也可以称为梯度),将梯度乘以一个预先确定的正数 𝜂 ,并从当前参数的值中减掉。也就是再小批量上更新参数。
    (w,b)←(w,b)−η∣B∣∑i⊂B∂(w,b)l(i)(w,b) (\mathbf{w}, b) \leftarrow(\mathbf{w}, b)-\frac{\eta}{|\mathcal{B}|} \sum_{i \subset B} \partial_{(\mathbf{w}, b)} l^{(i)}(\mathbf{w}, b) (w,b)(w,b)BηiB(w,b)l(i)(w,b)
    batch如果太小,不能很好利用GPU资源,如果太大,会增加内存消耗(所有样本都是相同的)。
    批量大小学习率的值通常是手动预先指定,而不是通过模型训练得到的。 这些可以调整但不在训练过程中更新的参数称为超参数(hyperparameter)。 **调参(hyperparameter tuning)**是选择超参数的过程。 超参数通常是我们根据训练迭代结果来调整的, 而训练迭代结果是在独立的 验证数据集validation dataset上评估得到的。
    事实上,比起找到当前数据域里面的一组最小值。更难做到的是找到一组参数,这组参数能够在我们从未见过的数据上实现较低的损失, 这一挑战被称为 泛化(generalization)

  • 正态分布与平方损失
    正态分布(normal distribution),也称为高斯分布(Gaussian distribution)。简单的说,若随机变量 𝑥 具有均值 𝜇 和方差 𝜎2 (标准差 𝜎 ),其正态分布概率密度函数如下:
    p(x)=12πσ2exp⁡(−12σ2(x−μ)2) p(x)=\frac{1}{\sqrt{2 \pi \sigma^{2}}} \exp \left(-\frac{1}{2 \sigma^{2}}(x-\mu)^{2}\right) p(x)=2πσ2 1exp(2σ21(xμ)2)
    可以定义一个python函数来进行表示:

def normal(x, mu, sigma):
    p = 1 / math.sqrt(2 * math.pi * sigma**2)
    return p * np.exp(-0.5 / sigma**2 * (x - mu)**2)
# 再次使用numpy进行可视化
x = np.arange(-7, 7, 0.01)

# 均值和标准差对
params = [(0, 1), (0, 2), (3, 1)]
d2l.plot(x, [normal(x, mu, sigma) for mu, sigma in params], xlabel='x',
         ylabel='p(x)', figsize=(4.5, 2.5),
         legend=[f'mean {mu}, std {sigma}' for mu, sigma in params])

在这里插入图片描述
改变均值会产生沿 𝑥 轴的偏移,增加方差将会分散分布、降低其峰值。
均方误差损失函数(简称均方损失)可以用于线性回归的一个原因是: 我们假设了观测中包含噪声,其中噪声服从正态分布 =>=>=>最小化目标函数和执行极大似然估计等价

  • 从线性回归到深度网络
    输入为 𝑥1,…,𝑥𝑑 , 因此输入层中的输入数(或称为特征维度,feature dimensionality)为 𝑑 ,可以看成单层的神经网络。

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

线性回归从0开始实现【重要】

  • 生成数据集
  • 读取数据集
  • 初始化模型参数
  • 定义模型、损失函数和优化算法
  • 训练

线性回归的简洁实现(使用pytorch的高级API快速实现)【重要】

  • 生成数据集
  • 读取数据集
  • 定义模型、初始化模型参数、定义损失函数、定义优化算法
  • 训练
Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐