概述
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函数于导数及交叉熵系数导数的计算所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复