softmax函数整理
- 2019 年 10 月 7 日
- 笔记
softmax函数是什么?
假设我们有一个数组,V,Vi表示V中的第i个元素,那么这个元素的Softmax值就是:
更形象的如下图表示:
softmax函数的是一个概率函数,max表示取其中大概率最大值,但是注意这个最大概率也可能取不到,它的作用相当于将所有输出的进行一下评分映射到(0-1)的区间作为最终的输出,再往前一点看就是将最原始的输入映射到(0-1)区间内。
在我们对神经网络求最终的输出的时候最后一步如果使用的是softmax函数来做分类的时候,一般选概率最大的那个值做最终的分类,同时我们知道神经网络得到结果之后一般时候损失反向传递来修正权值,那就得定义一个损失函数,在神经网络中一般使用损失熵来定义,交叉熵的定义如下,其中a代表softmax求出的值,yi代表真实值,i代表输出节点
怎么用呢?
举一个简单的例子:
们能得到下面公式:
z4 = w41*o1+w42*o2+w43*o3
z5 = w51*o1+w52*o2+w53*o3
z6 = w61*o1+w62*o2+w63*o3
z4,z5,z6分别代表结点4,5,6的输出,01,02,03代表是结点1,2,3往后传的输入。那么我们可以经过softmax函数得到
a4 = e^z4/(e^z4+e^z5+e^z6)
a5 = e^z5/(e^z4+e^z5+e^z6)
a6 = e^z6/(e^z4+e^z5+e^z6)
好了,我们的重头戏来了,怎么根据求梯度,然后利用梯度下降方法更新梯度!要使用梯度下降,肯定要定义一个损失函数,这里使用前文提到的交叉熵作为损失函数。
上面的交叉熵函数看起来是一个累和的形式,但是在分类的过程中,我们每一次只是将需要分类的节点的输出值设置为1,其他的检点为0,比如在上图中,4节点为最后的分类输出,则4节点的值a4为1,其他节点(a5,a6)的值为0,这个时候累和就只剩一个了。这个时候Loss=-yjlnaj,其中yj的值为1,Loss=-lnaj了!
参数的形式在该例子中,总共分为w41,w42,w43,w51,w52,w53,w61,w62,w63.这些,那么比如我要求出w41,w42,w43的偏导,就需要将Loss函数求偏导传到结点4,然后再利用链式法则继续求导即可,举个例子此时求w41的偏导为:
w51,….,w63等的权值同样可以用这个方法求出来,关键是如何求出Loss函数对4,5,6节点的偏导怎么求,一般分为两种情况:
注意:这里a4对z4的求导就是对softmax函数求导的过程,因为z4到a4时=是通过softmax函数变换得来的!
第一种:
j=i对应例子里就是如下图所示:
比如我选定了j为4,那么就是说我现在求导传到4结点这!
那么由上面求导结果再乘以交叉熵损失函数求导
Loss = -lnaj,它的导数为-1/aj,与上面aj(1-aj)相乘为aj-1(形式非常简单,这说明我只要正向求一次得出结果,然后反向传梯度的时候,只需要将它结果减1即可,就求出 了对该节点的求导,后面还会举例子!)那么我们可以得到Loss对于4结点的偏导就求出了了(这里假定4是我们的预计输出)
第二种:
这里对应我的例子图如下,我这时对的是j不等于i,往前传:
那么由上面求导结果再乘以交叉熵损失函数求导
Loss = -lnaj,它的导数为-1/aj,与上面-ajai相乘为ai(形式非常简单,这说明我只要正向求一次得出结果,然后反向传梯度的时候,只需要将它结果保存即可,后续例子会讲到)这里就求出了除4之外的其它所有结点的偏导,然后利用链式法则继续传递过去即可!我们的问题也就解决了.。
为什么会softmax会计算方便?
举个例子,通过若干层的计算,最后得到的某个训练样本的向量的分数是[z4,z5,z6] = [ 2, 3, 4 ],那么经过softmax函数作用后概率分别就是=[e^2/(e^2+e^3+e^4),e^3/(e^2+e^3+e^4),e^4/(e^2+e^3+e^4)] = [0.0903,0.2447,0.665],如果这个样本正确的分类是第二个的话,那么计算出来的偏导就是[0.0903,0.2447-1,0.665]=[0.0903,-0.7553,0.665],是不是非常简单!!然后再根据这个进行back propagation就可以了