• 分类(二):损失函数


    分类问题(二): 损失函数

    在上一篇我们探讨了分类问题的基本概念,同时介绍了熵的概念,并解释了交叉熵和最大似然之间的关系。分类问题可以理解将两个类别 p , q p,q p,q的所属分布接近,就是最小化交叉熵

    多分类交叉熵

    分类预测

    在多分类任务中输出的是目标属于每个类别的概率,所有类别的概率和为1,其中概率最大的类别就是目标所属的分类

    多分类使用softmax函数将向量的每一个分量映射到[0,1]区间,并且将向量进行归一化,保证所有分量的输出和为1,因此在多分类任务中提取的特征最后都要经过softmax函数,输出是每个类别的概率,然后使用交叉熵作为损失函数

    softmax函数定义如下
    S i = e z i ∑ i = 1 n e z i S_{i} = \frac{e^{zi}}{\sum_{i=1}^{n}e^{zi}} Si=i=1neziezi
    其中,输入的向量为 z i ( i = 1 , 2 , . . . , n ) z_{i}(i=1,2,...,n) zi(i=1,2,...,n),由此我们可以得到目标属于每个类别的概率,概率最大的就是预测得到的目标的类别

    在这里插入图片描述

    交叉熵损失

    使用softmax函数可以将特征向量映射为所属类别的概率,可以看作是预测类别的概率分布 q ( c i ) q(c_{i}) q(ci),有
    q ( c i ) = e z i ∑ i = 1 n e z i q(c_{i}) = \frac{e^{zi}}{\sum_{i=1}^{n}e^{zi}} q(ci)=i=1neziezi
    其中 c i c_{i} ci为某个类别,设训练数据中类别的概率分布为 p ( c i ) p(c_{i}) p(ci)和预测概率分布 q ( c i ) q(c_{i}) q(ci)的交叉熵为
    H ( p , q ) = − ∑ i p ( c i ) log ⁡ q ( c i ) H(p,q)=-\sum_{i}p(c_{i})\log q(c_{i}) H(p,q)=ip(ci)logq(ci)
    每个训练样本所属的类别是已知的,并且每个样本只会属于一个类别(概率为1),属于其他类别的概率为0,具体的,可以假设有个三分类任务,分别是:猫猪狗,现有一个训练样本为猫,则
    p ( c a t ) = 1 p ( p i g ) = 0 p ( d o g ) = 0

    p(cat)=1p(pig)=0p(dog)=0" role="presentation" style="position: relative;">p(cat)=1p(pig)=0p(dog)=0
    p(cat)=1p(pig)=0p(dog)=0
    假设通过预测得到的三个类别的概率分别为: q ( c a t ) = 0.6 , q ( p i g ) = 0.2 , q ( d o g ) = 0.2 q(cat)=0.6, q(pig)=0.2, q(dog)=0.2 q(cat)=0.6,q(pig)=0.2,q(dog)=0.2,计算 p , q p,q p,q的交叉熵为
    H ( p , q ) = − [ p ( c a t ) log ⁡ q ( c a t ) + p ( p i g ) log ⁡ q ( p i g ) + p ( d o g ) log ⁡ q ( d o g ) ] = − [ 1 ⋅ log ⁡ 0.6 + 0 ⋅ log ⁡ 0.2 + 0 ⋅ log ⁡ 0.2 ] = − log ⁡ 0.6 = − log ⁡ q ( c a t )
    H(p,q)=[p(cat)logq(cat)+p(pig)logq(pig)+p(dog)logq(dog)]=[1log0.6+0log0.2+0log0.2]=log0.6=logq(cat)" role="presentation" style="position: relative;">H(p,q)=[p(cat)logq(cat)+p(pig)logq(pig)+p(dog)logq(dog)]=[1log0.6+0log0.2+0log0.2]=log0.6=logq(cat)
    H(p,q)=[p(cat)logq(cat)+p(pig)logq(pig)+p(dog)logq(dog)]=[1log0.6+0log0.2+0log0.2]=log0.6=logq(cat)

    可以看到对于猫的分类最后计算只与 q ( c a t ) q(cat) q(cat)有关,利用这种特性可以将样本的类别进行重新编码,进而简化交叉熵的计算,这种编码方式就是one-hot编码,以上面例子为例
    c a t = ( 100 ) p i g = ( 010 ) d o g = ( 001 )
    cat=(100)pig=(010)dog=(001)" role="presentation" style="position: relative;">cat=(100)pig=(010)dog=(001)
    cat=(100)pig=(010)dog=(001)

    通过这种编码,计算交叉熵熵时,只需要计算和训练样本对应类别预测概率的值,其他项都是 0 ⋅ log ⁡ q ( c i ) = 0 0\cdot \log q(c_{i})=0 0logq(ci)=0,即
    C o r s s   E n t r o p h y ( p , q ) = − log ⁡ q ( c i ) Corss~Entrophy(p,q) = -\log q(c_{i}) Corss Entrophy(p,q)=logq(ci)
    其中 c i c_{i} ci为训练样本对应的类别,上式也被称为负对数似然(negative log-likelihood, nll)

    二分类交叉熵

    多分类使用softmax函数将最后的输出映射为每个类别的概率,在二分类中使用sigmoid将输出映射为正样本的概率,这是因为在二分类中,只有两个类别(正样本,负样本),只需要求得正样本的概率 q q q,则1-q就是负样本的概率

    sigmoid函数的表达式如下
    σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1+e^{-z}} σ(z)=1+ez1
    sigmoid的输入为z,输出为(0,1),可以表示分类为正样本的概率,二分类的交叉熵是多分类的一个特列
    C o r s s   E n t r o p h y ( p , q ) = − ∑ i m p ( x i ) log ⁡ q ( x i ) Corss~Entrophy(p,q) = -\sum_{i}^{m}p(x_{i})\log q(x_{i}) Corss Entrophy(p,q)=imp(xi)logq(xi)
    因为有两个类别 x ∈ x 1 , x 2 x\in x_{1}, x_{2} xx1,x2,则有
    C o r s s   E n t r o p h y ( p , q ) = − ∑ i m p ( x i ) log ⁡ q ( x i ) = − [ p ( x 1 ) log ⁡ q ( x 1 ) + p ( x 2 ) log ⁡ q ( x 2 ) ] = − [ p log ⁡ q + ( 1 − p ) log ⁡ ( 1 − q ) ]

    Corss Entrophy(p,q)=imp(xi)logq(xi)=[p(x1)logq(x1)+p(x2)logq(x2)]=[plogq+(1p)log(1q)]" role="presentation" style="position: relative;">Corss Entrophy(p,q)=imp(xi)logq(xi)=[p(x1)logq(x1)+p(x2)logq(x2)]=[plogq+(1p)log(1q)]
    Corss Entrophy(p,q)=imp(xi)logq(xi)=[p(x1)logq(x1)+p(x2)logq(x2)]=[plogq+(1p)log(1q)]

    为什么多分类用softmax

    softmaxsigmoid函数的区别在于是否互斥

    假设输出10类,输出通道是10

    1. sigmoid表示这十类互不相关,得到的10个概率值中每个值代表输入这类的概率和不属于这类的概率,都属于 [ 0 , 1 ] [0,1] [0,1],比如第一个类的概率为0.2,表示属于这个类的概率为0.2,不属于这个类的概率为0.8,并且这个概率与其他九个类没有关系。经过sigmoid输出的10个值互不影响,只关注某一类的可能性概率有多大,每一类都是二分类,所以加起来也不等于1,可以使第一类的概率为0.9,第二个为0.8
    2. softmax综合考虑10个类,属于每个类的概率,这10个类相互影响,和为1

    进一步理解

    1. 从网络角度来理解,输出维度是2,3,4等叫多分类,输出维度1为2分类。如果输出维度是2的话也可以是2分类,不过最后用softmax函数,而不是sigmoid函数
    2. sigmoid用到10分类中相当于10个分类器,10个人分别判断自己负责的类别,且相互独立。softmax是10分类中使用1个分类器,1个人判断10个类
    3. 多分类也可以用sigmoid函数,只不过效果较差

    简单来说

    1. softmax适用于预测结果互斥的情况,也就是label是one-hot的情况,例如 [ 0 , 0 , 1 ] [0,0,1] [0,0,1] [ 1 , 0 , 0 ] [1,0,0] [1,0,0]
    2. sigmoid适用于结果不互斥的情况,就是说label是 [ 1 , 1 , 0 ] , [ 1 , 1 , 1 ] [1,1,0],[1,1,1] [1,1,0],[1,1,1]的情况
  • 相关阅读:
    LeetCode-672. 灯泡开关 Ⅱ【穷举,位运算】
    基于PHP+MySQL的养老院管理系统
    Vim简介
    npm install pubsub-js报错的解决汇总
    比 JSON.stringify 快两倍的fast-json-stringify
    Linux网络编程9——UDP 和 本地/网络套接字
    Spring Security(五)--管理用户
    C#设计模式六大原则之单一职责原则
    Spring Boot-3-AbstractApplicationContext
    Elastic Search 浅浅认识 快速使用 keyword 和 text 的区别之处 spring boot 集成案例 es 增删改查
  • 原文地址:https://blog.csdn.net/weixin_41978699/article/details/126862106