zoukankan      html  css  js  c++  java
  • 损失函数

    损失函数的定义

    我们以分类问题为例来讨论,假如分类器f,那么对于输入X,输出为f(X)那么,如何衡量这个分类器的好坏,我们用f(X)和真正的Y值进行比较,来衡量分类器f的好坏,这种衡量的标准就是损失函数,损失函数越小,代表分类器的性能越好。 损失函数的输入为f(x)和Y,输出是一个非负实数,记做L(f(x),Y)。

    期望风险、经验风险和结构风险

    在学习损失函数时候,经常冒出来几个概念:经验风险、期望风险、结构风险。这些是什么意思?

    期望风险:

    当损失函数越小,表示我们的模型越好。但是我们不能用一个样本来进行预测,然后说这个模型的性能比较好。正确的做法是比较所有的样本,这里的所有包括我们已有的训练数据还有未知的所有数据。这里有一个前提,那即是我们假设我们的样本x和y服从某种概率的分布P(x,y)。我们用所有样本的损失函数的均值,也就是期望风险(expected risk)来进行度量。

    $ R_{exp}(f) = E_P[L(Y,F(X))] =int_{x imes y} L(y,f(x)) P(x,y) dxdy$

    但是这里的问题是这样的,x和y的联合概率分布式不能够得知的,所以我们想要使用期望风险来度量模型的性能是不可以的。

    经验风险:

    虽然,我们不知道x和y的分布情况,但是我们手里有一些训练数据,我们直接在这训练数据上面的风险最小,于是,就引入了经验风险(empirical risk)的概念:

    $R_{emp}(f) = frac{1}{N} sum limits_{i=1}^N L(y_i, f(x_i))$

    结构风险:

    根据大数定理,当样本N的数量无限多的时候,经验风险就等于期望风险,但是实际当中我们的数据是有限的,在有限的数据下面让经验风险最小容易产生“过拟合”的现象。 于是我们加入正则化项,让模型不要太拟合,加上正则化项以后的经验风险叫做结构风险(structural risk):

    $R_{srm}(f) = frac{1}{N} sum limits_{i=1}^N L(y_i, f(x_i)) + lambda J(f)$

    所以,最终我们用结构风险来对我们的模型进行度量和优化,让我们的模型使得结构风险最小化。

    上面的结构风险为一个通用的目标优化函数,很多优化模型都具有这样的函数形式。

    :以上内容参考 李航《统计学习》的1.3节。 周志华 《机器学习》6.4节将上式中的后面项$lambda J(f)$称为结构风险,前面项称为经验风险,和本文介绍的稍有出入。

    让我们再看看一下周志华《机器学习》当中对于这两项的描述,它说的也很有道理。结构风险反应的是模型当中固有的性质,经验风险反应的是数据和模型的契合程度(只有在引入数据的情况下才有经验这个概念),那么上面的式子当中哪个是固有性质的表述,当然是 $J(f)$了,哪个是关于经验的表述,当然是$ frac{1}{N} sum limits_{i=1}^N L(y_i, f(x_i))$。所以它把经验风险和结构风险分别定义为上面两项。

    损失函数的作用

    有了上面的知识,我们再来看一句话,也就是大多数文章当中出现的,“损失函数是经验风险函数的核心部分,也是结构风险函数的重要组成部分。模型的结构风险函数包括了经验风险项和正则项,” 通常表达式如下:

    $ heta^* = arg min limits_{ heta} frac{1}{N}  sum limits_{i=1}^{N}    L(y_i,f(x_i ; heta)) + lambda Phi ( heta)  $

    式子的前面一项为经验风险函数,后面的$Phi$为正则化项或者惩罚项,整个式子表示找到使得函数最小的$ heta$的值。从上面的式子可以看出来,模型的经验风险基本上由损失函数来决定,不同的损失函数,模型的形式是不一样的。经验风险+正则项构成了最终的结构风险

    在了解了损失函数在结构风险函数的重要性之后,下面我们以分类问题介绍一下几种损失函数。 我们令z = Yf(x)表示的是我们预测的值和实际的值的乘积。

    各种损失函数介绍:

    0-1损失

    0-1损失是一种最理想的损失函数,当Y和f(x)的值不一样的时候,也就是预测错误的时候,那么损失的值为1,当Y的值和f(x)的值一样的时候,损失的值为0。所以0-1损失的表达式如下:

    $L(Y, F(mathbf{x})) = left{  egin{aligned} 1, &   Y eq  f(x)  \      0,  & Y = f(x) \   end{aligned}   ight. $

    在分类问题当中,预测的值f(x)和Y的值的乘积z小于0的时候,则惩罚1,大于0则不惩罚,所以0-1损失的另一种形式如下:

    $L_{0/1}= left{  egin{aligned} 1, &quad   if z < 0;  \      0,  & quad otherwise \   end{aligned}   ight. $

    svm和Hinge损失

    在svm当中,硬间隔当中所有的样本满足$y_i(mathbf{w}^T mathbf{x}_i+b) geq 1$ 也就是所有的样本都被分类正确。

    这在实际当中这很难做到,于是采用软间隔,也就是允许部分样本不满足上述的条件。当然,我们还是希望不满足上述条件的样本尽量的少,哪些样本不满足上述条件?如下图所示,一种是下图中的棕色圆圈类的样本,虽然分类正确,但是在虚线和红线的内部,它满足 $1> y_i(mathbf{w}^T mathbf{x}_i+b) > 0$  。 另外一类是分类错误的。也就是下图中的蓝色圆圈内的样本,它们满足$y_i(mathbf{w}^T mathbf{x}_i+b) < 0$ 

    image

    所以,在svm当中,带有软间隔的优化函数可以写作下面的式子:$min limits_{mathbf{w}, b} frac{1}{2}   {Vert mathbf{w} Vert}^2  + C sum limits_{i=0}^{N} {[ 1-y_i({mathbf{w}}^Tx_i+b)]}_+$   其中C是惩罚系数。

    注意到上式中的${[ 1-y_i({mathbf{w}}^Tx_i+b)]}_+$, 它的含义是这样的,只取那些使得$1-y_i({mathbf{w}}^Tx_i+b) geq 0$的值,也就是我们上面分析的那两类样本。当满足$y_i(mathbf{w}^T mathbf{x}_i+b) geq 1$的时候,它的值为0,不进行惩罚。

    我们令${[ 1-y_i({mathbf{w}}^Tx_i+b)]}_+ = xi_i$   并且为了书写的方便,我们令$y_i({mathbf{w}}^Tx_i+b)$=$z_i$。 于是${[ 1-y_i({mathbf{w}}^Tx_i+b)]}_+ = xi_i$ 就变成了${[ 1-z_i]}_+ = xi _i$  结合我们上面分析的右下角的加号的含义,我们可以得知

    当$z$的值小于1的时候,$xi = 1-z$

    当$z$的值大于1的时候,$xi = 0$   

    即$z和xi$满足这样的关系:   $xi= left{  egin{aligned} 1-z, &   z<1  \      0,  & z>1 \   end{aligned}   ight. $

    上面的式子就是hinge损失,它可以写作一般的形式 $ell_{hinge}(z) = max(0, 1-z)$

    于是上式中的svm优化算法用hinge损失函数表示为:    $min limits_{mathbf{w}, b} frac{1}{2}   {Vert mathbf{w} Vert}^2  + C sum limits_{i=0}^{N} ell_{hinge}{( y_i({mathbf{w}}^Tx_i+b))}$

    如果将svm的优化函数看作是一种结构风险函数的,它为经验风险和正则项的和。 其中结构风险采用的是hinge损失函数,正则项采用了L2正则化。即svm=hinge损失+L2正则化。

    AdaBoost和指数损失

    指数损失:$L_{exp}(z) = exp(-z)$

    AdaBoost是采用加法模型,损失函数为指数函数,学习算法为前向分步算法的二分类学习算法。[来自李航《统计学习方法》8.3节]

    并且在这一节当中证明AdaBoost损失函数为指数函数。

    逻辑回归和对数损失以及交叉熵损失

    当有人问逻辑回归的损失函数是什么的时候,有的说是交叉熵损失,有的说是对数损失,其实这两者都对。

    逻辑回归,二分类的情况下推导如下:

    $$J( heta) = –ln(L( heta) = -sum limits_{i=1}^{m} (y_i ln(h_{ heta}) +(1-y_i) ln(1-h_{ heta}) )$$

    这个公式和交叉熵的定义是一样的,所以逻辑回归的损失函数是交叉熵损失。

    对于逻辑回归,它的通用的损失函数是这样定义的:$L(Y,P(Y|X)) = -log P(Y|X)$

    而取$P(Y|X) = frac{1}{1+e^{-z}}$的时候,对数损失变为了:$L_{log}(z) =log(1+e^{-z})$

    对数损失是在逻辑回归建模的时候推导出来的,推导过程如下:

    我们令$p(Y=y|x) = frac{1}{1+e^{ -y( mathbf{w}^T mathbf{x}+ b}) }$

    在求解最优的参数的时候,我们使用了最大似然函数的方法来进行求解,对似然函数取对数,变为对数似然函数。

    对数似然函数为:$ln(L(mathbf{w},b) = sum limits_{i=1}^{m} ln (frac{1}{ 1 + e^{-y_i ({mathbf{w}}^T mathbf{x}_i+ b)}  })$。(对数似然函数的求解很简单,只需要将各个概率相乘,然后取对数就可以了)

    求最大的对数似然函数,也就是求最小的负对数似然函数。于是优化目标变为$J(mathbf{w},b) = -ln(L(mathbf{w},b) = sum limits_{i=1}^{m}  ln( 1 + e^{-y_i ({mathbf{w}}^T mathbf{x}_i+ b)} ) = sum limits_{i=1}^{m}  ln( 1 + e^{-z} )$ 。

    用上面的式子和经验风险函数的式子相比,可以看出来在逻辑回归当中使用的对数损失函数为:$L(z) = ln( 1 + e^{-z} )$

     总结:

    对于算法和损失函数来说,可以从正面来说,一种损失函数是由一种算法推导出来的,比如SVM推导出hinge损失,LR推导出对数损失。另外,你也可以说损失函数+正则化项确定了一个算法,比如hinge损失+l2正则化就是SVM算法。

    参考:

    机器学习优化问题-经验风险、期望风险、结构风险
    机器学习-损失函数
    SVM等于Hinge损失 + L2正则化

     

  • 相关阅读:
    IOS技能点之Foundation之NSString
    JavaScript学习笔记 -- ES6学习(二) let 和const
    JavaScript 学习笔记-- ES6学习(一)介绍以及Babel的使用
    JavaScript 学习笔记: 扩充类型的功能
    PHP学习笔记(八)
    PHP学习笔记(六)
    Less 官方文档学习笔记
    PHP学习笔记(五)
    PHP 学习笔记 (四)
    PHP 学习笔记 (三)
  • 原文地址:https://www.cnblogs.com/jiaxin359/p/8651490.html
Copyright © 2011-2022 走看看