Softmax函数交叉熵及其求导

  1. 简介

S o f t m a x Softmax Softmax 函数

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

Softmax函数交叉熵及其求导_第1张图片

S o f t m a x Softmax Softmax 函数的公式为: a i = e z i ∑ j = 1 n e z j a_{i}=\frac{e^{z_{i}}}{\sum^{n}_{j=1}e^{z_{j}}} ai=j=1nezjezi

其中, a i a_{i} ai 为第 i i i 个神经元经过 S o f t m a x Softmax Softmax 函数得到的值, z i z_{i} zi 为第 i i i 个神经元的输出值,其计算公式为 $ z_{i}=W_{i}*x+ b $ $(W_{i}为权重矩阵W_{ij} 的第i行)。 $

代价函数交叉熵

为了计算损失函数,我们使用交叉熵代价函数,有 L o s s = − ∑ i n y i l o g a i Loss = -\sum^{n}_{i}y_{i}loga_{i} Loss=inyilogai

其中 y i y_{i} yi 代表第 a i a_{i} ai 个输出的真实值。

  1. Softmax函数交叉熵的求导

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

设我们有函数 g ( f ( x ) ) g(f(x)) g(f(x)), 则 ∂ g ( f ( x ) ) ∂ x = ∂ g ( f ( x ) ) ∂ f ( x ) \frac{\partial{ g(f(x))}}{\partial{x}} = \frac{\partial{ g(f(x))}}{\partial{f(x)}} xg(f(x))=f(x)g(f(x)) ∂ f ( x ) ∂ x \frac{\partial{ f(x)}}{\partial{x}} xf(x), 这就是链式法则。

2)
对于交叉熵函数求导,首先,我们要求导的是交叉熵对神经元输出的梯度: ∂ L ∂ z i \frac{\partial{L}}{\partial{z_{i}}} ziL

根据链式法则,我们有: ∂ L ∂ z i = ∂ L ∂ a j \frac{\partial{L}}{\partial{z_{i}}} = \frac{\partial{L}}{\partial{a_{j}}} ziL=ajL ∂ a j ∂ z i \frac{\partial{a_{j}}}{\partial{z_{i}}} ziaj

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

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

3)
对于求 ∂ L ∂ z i = ∂ L ∂ a j \frac{\partial{L}}{\partial{z_{i}}} = \frac{\partial{L}}{\partial{a_{j}}} ziL=ajL ∂ a j ∂ z i \frac{\partial{a_{j}}}{\partial{z_{i}}} ziaj ,可先求其前半部分 ∂ L ∂ a j \frac{\partial{L}}{\partial{a_{j}}} ajL

∂ L ∂ a j = ∂ ( − ∑ j n y j l o g a j ) ∂ a j = − ∑ j n y j a j \frac{\partial{L}}{\partial{a_{j}}} = \frac{\partial{ (-\sum^{n}_{j}y_{j}loga_{j}) }}{\partial{a_{j}}} = -\sum^{n}_{j}\frac{y_{j}}{a_{j}} ajL=aj(jnyjlogaj)=jnajyj

j = i j=i j=i 时, ∂ L ∂ a i = − y i a i \frac{\partial{L}}{\partial{a_{i}}} = -\frac{y_{i}}{a_{i}} aiL=aiyi
j ≠ i j \neq i j̸=i时, ∂ L ∂ a j = − ∑ j ≠ i n y j a j \frac{\partial{L}}{\partial{a_{j}}} = -\sum_{j\neq i}^{n}\frac{y_{j}}{a_{j}} ajL=j̸=inajyj

(4)

公式 ∂ L ∂ z i = ∂ L ∂ a j \frac{\partial{L}}{\partial{z_{i}}} = \frac{\partial{L}}{\partial{a_{j}}} ziL=ajL ∂ a j ∂ z i \frac{\partial{a_{j}}}{\partial{z_{i}}} ziaj 的第二部分: ∂ a j ∂ z i \frac{\partial{a_{j}}}{\partial{z_{i}}} ziaj , 需要分俩种情况讨论,即 j = i j=i j=i j ≠ i j \neq i j̸=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 ) \frac{\partial{a_{i}}}{\partial{z_{i}}} = \frac{\partial{ \frac{e^{z_{i}}}{\sum^{n}_{j=1}e^{z_{j}}} }}{\partial{z_{i}}} = \frac{e^{z_{i}}\sum^{n}_{j=1}e^{z_{j}} - (e^{z_{i}})^{2}}{(\sum^{n}_{j=1}e^{z_{j}})^{2}}=\frac{e^{z_{i}}}{\sum^{n}_{j=1}e^{z_{j}}}-(\frac{e^{z_{i}}}{\sum^{n}_{j=1}e^{z_{j}}})^{2}=a_{i}-a_{i}^{2}=a_{i}(1-a_{i}) ziai=zij=1nezjezi=(j=1nezj)2ezij=1nezj(ezi)2=j=1nezjezi(j=1nezjezi)2=aiai2=ai(1ai)

对于 j ≠ i , j \neq 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 \frac{\partial{a_{j}}}{\partial{z_{i}}} = \frac{\partial{ \frac{e^{z_{j}}}{\sum^{n}_{j=1}e^{z_{j}}} }}{\partial{z_{i}}} = \frac{-e^{z_{j}}e^{z_{i}}}{(\sum^{n}_{j=1}e^{z_{j}})^{2}}=-\frac{e^{z_{j}}}{\sum^{n}_{j=1}e^{z_{j}}}\frac{e^{z_{i}}}{\sum^{n}_{j=1}e^{z_{j}}}=-a_{j}a_{i} ziaj=zij=1nezjezj=(j=1nezj)2ezjezi=j=1nezjezjj=1nezjezi=ajai

因此,对于第二部分的求导,我们有 ∂ a j ∂ z i = a i ( 1 − a i ) + ∑ j ≠ i n − a j a i \frac{\partial{a_{j}}}{\partial{z_{i}}}=a_{i}(1-a_{i})+\sum_{j\neq i}^{n}-a_{j}a_{i} ziaj=ai(1ai)+j̸=inajai

5)
则对于 ∂ L ∂ z i = ∂ L ∂ a j \frac{\partial{L}}{\partial{z_{i}}} = \frac{\partial{L}}{\partial{a_{j}}} ziL=ajL ∂ a j ∂ z i \frac{\partial{a_{j}}}{\partial{z_{i}}} ziaj,我们有:

$\frac{\partial{L}}{\partial{z_{i}}} $

= ∂ L ∂ a j ∂ a j ∂ z i = \frac{\partial{L}}{\partial{a_{j}}}\frac{\partial{a_{j}}}{\partial{z_{i}}} =ajLziaj

$= -\frac{y_{i}}{a_{i}}(a_{i}(1-a_{i})) + \sum^{n}{j \neq i}\frac{y{j}}{a_{j}}a_{j}a_{i} $

= − y i ( 1 − a i ) + ∑ j ≠ i n y j a i = -y_{i}(1-a_{i}) + \sum^{n}_{j \neq i}y_{j}a_{i} =yi(1ai)+j̸=inyjai

$ = -y_{i}+a_{i}y_{i}+\sum^{n}{j \neq i}y{j}a_{i}$

= − y i + a i ∑ j = 1 n y j =-y_{i}+a_{i}\sum_{j=1}^{n} y_{j} =yi+aij=1nyj

由于对真实值,我们知道 y j y_{j} yj 为第 i i i个神经元期望输出的值,一般而言, ∑ j = 1 n y j = 1 \sum_{j=1}^{n} y_{j}=1 j=1nyj=1, 故对于这种通过 S o f t m a x Softmax Softmax函数的输出来确定其分类的,只有一个类别会是1,因此有代价函数对第 i i i个神经元的输出 z i z_{i} zi 的梯度为:
∂ L ∂ z i = − y i + a i \frac{\partial{L}}{\partial{z_{i}}} = -y_{i} + a_{i} ziL=yi+ai

你可能感兴趣的:(Deep,Learning,深度学习,DeepLearning.ai)