我是靠谱客的博主 笑点低汉堡,最近开发中收集的这篇文章主要介绍Softmax函数于导数及交叉熵系数导数的计算,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Softmax函数及导数

softmax函数在各种神经网络中应用广泛,本文粗略推导softmax函数的导数计算过程,

假设softmax函数为:

                                                            

如同名称所说,这是一个‘max’函数的‘soft’版本。区分于原版的max函数,这个函数将一组数转化为一组0到1之间的值,并且这些值的总和为1,其中数值最大的值在softmax中也有最大的值。softmax在深度学习中经常被用来表示标签的正确概率,‘分数’最高的标签自然也有最大的softmax值也就是正确概率。

在python中,softmax可以定义为:

def softmax(X):
exps = np.exp(X)
return exps / np.sum(exps)

在python.numpy.中,浮点数的范围是10^308,所以即使对于加减乘除运算,这个界限很难达到,但对于指数运算,有时候很容易就会超过这个值,所以常常引入参数C,使得:

                                                        

我们选择C的值为:

                                                                 

使得得到的a的大小平移到负数到0的范围内,从而让指数运算更稳定。

由于softmax函数的可解释性,我们通常将他运用到网络的最后一层,为此我们需要计算softmax的导数,

即           

                                                                       

根据商式定理,可以求导

需要注意的是,此处对于 i= j 和i ~=j 的情况需要分类讨论,

                

                   

所以结果为:

                                                                       

克罗内克记号为:

那么:

                                                                           

交叉熵及导数

交叉熵系数定义为衡量输出分布和原分布概率之间的距离函数,一般定义为:

                                                                        

我认为这样的定义容易造成误解,因为yi此处并非标签labels,而是正确的分类概率。

按原定义,python代码如下:

def cross_entropy(X,y):
"""
X is the output from fully connected layer (num_examples x num_classes)
y is labels (num_examples x 1)
"""
m = y.shape[0]
p = softmax(X)
log_likelihood = -np.log(p[range(m),y])
loss = np.sum(log_likelihood) / m
return loss

如果说理论上被正确分类的概率为1,那么对于所有的正确类(class)对应的yi,他们的值都是1,对于所有错误类对应的yi,它们的值都为0。

所以,仅有那些正确分类所对应的softmax函数值才对交叉熵有影响!

现在使用之前推导出来的softmax导函数来推导cross-entropy的导数。(这里o就是前面的a)

                                                                

根据之前的推导,

则有:

                                                               

                                                                                

翻译成代码就是:

def delta_cross_entropy(X,y):
"""
X is the output from fully connected layer (num_examples x num_classes)
y is labels (num_examples x 1)
"""
m = y.shape[0]
grad = softmax(X)
grad[range(m),y] -= 1
grad = grad/m
return grad

萌新易错点:因为这里讨论的不是多输入的情况,而是单输入,所以这里的L不是一个大的参数矩阵W所对应的损失函数,而是大矩阵W中一行或一列(取决于定义)所对应的损失函数,也就是所谓的Li。所以说总的损失还要加权平均后计算得到:

                                                            

在多输入(即x矩阵的一个维度不为1)的情况下,Li对dW(即导数)的每一个纬度都有贡献,所以也需要仿照上面的情况求和后再平均。注意不要遗漏了规则项R。


最后

以上就是笑点低汉堡为你收集整理的Softmax函数于导数及交叉熵系数导数的计算的全部内容,希望文章能够帮你解决Softmax函数于导数及交叉熵系数导数的计算所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(46)

评论列表共有 0 条评论

立即
投稿
返回
顶部