Softmax激活函数函数:

Softmax激活函数用于多分类过程中,它将多个神经元的输出,映射到(0,1)区间内,可以看成概率来理解,从而来进行多分类!

某个神经元的输出的值i ,则经过SoftMax函数的输出为Si,公式为:

多分类任务用什么激活函数 多分类问题激活函数_损失函数

示意图如下:

多分类任务用什么激活函数 多分类问题激活函数_神经网络_02

 

SoftMax的损失函数,以及下降方法:

要使用梯度下降,肯定需要一个损失函数,这里我们使用交叉熵作为我们的损失函数。也就是最小化训练数据与模型数据分布的KL散度 (等价于交叉熵)。

 

交叉熵的公式:

多分类任务用什么激活函数 多分类问题激活函数_机器学习_03

这里xi表示

所以可以建立损失函数:

多分类任务用什么激活函数 多分类问题激活函数_深度学习_04

其中x表示事件类型,共有i类,

多分类任务用什么激活函数 多分类问题激活函数_深度学习_05

表示xi多分类任务用什么激活函数 多分类问题激活函数_多分类任务用什么激活函数_06出现的次数,  

多分类任务用什么激活函数 多分类问题激活函数_深度学习_07

表示多分类任务用什么激活函数 多分类问题激活函数_损失函数_08事件出现的概率。

所以有:

多分类任务用什么激活函数 多分类问题激活函数_机器学习_09

多分类任务用什么激活函数 多分类问题激活函数_深度学习_10表示多分类任务用什么激活函数 多分类问题激活函数_多分类任务用什么激活函数_06事件类型的概率,就是softmax函数的输出值。

下面考虑一次实验的情况,因为一次实验只有多分类任务用什么激活函数 多分类问题激活函数_多分类任务用什么激活函数_06事件发生一次,

多分类任务用什么激活函数 多分类问题激活函数_深度学习_13

在这种情况下就是1。

设y为真实分类i时为1,其他情况为0,则对于一次实验,损失函数有:

多分类任务用什么激活函数 多分类问题激活函数_机器学习_14

ai是代表i类发生的概率,由SoftMax函数表示。

 


提一句最大似然与交叉熵的关系:更传统的机器学习说法是似然函数的最大化(当然要取log)就是交叉熵。

/

 

让我们接着说,在现实中我们认为除了预测目标的标记为y=1,其他的分类应该都是y=0。为了形式化说明,我这里认为训练数据的真实输出为第j个为1,其它均为0,那损失函数就变成了:

多分类任务用什么激活函数 多分类问题激活函数_机器学习_15

并且此时yj=1,所以有了非常简单的损失函数:

多分类任务用什么激活函数 多分类问题激活函数_深度学习_16

 

然后对某节点进行求偏导,以经典的神经网络形式来说明(也就是具有输入层、

隐藏层、输出层三个层级的神经网络,其中输入层到隐藏层是线性转换,隐藏层到输出层为softmax激活函数)拿一个语言分类器神经网络举例子:

多分类任务用什么激活函数 多分类问题激活函数_神经网络_17

设ai为当前经过softmax处理的输出层节点的输出,多分类任务用什么激活函数 多分类问题激活函数_神经网络_18为输出层的某节点的输出(没经过softmax处理之前的输出),

多分类任务用什么激活函数 多分类问题激活函数_机器学习_19

是隐藏层的k节点到隐藏层的权值:

多分类任务用什么激活函数 多分类问题激活函数_多分类任务用什么激活函数_20

由于

多分类任务用什么激活函数 多分类问题激活函数_深度学习_21

多分类任务用什么激活函数 多分类问题激活函数_损失函数_22都已知,所以重点是求解多分类任务用什么激活函数 多分类问题激活函数_损失函数_23 :

这个式子有两种情况,第一种就是当前分类节点(所谓当前分类节点就是当前求得的经过softmax函数输出最大的节点)求导,一种是对其他分类节点求导:

(i)对当前分类节点求导, j=i时即a的下标等于z的下标的情况下:

多分类任务用什么激活函数 多分类问题激活函数_神经网络_24

 

多分类任务用什么激活函数 多分类问题激活函数_深度学习_25

:

多分类任务用什么激活函数 多分类问题激活函数_神经网络_26

多分类任务用什么激活函数 多分类问题激活函数_损失函数_27

多分类任务用什么激活函数 多分类问题激活函数_损失函数_28

 

带入原式,对输出层节点求偏导:

多分类任务用什么激活函数 多分类问题激活函数_损失函数_29

可以看到,输出层经过softmax的节点对输出层节点求偏导,当最大的softmax输出对应的分类与输出层分类一致时,求对输出层节点的偏导只要将对应的最大的softmax输出层节点输出减1即可。

进一步可以接着求,隐藏层节点到输出层节点的权值偏导:

多分类任务用什么激活函数 多分类问题激活函数_神经网络_30

反向传播:

多分类任务用什么激活函数 多分类问题激活函数_多分类任务用什么激活函数_31

 

(ii)对其他分类节点求导, i≠j时即a的下标不等于z的下标时:

多分类任务用什么激活函数 多分类问题激活函数_深度学习_32

 

多分类任务用什么激活函数 多分类问题激活函数_机器学习_33

:

多分类任务用什么激活函数 多分类问题激活函数_深度学习_34

多分类任务用什么激活函数 多分类问题激活函数_多分类任务用什么激活函数_35

多分类任务用什么激活函数 多分类问题激活函数_机器学习_36

 

带入原式,对输出层节点求偏导:

多分类任务用什么激活函数 多分类问题激活函数_机器学习_37

可以看到,输出层经过Softmax的节点对输出层节点求偏导,当最大的Softmax输出对应的分类与输出层分类不一致时,求对输出层节点的偏导只要保持不变即可。

进一步可以接着求,隐藏层节点到输出层节点的权值偏导:

多分类任务用什么激活函数 多分类问题激活函数_深度学习_38

反向传播:

多分类任务用什么激活函数 多分类问题激活函数_多分类任务用什么激活函数_39

这样所有的节点就都可以反向传播到了。

分割线/

举个小例子:

举个例子,通过若干层的计算,最后得到的某个训练样本的输出向量是

多分类任务用什么激活函数 多分类问题激活函数_神经网络_40

,那么经过softmax激活函数作用后的输出分别就是:

多分类任务用什么激活函数 多分类问题激活函数_深度学习_41

如果真实情况下,第二种分类是正确的,那么softmax激活函数作用后的输出对输出向量的偏导数为

多分类任务用什么激活函数 多分类问题激活函数_深度学习_42

然后就可以反向传播了。

分割线/

 

但是这还有完,因为刚刚我们解决的是一次采样的。那么多次采样形成一批的话会有什么区别呢?

我们已经知道,一次实验的损失函数是:

多分类任务用什么激活函数 多分类问题激活函数_深度学习_43

第一种角度:

从交叉熵角度来说:

根据前面交叉熵公式:

多分类任务用什么激活函数 多分类问题激活函数_深度学习_44

多分类任务用什么激活函数 多分类问题激活函数_机器学习_45发生的次数为

多分类任务用什么激活函数 多分类问题激活函数_神经网络_46

,则有:

多分类任务用什么激活函数 多分类问题激活函数_机器学习_47

所以有:

多分类任务用什么激活函数 多分类问题激活函数_机器学习_48

相当于:

多分类任务用什么激活函数 多分类问题激活函数_深度学习_49

这样属于i类的实验会叠加使得系数变为

多分类任务用什么激活函数 多分类问题激活函数_多分类任务用什么激活函数_50

,使得上面两个式子等价了,这样就可以处理批量的样本了。

 

第二种角度:

从极大似然函数来说:

一次实验中i事件发生的概率

多分类任务用什么激活函数 多分类问题激活函数_多分类任务用什么激活函数_51

为:

多分类任务用什么激活函数 多分类问题激活函数_深度学习_52

一批样本中最大似然函数为:

多分类任务用什么激活函数 多分类问题激活函数_深度学习_53

取相反数,这样最小值就是最大值。

多分类任务用什么激活函数 多分类问题激活函数_机器学习_54

两边取对数

多分类任务用什么激活函数 多分类问题激活函数_机器学习_55

由于上式子遍历类型i,将每种事件发生的对数概率按照发生次数

多分类任务用什么激活函数 多分类问题激活函数_机器学习_56

叠加,等同于遍历整批样本N,将每个样本发生的各事件的概率进行叠加:

多分类任务用什么激活函数 多分类问题激活函数_多分类任务用什么激活函数_57

然后多分类任务用什么激活函数 多分类问题激活函数_神经网络_58是个常数,所以有:

多分类任务用什么激活函数 多分类问题激活函数_损失函数_59

 

这个式子的问题是与N有关,随着N的增加,式子有变小的趋势。所以要进行归一化,除以这批样本的总数:

多分类任务用什么激活函数 多分类问题激活函数_机器学习_60

这样就和上面的式子一致了。

 

 

参考:

https://www.zhihu.com/question/23765351/answer/240869755

Softmax 函数的特点和作用是什么?


softmax与多分类

https://www.zhihu.com/question/65288314/answer/849294209