美文网首页TensorFlowMachine Learning深度学习
手打例子一步一步带你看懂softmax函数以及相关求导过程

手打例子一步一步带你看懂softmax函数以及相关求导过程

作者: 97ed7fbbd56c | 来源:发表于2017-03-16 00:20 被阅读24412次

    这几天学习了一下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的知识,大家不用管,只要知道我现在根据每个状态(输入),来预测动作(得到概率最大的输出),最终得到的一系列动作序列就可以完成我的任务即可

    原理图如下图所示:

    那么比如在一次的输出过程中输出结点的值是如下:

    [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就变成了Loss = -yilnaj(yi,aj的i,j均为下标,公式不好打),累和已经去掉了,太好了。现在我们要开始求导数了!

    我们在整理一下上面公式,为了更加明白的看出相关变量的关系:

    其中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的偏导怎么求,如下:

    这里分为俩种情况:

    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之外的其它所有结点的偏导,然后利用链式法则继续传递过去即可!我们的问题也就解决了!

    下面我举个例子来说明为什么计算会比较方便,给大家一个直观的理解

    举个例子,通过若干层的计算,最后得到的某个训练样本的向量的分数是[ 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就可以了

    到这里,这篇文章的内容就讲完了,我希望根据自己的理解,通过列出大量例子,直白的给大家讲解softmax的相关内容,让大家少走弯路,真心希望对大家的理解有帮助!欢迎交流指错!画图整理不易,觉得有帮助的给个赞呗,哈哈!

    参考:

    softmax的log似然代价函数(公式求导)

    交叉熵代价函数(作用及公式推导)

    Softmax回归 - Ufldl

    部分图片来自于网络!

    相关文章

      网友评论

      • tensor初学者:请问如果这些公式看不懂能学会tensorflow吗
      • 762055ccac2a:希望继续写下去
      • 一纸青春:有些喜欢求出theta*data后都减去最大值,然后进行exp(),计算输出概率exp()/sigmaexp(),为了防止float溢出,使得()最大值为零。那么如果按照这种方式处理的话,偏导怎么求解?:pray:
      • 明月在我心:楼主写的很棒。赞。但有个问题:为什么不将两种结果统一为一种形式,两者都是a-y。只不过第一种减去1,第二种减去0。
      • 04399550f45e:请问,求w41为什么没有a5和a6的分量?按照链式法则,不是应该有的吗?
      • heaven_ly:您好大佬,请问三层神经网络的第一层到第二层的权重偏导怎么求呢?
      • 4b7ce6677af3:写得很好,文中有点小错误,就是计算a4~a6的时候,分母应该是e的幂次方,写成z了,不过没有任何影响哈,稍微懂点的都能看懂。
        是小橙子呀:我看到那个地方也觉得有点问题。同感
      • 维真_dfb9:哥哥 你好 可以加个好友么?我有问题要问呀
      • 苏晓森:我有一个问题,为什么a4的更新量除了更新节点4还要更新节点5和6?从输出到softmax输出之间不是全连接关系啊。😫
        fe828d9cbc17:输出到softmax其实隐含的全连接,因为每个softmax的分母是上一层所有输出的和,跟上一层的每个输出都有关系,反向传播的时候就不仅仅是求j=k的情况了
        苏晓森: @忆臻HIT_NLP 嗯,我还有一个疑问。softmax层的代价函数是和正确分类位置有关的那个交叉熵-ln softmax(xi),其中xi为正确分类位置。我的问题是,softmax(xi)越大,-ln softmax(xi)就越小,代价越小,理论上由于softmax当一个输出的概率越大,其余输出的概率会变小,因此只需要优化正确分类位置就行了。但事实上是所有输出节点都优化了?为什么?
        97ed7fbbd56c:@苏晓森 因为全部都需要反向传播回去的
      • 386c00795697:觉得代价函数应该是log-likelihood,而非交叉熵
        a99ec40836b4:@梁礼强 交叉熵和对数似然损失不等价吧?只有在样本独立同分布和y满足一定的分布的条件形式才推导的一样。
        梁礼强:可以从逻辑回归推广出来,其实两者绝对值(只讨论类似逻辑回归形式的话)是一样的。只是,极大似然估计目标是max(log-likelihood) 而交叉熵min(-log-likelihood)
      • 9d3783b6a96a:哥,你能讲讲正则化吗。不明白正则化的意义
        97ed7fbbd56c:可以,目前没有精力再简书上更新,可以关注我的公众号,自然语言处理与机器学习~
      • 9d3783b6a96a:就为了给你回复下 表达谢意 注册了个帐号! 谢谢哥,看懂了
      • 荞麦liang面:作为一名彻底的小白,虽然完全看不懂,但是也要表达一下崇拜!!!棒棒哒!
        97ed7fbbd56c:@荞麦liang面 谢谢,哈哈
      • fda89b48da13:您好,看了您的文章,我还是没懂为什么要分成两类情况进行考虑,您能不能换个方式再说下?谢谢
        54ad99b0b82e:从数学求偏导的角度看,当遇到i,j不同下标时自然而然会要分情况讨论;
        从误差反向传播的角度看,w41和w51对a4的贡献程度是不同的,所以要分情况讨论。
        3f669482b418:我也困惑了一下, 从算式上看,要分别求w41,w42,w43的偏导,所以才要分两种情况.但是从根源上为啥,还是有点困惑,是否解决了,伙伴?
      • 54ad99b0b82e:你好,最后的例子中偏导是不是还应该点乘[o1,o2,o3]?
        97ed7fbbd56c:@54ad99b0b82e 懂了,如果还有层数,继续传的话,是这样的。
        54ad99b0b82e:@忆臻HIT_NLP [0.0903,-0.7553,0.665].*[o1,o2,o3]
        97ed7fbbd56c:哪一个?

      本文标题:手打例子一步一步带你看懂softmax函数以及相关求导过程

      本文链接:https://www.haomeiwen.com/subject/rifdnttx.html