机器学习之代价函数(cost function)

机器学习之代价函数(cost function)

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

在学习相关算法的过程中,对代价函数的理解也在不断的加深,在此做一个小结。

0x01 什么是代价函数0x02 代价函数的常见形式经过上面的描述,一个好的代价函数需要满足两个最基本的要求:能够评价模型的准确性,对参数θ可微。

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

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

代码语言:javascript复制'''

交叉熵是对「出乎意料」(译者注:原文使用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,发生了也不会引起任何惊讶;当不可能事件发生时,香农信息量为无穷大,这表示给我们提供了无穷多的新信息,并且使我们无限的惊讶。更多解释可以看这里。

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

这里之所以多了一层求和项,是因为神经网络的输出一般都不是单一的值,K表示在多分类中的类型数。

例如在数字识别中,K=10,表示分了10类。此时对于某一个样本来说,输出的结果如下:

代码语言:javascript复制 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):

代码语言:javascript复制 0

0

0

0

0

0

0

0

0

1比较预测结果和理想情况下的结果,可以看到这两个向量的对应元素之间都存在差异,共有10组,这里的10就表示代价函数里的K,相当于把每一种类型的差异都累加起来了。

0x03 代价函数与参数代价函数衡量的是模型预测值h(θ) 与标准答案y之间的差异,所以总的代价函数J是h(θ)和y的函数,即J=f(h(θ), y)。

又因为y都是训练样本中给定的,h(θ)由θ决定,所以,最终还是模型参数θ的改变导致了J的改变。对于不同的θ,对应不同的预测值h(θ),也就对应着不同的代价函数J的取值。变化过程为:

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

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

代码语言:javascript复制"""

Spyder Editor

Python 3.6, Belter, 20170401

"""

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(θ)的变化情况:

代码语言:javascript复制"""

Spyder Editor

Python 3.6, Belter, 20170401

"""

# 计算代价函数的值

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)从图中可以很直观的看到θ对代价函数的影响,当θ1=1时,代价函数J(θ)取到最小值。因为线性回归模型的代价函数(均方误差)的性质非常好,因此也可以直接使用代数的方法,求J(θ)的一阶导数为0的点,就可以直接求出最优的θ值(正规方程法)。

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

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

4.1 线性回归模型的代价函数对参数的偏导数 还是以两个参数为例,每个参数都有一个偏导数,且综合了所有样本的信息。

4.2 逻辑回归模型的代价函数对参数的偏导数根据逻辑回归模型的代价函数以及sigmoid函数

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

详细推导过程可以看这里-逻辑回归代价函数的导数

0x05 参考https://www.quora.com/How-are-the-cost-functions-for-Neural-Networks-derived/answer/Daniel-Watson-22?srid=uIoGQ

https://www.zhihu.com/question/23468713

https://zh.wikipedia.org/wiki/%E7%86%B5_(%E4%BF%A1%E6%81%AF%E8%AE%BA)

https://hit-scir.gitbooks.io/neural-networks-and-deep-learning-zh_cn/content/chap3/c3s3.html

Coursera, Andrew Ng 公开课第一周,第三周,第五周

http://math.stackexchange.com/questions/477207/derivative-of-cost-function-for-logistic-regression

http://math.stackexchange.com/questions/947604/gradient-tangents-planes-and-steepest-direction

0x06 转载

相关推荐

顺丰保价费怎么算(顺丰保价收费标准)
今日之时365天第二季

顺丰保价费怎么算(顺丰保价收费标准)

📅 07-19 👁️ 6832
怎么在手机上查看网络密码 手机网络密码查看方法
今日之时365天第二季

怎么在手机上查看网络密码 手机网络密码查看方法

📅 09-13 👁️ 1786
党政机关公文格式规范(精简版)
哈尔滨哪家医院治疗癫痫病最好-哈尔滨正规的癫痫病医院排名榜?
蒸锅十大品牌排行榜
今日之时365天第二季

蒸锅十大品牌排行榜

📅 07-08 👁️ 3372
爱情观:真正的爱情是什么?
今日之时365天第二季

爱情观:真正的爱情是什么?

📅 08-27 👁️ 8669