美文网首页工作生活
4. 深度学习-损失函数

4. 深度学习-损失函数

作者: 李涛AT北京 | 来源:发表于2019-07-03 20:02 被阅读0次
  • 我们知道神经网络是一种非线性模型,激活函数就是用来映射为非线性的,激活函数是保证神经网络非线性的关键。但是模型的参数我们如何求得最优组合呢?用什么评价标准呢?

1. 经验风险,期望风险,结构风险

  • 如何选择最优参数和评价一组参数是最优的,这就是机器学习中的策略,也就是性能度量P,在李航的《统计学习方法》和周志华的《机器学习》中开篇都曾讲过,这里不再详细介绍。传统的机器学习的策略采用经验风险 最小化原则。要降低经验风险,就要提升模型的复杂度,但是回导致 VC 维很高(如果人类的智商水平可以用大脑的脑细胞数来衡量,那么机器的智商水平就可以用VC维比喻来衡量)。VC维高,置信风险越高,所以结构风险也就高。这就产生了过拟合现象,因此我们针对不同的问题选择不同的策略,使结构风险最小化。

  • 损失函数(Loss Function)是一种用来估算实际值与模型的预测值之间的不一样程度的函数式。通常,它是一种非负值的函数,其值越小,鲁棒性就越好,模型就越稳定。损失函数是针对一个样本而言的,通过损失函数,只能知道模型的决策函数对单个样本的预测能力,但是我们要知道其对整个训练集的预测能力,甚至对新数据的预测能力。如果想知道对整个训练集的预测能力,只需要对训练样本分别损失函数的值,然后进行累加,最后求一个均值即可。这就是经验风险

  • 经验风险越小,说明模型对训练集拟合的效果好,但是对测试集(新数据)的拟合效果如何,有待商榷。那我们如何去衡量所有样本(训练集,测试集,及后期线上产生的数据)的拟合效果呢?从概率论,我们首先想到的是使用期望风险,即假设 XY服从联合分布P(X,Y),期望风险的数学公式为:R_{exp}(f)=E_{p}[L(Y,f(x))]=\int L(f(x),y)*p(x,y)dxdy,其中L(f(x),y)表示损失函数f(x)表示预测值y表示实际值

  • 期望风险是全局的概念,而经验风险是局部的概念。理想的模型希望期望风险最小化,但是期望风险往往不可以得到(未知的数据具有不确定性), XY的联合分布P(X,Y)函数不易得到。为了期望风险最小化,我们采用局部最优代替全局最优的思想,这是因为训练数据足够大,根据大数定理,经验风险应该接近期望风险,这也是经验风险最小化的理论基础。

  • 如果只考虑经验风险,大多数出现过拟合的现象,考虑到期望风险,但是未知的数据不易得到和存在不确定性。两者不能兼顾也,这时该怎么办呢?这就引出了结构风险。结构风险是经验风险加上置信风险,其中置信风险是指模型对未知样本预测的误差。我们知道SVM能够在小样本上优于其他算法,就在于其优化策略使结构风险最小。

  • 置信风险的影响因素有两个:训练样本数量和模型的VC维。训练样本的数量越多,置信风险就越小;模型的VC维越大,模型的假设空间就越大,模型解的种类就越多,拟合能力就越差,置信风险就越大。因此我们增加训练集的数据量和降低模型的VC维,才能降低置信风险,从而使结构风险降低。通常降低模型的VC维的做法是模型加入一个正则化项(惩罚项)。这也是为什么我们建立的模型往往要加入L1,L2范式了。

  • 为了同时保证经验风险和置信风险都达到最小化,这时将两项通过一个权重系数\lambda,融合为一个式子,通过调节超参数\lambda的值,来平衡经验风险和置信风险,使结构风险最小。

  • 上面说那么多,总结起来就是下面几句:

    • 经验风险是局部的。损失函数基于训练数据最小化;
    • 期望风险是全局的。损失函数基于训练数据+测试数据最小化;
    • 置信风险是损失函数基于未知样本最小化,通常增加训练数据量和加入正则化项;
    • 结构风险是经验风险+置信风险。
  • 我们知道了结构风险的概念,但是我们的目的是使结构风险最小,如何让结构风险最小呢?通常我们使用目标函数,让目标函数最小化。目标函数的一般形式是J=arg min_{m}\sum _{i}L(y_{i},f(x_{i};w))+\lambda \Omega (w),其中L是损失函数,\Omega:正则化项

2. 损失函数

  • 有上面的知识,我们知道要建立一个很好的模型,需要损失函数。损失函数多种多样,但是一定满足两个原则。
    • 非负性;
    • 当预测值与真实值接近时,损失函数趋于0。

2.1 0-1 损失函数

  • 假设在二分类问题中,正类 Y=+1,负类 Y=-1,对于一个二分类模型f(x)

  • 定义 0-1 损失函数:

    • L(Y,f(x)) = \left\{\begin{matrix} 1, & Y*f(x)<0\\ 0, & Y*f(x)\geq 0 \end{matrix}\right.
  • 另一种形式:

    • L(Y,f(x)) = \frac{1}{2}(1-sign(y*f(x)))
  • 0-1 损失函数的意思是,预测对的时候,函数为0,预测错的时候,函数为1。更简单的理解就是0-1函数只取决于预测值与实际值乘积的正负号。很明显0-1损失函数是一个在定义域为0时,不可导,也不是一个连续函数,更不是一个非凸函数(这里不再解释这些概念,都是数学的基础知识)。因此该损失函数在求解模型参数时,存在很多不足之处。

2.2 交叉熵损失函数

  • 交叉熵损失函数是0-1函数的一种替换形式,。函数的形式如下:
    • L(Y,p(Y|X)) = -logP(Y|X)

2.2.1 表达式一

  • 运用交叉熵损失函数的典型算法是logistic回归算法(激活函数是sigmoid函数)。logistic不用均方差函数,使用logistic是有原因的。在推到均方差误差函数的时候,我们有一个假设前提,预测值与真实值的误差是白噪声,其实就是服从正态分布(高斯分布)。为什么假设误差是个白噪声呢?这就涉及到大学所学的概率论了,根据中心极限定理,我们知道数据足够多的时候,误差近似服从正态分布。而在推到logistic算法时,它假设样本服从0-1分布(伯努利分布),然后根据最大似然估计,求其最优解。逻辑回归没有极大化似然函数,我们将其转化为最小化负的似然函数。

  • logistic(Sigmoid)表达式为:

    • h_{\Theta }(x)=\frac{1}{1+e^{-\theta ^{\tau }x}}
  • logistic的Log损失函数表达式:

    • L( h_{\Theta }(x),y)=\left\{\begin{matrix} -log( h_{\Theta }(x)), & y=1\\ -log( 1-h_{\Theta }(x)),& y =0 \end{matrix}\right.
  • 我们知道,当真实值y=1时,我们希望自己的模型预测的也接近于1,即h_{\Theta }(x)在1的附近,这时损失函数L( h_{\Theta }(x),y)就趋于0,同理真实值y=0时,损失函数也趋于0。说明此函数满足损失函数的第二个原则。对于第一个原则,我们易知,log函数在定义域(0,1)内小于0,但是损失函数前面有一个负号,因此该损失函数也满足非负性。

  • 此处说明一下,该指数函数有的教材是以e为底,有的是以2为底,仔细想一下,每个编写教材的思考角度不一样,如果从数学推理的角度,设计算法时应该以e为底,因为自然常数e有着特殊的意义,可以推导出很多有意义的东西,比如幂级数,欧拉公式,素数定理等等。如果从计算机的角度,计算机喜欢0,1,也只识别0,1 我们使用2为底,能够加快我们的运算速度。这只是自己的浅理解,没有查看过相关文献,没有理论支撑。

  • logistic的损失函数整体表达式:

    • L( h_{\Theta }(x),y)=-y_{i}*log( h_{\Theta }(x))-(1-y_{i})*log( 1-h_{\Theta }(x))
  • 考虑到经验风险,损失函数为:

    • J(\theta )=\frac{1}{m}\sum_{i=1}^{m}-y_{i}*log( h_{\Theta }(x))-(1-y_{i})*log( 1-h_{\Theta }(x))
  • 上试就是交叉熵函数。

2.2.2 表达式二

  • 对于sigmoid函数,有

    • h_{\theta }(-x)=\frac{1}{1+e^{-\theta ^{T}(-x)}}
          =\frac{1}{1+e^{\theta ^{T}x}}
          =1-\frac{e^{\theta ^{T}(x)}}{1+e^{\theta ^{T}(x)}}
          =1-\frac{1}{1+1/e^{\theta ^{T}(x)}}
          =1-\frac{1}{1+e^{-\theta ^{T}(x)}}
          =1-h_{\theta }(x)
  • 有了上试对sigmoid函数的推导,下面就容易处理了。我们知道在二分类中,假设y的取值,正类时:y=1,负类时:y=-1。对于sigmoid函数,我们将y也放入变量中,P(Y|X) = h_{\theta }(yx),其损失函数的形式如下:

    • L(Y,p(Y|X)) = -logP(Y|X)
          =-log(h_{\theta }(yx))
          =\left\{\begin{matrix} -log(h_{\theta }(x)), &y=1 \\ -log(h_{\theta }(-x))=-log(1-h_{\theta }(x)), & y=-1 \end{matrix}\right.
  • 经验风险的损失函数为:

    • J(\theta )=\frac{1}{m}\sum_{i=1}^{m}-log(h_{\theta }(yx))
         =\frac{1}{m}\sum_{i=1}^{m}-log(1/(1+e^{-\theta ^{T}yx}))

2.2.3 交叉熵损失函数+Sigmoid激活函数

  • 有了激活函数的基础,我们知道在做二分类的时候,通常输出层选择sigmoid激活函数。现在谈谈为什么在激活函数为sigmoid下,我们要选择交叉熵损失函数,而不选择均方误差损失函数。其实有两方面原因:

    • 第一原因。先天条件不满足,sigmoid假设样本服从伯努利分布,而均方误差函数假设服从白噪声。
    • 第二个原因。sigmoid激活函数 + MSE(均方误差)损失函数收敛速度慢。这里不再陈述为何收敛速度慢,上一遍文章讲激活函数的时候,就是在MSE损失函数下,sigmoid函数为何梯度消失的问题。
  • 那疑问来了,为何在交叉熵损失函数下,为何sigmoid的收敛速度快了呢?这里不再介绍过程了,这涉及到前向传播和后向传播,不是几句话能说明白的。它收敛变化的原因就是它的梯度不含有激活函数的导数,在最后一层是预测值与实际值的差,差值大的时候,梯度大些,能快速靠近收敛点差值小了,梯度小些,缓慢的靠近收敛点,防止在收敛点震荡。

2.3 对数似然损失函数

  • 对数似然损失函数其实是交叉熵损失函数的推广。

  • 对数似然损失函数的表达式;

    • J(\theta )=\sum_{k=1}^{K}y_{k}log(f(x))
         =\sum_{k=1}^{K}y_{k}log(\frac{e^{\theta_{l}^{T}x}}{\sum_{l=1}^{K}e^{\theta_{l}^{T}x}})
  • 常常激活函数选择softmax时,我们选用对数似然损失函数。这是因为我们在选择模型函数的时候,选择的是softmax函数。我们知道softmax激活函数,通常用来解决多分类并且类与类之间是互斥的。因此当我们的某一个样本x_{i},实际标签属于2类(假设类别有1,2,3,...),从而只有y_{2}=1,其他的都为0(y_{k}=0,k\neq 2),导致损失函数为J(\theta )=\sum_{k=1}^{K}y_{k}log(f(x))=log(\frac{e^{\theta_{l}^{T}x}}{\sum_{l=1}^{K}e^{\theta_{l}^{T}x}})

2.4 Hinge 损失函数

  • 对于二分类问题,假设输出的y=1,-1。Hinge (合页)损失函数的表达式:
    • L(y,f(x))=max(0,1-f(x)*y)
  • 运用Hinge损失函数的典型分类器是SVM算法,f(x)\geq 1。我们可以知道,当预测对的时候,同号,hinge loss为0;当预测错的时候,异号,hinge loss为1。
  • Hinge损失函数对判定边界附近点(错误越大的点)和离群点的惩罚力度较高,由于错分导致分类误差会很大,如此便会影响整个分类超平面的学习,从而降低模型泛化能力。

2.5 指数损失

  • exp-loss主要用于以boosting思想,设计的算法,主要有AdaBoost算法和提升树(boosting tree)系列算法。
  • 具体形式:
    • L(y,f(x))=exp(-y*f(x))

2.6 均方误差损失函数

  • 均方误差损失函数较多用于回归任务,它假设样本和噪声都是服从正态分布的。它也是一个连续函数。
  • MSE 公式:
    • L(y,f(x))=(y-f(x))^{2}
  • 特点:
    • 计算方便,只是平方运算,不含较为复杂的幂运算;
    • 欧氏距离是一种很好的相似度度量标准;
    • 在不同的表示域变换后特征性质不变。

2.7 绝对值损失函数

  • 具体公式

    • L(y,f(x))=\left | (y-f(x)) \right |
  • 绝对值损失和 MSE 损失类似,不同之处在于平方损失函数更平滑。绝对值损失在预测值等于真实值时,存在间断点,实际中几乎不用,因为在间断点时,损失函数不可导。

2.8 自定义损失函数

  • Tensorflow 不仅支持常用的损失函数,还支持自己定义函数。因为在实际项目中,有的损失函数不适用,需要自己去定义函数。比如,在预测商品销量的时候,假设商品的成本是1元,销售价是10元,如果预测少一个,意味着少挣9元,但是预测多一个,意味着损失1元,客户希望利润最大化,那该如何选择损失函数?

相关文章

  • 4. 深度学习-损失函数

    我们知道神经网络是一种非线性模型,激活函数就是用来映射为非线性的,激活函数是保证神经网络非线性的关键。但是模型的参...

  • 凸优化,梯度下降和优化算法进阶

    1. 凸优化 优化方法目标:训练集损失函数值深度学习目标:测试集损失函数值(泛化性) 1.1 优化在深度学习中的挑...

  • Tensorflow中优化器--AdamOptimizer详解

    大多数机器学习(深度学习)任务就是最小化损失,在损失函数定义好的情况下,使用一种优化器进行求解最小损失。深度学习常...

  • 理解熵,交叉熵和交叉熵损失

    交叉熵损失是深度学习中应用最广泛的损失函数之一,这个强大的损失函数是建立在交叉熵概念上的。当我开始使用这个损失函数...

  • 深度学习入门--损失函数

    神经网络的学习是指从训练数据中自动获取最优权重参数的过程,损失函数就是用来衡量神经网络的学习的程度,学习的目的就是...

  • 损失函数

    损失函数定义: 在深度学习中, 损失函数是用来衡量一组参数的质量的函数, 衡量的方式是比较网络输出和真实输出的差异...

  • Pytorch_第六篇_深度学习 (DeepLearning)

    深度学习 (DeepLearning) 基础 [2]---神经网络常用的损失函数 Introduce 在上一篇“深...

  • 动手学深度学习(六) 凸优化

    优化与深度学习 优化与估计 尽管优化方法可以最小化深度学习中的损失函数值,但本质上优化方法达到的目标与深度学习的目...

  • 吴恩达深度学习4.8 风格迁移的损失函数

    损失函数在深度学习当中的作用是评价模型的输出效果,一般来说,输出效果越好则损失函数的值越小。 在对模型进行训练时,...

  • 深度学习 损失函数的思考

    分析:lr=0.001 时,步长太大,来回振动,这不是好的loss函数曲线。lr=0.0001时,步长依然大,只是...

网友评论

    本文标题:4. 深度学习-损失函数

    本文链接:https://www.haomeiwen.com/subject/snxhhctx.html