• softmax和softmax loss的学习记录


    0. 喜洋洋

        小黑喵教程3之卷积神经网络中的softmax函数和softmax loss。在CNN完成MNIST手写识别的实验中,我们的loss函数选用了softmax loss,但没有多作说明。今天特别的把这一点内容补上,小白喵要认真听课哦。

        听到softmax不禁就会想起max。要区别两者的关系,打个最通俗的比方:max是一个很专一的人,无论有多少的输出,它也只会对应一个输出;而softmax不同,它会把所有的输入当做“备胎“,给每一个输入打分,输出为等同输入长度的向量,每个元素值域为[0,1],且加和为1(例如CNN的MNIST实验中,某一个图片对应0-9十个分类的概率)。

        对softmax这个渣男有了基本认识之后,就需要对其公式和loss函数公式进行简单的讲解了。不要怕公式,放平心态其实挺简单的。

    1. 灰太狼

      1.1 softmax

        首先回忆一下softmax出现在网络的哪个位置。前面也讲了,他是最后做“分类预测”(打分)时出现,所以肯定是神经网络完成“卷积-池化-全连接层”之后。所以它接收的输入为全连接层输出的向量。

        在CNN的MNIST实验中,可以理解为softmax就是接收了最后一个全连接层10维向量的输出。之前全连接层的输出每个元素的值可能千奇百怪并不是在[0,1]之间,当然值越大代表某个数字的概率也就越大。softmax要做的其实就是把这组10维向量经过一个数学公式进行归一化。

        softmax公式如下:

    上式中,Sj为10维向量的第j维对应的softmax输出,aj为第j维向量原来的值,分母中即为所有的该向量的总和(归一化,在MNIST例子中T=10)。所以每一个Sj均在[0,1]直接,且加和为1。

        举个例子,对于一个3分类的问题。如果最后一层全连接输出为(1,2,3),那么经过softmax函数之后输出为(0.09,0.24,0.67)。这就代表了它属于第3类的概率最高。

        丹丹可能会疑惑。既然(1,2,3)已经能好好的表达属于哪个概率最大了,为什么还要softmax呢。第一是为了归一化,方便设计loss函数;第二是在神经网络训练减少loss时,方便求导(减少loss就是按照梯度下降最快的方式,softmax loss函数求导性质比较好,所以优化相对简单),先简单这么理解吧,需要发论文的时候这一块要更深入的了解。

      1.2 softmax loss

        讲完softmax后感觉softmax loss就很容易了,就是一个数学定义式。loss函数是为了做什么,不就是记录预测值和真实值的差距吗。定义为:

    上式中,L代表softmax loss。Sj就是1.1中介绍的softmax输出,yj代表这幅图片属于哪个类(也就是说,MNIST例子中,yj这个10维向量只有1个元素为1,其他都为0)。所以上式简单表达为:

    最后softmax loss就变为了softmax输出中打分最高的一维的log函数取负。对应的实际意义是什么呢,我们可以先看看-log函数的图像:

    我们的Sj是处于[0,1]之间,对于loss函数来说,Sj越大(网络预测的概率越大,越准),那么L的值就越小;相反L的值越大。例如,Sj=0.6和Sj=0.3都是归类到数字1,但是前者的L值更小代表它预测得更准。所以当我们训练很多轮加强网络深度之后,对于MNIST这个例子,最好的效果就是让softmax输出类似于(0.99,0,0,0,0,0,0,0,0,0,0),这样L值无限趋近于0。

    2. 我只是一只喵

        我也学到了很多东西,当然也愿意和丹丹分享。如果有不明白的地方一定要和小黑喵讨论。好啦,今天的内容就到这里了。

  • 相关阅读:
    酒香也怕巷子深,谈谈前端简历书写技巧。
    谈谈自己对语义化的认识
    服务器向用户返回的状态码和提示信息,常见的有以下一些(方括号中是该状态码对应的HTTP动词)
    Python常用库大全
    Python七大原则,24种设计模式
    Python设计模式(4):行为型
    Python设计模式(3):结构型
    Python设计模式(2):创建型
    python设计模式
    数据库的优化
  • 原文地址:https://www.cnblogs.com/catallen/p/8854937.html
Copyright © 2020-2023  润新知