在本节中我们通过介绍线性回归来引入深度学习中几个重要的概念,包括:样本、训练数据集、训练、随机梯度等优化算法、batch批、损失函数、学习率等。实际上,线性回归也可以被视作一个最简单的神经网络,即单层神经网络
1 线性模型
我们通过一个简单的例子来介绍线性回归模型:
我们常常会通过对房屋面积、房龄、房子位置等各方面因素的评估来估算房价。在这里,我们就以房龄、房屋面积这两个因素作为自变量来进行房价的预测。
预测的方法有很多,可以建立起不同的预测模型。在这里,我们提出一个假设:房屋价格可以表示为房龄和面积的加权和,即:
p
r
i
c
e
=
w
1
a
r
e
a
+
w
2
a
g
e
+
b
price= w_1area + w_2age + b
price=w1area+w2age+b
w
1
和
w
2
w_1和w_2
w1和w2是叫做权重,其衡量了输入对输出的影响的程度;b叫做偏置,是输出本身的属性。
所以线性回归模型,就是通过自变量的线性加权来反映目标的值。
记
x
=
[
x
1
,
x
2
,
x
3
,
.
.
.
]
,
w
=
[
w
1
,
w
2
,
w
3
,
.
.
.
]
x=[x_1,x_2,x_3,...],w=[w_1,w_2,w_3,...]
x=[x1,x2,x3,...],w=[w1,w2,w3,...],则线性回归模型可以表示为:
y
=
x
w
+
b
y=xw+b
y=xw+b
上述的表示是一条x数据和一条y数据的对于,这样的一行数据我们把他叫做样本,x叫做特征,y叫做标签。我们可以把所有的样本放在一起,形成一个矩阵,这个矩阵叫做训练数据集,此时y也是一个向量
y
=
[
y
1
,
y
2
,
y
3
,
.
.
.
]
⊤
,
X
=
[
x
1
,
x
2
,
x
3
,
.
.
.
]
⊤
y=[y_1,y_2,y_3,...]^{\top},X=[x1,x2,x3,...]^{\top}
y=[y1,y2,y3,...]⊤,X=[x1,x2,x3,...]⊤
y
=
X
w
+
b
y=Xw+b
y=Xw+b
我们的目标即是找到通过大量数据不断更新权重和偏置,找到一组合适的参数
w
1
,
w
2
,
b
w_1,w_2,b
w1,w2,b使得预测值与真实值尽可能接近,这样的寻找权重和偏置的过程我们称之为训练。
在开始寻找最好的模型参数(model parameters)之前, 我们还需要两个东西: (1)一种模型质量的度量方式; (2)一种能够更新模型以提高模型预测质量的方法。
2 损失函数
我们该如何度量我们所找到的参数的好坏呢?最直观的想法就是我们在此参数下做出的预测和真实值之间的差距,比如以下公式:
l
o
s
s
(
i
)
<
w
,
b
>
=
1
2
(
y
i
−
y
i
^
)
2
loss^{(i)}<w,b>=\frac{1}{2}(y_i-\hat{y_i})^2
loss(i)<w,b>=21(yi−yi^)2
其中
y
i
^
=
x
i
w
+
b
\hat{y_i}=x_iw+b
yi^=xiw+b是我们的预测值,即我们用真实值和预测值差的平方/2来评估参数的的好坏,其值越小,说明真实值和预测值的偏差越小,模型的效果也就越好。这个函数就叫做损失函数。此处所列出的公式仅仅是针对一个样本的损失函数,我们针对所有数据集的损失函数可以表示为:
l
o
s
s
(
w
,
b
)
=
1
2
n
∑
i
=
1
n
(
y
i
−
y
i
^
)
2
loss(w,b)=\frac{1}{2n}\sum_{i=1}^{n}(y_i-\hat{y_i})^2
loss(w,b)=2n1i=1∑n(yi−yi^)2
我们将每条样本的损失求和取平均值,作为该模型参数下的损失。我们将这个损失函数叫做均方误差(mean squared error)。实际上,还有很多损失函数,在这里我们只以均方差来引入损失函数的概念,其他更多损失函数我们在后面陆续介绍。
3 优化算法
有了评估模型质量的指标以后,我们应该如何根据这个指标来不断更新模型参数呢?
在这里我们介绍一种随机梯度下降的方法。
我们知道,损失函数是关于权重和偏置的函数,那么,想要使得损失函数最小,我们可以通过求解损失函数的梯度来更新权重和偏置。我们可以通过以下公式来更新权重和偏置:
w
i
+
1
=
w
i
−
η
∂
l
o
s
s
∂
w
w_{i+1}=w_{i}-\eta\frac{\partial loss}{\partial w}
wi+1=wi−η∂w∂loss
其中,
∂
l
o
s
s
∂
w
\frac{\partial loss}{\partial w}
∂w∂loss是损失函数关于权重的梯度,它指向了损失函数增长最快的方向,“-”就使得
w
w
w向损失函数减小的方向移动,每次移动的量为
η
\eta
η。
η
\eta
η叫做学习率,它决定了每次更新的步长,如果
η
\eta
η过大,可能会导致损失函数不收敛,如果
η
\eta
η过小,可能会导致收敛速度过慢。所以
η
\eta
η的选择是一个很重要的问题。
通过下面的图形,我们也可以直观的理解梯度下降的过程:
4 批处理(batch)
在实际的训练过程中,如果采用单条样本来更新参数,可能会受到单个较大偏差样本的影响,使得过拟合或更新不稳定;而在用整个数据集上来计算梯度进而更新参数又是太昂贵的做法(计算梯度是很贵的事!),因此我们通常会将训练数据集分成若干个小的数据集,每个小的数据集叫做batch,我们每次用一个batch的数据来更新参数,这样的方法叫做批处理。这样的方法有两个好处:(1)减少计算量;(2)增加模型的泛化能力。
同样的,batch_size也是一个很重要的超参数,过大过小都会影响模型的效果。
5 小结
在这一节中,我们了解到:
- 线性回归模型是一个最简单的神经网络模型,它通过线性加权及偏置来反映输入和输出之间的关系;
- 我们使用平方损失等损失函数来衡量模型参数的好坏
- 梯度下降算法以一定或变化的步长(学习率)沿着反梯度方向更新模型参数,从而不断减小损失函数的值;
- 通过批处理的方法,我们可以减少计算量,增加模型的泛化能力。
- 学习率和batch_size是两个重要的超参数,它们的选择会影响模型的效果。
在接下来的章节中,我们会介绍线性回归模型的代码实现,分别包含从0开始(不使用任何已有框架)以及简单实现。