先来看看什么是交叉熵损失函数。考虑在一个含有
个类别的图像分类数据集上面训练神经网络,使用常规的batch SGD训练,记一次迭代(iter)后神经网络的输出向量为
,则
的维度为
,
的维度为
,代表第i张图片分别属于各类的置信度分;真实的训练标签
向量可以表示为
,其中
为
范围的整数,代表第i张图片的真实类别。
我们希望神经网络的输出向量能够代表图片属于各类别的概率,但此时的
显然有正有负,所以需要先进行一步
softmax操作,使
的各个分量都变成正的(其实就相当于做了一次指数归一化):
经过softmax后,交叉熵损失可以表示为如下公式,其中第二个等号用到了python语法的特性,可以暂时不管:
上面的定义可能有点懵,下面我再详细解释一下。我们现在来看看
到底是个什么东西。
一层一层拆开来看,首先是
,这个显然是第i张图片的真实标签。那么
又是什么?
是一个长度为
的向量,
代表神经网络认为将第
张图片属于第
类的概率,再进一步,
就是
神经网络将第i张图片分类正确的概率了。此时还是不明白
究竟是什么。
现在换一种方式,记
,那么根据上面的讨论,
代表
这张图片分类正确的概率。
就代表了神经网络将一个批次上的所有batchsize张图片全部分类正确的概率, 而我们训练神经网络的目的就是为了使这个式子的结果接近1!
回想一下极大似然估计在做什么事情:求出一组参数
使得似然函数最大。现在神经网络的训练就是在做这件事,只不过有一点不同的是,神经网络使用迭代法(如SGD,Adam)求解似然函数极值,而概率论课本中通常直接求导得极值点。
构造似然函数为
,再将
代入,最后得到了上面的公式:
至于为什么少了个负号,这是由于神经网络训练中一般规定寻找最小值。因此最后 对似然函数取负号后就得到了交叉熵损失函数。
欢迎访问我的博客https://07hyx06.github.io/cv_content.html 目前正在搭建,功能还在完善:)