线性回归的表示方法
这节我们解释线性回归与神经网络的联系,以及线性回归的矢量计算表达式。
神经网络图
在深度学习中,我们可以使用神经网络图直观地表现模型结构。为了更清晰地展示线性回归作为神经网络的结构,下图使用神经网络图表示本节中介绍的线性回归模型。神经网络图隐去了模型参数权重和偏差。
在如图所示的神经网络中,输入分别为 x 1 x_1 x1和 x 2 x_2 x2,因此输入层的输入个数为2。输入个数也叫特征数或特征向量维度。图中网络的输出为 o o o,输出层的输出个数为1。需要注意的是,我们直接将图中神经网络的输出 o o o作为线性回归的输出,即 y ^ = o \hat{y}=o y^=o。由于输入层并不涉及计算,按照惯例,如图所示的神经网络的层数为1。
所以,线性回归是一个单层神经网络。输出层中负责计算 o o o的单元又叫神经元。在线性回归中, o o o的计算依赖于 x 1 x_1 x1和 x 2 x_2 x2。也就是说,输出层中的神经元和输入层中各个输入完全连接。因此,这里的输出层又叫全连接层 (fuly-connected layer) 或稠密层 (dense layer)。
矢量计算表达式
在模型训练或预测时,我们常常会同时处理多个数据样本并用到矢量计算。在介绍线性回归的矢量计算表达式之前,让我们先考虑对两个向量相加的两种方法。
下面先定义两个1000维的向量。
import torch
from time import time
a = torch.ones(1000)
b = torch.ones(1000)
向量相加的另一种方法是,将这两个向量直接做矢量加法。
start = time()
c = torch.zeros(1000)
for i in range(1000):
c[i] = a[i] + b[i]
print(time() - start)
输出:
0.01296544075012207
向量相加的另一种方法是,将这两个向量直接做矢量加法。
start = time()
d = a + b
print(time() - start)
输出:
0.0
结果很明显,后者比前者更省时。因此,我们应该尽可能采用矢量计算,以提升计算效率。
让我们再次回到本节的房价预测问题。如果我们对训练数据集里的3个房屋样本(索引分别为1、2和3逐一预测价格,将得到
y ^ ( 1 ) = x 1 ( 1 ) w 1 + x 2 ( 1 ) w 2 + b , y ^ ( 2 ) = x 1 ( 2 ) w 1 + x 2 ( 2 ) w 2 + b , y ^ ( 3 ) = x 1 ( 3 ) w 1 + x 2 ( 3 ) w 2 + b . \begin{array}{l}\hat{y}^{(1)}=x_1^{(1)}w_1+x_2^{(1)}w_2+b,\\ \hat{y}^{(2)}=x_1^{(2)}w_1+x_2^{(2)}w_2+b,\\ \hat{y}^{(3)}=x_1^{(3)}w_1+x_2^{(3)}w_2+b.\end{array} y^(1)=x1(1)w1+x2(1)w2+b,y^(2)=x1(2)w1+x2(2)w2+b,y^(3)=x1(3)