几乎所有的机器学习算法最后都归结为求解最优化问题,以达到我们想让算法达到的目标。为了完成某一目标,需要构造出一个“目标函数”来,然后让该函数取极大值或极小值,从而得到机器学习算法的模型参数。如何构造出一个合理的目标函数,是建立机器学习算法的关键,一旦目标函数确定,接下来就是求解最优化问题,这在数学上一般有现成的方案。如果你对最优化算法感兴趣,可以阅读SIGAI之前的公众号文章“理解梯度下降法”,“理解牛顿法”,“理解凸优化”,“机器学习中的最优化算法总结”。本文的侧重点是对目标函数的构造进行总结。

下面我们将介绍机器学习中一些典型的目标函数的构造思路,并对各种算法的目标函数做一个总结。按照用途和要解决的问题,机器学习算法可以分为有监督学习,无监督学习,强化学习3种类型。其中,有监督学习又进一步细分为分类问题与回归问题,无监督学习算法分为聚类问题和数据降维问题。概括起来,各类算法要解决的核心问题是:

对于有监督学习中的分类问题与回归问题,机器学习算法寻找一个映射函数:

为输入的样本数据预测出一个实数值或类别标签。不同的是,分类问题要确定样本的类别,即回答“是什么”的问题;回归问题要预测出一个实数值,即回答“是多少”的问题。例如,如果要确定一张图像是猫还是狗,则为分类问题,算法的输入为图像,输出为类别编号。如果我们要根据一个人的年龄、学历、行业等信息预测他/她的收入,则属于回归问题。二者都是要确定上面这种形式的函数。

对于无监督学习的聚类问题,机器学习算法要寻找一个集合的划分,将样本集D划分成多个不相交的子集:

每个样本属于这些子集中的一个,因此可以概括为解决“怎么分的问题”,与分类问题不同的是,这里没有人工事先定义好的类别,因此也没有训练过程。例如,如果要将一批新闻划分为不同类型的,就属于聚类问题,这里没有实现定义好的类,算法自己完成划分,这些类可能是政治、体育、娱乐、经济、军事等。

对于数据降维问题,机器学习算法要寻找一个映射函数,将一个高维向量映射成一个低维向量:

但要尽可能的保留之前向量的一些重要信息。

对于强学习,机器学习算法要为每种状态s下确定一个动作a来执行,即确定策略函数,使得执行这些动作之后得到我们预期的结果:

执行动作后会得到奖励,这个预期的结果是让奖励最大化。例如,用强化学习来实现自动驾驶,要根据当前的路况来决定怎么开车,这里的路况就是状态,开车就是动作,通过控制汽车去我们想去的目的地,这就是目标。

上面这些算法要完成的目标是一个抽象的概念,具体实现时,要通过一个“目标函数”来体现,算法要通过让目标函数取极大值或极小值来确定模型的参数。

有监督学习

首先来看有监督学习,要确定一个映射函数,这个函数带有参数,而参数则通过训练样学习得到。假设映射函数为:

其中θ是模型的参数,如何确定它的值,是训练算法的核心。一般来说,我们称有监督学习的目标函数为“损失函数”,它通过模型对每个训练样本x的预测值y与训练样本的真正标签值y来构造。其含义是,如果算法预测错了,则有损失,因此该函数反映了映射函数的预测值与样本真实标签值之间的误差。让误差最小化,就是让损失函数最小化:

某些有监督的机器学习算法拟合的是概率密度函数或者某一概率分布,此时需要根据样本来确定概率分布的参数。在学习概率论与数理统计时我们知道,确定一个概率分布的参数最常用的是最大似然估计,它求解如下的似然函数最大化问题:

求解函数极值时需要对参数求导,这种连乘形式的函数求导不方便,因此对似然函数取对数,得到对数似然函数:

这类问题的核心是根据一组样本来估计概率分布的参数,使得在参数θ取最优值的时候,这组样本出现的概率最大。下面针对分类问题和回归问题,分别总结常用的目标函数。

分类问题

对于分类问题,预测函数的输出值是离散化的类别标签。给定一组训练样本,在训练时的目标是让这组训练样本尽量被正确的分类,这对应于经验风险最小化的思想。

感知器算法的是最简单的线性分类器,它的目标是让所有样本尽可能分类。对于二分类问题,线性分类器的判别函数为:

样本的标签值为+1或-1,分别对应正样本和负样本。如果线性函数预测出来的值和样本的真实标签值不同号,则预测错误;如果同号,则预测正确。要将预测错误最小化,只需求解如下最优化问题即可:

对于每个训练样本,如果预测正确,则损失函数为负,否则为正。这样我们就构造出了一个容易求解的损失函数。

对于二分类或多分类问题,都可以用欧氏距离作为分类的损失函数。对于多分类问题,一般不直接用类别编号作为预测值,而是为类别进行向量化编码,如one-hot编码。此时损失函数定义为:

在人工神经网络发展的早期,这种函数被广泛使用,但后来对于多分类问题,更多的采用交叉熵损失函数。在后面我们会介绍此函数,至于原因,在SIGAI之前的公众号文章“【群话题精华】五月集锦——机器学习和深度学习中一些值得思考的问题”中曾经做过说明,感兴趣的读者可以阅读这篇文章。

线性判别分析(LDA)是一种有监督的数据降维算法,它的目标是最大化类间差异,最小化类内差异。数据经过投影之后,在低维空间里,同类样本聚集在一起,不同类的样本相距尽可能远。类内差异用每个类的方差来衡量,类间差异用各个类的类中心之间的距离来衡量,二者的比值为我们要优化的目标。由此构造出如下损失函数:

求解这一问题最后归结为求解矩阵的特征值问题。

前面介绍的感知器算法的目标函数,欧氏距离损失,代表的都是经验风险,即在训练样本集上让误差最小化。这样做的泛化性能不一定好,还有一种做法为结构化风险最小化,典型代表是支持向量机。

支持向量机不仅要让所有训练样本尽可能被正确分类,还要让分类间隔最大化,根据解析几何中点到超平面的距离公式,我们构造出了它的优化目标:

这和前面一种表述是等价的。此时,目标函数的前半部分充当正则化项,后半部分充当真正的损失函数,用于对违反约束的样本进行惩罚。

前面说过,对于输出概率值的模型,可以采用最大似然估计来估计模型的参数。典型的代表是logistic回归。对于二分类问题,如果样本的类别标签值为1和0,则对数似然函数为:

将logistic回归推广到多分类问题,即softmax回归,它输出一个样本属于每个类的概率值。因此,训练样本的标签值为一个向量,如果样本属于某一类,该分量为1,其他分量为0。损失函数根据标签向量与预测出的概率向量构造,使用的是softmax交叉熵,定义为:

而交叉熵损失定义为:

它在深度神经网络中被广泛使用。

AdaBoost算法训练时优化的目标函数为指数损失函数,它根据强分类器的输出值F(x)与样本的标签值构造:

在这里,样本的标签值为-1或+1,对应于负样本和正样本。强分类器通过加法模型构造,求解时每次优化一个弱分类器和它的权重,具体做法在之前的公众号文章“理解AdaBoost算法”中已经介绍,由此可以推导出AdaBoost的训练算法。

神经网络尤其是深度学习中使用的损失函数种类繁多,除了传统的欧氏距离之外,还有近几年流行的交叉熵,以及其他函数,下表列出了常用的一些损失函数以及它们的导数:

在这里,求导是对神经网络的预测数据进行的。损失层是神经网络训练时的最后一层,它也只用于训练阶段。在实现反向传播算法时,它是梯度反向传播的起点。

需要说明的是,对前面介绍的很多损失函数,我们都可以加上正则化项,得到新的损失函数,以减轻过拟合。

查看原文 >>
相关文章