在完成ML课程的第三个project的时候,出现了一个错误,我完成使用tensorflow直接进行softmax的时候,发现出现了结果的准确率有0.81,但是在自己写的代码里面出现的结果,居然只有0.5的准确率,而且在我输出它对每个样本完成的概率的计算,发现出来的结果都是0.5,这都是啥嘛,,,气死我了,在tensorflow和自己写的代码里面的计算代价的代码都是一样的,仅仅的差别就是梯度下降是tensorflow帮你计算,很显然,说明我的梯度下降的代码写错了。
题目:下面的逻辑回归的代码详见我的另一个博客:逻辑回归--GD,SGD,牛顿法
数据集网址:
之后再说这个错误,现在这里理一下softmax的过程!
一、softmax简述
softmax是一个多分类的模型,所以也称为多分类的逻辑回归模型。
我们知道逻辑回归求得是这个样本属于1类的概率,它是通过线性得到一个预测的值,之后再放入sigmoid函数将预测的值变化到0-1之间,比拟成概率。这里的softmax得到的也是样本属于每个类别的概率,且概率之和为1.怎么实现的呢?就是通过softmax的假设函数。
softmax的假设函数:
我们先说明一些标志的意思,C是总类别的数目,N表示的所有的样本的数目,m是输入的X的特征数,那么很显然X是一个大小为(N,m)的矩阵,label是一个大小为(n,1)的矩阵,表示的是每个样本的真实标签(这里将会是易错点!!),是一个大小为(C,m)的矩阵,
表示的是第j类的参数,那么k的取值就是1到C,我们用上角代表第几个样本,比如
表示的是第i的样本的预测类别,
是X的第i行,也就是第i个样本的特征。下面的这个公式很显然是:第i个样本被预测成第j类别的概率
,很显然对于一个样本而言,左式产生的所有的类别概率之和为1。那么最后预测的p是一个N*C的矩阵,第i行(1,C)表示第i个样本的被预测为所有样本的概率,那么每一行之和就是1.
二、softmax的代价函数
softmax对于所有的样本的损失函数:
简化下面的求梯度的计算,对于单样本而言,上面的式子中的是一个单数字,如果属于第1类,那么
,如果我们将label转化成one-hot的形式,很显然,如果存在C=3(1,2,3)个类别,那么属于第1类就变成了[1,0,0]这样的形式,所以对于单样本的损失可以写成:
,这个表示的是单样本的损失,举个例子,大家更容易理解,比如C=3,那么对于样本i得到的预测概率是属于第1,2,3类别的概率
,如果第i个样本的真实标签是
也就是属于第2类,那么损失是
,看明白了吗?
所以下面实