最近学习遇到了代价函数,在网上搜索整理了几个容易混淆的概念:
一、定义
损失函数定义在单个样本上,算的是一个样本的误差。
代价函数定义在整个训练集上,是所有样本误差的平均,也就是损失函数的平均。
目标函数定义为最终需要优化的函数,等于经验风险 + 结构风险(也就是Cost Function + 正则化项)。
损失函数和代价函数是同一个东西,目标函数是一个与他们相关但更广的概念,对于目标函数来说在有约束条件下的最小化就是损失函数。
上面三个图的函数依次为f1(x),f2(x),f3(x)。我们想用这三个函数分别来拟合Price,Price的真实值记为Y。我们给定x,这三个函数都会输出一个f(x),这个输出的f(x)与真实值Y可能相同,也可能不同。为了表示我们拟合的好坏,我们就用一个函数来度量拟合的程度,比如L(Y,f(x))=(Y-f(x))2,这个函数就称为损失函数(loss function),或者叫代价函数(cost function)。损失函数越小,就代表模型拟合的越好。
那是不是我们的目标就只是让loss function越小越好呢?
还不是。这个时候还有一个概念叫风险函数(risk function)。风险函数是损失函数的期望,这是由于我们输入输出的(X,Y)遵循一个联合分布,但是这个联合分布是未知的,所以无法计算。但是我们是有历史数据的,就是我们的训练集f(X),关于训练集的平均损失称作经验风险(empirical risk),即,所以我们的目标就是最小化经验风险,称为经验风险最小化。
到这里完了吗?还没有。
如果到这一步就完了的话,那我们看上面的图,那肯定是最右面的f3(x)的经验风险函数最小了,因为它对历史的数据拟合的最好嘛。但是我们从图上来看f3(x)肯定不是最好的,因为它过度学习历史数据,导致它在真正预测时效果会很不好,这种情况称为过拟合(over-fitting)。
为什么会造成这种结果?
大白话说就是它的函数太复杂了,都有四次方了,这就引出了下面的概念,我们不仅要让经验风险最小化,还要让结构风险最小化。这个时候就定义了一个函数J(f),这个函数专门用来度量模型的复杂度,在机器学习中也叫正则化(regularization)。常用的有L1,L2范数。到这一步我们就可以说我们最终的优化函数是,即最优化经验风险和结构风险,而这个函数就被称为目标函数。
结合上面的例子来分析:最左面的f1(x)结构风险最小(模型结构最简单),但是经验风险最大(对历史数据拟合的最差);最右面的f3(x)经验风险最小(对历史数据拟合的最好),但是结构风险最大(模型结构最复杂);而f2(x)达到了二者的良好平衡,最适合用来预测未知数据集。
这就不难理解,目标跟踪中基于岭回归的目标优化问题:
二、什么是代价函数
假设有训练样本(x, y),模型为h,参数为θ。h(θ) = θTx(θT表示θ的转置)。
(1)概况来讲,任何能够衡量模型预测出来的值h(θ)与真实值y之间的差异的函数都可以叫做代价函数C(θ),如果有多个样本,则可以将所有代价函数的取值求均值,记做J(θ)。因此很容易就可以得出以下关于代价函数的性质:
- 对于每种算法来说,代价函数不是唯一的;
- 代价函数是参数θ的函数;
- 总的代价函数J(θ)可以用来评价模型的好坏,代价函数越小说明模型和参数越符合训练样本(x, y);
- J(θ)是一个标量;
(2)当我们确定了模型h,后面做的所有事情就是训练模型的参数θ。那么什么时候模型的训练才能结束呢?这时候也涉及到代价函数,由于代价函数是用来衡量模型好坏的,我们的目标当然是得到最好的模型(也就是最符合训练样本(x, y)的模型)。因此训练参数的过程就是不断改变θ,从而得到更小的J(θ)的过程。理想情况下,当我们取到代价函数J的最小值时,就得到了最优的参数θ,记为:
例如,J(θ) = 0,表示我们的模型完美的拟合了观察的数据,没有任何误差。
(3)在优化参数θ的过程中,最常用的方法是梯度下降(gradient descent algorithm),这里的梯度就是代价函数J(θ)对θ1, θ2, ..., θn的偏导数。由于需要求偏导,我们可以得到另一个关于代价函数的性质:
- 选择代价函数时,最好挑选对参数θ可微的函数(全微分存在,偏导数一定存在)
三、代价函数的常见形式
一个好的代价函数需要满足两个最基本的要求:能够评价模型的准确性,对参数θ可微。
3.1 均方误差
在线性回归中,最常用的是均方误差(Mean squared error),具体形式为:
m:训练样本的个数;
hθ(x):用参数θ和x预测出来的y值;
y:原训练样本中的y值,也就是标准答案
上角标(i):第i个样本
从图中可以很直观的看到θ对代价函数的影响,当θ1=1时,代价函数J(θ)取到最小值。因为线性回归模型的代价函数(均方误差)的性质非常好,因此也可以直接使用代数的方法,求J(θ)的一阶导数为0的点,就可以直接求出最优的θ值(正规方程法)。
对于有两个参数的模型,运用梯度下降算法,更新参数的过程:
线性回归模型的代价函数对参数的偏导数:
3.2 交叉熵
在逻辑回归中,最常用的代价函数是交叉熵(Cross Entropy),交叉熵是一个常见的代价函数,在神经网络中也会用到。
下面是《神经网络与深度学习》一书对交叉熵的解释:
交叉熵是对「出乎意料」(译者注:原文使用suprise)的度量。神经元的目标是去计算函数y, 且y=y(x)。但是我们让它取而代之计算函数a, 且a=a(x)。假设我们把a当作y等于1的概率,1−a是y等于0的概率。那么,交叉熵衡量的是我们在知道y的真实值时的平均「出乎意料」程度。当输出是我们期望的值,我们的「出乎意料」程度比较低;当输出不是我们期望的,我们的「出乎意料」程度就比较高。
线性回归模型中,训练集和代价函数如下图
如果我们还用J(θ)函数做为逻辑回归模型的代价函数,用h(x) = g(θ^T * x),将h(x)代入线性回归的代价函数J(θ0,θ1)中,曲线如下图所示
发现J(θ)的曲线图是"非凸函数",存在多个局部最小值,不利于我们求解全局最小值。
因此,上述的代价函数对于逻辑回归是不可行的,我们需要其他形式的代价函数来保证逻辑回归的代价函数是凸函数。
这里我们先对线性回归模型中的代价函数J(θ)进行简单的改写,将Cost(h(x), y) = 1/2(h(x) - y)^2 替换为:
在这里我们选择对数似然损失函数做为逻辑回归模型的代价函数,Cost函数可以表示如下:
为了统一表示,可以把Cost(h(x), y)表达成统一的式子,根据前面J(θ)的定义,J(θ)等于
特别说明:
- 当y=1的时候,第二项(1-y)log(1-h(x))等于0
- 当y=0的时候,ylog(h(x))等于0
根据逻辑回归模型的代价函数以及sigmoid函数
得到对每个参数的偏导数为
详细推导过程可以看这里-逻辑回归代价函数的导数
3.3 神经网络中的代价函数
学习过神经网络后,发现逻辑回归其实是神经网络的一种特例(没有隐藏层的神经网络)。因此神经网络中的代价函数与逻辑回归中的代价函数非常相似:
这里之所以多了一层求和项,是因为神经网络的输出一般都不是单一的值,K表示在多分类中的类型数。
例如在数字识别中,K=10,表示分了10类。此时对于某一个样本来说,假设输出的结果如下:1.1266e-004 1.7413e-003 2.5270e-003 1.8403e-005 9.3626e-003 3.9927e-003 5.5152e-003 4.0147e-004 6.4807e-003 9.9573e-001
一个10维的列向量,预测的结果表示输入的数字是0~9中的某一个的概率,概率最大的就被当做是预测结果。例如上面的预测结果是9。理想情况下的预测结果应该如下(9的概率是1,其他都是0):0 0 0 0 0 0 0 0 0 1
比较预测结果和理想情况下的结果,可以看到这两个向量的对应元素之间都存在差异,共有10组,这里的10就表示代价函数里的K,相当于把每一种类型的差异都累加起来了。
神经网络中的代价函数对参数的偏导数,待学习补充。