线性回归
举例说明线性回归 - 房价预测
- 假设有三个特征: x 1 = x_1 = x1= #beds, x 2 = x_2 = x2= #baths, x 3 = x_3 = x3= #living sqft,
- 假设预测值是所有输入特征的加权和: y = w 1 x 1 + w 2 x 2 + w 3 x 3 + b y=w_1 x_1+w_2 x_2+w_3 x_3+b y=w1x1+w2x2+w3x3+b
- 权重 w 1 , w 2 , w 3 w_1,w_2,w_3 w1,w2,w3和偏移 b b b将会从训练数据中学习获得
线性回归的一般形式
一般来说,给定数据 x = [ x 1 , x 2 , … , x p ] \mathbf{x}=\left[x_1, x_2, \ldots, x_p\right] x=[x1,x2,…,xp],即每个样本表示成 p p p维特征,那么线性模型就去预测
y ^ = w 1 x 1 + w 2 x 2 + … + w p x p + b = ⟨ w , x ⟩ + b \hat{y}=w_1 x_1+w_2 x_2+\ldots+w_p x_p+b=\langle\mathbf{w}, \mathbf{x}\rangle+b y^=w1x1+w2x2+…+wpxp+b=⟨w,x⟩+b
其实 w , x \mathbf{w}, \mathbf{x} w,x都是长为 p p p的向量, w \mathbf{w} w和 b b b都是可以学习的参数。
如果上面的式子要通过代码实现,可以写成如下形式:
# weight w has shape (p,1)
# bias b is a scalar
# data x has shape (p,1)
y_hat = (x*w).sum + b
目标函数
假设收集了 n n n个训练样本 X = [ x 1 , x 2 , … , x n ] T ∈ R n × p \mathbf{X}=\left[\mathbf{x}_1, \mathbf{x}_2, \ldots, \mathbf{x}_n\right]^T \in \mathbb{R}^{n \times p} X=[x1,x2,…,xn]T∈Rn×p, X \mathbf{X} X是一个有 n n n行 p p p列的一个矩阵,同时 X \mathbf{X} X对应标签 y = [ y 1 , … , y n ] T ∈ R n \mathbf{y}=\left[y_1, \ldots, y_n\right]^T \in \mathbb{R}^n y=[y1,…,yn]T∈Rn。
目标:最小化平均均方误差(mean square error, MSE)
w ∗ , b ∗ = argmin w , b ℓ ( X , y , w , b ) = argmin w , b 1 n ∑ i = 1 n ( y i − ⟨ x i , w ⟩ − b ) 2 \begin{aligned}\mathbf{w}^*, \mathbf{b}^* & =\underset{\mathbf{w}, b}{\operatorname{argmin}} \ell(\mathbf{X}, \mathbf{y}, \mathbf{w}, b) \\& =\underset{\mathbf{w}, b}{\operatorname{argmin}} \frac{1}{n} \sum_{i=1}^n\left(y_i-\left\langle\mathbf{x}_i, \mathbf{w}\right\rangle-b\right)^2\end{aligned} w∗,b∗=w,bargminℓ(X,y,w,b)=w,bargminn1i=1∑n(yi−⟨xi,w⟩−b)2
线性分类
回归的输出是连续的实数,但对于分类,输出的是类别的预测。
多类别分类:
- 如果要做多类物体的输出,我们可以做一个向量的输出,具体来说,输出可以是长为 m m m的向量,向量里的第 i i i个元素反映的是分类为第 i i i的置信度(概率),值越高表示越有可能属于这一类,越低表示越不可能。
- 我们可以用一个线性模型 o i = ⟨ x , w i ⟩ + b i o_i=\left\langle\mathbf{x}, \mathbf{w}_i\right\rangle+b_i oi=⟨x,wi⟩+bi,其中 x \mathbf{x} x是数据的特征, w i \mathbf{w}_i wi是一个长为 p p p的向量,表示对应的类 i i i可以学习的参数, b i b_i bi表示这一类的偏移。那么对于类 i i i,其置信度就是 o i o_i oi。因为有 m m m各类别,所以一共有 m m m个 o i o_i oi。
- 标签 y = [ y 1 , y 2 , … , y m ] \mathbf{y}=\left[y_1, y_2, \ldots, y_m\right] y=[y1,y2,…,ym],其中只有一个 y i = 1 y_i=1 yi=1,其余全部为 0 0 0,也就是one-hot encoding(独热编码),表示属于第 i i i类。
- 我们要最小化均方误差(MSE) 1 m ∥ o − y ∥ 2 2 \frac{1}{m}\|\mathbf{o}-\mathbf{y}\|_2^2 m1∥o−y∥22
- 预测出来的类别就是 argmax i { o i } i = 1 m \operatorname{argmax}_i\left\{o_i\right\}_{i=1}^m argmaxi{ oi}i=1m,表示预测结果为第 i i i类,这个 i i i要使得 o i o_i oi最大。
Softmax回归(Softmax regression)
因为我们的目标是使得所有的 o o o和 y y y是一样的,但是在实际做分类的时候,我们并不关心不属于这一类的 o o o的输出,我们只希望真实类别的置信度够大够强。所以为了让我们的模型更加专注于正确类,而不关心别的类,我们提出使用softmax。
- 首先需要把预测的分数换算成一个概率。 o i o_i oi输出是一个实数,在负无穷到正无穷之间。如果要把它转变为概率,就必须使其大于等于0,且所有概率相加为1。
y ^ = softmax ( o ) where y ^ i = exp ( o i ) ∑ k = 1 m exp ( o k ) \hat{\mathbf{y}}=\operatorname{softmax}(\mathbf{o}) \text { where } \hat{y}_i=\frac{\exp \left(o_i\right)}{\sum_{k=1}^m \exp \left(o_k\right)} y^=softmax(o) where y^i=∑k=1mexp(ok)exp(oi)
O_exp = torch.exp(O)
partition = O_exp.sum(1, keepdim=True)
Y = O_exp / partition
这里虽然使用了非线性的变化,但是依然是个线性模型。因为模型在做决定的时候要找的最大的 y ^ i \hat y_i y^i等价于最大的 o i o_i oi,即 argmax i y ^ i = argmax i o i \operatorname{argmax}_i \hat{y}_i=\operatorname{argmax}_i o_i argmaxiy^i=argmaxioi
- 如果要比较概率 y ^ \hat y y^和 y y y之间的差别,我们可以使用交叉熵(cross-entropy):
H ( y , y ^ ) = ∑ i − y i log ( y ^ i ) = − log y ^ y H(\mathbf{y}, \hat{\mathbf{y}})=\sum_i-y_i \log \left(\hat{y}_i\right)=-\log \hat{y}_y H(y,y^)=i∑−yilog(y^i)=−logy^y
因为其实 y i y_i yi中只有一个是1,其余全部是0,所以交叉熵能够被化简为 − log y ^ y -\log \hat{y}_y −logy^y。 − log -\log −log是递减函数,所以为了使交叉熵最小,就要让 y ^ y \hat{y}_y y^y最大。那么这个模型最终只关心我们在正确类别上的预测概率,对于别的值就不怎么关心。
参考资料
3.3 最简单也同样最常用的线性模型【斯坦福21秋季:实用机器学习中文版】_哔哩哔哩_bilibili
3.1. Linear Regression — Dive into Deep Learning 1.0.0-beta0 documentation
https://c.d2l.ai/stanford-cs329p/_static/pdfs/cs329p_slides_4_3.pdf