线性回归算法实现的基本要素
模型
- 线性回归假设输出与各个输入之间是线性关系,公式如下:
price=warea⋅area+wage⋅age+b
数据集
- 模型调整参数的意义:多栋房屋的真实售出价格和它们对应的面积和房龄。我们希望在这个数据上面寻找模型参数来使模型的预测价格与真实价格的误差最小。
- 该数据集被称为训练数据集(training data set)或训练集(training set)。
- 一栋房屋被称为一个样本(sample),其真实售出价格叫作标签(label),用来预测标签的两个因素叫作特征(feature)。
- 特征用来表征样本的特点。
损失函数
- 在模型训练中,我们需要衡量价格预测值与真实值之间的误差。通常我们会选取一个非负数作为误差,且数值越小表示误差越小。
- 一个常用的选择是平方函数。 它在评估索引为 i 的样本误差的表达式为
l(i)(w,b)=21(y^(i)−y(i))2,
L(w,b)=n1i=1∑nl(i)(w,b)=n1i=1∑n21(w⊤x(i)+b−y(i))2.
优化函数 - 随机梯度下降
-
当模型和损失函数形式较为简单时,上面的误差最小化问题的解可以直接用公式表达出来。这类解叫作解析解(analytical solution)。本节使用的线性回归和平方误差刚好属于这个范畴。然而,大多数深度学习模型并没有解析解,只能通过优化算法有限次迭代模型参数来尽可能降低损失函数的值。这类解叫作数值解(numerical solution)。
-
小批量随机梯度下降(mini-batch stochastic gradient descent)在深度学习中被广泛使用。它的算法很简单:先选取一组模型参数的初始值,如随机选取;接下来对参数进行多次迭代,使每次迭代都可能降低损失函数的值。在每次迭代中,先随机均匀采样一个由固定数目训练数据样本所组成的小批量(mini-batch)
B,然后求小批量中数据样本的平均损失有关模型参数的导数(梯度),最后用此结果与预先设定的一个正数的乘积作为模型参数在本次迭代的减小量。
(w,b)←(w,b)−∣B∣ηi∈B∑∂(w,b)l(i)(w,b)
学习率:
η代表在每次优化中,能够学习的步长的大小
批量大小:
B是小批量计算中的批量大小batch size
总结一下,优化函数的有以下两个步骤:
- (i)初始化模型参数,一般来说使用随机初始化;
- (ii)我们在数据上迭代多次,通过在负梯度方向移动参数来更新每个参数。
softmax的基本概念
分类问题
- 一个简单的图像分类问题,输入图像的高和宽均为2像素,色彩为灰度。
- 图像中的4像素分别记为
x1,x2,x3,x4。
- 假设真实标签为狗、猫或者鸡,这些标签对应的离散值为
y1,y2,y3。
- 我们通常使用离散的数值来表示类别,例如
y1=1,y2=2,y3=3。
权重矢量
o1=x1w11+x2w21+x3w31+x4w41+b1
o2=x1w12+x2w22+x3w32+x4w42+b2
o3=x1w13+x2w23+x3w33+x4w43+b3
神经网络图
下图用神经网络图描绘了上面的计算。softmax回归同线性回归一样,也是一个单层神经网络。由于每个输出
o1,o2,o3的计算都要依赖于所有的输入
x1,x2,x3,x4,softmax回归的输出层也是一个全连接层。
softmax回归是一个单层神经网络
既然分类问题需要得到离散的预测输出,一个简单的办法是将输出值
oi当作预测类别是
i的置信度,并将值最大的输出所对应的类作为预测输出,即输出
iargmaxoi。例如,如果
o1,o2,o3分别为
0.1,10,0.1,由于
o2最大,那么预测类别为2,其代表猫。
类别输出问题
直接使用输出层的输出有两个问题:
- 一方面,由于输出层的输出值的范围不确定,我们难以直观上判断这些值的意义。例如,刚才举的例子中的输出值10表示“很置信”图像类别为猫,因为该输出值是其他两类的输出值的100倍。但如果
o1=o3=103,那么输出值10却又表示图像类别为猫的概率很低。
- 另一方面,由于真实标签是离散值,这些离散值与不确定范围的输出值之间的误差难以衡量。
softmax运算符(softmax operator)解决了以上两个问题。它通过下式将输出值变换成值为正且和为1的概率分布:
y^1,y^2,y^3=softmax(o1,o2,o3)
其中
y^1=∑i=13exp(oi)exp(o1),y^2=∑i=13exp(oi)exp(o2),y^3=∑i=13exp(oi)exp(o3).
容易看出
y^1+y^2+y^3=1且
0≤y^1,y^2,y^3≤1,因此
y^1,y^2,y^3是一个合法的概率分布。这时候,如果
y^2=0.8,不管
y^1和
y^3的值是多少,我们都知道图像类别为猫的概率是80%。此外,我们注意到
iargmaxoi=iargmaxy^i
因此softmax运算不改变预测类别输出。
- 计算效率
- 单样本矢量计算表达式
为了提高计算效率,我们可以将单样本分类通过矢量计算来表达。在上面的图像分类问题中,假设softmax回归的权重和偏差参数分别为
W=⎣⎢⎢⎡w11w21w31w41w12w22w32w42w13w23w33w43⎦⎥⎥⎤,b=[b1b2b3],
设高和宽分别为2个像素的图像样本
i的特征为
x(i)=[x1(i)x2(i)x3(i)x4(i)],
输出层的输出为
o(i)=[o1(i)o2(i)o3(i)],
预测为狗、猫或鸡的概率分布为
y^(i)=[y^1(i)y^2(i)y^3(i)].
softmax回归对样本
i分类的矢量计算表达式为
o(i)y^(i)=x(i)W+b,=softmax(o(i)).
小批量矢量计算表达式
为了进一步提升计算效率,我们通常对小批量数据做矢量计算。广义上讲,给定一个小批量样本,其批量大小为
n,输入个数(特征数)为
d,输出个数(类别数)为
q。设批量特征为
X∈Rn×d。假设softmax回归的权重和偏差参数分别为
W∈Rd×q和
b∈R1×q。softmax回归的矢量计算表达式为
OY^=XW+b,=softmax(O),
其中的加法运算使用了广播机制,
O,Y^∈Rn×q且这两个矩阵的第
i行分别为样本
i的输出
o(i)和概率分布
y^(i)。
交叉熵损失函数
对于样本
i,我们构造向量
y(i)∈Rq ,使其第
y(i)(样本
i类别的离散数值)个元素为1,其余为0。这样我们的训练目标可以设为使预测概率分布
y^(i)尽可能接近真实的标签概率分布
y(i)。
Loss=∣y^(i)−y(i)∣2/2
然而,想要预测分类结果正确,我们其实并不需要预测概率完全等于标签概率。例如,在图像分类的例子里,如果
y(i)=3,那么我们只需要
y^3(i)比其他两个预测值
y^1(i)和
y^2(i)大就行了。即使
y^3(i)值为0.6,不管其他两个预测值为多少,类别预测均正确。而平方损失则过于严格,例如
y^1(i)=y^2(i)=0.2比
y^1(i)=0,y^2(i)=0.4的损失要小很多,虽然两者都有同样正确的分类预测结果。
改善上述问题的一个方法是使用更适合衡量两个概率分布差异的测量函数。其中,交叉熵(cross entropy)是一个常用的衡量方法:
H(y(i),y^(i))=−j=1∑qyj(i)logy^j(i),
其中带下标的
yj(i)是向量
y(i)中非0即1的元素,需要注意将它与样本
i类别的离散数值,即不带下标的
y(i)区分。在上式中,我们知道向量
y(i)中只有第
y(i)个元素
y(i)y(i)为1,其余全为0,于是
H(y(i),y^(i))=−logy^y(i)(i)。也就是说,交叉熵只关心对正确类别的预测概率,因为只要其值足够大,就可以确保分类结果正确。当然,遇到一个样本有多个标签时,例如图像里含有不止一个物体时,我们并不能做这一步简化。但即便对于这种情况,交叉熵同样只关心对图像中出现的物体类别的预测概率。
假设训练数据集的样本数为
n,交叉熵损失函数定义为
ℓ(Θ)=n1i=1∑nH(y(i),y^(i)),
其中
Θ代表模型参数。同样地,如果每个样本只有一个标签,那么交叉熵损失可以简写成
ℓ(Θ)=−(1/n)∑i=1nlogy^y(i)(i)。从另一个角度来看,我们知道最小化
ℓ(Θ)等价于最大化
exp(−nℓ(Θ))=∏i=1ny^y(i)(i),即最小化交叉熵损失函数等价于最大化训练数据集所有标签类别的联合预测概率。
多层感知机的基本知识
深度学习主要关注多层模型。在这里,我们将以多层感知机(multilayer perceptron,MLP)为例,介绍多层神经网络的概念。
隐藏层
下图展示了一个多层感知机的神经网络图,它含有一个隐藏层,该层中有5个隐藏单元。
表达公式
具体来说,给定一个小批量样本
X∈Rn×d,其批量大小为
n,输入个数为
d。假设多层感知机只有一个隐藏层,其中隐藏单元个数为
h。记隐藏层的输出(也称为隐藏层变量或隐藏变量)为
H,有
H∈Rn×h。因为隐藏层和输出层均是全连接层,可以设隐藏层的权重参数和偏差参数分别为
Wh∈Rd×h和
bh∈R1×h,输出层的权重和偏差参数分别为
Wo∈Rh×q和
bo∈R1×q。
我们先来看一种含单隐藏层的多层感知机的设计。其输出
O∈Rn×q的计算为
HO=XWh+bh,=HWo+bo,
也就是将隐藏层的输出直接作为输出层的输入。如果将以上两个式子联立起来,可以得到
O=(XWh+bh)Wo+bo=XWhWo+bhWo+bo.
从联立后的式子可以看出,虽然神经网络引入了隐藏层,却依然等价于一个单层神经网络:其中输出层权重参数为
WhWo,偏差参数为
bhWo+bo。不难发现,即便再添加更多的隐藏层,以上设计依然只能与仅含输出层的单层神经网络等价。
激活函数
上述问题的根源在于全连接层只是对数据做仿射变换(affine transformation),而多个仿射变换的叠加仍然是一个仿射变换。解决问题的一个方法是引入非线性变换,例如对隐藏变量使用按元素运算的非线性函数进行变换,然后再作为下一个全连接层的输入。这个非线性函数被称为激活函数(activation function)。
下面我们介绍几个常用的激活函数:
模型选择、过拟合和欠拟合
训练误差和泛化误差
在解释上述现象之前,我们需要区分训练误差(training error)和泛化误差(generalization error)。通俗来讲,前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现出的误差的期望,并常常通过测试数据集上的误差来近似。计算训练误差和泛化误差可以使用之前介绍过的损失函数,例如线性回归用到的平方损失函数和softmax回归用到的交叉熵损失函数。
机器学习模型应关注降低泛化误差。
模型选择
验证数据集
从严格意义上讲,测试集只能在所有超参数和模型参数选定后使用一次。不可以使用测试数据选择模型,如调参。由于无法从训练误差估计泛化误差,因此也不应只依赖训练数据选择模型。鉴于此,我们可以预留一部分在训练数据集和测试数据集以外的数据来进行模型选择。这部分数据被称为验证数据集,简称验证集(validation set)。例如,我们可以从给定的训练集中随机选取一小部分作为验证集,而将剩余部分作为真正的训练集。
K折交叉验证
由于验证数据集不参与模型训练,当训练数据不够用时,预留大量的验证数据显得太奢侈。一种改善的方法是K折交叉验证(K-fold cross-validation)。在K折交叉验证中,我们把原始训练数据集分割成K个不重合的子数据集,然后我们做K次模型训练和验证。每一次,我们使用一个子数据集验证模型,并使用其他K-1个子数据集来训练模型。在这K次训练和验证中,每次用来验证模型的子数据集都不同。最后,我们对这K次训练误差和验证误差分别求平均。
过拟合和欠拟合
接下来,我们将探究模型训练中经常出现的两类典型问题:
- 一类是模型无法得到较低的训练误差,我们将这一现象称作欠拟合(underfitting);
- 另一类是模型的训练误差远小于它在测试数据集上的误差,我们称该现象为过拟合(overfitting)。
在实践中,我们要尽可能同时应对欠拟合和过拟合。虽然有很多因素可能导致这两种拟合问题,在这里我们重点讨论两个因素:模型复杂度和训练数据集大小。
模型复杂度
为了解释模型复杂度,我们以多项式函数拟合为例。给定一个由标量数据特征
x和对应的标量标签
y组成的训练数据集,多项式函数拟合的目标是找一个
K阶多项式函数
y^=b+k=1∑Kxkwk
来近似
y。在上式中,
wk是模型的权重参数,
b是偏差参数。与线性回归相同,多项式函数拟合也使用平方损失函数。特别地,一阶多项式函数拟合又叫线性函数拟合。
给定训练数据集,模型复杂度和误差之间的关系:
训练数据集大小
影响欠拟合和过拟合的另一个重要因素是训练数据集的大小。一般来说,如果训练数据集中样本数过少,特别是比模型参数数量(按元素计)更少时,过拟合更容易发生。此外,泛化误差不会随训练数据集里样本数量增加而增大。因此,在计算资源允许的范围之内,我们通常希望训练数据集大一些,特别是在模型复杂度较高时,例如层数较多的深度学习模型。
解决过拟合和欠拟合的方法