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 函数就起到了十分重要的作用。
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函数的求导,用得最多的应该是链式法则,对于链式法则,举个例子如下:
设我们有函数 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)}} ∂x∂g(f(x))=∂f(x)∂g(f(x)) ∂ f ( x ) ∂ x \frac{\partial{ f(x)}}{\partial{x}} ∂x∂f(x), 这就是链式法则。
2)
对于交叉熵函数求导,首先,我们要求导的是交叉熵对神经元输出的梯度: ∂ L ∂ z i \frac{\partial{L}}{\partial{z_{i}}} ∂zi∂L
根据链式法则,我们有: ∂ L ∂ z i = ∂ L ∂ a j \frac{\partial{L}}{\partial{z_{i}}} = \frac{\partial{L}}{\partial{a_{j}}} ∂zi∂L=∂aj∂L ∂ a j ∂ z i \frac{\partial{a_{j}}}{\partial{z_{i}}} ∂zi∂aj
其中, 使用 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}}} ∂zi∂L=∂aj∂L ∂ a j ∂ z i \frac{\partial{a_{j}}}{\partial{z_{i}}} ∂zi∂aj ,可先求其前半部分 ∂ L ∂ a j \frac{\partial{L}}{\partial{a_{j}}} ∂aj∂L:
∂ 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}} ∂aj∂L=∂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}} ∂ai∂L=−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}} ∂aj∂L=−∑j̸=inajyj
(4)
公式 ∂ L ∂ z i = ∂ L ∂ a j \frac{\partial{L}}{\partial{z_{i}}} = \frac{\partial{L}}{\partial{a_{j}}} ∂zi∂L=∂aj∂L ∂ a j ∂ z i \frac{\partial{a_{j}}}{\partial{z_{i}}} ∂zi∂aj 的第二部分: ∂ a j ∂ z i \frac{\partial{a_{j}}}{\partial{z_{i}}} ∂zi∂aj , 需要分俩种情况讨论,即 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}) ∂zi∂ai=∂zi∂∑j=1nezjezi=(∑j=1nezj)2ezi∑j=1nezj−(ezi)2=∑j=1nezjezi−(∑j=1nezjezi)2=ai−ai2=ai(1−ai)
对于 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} ∂zi∂aj=∂zi∂∑j=1nezjezj=(∑j=1nezj)2−ezjezi=−∑j=1nezjezj∑j=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} ∂zi∂aj=ai(1−ai)+∑j̸=in−ajai
5)
则对于 ∂ L ∂ z i = ∂ L ∂ a j \frac{\partial{L}}{\partial{z_{i}}} = \frac{\partial{L}}{\partial{a_{j}}} ∂zi∂L=∂aj∂L ∂ a j ∂ z i \frac{\partial{a_{j}}}{\partial{z_{i}}} ∂zi∂aj,我们有:
$\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}}} =∂aj∂L∂zi∂aj
$= -\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(1−ai)+∑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+ai∑j=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} ∂zi∂L=−yi+ai