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

    交叉熵损失函数

    标签(空格分隔): 损失函数


    在得到预测结果之后我们使用softmax对预测概率进行归一化,softmax之后产生的(hat{y}_i)之中的参数之和为1,并且每个参数都是0~1之间,在归一化结束之后因为其用的是指数函数所以较大的值只会更大。下面用一个简单的图像分类例子开始讲解,下面两个模型都是通过(sigmoid/softmax)的方式得到对于每个预测结果的概率值
    模型一:

    (hat{y}) (y) acc
    0.3 0.3 0.4 0 0 1 T
    0.3 0.4 0.3 0 1 0 T
    0.1 0.2 0.7 1 0 0 F

    模型二:

    (hat{y}) (y) acc
    0.1 0.2 0.7 0 0 1 T
    0.1 0.7 0.2 0 1 0 T
    0.3 0.4 0.3 1 0 0 F

    模型二对于样本1和样本2判断非常准确,对于样本3判断错误,但是相对来说不离谱。
    在通过(sigmoid/softmax)归一化之后,我们需要损失函数判断模型在样本上的表现,那么我们可以定义那些损失函数呢?

    Classification Error

    最为直接的损失函数定义为:(classification;error=frac{count;of;error;items}{count;of;all;items})

    模型一:(classification;error=frac{1}{3})

    模型二:(classification;error=frac{1}{3})

    在前面可以看出来虽然模型一模型二都预测错了一个,但是模型二表现得更好,损失函数值应该更小才对, 这样才可以更好的判断模型的优劣。所以这种模型一般没啥人用。

    Mean Squared Error

    均方误差损失也是一种比较常见的损失函数,其定义为:(MSE=frac{1}{n}sum_i^n(y_i-hat{y}_i)^2)

    模型一

    [sample;1;loss=(0.3-0)^2+(0.3-0)^2+(0.4-1)^2=0.54\ sample;2;loss=(0.3-0)^2+(0.4-1)^2+(0.3-0)^2=0.54\ sample;3;loss=(0.1-1)^2+(0.2-0)^2+(0.7-0)^2=1.34\ MES=frac{0.54+0.54+1.34}{3}=0.81 ]

    模型二

    [sample;1;loss=(0.1-0)^2+(0.2-0)^2+(0.7-1)^2=0.14\ sample;2;loss=(0.1-0)^2+(0.7-1)^2+(0.2-0)^2=0.14\ sample;3;loss=(0.3-1)^2+(0.4-0)^2+(0.3-0)^2=1.74\ MES=frac{0.14+0.14+0.74}{3}=0.34 ]

    我们发现MES能够判断出来模型二优于模型一,那么为什么不采用这种损失函数呢?主要原因是在分类问题中使用(sigmoid/softmax)得到概率,配合(MSE)损失函数时,采用梯度下降法进行学习时,会出现模型一开始训练的时候,学习速率变得非常慢的情况。
    对于分类问题的损失函数来说,分类错误率和均方误差都不是很好的损失函数,下面看一下交叉熵损失函数的表现。

    Cross Entropy Loss Function

    二分类

    在二分的情况下,模型最后需要预测的结果只有两种情况,对于每个类别我们预测得到的概率为(p)(1-p)此时损失函数的表达式为:$$L=frac{1}{N}sum_iL_i=frac{1}{N}sum_i-[y_icdot log(p_i)+(1-y_i)cdot log(1-p_i)] ag1$$

    其中:

    • (y_i) 表示样本(i)的label,正类为(1),负类为(0)
    • (p_i) 表示样本(i)预测为正类的概率

    多分类

    多分类的情况实际上就是对二分类的扩展:

    [L=frac{1}{N}sum_iL_i=-frac{1}{N}sum_{c=1}^My_{ic}ln(p_{ic}) ag2 ]

    其中:

    • (M) 代表类别的数量
    • (y_{ic}) 符号函数((0)(1)),如果样本(i)的真实类别等于(c)(1),否则取(0)
    • (p_{ic}) 观测样本(i)属于类别(c)的预测概率。

    现在利用交叉熵损失函数计算上面的损失值:

    模型一

    [sample;1;loss = -(0 imes ln(0.3)+0 imes ln(0.3)+1 imes ln(0.4))=0.91 \ sample;2;loss = -(0 imes ln(0.3)+1 imes ln(0.4)+0 imes ln(0.3))=0.91 \ sample;3;loss = -(1 imes ln(0.1)+0 imes ln(0.2)+0 imes ln(0.7))=2.30 ]

    对所有样本的loss求平均:

    [L = frac{0.91+0.91+2.30}{3}=1.37 ]

    模型二

    [sample;1;loss = -(0 imes ln(0.1)+0 imes ln(0.2)+1 imes ln(0.7))=0.35 \ sample;2;loss = -(0 imes ln(0.1)+1 imes ln(0.7)+0 imes ln(0.2))=0.35 \ sample;3;loss = -(1 imes ln(0.3)+0 imes ln(0.4)+0 imes ln(0.3))=1.20 ]

    对所有样本的loss求平均:

    [L = frac{0.35+0.35+1.20}{3}=0.63 ]

    可以发现交叉熵损失函数可以得到模型一模型二的预测效果差异。

    学习过程

    交叉熵损失函数经常用于分类问题当中,特别是在神经网络做问题分类的时候,也经常使用交叉熵做损失函数,此外,由于交叉熵涉及到计算每个类别的概率,所以交叉熵几乎每次都和(sigmoid/softmax)函数一起出现

  • 相关阅读:
    数据库操作相关(sql语句-命令行)
    五月份和六月份的总结
    解决IE6下透明图片有背景的问题
    LceMeaning专用函数集《Lcemeaning》
    Delphi获得与设置系统时间格式《转》
    Delphi 调用Excel《转》
    调用外部程序并等待程序运行结束《Lcemeaning》
    如何获取Memo的行数与列数《转》
    delphi小写金额转大写的函数《转》
    delphi中的时间函数运算《转》
  • 原文地址:https://www.cnblogs.com/A-FM/p/15076881.html
Copyright © 2011-2022 走看看