08 线性回归
线性回归的理论
回归(regression)是能为一个或多个自变量与因变量之间关系建模的一类方法。
线性回归可以看作最简单的单层神经网络。
推导过程——以房屋价格预测为例子:
房子的线性假设,房屋价格为面积、年龄等因素的加权和,并受到偏置的影响
p
r
i
c
e
=
𝑤
a
r
e
a
⋅
a
r
e
a
+
𝑤
a
g
e
⋅
a
g
e
+
𝑏
.
price=𝑤_{area}⋅area+𝑤_{age}⋅age+𝑏.
price=warea⋅area+wage⋅age+b.
- 为什么要使用偏置?偏置是指当所有特征都取值为0时,预测值应该为多少,如果没有偏置,那么模型表达能力会受到限制。因为模型根本上是一个仿射变换,仿射变换的特点是通过加权和对特征进行线性变换(linear transformation), 并通过偏置项来进行平移(translation)。
预测结果可以表示为:
𝑦 ^ = 𝑤 1 𝑥 1 + . . . + 𝑤 𝑑 𝑥 𝑑 + 𝑏 . 𝑦̂ =𝑤_1𝑥_1+...+𝑤_𝑑𝑥_𝑑+𝑏. y^=w1x1+...+wdxd+b.
将所有特征放到向量 𝐱∈ℝ^𝑑 中, 并将所有权重放到向量 𝐰∈ℝ^𝑑 中。使用点积表示为:
𝑦 ^ = 𝐰 ⊤ 𝐱 + 𝑏 𝑦̂ =𝐰^⊤𝐱+𝑏 y^=w⊤x+b
一个𝐱表示一个样本的特征,使用矩阵 𝐗∈ℝ𝑛×𝑑 可以很方便地引用我们整个数据集的 𝑛 个样本,每一行是一个样本,每一列是一种特征,使用矩阵-向量乘法(变成了多个样本):
𝐲 ^ = 𝐗 𝐰 + 𝑏 𝐲̂ =𝐗𝐰+𝑏 y^=Xw+b
线性回归的目标是找到一组权重向量 𝐰 和偏置 𝑏 : 当给定从 𝐗 的同分布中取样的新样本特征时, 这组权重向量和偏置能够使得新样本预测标签的误差尽可能小。 - 损失函数:模型拟合程度的度量方法。
平方误差函数:常数 1 2 \frac{1}{2} 21不会带来本质的差别,主要是为了求导后系数变成1
l ( i ) ( w , b ) = 1 2 ( 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
)
=
1
n
∑
i
=
1
n
l
(
i
)
(
w
,
b
)
=
1
n
∑
i
=
1
n
1
2
(
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=1∑nl(i)(w,b)=n1i=1∑n21(w⊤x(i)+b−y(i))2
训练中,希望寻找一组参数( 𝐰∗,𝑏∗ ), 这组参数能最小化在所有训练样本上的总损失
𝐰
∗
,
𝑏
∗
=
a
r
g
m
i
n
𝐿
(
𝐰
,
𝑏
)
𝐰∗,𝑏∗=argmin 𝐿(𝐰,𝑏)
w∗,b∗=argminL(w,b)
- 解析解 / 显示解:线性回归的解可以用一个公式简单地表达出来, 这类解叫作解析解(analytical solution)
我们将偏置 𝑏 合并到参数 𝐰 中,合并方法是在包含所有参数的矩阵中附加一列。我们的预测问题是最小化 ‖ 𝐲 − 𝐗 𝐰 ‖ 2 ‖𝐲−𝐗𝐰‖^2 ‖y−Xw‖2 。 这在损失平面上只有一个临界点,这个临界点对应于整个区域的损失极小点。 将损失关于 𝐰 的导数设为0,得到解析解。
𝐰 ∗ = ( 𝐗 ⊤ 𝐗 ) − 1 𝐗 ⊤ 𝐲 𝐰∗=(𝐗^⊤𝐗)^{−1}𝐗^⊤𝐲 w∗=(X⊤X)−1X⊤y
优化方法的理论
- 随机梯度下降——其它模型的求解方法:
模型没有显示解的时候。
- 随机挑选一个初始值 w 0 w_0 w0
- 进行重复迭代。
更新法则: w t = w t − 1 − η ∂ ℓ ∂ w t − 1 \mathbf{w}_{t}=\mathbf{w}_{t-1}-\eta \frac{\partial \ell}{\partial \mathbf{w}_{t-1}} wt=wt−1−η∂wt−1∂ℓ
负梯度:沿梯度方向将增加损失函数的值,所以需要寻找负梯度方向。图中的黄线的方向。
学习率: η \eta η 步长的超参数。学习率太大会振荡,学习率太小会造成计算资源过度损耗。
-
小批量随机梯度下降:最常用的梯度下降方法
会在每次需要计算更新的时候随机抽取一小批样本, 这种变体叫做小批量随机梯度下降(minibatch stochastic gradient descent)。首先随机抽样一个小批量 B B B,计算小批量的平均损失关于模型参数的导数(也可以称为梯度),将梯度乘以一个预先确定的正数 𝜂 ,并从当前参数的值中减掉。也就是再小批量上更新参数。
( 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∣ηi⊂B∑∂(w,b)l(i)(w,b)
batch如果太小,不能很好利用GPU资源,如果太大,会增加内存消耗(所有样本都是相同的)。
批量大小和学习率的值通常是手动预先指定,而不是通过模型训练得到的。 这些可以调整但不在训练过程中更新的参数称为超参数(hyperparameter)。 **调参(hyperparameter tuning)**是选择超参数的过程。 超参数通常是我们根据训练迭代结果来调整的, 而训练迭代结果是在独立的 验证数据集validation dataset上评估得到的。
事实上,比起找到当前数据域里面的一组最小值。更难做到的是找到一组参数,这组参数能够在我们从未见过的数据上实现较低的损失, 这一挑战被称为 泛化(generalization)。 -
正态分布与平方损失:
正态分布(normal distribution),也称为高斯分布(Gaussian distribution)。简单的说,若随机变量 𝑥 具有均值 𝜇 和方差 𝜎2 (标准差 𝜎 ),其正态分布概率密度函数如下:
p ( x ) = 1 2 π σ 2 exp ( − 1 2 σ 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πσ21exp(−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快速实现)【重要】
- 生成数据集
- 读取数据集
- 定义模型、初始化模型参数、定义损失函数、定义优化算法
- 训练