线性回归

应用场景

用于回归问题,给定多个特征,预测单个特征的值(连续值),比如房价预测。

模型

特征数 m m m,样本数 n n n

  • 单样本
    y ^ = w ⊤ x + b , \hat{y} = \mathbf{w}^\top \mathbf{x} + b, y^=wx+b,
    输入:特征向量 x ∈ R m × 1 \mathbf{x} \in \mathbb{R}^{m\times1} xRm×1
    输出:预测值 y ^ ∈ R \hat{y} \in \mathbb{R} y^R
    参数:向量 w ∈ R m × 1 \mathbf{w} \in \mathbb{R}^{m\times1} wRm×1、标量 b ∈ R b \in \mathbb{R} bR
  • 多样本
    y ^ = X w + b . \mathbf{\hat{y}} = \mathbf{X}\mathbf{w} + b. y^=Xw+b.
    输入:特征矩阵 X = ( x ( 1 ) , x ( 2 ) , . . . , x ( n ) ) ⊤ ∈ R n × m \mathbf{X}=\left( \mathbf{x}^{(1)}, \mathbf{x}^{(2)}, ..., \mathbf{x}^{(n)} \right)^{\top} \in \mathbb{R}^{n \times m} X=(x(1),x(2),...,x(n))Rn×m
    输出:预测向量 y ^ = ( y ^ ( 1 ) , y ^ ( 2 ) , . . . , y ^ ( n ) ) ⊤ ∈ R n × 1 \mathbf{\hat{y}}=\left(\hat y^{(1)},\hat y^{(2)},...,\hat y^{(n)} \right)^{\top} \in \mathbb{R}^{n \times 1} y^=(y^(1),y^(2),...,y^(n))Rn×1
    参数:向量 w ∈ R m × 1 \mathbf{w} \in \mathbb{R}^{m \times 1} wRm×1、标量 b ∈ R b \in \mathbb{R} bR(在python里会被broadcasting到n个样本上)

Loss函数

  • 单样本:平方损失
    l ( w , b ) = 1 2 ( y ^ − y ) 2 , l(\mathbf{w}, b) = \frac{1}{2} \left(\hat{y} - y\right)^2, l(w,b)=21(y^y)2,
  • 多样本:均方误差(Mean-Squared Error, MSE)
    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=1nl(i)(w,b)=n1i=1n21(wx(i)+by(i))2.

优化方法

mini-batch随机梯度下降法
先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch) B \mathcal{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 \in \mathcal{B}} \partial_{(\mathbf{w},b)} l^{(i)}(\mathbf{w},b). (w,b)(w,b)BηiB(w,b)l(i)(w,b).
学习率: η \eta η代表在每次优化中,能够学习的步长的大小
批量大小: B \mathcal{B} B是小批量计算中的批量大小batch size

PyTorch实现

线性回归等价于一个全连接层,其没有激活函数、输出层为1,用Pytorch的API即nn.Linear(n_feature, 1):

class LinearNet(nn.Module):
    def __init__(self, n_feature):
        super(LinearNet, self).__init__()      # call father function to init 
        self.linear = nn.Linear(n_feature, 1)  # function prototype: `torch.nn.Linear(in_features, out_features, bias=True)`

    def forward(self, x):
        y = self.linear(x)
        return y
    
net = LinearNet(num_inputs)

https://github.com/XuanxuanGao/MachineLearningWithPyTorch/blob/master/%E7%BA%BF%E6%80%A7%E5%9B%9E%E5%BD%92.ipynb

你可能感兴趣的:(机器学习,PyTorch)