百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

机器学习——代价 损失 COST 函数

toyiye 2024-06-21 12:21 9 浏览 0 评论

机器学习——代价 / 损失 /COST 函数

代价函数(有的地方也叫损失函数,Loss Function)在机器学习中的每一种算法中都很重要,因为训练模型的过程就是优化代价函数的过程,代价函数对每个参数的偏导数就是梯度下降中提到的梯度,防止过拟合时添加的正则化项也是加在代价函数后面的。在学习相关算法的过程中,对代价函数的理解也在不断的加深。

1. 什么是代价函数?

假设有训练样本(x, y),模型为 h,参数为θ。h(θ) = θTx(θT表示θ的转置)。

下面分 3 个方面来进行陈述:

  1. 概况来讲,任何能够衡量模型预测出来的值 h(θ)与真实值 y 之间的差异的函数都可以叫做代价函数 C(θ)。
  2. 如果有多个样本,则可以将所有代价函数的取值求均值,记做 J(θ)。因此很容易就可以得出以下关于代价函数的性质:
  3. 对于每种算法来说,代价函数不是唯一的;
  4. 代价函数是参数θ的函数;
  5. 总的代价函数 J(θ)可以用来评价模型的好坏,代价函数越小说明模型和参数越符合训练样本(x, y);
  6. J(θ)是一个标量;
  7. 当我们确定了模型 h,后面做的所有事情就是训练模型的参数θ。
  8. 那么什么时候模型的训练才能结束呢?这时候也涉及到代价函数,由于代价函数是用来衡量模型好坏的,我们的目标当然是得到最好的模型(也就是最符合训练样本 (x, y) 的模型)。因此训练参数的过程就是不断改变θ,从而得到更小的 J(θ)的过程。理想情况下,当我们取到代价函数 J 的最小值时,就得到了最优的参数θ,记为:

minθJ(θ)

例如,J(θ) = 0,表示我们的模型完美的拟合了观察的数据,没有任何误差。
  1. 在优化参数θ的过程中,最常用的方法是梯度下降,这里的梯度就是代价函数 J(θ)对θ1, θ2, ..., θn 的偏导数。由于需要求偏导,我们可以得到另一个关于代价函数的性质:选择代价函数时,最好挑选对参数θ可微的函数(全微分存在,偏导数一定存在)

2. 代价函数的常见形式

经过上面的描述,一个好的代价函数需要满足两个最基本的要求:能够评价模型的准确性,对参数θ可微。

2.1 均方误差

在线性回归中,最常用的是 ** 均方误差 **(Mean squared error),具体形式为:

J(θ0,θ1)=12m∑i=1m(y^(i)?y(i))2=12m∑i=1m(hθ(x(i))?y(i))2

  • m:训练样本的个数;
  • hθ(x):用参数θ和 x 预测出来的 y 值;
  • y:原训练样本中的 y 值,也就是标准答案
  • 上角标(i):第 i 个样本

2.2 什么是信息量?

假设 X 是一个离散型随机变量,其取值集合为 X,概率分布函数为 p(x)=Pr(X=x),x∈X ,我们定义事件 X=x0 的信息量为:

I(x0)=?log(p(x0))

可以理解为,一个事件发生的概率越大,则它所携带的信息量就越小,而当 p(x0)=1 时,熵将等于 0,也就是说该事件的发生不会导致任何信息量的增加。

举个例子,小明平时不爱学习,考试经常不及格,而小王是个勤奋学习的好学生,经常得满分,所以我们可以做如下假设:

事件 A:小明考试及格,对应的概率 P(xA)=0.1,信息量为 I(xA)=?log(0.1)=3.3219?

事件 B:小王考试及格,对应的概率 P(xB)=0.999,信息量为 I(xB)=?log(0.999)=0.0014

可以看出,结果非常符合直观:

小明及格的可能性很低(十次考试只有一次及格),因此如果某次考试及格了(大家都会说:XXX 竟然及格了!),必然会引入较大的信息量,对应的 I 值也较高。而对于小王而言,考试及格是大概率事件,在事件 B 发生前,大家普遍认为事件 B 的发生几乎是确定的,因此当某次考试小王及格这个事件发生时并不会引入太多的信息量,相应的 I 值也非常的低。

2.3 什么是熵?

假设小明的考试结果是一个 0-1 分布 XA 只有两个取值{0:不及格,1:及格},在某次考试结果公布前,小明的考试结果有多大的不确定度呢?你肯定会说:十有八九不及格!因为根据先验知识,小明及格的概率仅有 0.1,90% 的可能都是不及格的。怎么来度量这个不确定度?求期望!

对应小明的熵:

HA(x)=?[p(xA)log?(p(xA))+(1?p(xA))log?(1?p(xA))]=0.4690

对应小王的熵:

HB(x)=?[p(xB)log(p(xB))+(1?p(xB))log(1?p(xB))]=0.0114

虽然小明考试结果的不确定性较低,毕竟十次有 9 次都不及格,但是也比不上小王(1000 次考试只有一次才可能不及格,结果相当的确定)

我们再假设一个成绩相对普通的学生小东,他及格的概率是 P(xC)=0.5, 即及格与否的概率是一样的,对应的熵:

HC(x)=?[p(xC)log(p(xC))+(1?p(xC))log(1?p(xC))]=1

其熵为 1,他的不确定性比前边两位同学要高很多,在成绩公布之前,很难准确猜测出他的考试结果。

可以看出,熵其实是信息量的期望值,它是一个随机变量的确定性的度量。熵越大,变量的取值越不确定,反之就越确定。

对于一个随机变量 X 而言,它的所有可能取值的信息量的期望(E[I(x)])就称为熵。

X 的熵定义为:

H(X)=Eplog?1p(x)=?∑x∈Xp(x)log?p(x)

为了保证有效性,这里约定当 p(x)→0 时, 有 p(x)logp(x)→0
当 X 为 0?1 分布时,熵与概率 p 的关系如下图:


可以看出,当两种取值的可能性相等时,不确定度最大(此时没有任何先验知识),这个结论可以推广到多种取值的情况。在图中也可以看出,当 p=0 或 1 时,熵为 0,即此时 X 完全确定。

2.4 什么是相对熵

相对熵 (Relative entropy) 又称为 KL 散度(Kullback-Leibler divergence),KL 距离,是两个随机分布间距离的度量。记为 DKL(p||q)。它度量当真实分布为 p 时,假设分布 q 的无效性。

DKL(p‖q)=Ep[log?p(x)q(x)]=∑x∈Xp(x)log?p(x)q(x)=∑x∈X[p(x)log?p(x)?p(x)log?q(x)]=∑x∈Xp(x)log?p(x)?∑x∈Xp(x)log?q(x)=?H(p)?∑x∈Xp(x)log?q(x)=?H(p)+Ep[?log?q(x)]=Hp(q)?H(p)

2.5 交叉熵

交叉熵容易跟相对熵搞混,二者联系紧密,但又有所区别。假设有两个分布 p,q,则它们在给定样本集上的交叉熵定义如下:

CEH(p,q)=Ep[?log?q]=?∑x∈Xp(x)log?q(x)=H(p)+DKL(p||q)

可以看出,交叉熵与上一节定义的相对熵仅相差了 H(p) , 当 p 已知时,可以把 H(p) 看做一个常数,此时交叉熵与 KL 距离在行为上是等价的,都反映了分布 p,q 的相似程度。最小化交叉熵等于最小化 KL距离。它们都将在 p=q 时取得最小值 H(p)(p=q 时 KL 距离为 0),因此有的工程文献中将最小化 KL距离的方法称为 Principle of Minimum Cross-Entropy (MCE)或 Minxent 方法。

在逻辑回归中,最常用的是代价函数是 ** 交叉熵 **(Cross Entropy),交叉熵是一个常见的代价函数,在神经网络中也会用到。下面是《神经网络与深度学习》一书对交叉熵的解释

交叉熵是对「出乎意料」(译者注:原文使用 suprise)的度量。神经元的目标是去计算函数 y, 且 y=y(x)。但是我们让它取而代之计算函数 a, 且 a=a(x)。假设我们把 a 当作 y 等于 1 的概率,1?a 是 y 等于 0 的概率。那么,交叉熵衡量的是我们在知道 y 的真实值时的平均「出乎意料」程度。当输出是我们期望的值,我们的「出乎意料」程度比较低;当输出不是我们期望的,我们的「出乎意料」程度就比较高。

在 1948 年,克劳德·艾尔伍德·香农将热力学的熵,引入到信息论,因此它又被称为香农熵 (Shannon Entropy),它是香农信息量(Shannon Information Content, SIC) 的期望。香农信息量用来度量不确定性的大小:一个事件的香农信息量等于 0,表示该事件的发生不会给我们提供任何新的信息,例如确定性的事件,发生的概率是 1,发生了也不会引起任何惊讶;当不可能事件发生时,香农信息量为无穷大,这表示给我们提供了无穷多的新信息,并且使我们无限的惊讶。

在 logistic regression 中,

  • p: 真实样本分布,服从参数为 p 的 0-1 分布,即 X~B(1,p)
  • q: 待估计的模型,服从参数为 q 的 0-1 分布,即 X~B(1,q)

两者的交叉熵为:

CEH(p,q)=?∑x∈Xp(x)log?q(x)=?[Pp(x=1)log?Pq(x=1)+Pp(x=0)log?Pq(x=0)]=?[plog?q+(1?p)log?(1?q)]=?[ylog?hθ(x)+(1?y)log?(1?hθ(x))]

对所有训练样本取均值得:

?1m∑i=1m[y(i)log?hθ(x(i))+(1?y(i))log?(1?hθ(x(i)))]

2.6 神经网络中的代价函数

学习过神经网络后,发现逻辑回归其实是神经网络的一种特例(没有隐藏层的神经网络)。因此神经网络中的代价函数与逻辑回归中的代价函数非常相似

J(θ)=?1m[∑i=1m∑k=1K(yk(i)log?hθ(x(i))+(1?yk(i))log?(1?(hθ(x(i)))k)]

这里之所以多了一层求和项,是因为神经网络的输出一般都不是单一的值,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,相当于把每一种类型的差异都累加起来了。

3. 代价函数与参数

代价函数衡量的是模型预测值 h(θ) 与标准答案 y 之间的差异,所以总的代价函数 J 是 h(θ)和 y 的函数,即 J=f(h(θ),y) 。又因为 y 都是训练样本中给定的,h(θ)由θ决定,所以,最终还是模型参数θ的改变导致了 J 的改变。对于不同的θ,对应不同的预测值 h(θ),也就对应着不同的代价函数 J 的取值。变化过程为:

θ??>h(θ)??>J(θ)

θ引起了h(θ)的改变,进而改变了J(θ)的取值。为了更直观的看到参数对代价函数的影响,举个简单的例子:

有训练样本{(0, 0), (1, 1), (2, 2), (4, 4)},即4对训练样本,每个样本对中第1个数表示x的值,第2个数表示y的值。这几个点很明显都是y=x这条直线上的点。如下图:

不同参数可以拟合出不同的直线


import matplotlib.pyplot as plt
import numpy as np
X = np.array([[0, 1, 2, 4]]).T  # 都转换成列向量
y = np.array([[0, 1, 2, 4]]).T
theta1 = np.array([[0, 0]]).T  # 三个不同的theta_1值
theta2 = np.array([[0, 0.5]]).T
theta3 = np.array([[0, 1]]).T
X_size = X.shape
X_0 = np.ones((X_size[0],1))  # 添加x_0
X_with_x0 = np.concatenate((X_0, X), axis=1)
h1 = np.dot(X_with_x0, theta1)
h2 = np.dot(X_with_x0, theta2)
h3 = np.dot(X_with_x0, theta3)
plt.plot(X, y, 'rx', label='y')
plt.plot(X, h1, 'b', label='h1, theta_1=0')
plt.plot(X, h2, 'm', label='h2, theta_1=0.5')
plt.plot(X, h3, 'g', label='h3, theta_1=1')
plt.xlabel('X')
plt.ylabel('y/h')
plt.axis([-0.1, 4.5, -0.1, 4.5])
plt.legend(loc='upper left')
plt.savefig('liner_gression_error.png', dpi=200)

常数项为0,所以可以取 θ0=0,然后取不同的 θ1,可以得到不同的拟合直线。当 θ1=0 时,拟合的直线是 y=0,即蓝色线段,此时距离样本点最远,代价函数的值(误差)也最大;当 θ1=1 时,拟合的直线是 y=x ,即绿色线段,此时拟合的直线经过每一个样本点,代价函数的值为 0 。

通过下图可以查看随着 θ1 的变化,J(θ) 的变化情况:

代价函数J(θ)随参数的变化而变化


# 计算代价函数的值
def calcu_cost(theta, X, y):
    m = X.shape[0]  # sample size
    X_0 = np.ones((m,1))
    X_with_x0 = np.concatenate((X_0, X), axis=1)
    h = np.dot(X_with_x0, theta)
    return(np.dot((h-y).T, (h-y))/(2*m))
    
X = np.array([[0, 1, 2, 4]]).T
y = np.array([[0, 1, 2, 4]]).T
theta_0 = np.zeros((101, 1))
theta_1 = np.array([np.linspace(-2, 4, 101)]).T
theta = np.concatenate((theta_0, theta_1), axis=1)  # 101组不同的参数
J_list = []
for i in range(101):
    current_theta = theta[i:i+1].T
    cost = calcu_cost(current_theta, X, y)
    J_list.append(cost[0,0])
plt.plot(theta_1, J_list)
plt.xlabel('theta_1')
plt.ylabel('J(theta)')
plt.savefig('cost_theta.png', dpi=200)

4. 代价函数与梯度

梯度下降中的梯度指的是代价函数对各个参数的偏导数,偏导数的方向决定了在学习过程中参数下降的方向,学习率(通常用α表示)决定了每步变化的步长,有了导数和学习率就可以使用梯度下降算法(Gradient Descent Algorithm)更新参数了。下图中展示了只有两个参数的模型运用梯度下降算法的过程。

下图可以看做是代价函数J(θ)与参数θ做出的图,曲面上的一个点 (θ0,θ1,J(θ)),有无数条切线,在这些切线中与 x?y 平面(底面,相当于 θ0 , θ1)夹角最大的那条切线就是该点梯度的方向,沿该方向移动,会产生最大的高度变化(相对于z轴,这里的z轴相当于代价函数J(θ))。

4.1 线性回归模型的代价函数对参数的偏导数

还是以两个参数为例,每个参数都有一个偏导数,且综合了所有样本的信息。

4.2 逻辑回归模型的代价函数对参数的偏导数

根据逻辑回归模型的代价函数以及sigmoid函数

hθ(x)=g(θTx)g(z)=11+e?z

得到对每个参数的偏导数为

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码