答案来自专栏:机器学习算法与天然语言处理php
详解softmax函数以及相关求导过程react
这几天学习了一下softmax激活函数,以及它的梯度求导过程,整理一下便于分享和交流。算法
softmax函数
softmax用于多分类过程当中,它将多个神经元的输出,映射到(0,1)区间内,能够当作几率来理解,从而来进行多分类!数组
假设咱们有一个数组,V,Vi表示V中的第i个元素,那么这个元素的softmax值就是网络
更形象的以下图表示:机器学习
softmax直白来讲就是将原来输出是3,1,-3经过softmax函数一做用,就映射成为(0,1)的值,而这些值的累和为1(知足几率的性质),那么咱们就能够将它理解成几率,在最后选取输出结点的时候,咱们就能够选取几率最大(也就是值对应最大的)结点,做为咱们的预测目标!函数
举一个我最近碰到利用softmax的例子:我如今要实现基于神经网络的句法分析器。用到是基于转移系统来作,那么神经网络的用途就是帮我预测我这一个状态将要进行的动做是什么?好比有10个输出神经元,那么就有10个动做,1动做,2动做,3动做...一直到10动做。(这里涉及到nlp的知识,你们不用管,只要知道我如今根据每一个状态(输入),来预测动做(获得几率最大的输出),最终获得的一系列动做序列就能够完成个人任务便可)学习
原理图以下图所示:优化
那么好比在一次的输出过程当中输出结点的值是以下:.net
[0.2,0.1,0.05,0.1,0.2,0.02,0.08,0.01,0.01,0.23]
那么咱们就知道此次我选取的动做是动做10,由于0.23是此次几率最大的,那么怎么理解多分类呢?很容易,若是你想选取俩个动做,那么就找几率最大的俩个值便可~(这里只是简单的告诉你们softmax在实际问题中通常怎么应用)
softmax相关求导
当咱们对分类的Loss进行改进的时候,咱们要经过梯度降低,每次优化一个step大小的梯度,这个时候咱们就要求Loss对每一个权重矩阵的偏导,而后应用链式法则。那么这个过程的第一步,就是对softmax求导传回去,不用着急,我后面会举例子很是详细的说明。在这个过程当中,你会发现用了softmax函数以后,梯度求导过程很是很是方便!
下面咱们举出一个简单例子,原理同样,目的是为了帮助你们容易理解!
咱们能获得下面公式:
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函数获得



好了,咱们的重头戏来了,怎么根据求梯度,而后利用梯度降低方法更新梯度!
要使用梯度降低,确定须要一个损失函数,这里咱们使用交叉熵做为咱们的损失函数,为何使用交叉熵损失函数,不是这篇文章重点,后面有时间会单独写一下为何要用到交叉熵函数(这里咱们默认选取它做为损失函数)
交叉熵函数形式以下:
其中y表明咱们的真实值,a表明咱们softmax求出的值。i表明的是输出结点的标号!在上面例子,i就能够取值为4,5,6三个结点(固然我这里只是为了简单,真实应用中可能有不少结点)
如今看起来是否是感受复杂了,竟然还有累和,而后还要求导,每个a都是softmax以后的形式!
可是实际上不是这样的,咱们每每在真实中,若是只预测一个结果,那么在目标中只有一个结点的值为1,好比我认为在该状态下,我想要输出的是第四个动做(第四个结点),那么训练数据的输出就是a4 = 1,a5=0,a6=0,哎呀,这太好了,除了一个为1,其它都是0,那么所谓的求和符合,就是一个幌子,我能够去掉啦!
为了形式化说明,我这里认为训练数据的真实输出为第j个为1,其它均为0!
那么Loss就变成了
,累和已经去掉了,太好了。如今咱们要开始求导数了!
咱们在整理一下上面公式,为了更加明白的看出相关变量的关系:
其中
,那么形式变为
那么形式愈来愈简单了,求导分析以下:
参数的形式在该例子中,总共分为w41,w42,w43,w51,w52,w53,w61,w62,w63.这些,那么好比我要求出w41,w42,w43的偏导,就须要将Loss函数求偏导传到结点4,而后再利用链式法则继续求导便可,举个例子此时求w41的偏导为:
w51.....w63等参数的偏导同理能够求出,那么咱们的关键就在于Loss函数对于结点4,5,6的偏导怎么求,以下:
这里分为俩种状况:
j=i对应例子里就是以下图所示:
好比我选定了j为4,那么就是说我如今求导传到4结点这!
那么由上面求导结果再乘以交叉熵损失函数求导
,它的导数为
,与上面
相乘为
(形式很是简单,这说明我只要正向求一次得出结果,而后反向传梯度的时候,只须要将它结果减1便可,后面还会举例子!)那么咱们能够获得Loss对于4结点的偏导就求出了了(这里假定4是咱们的预计输出)
第二种状况为:
这里对应个人例子图以下,我这时对的是j不等于i,往前传:
那么由上面求导结果再乘以交叉熵损失函数求导
,它的导数为
,与上面
相乘为
(形式很是简单,这说明我只要正向求一次得出结果,而后反向传梯度的时候,只须要将它结果保存便可,后续例子会讲到)这里就求出了除4以外的其它全部结点的偏导,而后利用链式法则继续传递过去便可!咱们的问题也就解决了!
下面我举个例子来讲明为何计算会比较方便,给你们一个直观的理解
举个例子,经过若干层的计算,最后获得的某个训练样本的向量的分数是[ 2, 3, 4 ],
那么通过softmax函数做用后几率分别就是=[
,
,
] = [0.0903,0.2447,0.665],若是这个样本正确的分类是第二个的话,那么计算出来的偏导就是[0.0903,0.2447-1,0.665]=[0.0903,-0.7553,0.665],是否是很是简单!!而后再根据这个进行back propagation就能够了
到这里,这篇文章的内容就讲完了,我但愿根据本身的理解,经过列出大量例子,直白的给你们讲解softmax的相关内容,让你们少走弯路,真心但愿对你们的理解有帮助!欢迎交流指错!画图整理不易,以为有帮助的给个赞呗,哈哈!
参考:
softmax的log似然代价函数(公式求导)
交叉熵代价函数(做用及公式推导)
Softmax回归 - Ufldl
部分图片来自于网络!