> For the complete documentation index, see [llms.txt](https://zhjunqin.gitbook.io/machine-learning/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://zhjunqin.gitbook.io/machine-learning/ji-qi-xue-xi/shen-jing-wang-luo/gai-jin-shen-jing-wang-luo-de-xue-xi-fang-fa/softmax.md).

# softmax

## Softmax

除了使用交叉熵来解决学习缓慢的问题外，还可以使用基于柔性最大值（softmax）神经元层。

柔性最大值的想法其实就是为神经网络定义一种新式的输出层。开始时和和S型层一样，首先计算带权输入

$$
z^L\_j=\displaystyle\sum\_{k}(w\_{jk}^L a\_k^{L-1}) + b\_j^L
$$

然后应用 softmax 函数在$$z^L\_j$$上，根据这个函数，第$$j$$个神经元的激活值就是

$$
a^L\_j = \frac{e^{z^L\_j}}{\displaystyle\sum\_{k}e^{z^L\_k}}
$$

其中分母的求和是在所有的输出神经元上进行的。而且所有输出的激活值加起来正好为1，同样保证输出激活值都是正数。而且柔性最大值层的输出可以被看做是一个概率分布。

下面计算$$a^L\_j$$对$$z\_i^L$$的导数

如果$$j=i$$：

$$
\frac{\partial a\_j^L}{\partial z\_i^L} = \frac{\partial }{\partial z\_i^L}(\frac{e^{z^L\_j}}{\displaystyle\sum\_{k}e^{z^L\_k}})
$$

$$
\=\frac{(e^{z^L\_j})'\cdot\displaystyle\sum\_{k}e^{z^L\_k} - e^{z^L\_j}\cdot e^{z^L\_j} }{(\displaystyle\sum\_{k}e^{z^L\_k})^2}
$$

$$
\=\frac{e^{z^L\_j}}{\displaystyle\sum\_{k}e^{z^L\_k}}-\frac{e^{z^L\_j}}{\displaystyle\sum\_{k}e^{z^L\_k}} \cdot \frac{e^{z^L\_j}}{\displaystyle\sum\_{k}e^{z^L\_k}}
$$

$$
\=a\_j (1-a\_j)
$$

如果$$j \neq i$$：

$$
\frac{\partial a\_j^L}{\partial z\_i^L}=\frac{\partial }{\partial z\_i^L}(\frac{e^{z^L\_j}}{\displaystyle\sum\_{k}e^{z^L\_k}})
$$

$$
\=\frac{0\cdot\displaystyle\sum\_{k}e^{z^L\_k} - e^{z^L\_j}\cdot e^{z^L\_i} }{(\displaystyle\sum\_{k}e^{z^L\_k})^2}
$$

$$
\=-\frac{e^{z^L\_j}}{\displaystyle\sum\_{k}e^{z^L\_k}} \cdot \frac{e^{z^L\_i}}{\displaystyle\sum\_{k}e^{z^L\_k}}
$$

$$
\= - a\_j a\_i
$$

## 对数似然损失函数

其对数似然损失函数为：

$$
C=-\displaystyle\sum\_{k}y\_k \mathrm{log}a\_k
$$

其中$$a\_k$$为第$$k$$个神经元的输出值，$$y\_k$$表示第$$k$$个神经元的真实值，取值为$$0$$或$$1$$。

这个代价的简单含义是：只有一个神经元对应了该样本的正确分类，若这个神经元的输出概率越高，则其产出的代价越小，反之则代价越高。

则计算损失函数对权重和偏置的偏导数：

$$
\frac{\partial C}{\partial b\_j^L} = \frac{\partial C }{\partial z\_j^L}\cdot \frac{\partial z\_j^L }{\partial b\_j^L}
$$

$$
\= \frac{\partial C }{\partial z\_j^L}\cdot \frac{\partial \displaystyle\sum\_{k}(w\_{jk}^L a\_k^{L-1}) + b\_j^L }{\partial b\_j^L} = \frac{\partial C }{\partial z\_j^L}
$$

$$
\= \frac{\partial}{\partial z\_j^L}( -\displaystyle\sum\_{k}y\_k \mathrm{log}a\_k^L )
$$

$$
\=-\displaystyle\sum\_{k}y\_k \cdot \frac{1 }{a\_k^L} \cdot \frac{\partial a\_k^L}{\partial z\_j^L}
$$

$$
\=-y\_j \cdot \frac{1 }{a\_j^L} \cdot \frac{\partial a\_j^L}{\partial z\_j^L}-\displaystyle\sum\_{k \neq j}y\_k \cdot \frac{1 }{a\_k^L} \cdot \frac{\partial a\_k^L}{\partial z\_j^L}
$$

$$
\=-y\_j \cdot \frac{1 }{a\_j^L} \cdot a\_j^L (1-a\_j^L)-\displaystyle\sum\_{k \neq j}y\_k \cdot \frac{1 }{a\_k^L} \cdot -a\_j^L a\_k^L
$$

$$
\=-y\_j + y\_j a\_j^L +\displaystyle\sum\_{k \neq j}y\_k \cdot  a\_j^L
$$

$$
\=a\_j^L-y\_j
$$

同样可得：

$$
\frac{\partial C}{\partial w\_{jk}}=a^{L-1}(a\_j^L-y\_j)
$$

因此可以确保不会遇到学习缓慢的问题。事实上把一个具有对数似然代价的柔性最大值输出层，看作与一个具有交叉熵代价函数的S型输出层非常相似。在很多应用场景中，这两种方式的效果都不错。

参考：<https://blog.csdn.net/niuniuyuh/article/details/61926561>
