深入浅出PyTorch:从模型到源码
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.2 机器学习基本概念

由于深度学习是一种特殊的机器学习方法,一般的机器学习概念对于深度学习也适用。为了能够更好地对深度学习的一些概念做阐述,这里把机器学习的概念作为独立的一节,希望能够帮助读者更好地理解深度学习的基本概念。

1.2.1 机器学习的主要任务

首先让我们了解一下机器学习的主要任务。一般来说,我们可以把这个任务描述为:给定在现实中获取的一系列数据来构建一个模型,用于描述数据的具体分布(这个分布指的是概率论意义上的分布。也就是说,某些数据可能出现得比较频繁,另外一些数据可能出现得比较稀少,我们需要描述什么数据比较可能出现,并且用概率来描述数据出现的可能性)。在这里用粗体标出了三个重要的词,下面详细介绍一下这些词的具体意义。

数据是人们对周围发生的一些现象的数字化描述。我们在现实中获取的数据是各种各样的,比如图片(计算机使用像素的排列来表示图片,其中每个像素可表示为三个数值(即红绿蓝(RGB))或四个数值和透明度(RGBA))、文本(计算机使用字符串来表示文本)、音频(计算机中一个比较通用的格式是使用16bit(即65536个值)来代表声音的振幅,按照一定采样频率如44.1kHz来组成一段音频。)等。这些数据可以分成有标签的(比如电影评论的文本和文本对应的评价)和没有标签的(比如只是一段文本)。根据能够处理的数据类型,机器学习的任务大致可以分为两类:监督学习(Supervised Learning)和无监督学习(Unsupervised Learning)。前者指的是,我们拥有具体的数据和预测目标(标签),需要从数据出发构造具体的模型预测这些目标,当然模型预测越准确越好,其代表的主要任务包括回归(预测连续的值,如根据历史的气温预测未来的气温)和分类(预测离散的值,如根据图片预测图片描述的具体物体的类型)。后者指的是,我们只有数据,没有预测目标,需要构造具体的模型来找出数据的具体规律,其代表的主要任务包括聚类(找出相似的多组数据并把它们归类)。当然,实际上还有介于监督学习和无监督学习方法之间的半监督学习(Semi-supervised Learning),这里限于篇幅,就不具体展开介绍。

我们在机器学习的资料中经常会碰到一个概念:模型。大多数机器学习任务的目的可以归纳为得到一个模型,用这个模型来描述给定的数据。得到这个模型的过程称之为机器学习模型的训练过程。由于篇幅所限,本书并不打算详细介绍机器学习模型具体有哪些,以及这些模型具体的应用场景等,有兴趣的读者可以参考相关书籍。这里主要试图从概率分布的角度来帮助理解一下什么是机器学习模型。从概率论的角度说,我们可以认为机器学习模型是一个概率分布PθX(这里以概率密度函数来代表概率分布),其中X是训练数据,这个概率分布拥有参数θ=(θ1θ2,…,θn)(这个参数可以是一个或多个,我们用粗体字母来代表所有的参数,n代表参数的个数)。机器学习的任务就是求最优参数θt,使得概率分布PθX最大。我们可以用式(1.1)来代表这个过程,其中argmax函数代表的是取参数使得数据的概率密度最大。求解最优参数θt的过程,我们称之为模型的训练过程(Training),用来训练这个模型的数据集称之为训练集(Training Set),由此得到的模型就可以用来做相应的预测。

由于用于机器学习的训练集通常有很多条具体数据,我们可以把训练数据X拆成单条数据的集合,即X=X1X2,…,Xn,其中n为数据的总数目,X为数据的批次(batch),X的子集称之为数据的迷你批次(mini-batch)。假设训练数据的单条数据之间相互独立,我们可以把式(1.1)进一步展开成式(1.2)。需要注意的是,这里把对于独立单条数据的乘积取对数变成了求概率的对数的和,该方法是机器学习推导公式时经常使用的一个方法,我们把整体的求解最优参数θt的过程称之为极大似然估计(Maximum Likelihood Estimation,MLE)。

1.2.2 机器模型的类型

以上的机器学习理论适用于所有的机器学习,包括监督学习和无监督学习。对于监督学习来说,我们面对的训练集包含输入的数据X及其对应的标签Y。所以我们应该求的是包含了XY的一个概率分布。根据概率论的知识可以知道,对应的概率分布(这里均以对应的概率密度函数来指代分布)有两种,即联合概率分布(Joint Distribution)PθXY和条件概率分布(Conditional Distribution)PθY|X。这两个概率分布的区别在于,前者表示的是数据和标签共同出现的概率,后者表示的是在给定数据的条件下,对应标签的概率。根据描述的概率分布,我们也可以把监督学习的机器学习模型分成两类:生成式模型(Generative Model)和判别式模型(Discriminative Model),前者基于的是联合概率分布,后者基于的是条件概率分布。生成式模型代表性的有朴素贝叶斯(Naive Bayes,NB)和隐马尔可夫模型(Hidden Markov Model,HMM)等,判别式模型代表性的有逻辑斯蒂回归(Logistic Regression,LR)和条件随机场(Conditional Random Fields,CRF)等。除了概率分布形式上的区别,这两类模型在许多方面都有区别。生成式模型除了能够根据输入数据X来预测对应的标签Y,还能根据训练得到的模型产生服从训练数据集分布的数据XY,相当于生成一组新的数据,这个也就是名称中的生成式模型的来源。相对而言,判别式模型就仅能根据具体的数据X来预测对应的标签Y。一般来说,牺牲了生成数据的能力,判别式模型获取的是比生成式模型高的预测准确率。至于为什么判别式模型的预测准确率高,我们可以通过全概率公式和信息熵公式来说明这个问题。首先看一下全概率公式(1.3)。我们可以看到,相对于条件概率,在计算联合概率的时候引入了输入数据的概率分布PX,而这并不是我们关心的(我们只关心给定X的情况下Y的分布),于是这个就相对削弱了模型的预测能力。

前面是定性的说明,下面从定量的角度来阐述生成式模型和判别式模型的信息量。首先定义一下信息熵,如式(1.4)所示。如果概率密度分布相对集中,意味着概率密度包含的信息比较少,信息熵就比较小,反之信息熵比较大。我们可以定义一下联合分布的信息熵(见式(1.5))和条件分布的信息熵(见式(1.6))。根据条件概率的定义,可以得到式(1.7)。假如X的分布比较离散,而且相对均匀,满足HX>0(所有的离散分布和很多连续分布满足这个条件),可以得到条件分布的信息熵小于联合分布,从对应模型的角度上说,我们可以认为判别式模型比生成式模型包含的信息更多。这就是判别式模型比生成式模型在很多条件下效果好的原因。更多关于判别式和生成式模型的相关理论可以参考相应的资料20

1.2.3 损失函数以及模型的拟合

有了关于极大似然估计和监督学习的一些知识后,我们可以进一步考虑一个问题:如何优化机器学习模型?让我们首先从回归模型(Regression)出发。所谓回归模型,可以简单地认为拟合一个函数fθx,给定输入的值Xi,给出对应的目标值Yi,其中θ是需要训练的参数。假设我们的噪声,也就是模型的预测值和对应目标值的差值fθXi-Yi服从高斯分布N(0,σ2),其中,σ2是噪声的方差,这样就可以通过极大似然估计的方法来计算最优的参数θt。整个过程的公式如式(1-8)~式(1.10)所示,其中,式(1.8)是根据极大似然估计,代入高斯分布的概率密度函数,可以最后化简得到式(1.9)。这个公式意味着,在上述的假设条件下,回归模型的极大估计可以归结为求出最优的参数θt,使得模型的预测值和目标值差值对于所有训练数据的平方和最小。我们把argmin函数中需要优化的函数称之为损失函数,这个损失函数被称为L2模损失函数(L2-norm Loss Function)或者方均误差函数(Mean Square Error,MSE)。我们可以看到这个损失函数和正态分布密切相关。当然,如果误差服从其他分布,如拉普拉斯分布(Laplacian Distribution),最后得到的损失函数称为L1模损失函数(L1-norm Loss Function),如式(1.10)所示。

接下来,我们关注一下监督学习的另一类问题,即分类问题。对于分类问题,我们关注的是另外一个分布,即多项分布(Multinomial Distribution)。对于这类分布,我们设计的机器学习模型需要输出的是概率,相应的任务是拟合一个函数,给定输入的值Xi,给出对应的目标值的概率,其中k=1,…,LL是总的分类个数,取0和1两个值中的一个,如果标签是目标标签,则为1,否则为0(在L个值中只有一个为1,其他为0,我们称之为独热编码,即One-hot Encoding)。相应的概率分布和极大似然估计如式(1.11)和式(1.12)所示。这里之所以要求最小值,是因为一般的优化过程都是做极小化的优化,而相应的优化目标函数(即损失函数)称之为交叉熵(Cross Entropy)。

在训练过程中,我们一般会把数据集进行一定的分割,包括前面讲到的训练集,我们会把数据集分为训练集(Training Set)、验证集(Validation Set)和测试集(Test Set)。之所以要这样分类,首先是因为备选的模型有很多,同时,选定了一种模型,可以调节的超参数(hyper-parameter,指的是在模型初始化时选定,不随着训练过程变化的参数,比如神经网络的层数等,在后面会进一步提到)也很多,我们需要实验什么样的模型在什么超参数条件下表现最好,这时就要使用验证集,根据模型在验证集的表现来决定具体使用的模型和模型对应的超参数。一般来说,随着训练模型的进行,模型的损失函数(Loss Function,衡量模型预测的结果和真实数据结果的差异,一般来说,这个值越小越好,如前面提到的L2 Loss和Cross Entropy)在训练集上将会越来越低,而在验证集上将会呈现出先减小后增加的情况,如图1.5所示。之所以会这样,是因为在训练模型的过程中,模型的分布会逐渐趋向训练集的分布,这个在训练集数据能够很好地代表全体数据的分布时当然是一种很好的现象,但是在实际应用过程中,我们得到的训练集数据往往是有限的,而且不能完全正确地描述实际的数据分布,这样就要求我们保持模型具有一定的泛化性,即用和训练集不同但数据源一致的数据来验证我们得到的模型时,损失函数不能太大。我们可以看到在图1.5直虚线右边的区域,模型已经完全偏向于训练集,失去了一定的泛化性,这个区域称之为过拟合(Over-fitting)区域,相应的左边的位置由于模型还没训练到验证集的损失函数最低点,我们称之为欠拟合区域(Under-fitting)。需要注意的是,过拟合和欠拟合是模型所处的一个状态,发生的位置和模型的参数数目、数据量大小有关系。一般来说,随着数据量增大,模型越不容易过拟合,随着参数数目增大(即增大模型复杂性),模型越容易过拟合。另外,测试集的存在是为了避免超参数的调节影响到最终的结果。在实际的应用过程中,超参数的调节总是以尽量降低验证集的损失函数为目的,这样验证集就不能作为一种很好的评判标准,我们需要一个独立的未针对其调节过参数的数据集来验证模型是否有很高的准确率,因此,我们从数据集中独立出了测试集,以此来验证模型是否正常工作。在机器学习实践中,可以考虑类似70%、20%、10%的训练集、验证集、测试集的划分(这里的划分仅供参考)。在深度学习中,由于训练集越大越好,可以考虑类似90%、5%、5%的训练集、验证集、测试集的划分(这里的划分仅供参考)。

图1.5 损失函数随着训练时间的变化(实线曲线为训练集的损失函数,虚线曲线为验证集的损失函数,直线虚线为验证集损失函数最小的位置)

为了消除过拟合的状态,我们需要引入参数的先验分布(Prior Distribution),这是因为之前我们在所有的推导中没有假设参数的范围,因此给了参数很大的变动范围,从而使得模型更容易过拟合。为了减小过拟合的趋势,我们可以人为假设参数服从一定的分布,比如高斯分布,这样就能减小参数的选择范围。我们称这种人为选择的分布叫参数的先验分布。一般来说,可以假设参数θ服从的正态分布。结合式(1.8),可以得到式(1.13),其中。我们可以看到后面加了一项,即所有的参数平方和乘以一个常数α。我们称这个方法为L2正则化(Regularization),相应的系数α为正则化系数,正则化系数越大,则正则化的效果越强,参数分布的标准差就越小,对应的模型在训练过程中就会偏向欠拟合区域,反之,模型则会偏向过拟合区域。这样,我们通过调节正则化系数,就可以控制模型的拟合情况,使得最后模型在验证集上尽量得到高的准确率。另外需要提到的一点是,这里显示的先验分布是正态分布,相应地,如果先验分布为拉普拉斯分布,这里使用的正则化就称之为L1正则化,相应的正则化的项则表现为所有参数值的绝对值的和。

除了加入正则项,在深度学习的实践过程中,我们往往会使用其他的功能来避免过拟合,比如提前停止(Early Stopping),这是因为我们发现在训练过程中可以通过观察验证集的损失函数是否停止下降并开始上升来判断模型是否到达了过拟合的区域,从而避免过拟合的发生。另外一些手段,例如,把神经元的数值按照一定的概率置为零,即丢弃(Dropout),以及在优化器中使用权重衰减(Weight Decay,我们会在优化器的部分介绍这个方法)也能有效避免模型训练中的过拟合。这些方法的本质原理都是减小参数的变化空间,从而缩小模型的表示范围,最后达到让模型在表示训练集数据的同时,也能很好地泛化到验证集数据的目的。