作者 | PARAS DAHAL
译者 | zzq
出品 | 人工智能头条(公众号ID:AI_Thinker)
【导读】如果你稍微了解一点深度学习的知识或者看过深度学习的在线课程,你就一定知道最基础的多分类问题。当中,老师一定会告诉你在全连接层后面应该加上 Softmax 函数,如果正常情况下(不正常情况指的是类别超级多的时候)用交叉熵函数作为损失函数,你就一定可以得到一个让你基本满意的结果。而且,现在很多开源的深度学习框架,直接就把各种损失函数写好了(甚至在 Pytorch中 CrossEntropyLoss 已经把 Softmax函数集合进去了),你根本不用操心怎么去实现他们,但是你真的理解为什么要这么做吗?这篇小文就将告诉你:Softmax 是如何把 CNN 的输出转变成概率,以及交叉熵是如何为优化过程提供度量。为了让读者能够深入理解,我们将会用 Python 一一实现他们。
▌Softmax函数
Softmax 函数接收一个 这N维向量作为输入,然后把每一维的值转换成(0,1)之间的一个实数,它的公式如下面所示:
正如它的名字一样,Softmax 函数是一个“软”的最大值函数,它不是直接取输出的最大值那一类作为分类结果,同时也会考虑到其它相对来说较小的一类的输出。
说白了,Softmax 可以将全连接层的输出映射成一个概率的分布,我们训练的目标就是让属于第k类的样本经过 Softmax 以后,第 k 类的概率越大越好。这就使得分类问题能更好的用统计学方法去解释了。
使用 Python,我们可以这么去实现 Softmax 函数:
我们需要注意的是,在 numpy 中浮点类型是有数值上的限制的,对于float64