zoukankan      html  css  js  c++  java
  • 机器学习之代价函数(cost function)

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

    什么是代价函数?


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

    (1)概况来讲,任何能够衡量模型预测出来的值h(θ)与真实值y之间的差异的函数都可以叫做代价函数C(θ),如果有多个样本,则可以将所有代价函数的取值求均值,记做J(θ)。因此很容易就可以得出以下关于代价函数的性质:

    • 对于每种算法来说,代价函数不是唯一的;
    • 代价函数是参数θ的函数;
    • 总的代价函数J(θ)可以用来评价模型的好坏,代价函数越小说明模型和参数越符合训练样本(x, y);
    • J(θ)是一个标量;

    (2)当我们确定了模型h,后面做的所有事情就是训练模型的参数θ。那么什么时候模型的训练才能结束呢?这时候也涉及到代价函数,由于代价函数是用来衡量模型好坏的,我们的目标当然是得到最好的模型(也就是最符合训练样本(x, y)的模型)。因此训练参数的过程就是不断改变θ,从而得到更小的J(θ)的过程。理想情况下,当我们取到代价函数J的最小值时,就得到了最优的参数θ,记为:

    minθJ(θ)minθJ(θ)

    例如,J(θ) = 0,表示我们的模型完美的拟合了观察的数据,没有任何误差。

    (3)在优化参数θ的过程中,最常用的方法是梯度下降,这里的梯度就是代价函数J(θ)对θ1, θ2, ..., θn的偏导数。由于需要求偏导,我们可以得到另一个关于代价函数的性质:

    • 选择代价函数时,最好挑选对参数θ可微的函数(全微分存在,偏导数一定存在)

    代价函数的常见形式


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

    (1)在线性回归中,最常用的是均方误差(Mean squared error),即

    J(θ0,θ1)=12mi=1m(y^(i)y(i))2=12mi=1m(hθ(x(i))y(i))2J(θ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)在逻辑回归中,最常用的是代价函数是交叉熵(Cross Entropy),交叉熵是一个常见的代价函数,在神经网络中也会用到。下面是《神经网络与深度学习》一书对交叉熵的解释:

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

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

    J(θ)=1m[i=1m(y(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))]J(θ)=−1m[∑i=1m(y(i)log⁡hθ(x(i))+(1−y(i))log⁡(1−hθ(x(i)))]

    符号说明同上 

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

    J(θ)=1m[i=1mk=1K(y(i)kloghθ(x(i))+(1y(i)k)log(1(hθ(x(i)))k)]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,相当于把每一种类型的差异都累加起来了。

    代价函数与参数


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

    θ>h(θ),y>J(θ)θ−>h(θ),y−>J(θ)

    为了更直观的看到参数对代价函数的影响,举个简单的例子:

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

    abc

     View Code

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

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

     View Code

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

    代价函数与梯度


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

     

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

    (1)线性回归模型的代价函数对参数的偏导数:

     

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

    (2)逻辑回归模型的代价函数对参数的偏导数:

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

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

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

    θjJ(θ)=i=1m(hθ(xi)yi)xij∂∂θjJ(θ)=∑i=1m(hθ(xi)−yi)xji

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

    (3)神经网络中的代价函数对参数的偏导数:

     这里的计算过程与前面都不一样,后面再补充。

    References


    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

  • 相关阅读:
    PHP基础学习笔记(一)
    安装wampserver之后,浏览器中输入localhost页面显示IIS7解决办法
    HTML5常识总结(一)
    AngularJs中的服务
    AngularJs中的directives(指令part1)
    Happy Number——LeetCode
    Binary Tree Zigzag Level Order Traversal——LeetCode
    Construct Binary Tree from Preorder and Inorder Traversal——LeetCode
    Construct Binary Tree from Inorder and Postorder Traversal——LeetCode
    Convert Sorted Array to Binary Search Tree——LeetCode
  • 原文地址:https://www.cnblogs.com/nowornever-L/p/6878210.html
Copyright © 2011-2022 走看看