Softmax函数交叉熵及其求导

1. 简介

S o f t m a x 函数

S o f t m a x 函数在神经网络分类是十分常用的函数,如下所示,在神经元output layer中,可以输出一个 R 4 维度的向量,来进行分类,例如输出层为向量 O = [ 0.2 , 0.1 , 0.4 , 0.3 ] , 可根据向量中元素大小(元素之和为1)来判断该输入(可以是图片,也可以是文字)属于哪一类,而在这种分类的情况中, S o f t m a x 函数就起到了十分重要的作用。

这里写图片描述

S o f t m a x 函数的公式为: a i = e z i j = 1 n e z j

其中, a i 为第 i 个神经元经过 S o f t m a x 函数得到的值, z i 为第 i 个神经元的输出值,其计算公式为 z i = W i x + b ( W i W i j i )

代价函数交叉熵

为了计算损失函数,我们使用交叉熵代价函数,有 L o s s = i n y i l o g a i

其中 y i 代表第 a i 个输出的真实值。

2. Softmax函数交叉熵的求导

1)
对于Softmax函数的求导,用得最多的应该是链式法则,对于链式法则,举个例子如下:

设我们有函数 g ( f ( x ) ) , 则 g ( f ( x ) ) x = g ( f ( x ) ) f ( x ) f ( x ) x , 这就是链式法则。

2)
对于交叉熵函数求导,首先,我们要求导的是交叉熵对神经元输出的梯度: L z i

根据链式法则,我们有: L z i = L a j a j z i

其中, 使用 a j 是因为对 S o f t m a x 函数包含了所有神经网络输出的和,即 a i = e z i j = 1 n e z j ,所以,就算我们不是求交叉熵对 a j 的梯度,但是 a j 依旧包含了 a i 的元素。

总的来说就是,由于 S o f t m a x 函数的特殊性,对于 a j j 个神经元的输出,其中也包含了 a i 中的元素。

3)
对于求 L z i = L a j a j z i ,可先求其前半部分 L a j

L a j = ( j n y j l o g a j ) a j = j n y j a j

j = i 时, L a i = y i a i
j i 时, L a j = j i n y j a j

(4)

公式 L z i = L a j a j z i 的第二部分: a j z i , 需要分俩种情况讨论,即 j = i j i 俩种情况。

对于 j = i ,

a i z i = e z i j = 1 n e z j z i = e z i j = 1 n e z j ( e z i ) 2 ( j = 1 n e z j ) 2 = e z i j = 1 n e z j ( e z i j = 1 n e z j ) 2 = a i a i 2 = a i ( 1 a i )

对于 j i ,

a j z i = e z j j = 1 n e z j z i = e z j e z i ( j = 1 n e z j ) 2 = e z j j = 1 n e z j e z i j = 1 n e z j = a j a i

因此,对于第二部分的求导,我们有 a j z i = a i ( 1 a i ) + j i n a j a i

5)
则对于 L z i = L a j a j z i ,我们有:

L z i

= L a j a j z i

= y i a i ( a i ( 1 a i ) ) + j i n y j a j a j a i

= y i ( 1 a i ) + j i n y j a i

= y i + a i y i + j i n y j a i

= y i + a i j = 1 n y j

由于对真实值,我们知道 y j 为第 i 个神经元期望输出的值,一般而言, j = 1 n y j = 1 , 故对于这种通过 S o f t m a x 函数的输出来确定其分类的,只有一个类别会是1,因此有代价函数对第 i 个神经元的输出 z i 的梯度为:

L z i = y i + a i

猜你喜欢

转载自blog.csdn.net/hansry/article/details/79943362
今日推荐