【机器学习】softmax函数

本文深入解析Softmax函数及其在神经网络中的应用,包括其定义、与Cross-Entropy损失函数的结合方式,以及求导过程。同时,探讨了使用Cross-Entropy相较于平方误差的优势,尤其是在解决梯度消失问题上的表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

2017年05月25日 21:13:16阅读数:8672

转载至 https://blog.youkuaiyun.com/haolexiao/article/details/72757796

原本以为softmax函数求导没啥难度的,结果自己写CNN的时候,梯度算的一直不对,查了半天才发现是因为softmax求导没求对。索性就开一篇Blog把softmax相关的都给记录一下。

softmax的定义

softmax函数如下: 

aLj=ezLj∑kezLkajL=ezjL∑kezkL


其可以看成sigmoid函数在多元分布中的一个推广 
至于softmax这个公式具体是怎么来的呢? 
可以参照广义线性模型(GLM)里,通过多项分布化成为指数分布簇的形式,就得到了softmax 
相当于softmax是对于多项分布的一个刻画。 
所以softmax函数所表示的可以看成为对分类结果的概率分布。

 

softmax和cross-entropy损失函数

正如上面所说,softmax可以看成对概率分布的一个刻画,所以既然有概率分布,就可以用cross-entropy来定义损失函数 
之前的一篇Blog里讲过cross-entropy,从两个角度来考虑,一个是相当于用预测结果的分布区编码正确的结果分布,得到的编码长度,另一个角度可以看成,度量两个分布的KL距离,将其展开去掉常数项,也能得到cross-entropy 
所以损失函数可以度量成: 

L=−∑jyjlnaLjL=−∑jyjln⁡ajL

 

softmax的求导

softmax本身的求导如下: 
当j≠ij≠i时,我们只用对分母求偏导就好 

∂aLj∂zLi=−ezLj(∑kezLk)2⋅ezLi=−aLi⋅aLj∂ajL∂ziL=−ezjL(∑kezkL)2⋅eziL=−aiL⋅ajL


当j=ij=i时: 

∂aLj∂zLj=ezLj⋅(∑kezLk)−(ezLj)2(∑kezLk)2=aLj⋅(1−aLj)∂ajL∂zjL=ezjL⋅(∑kezkL)−(ezjL)2(∑kezkL)2=ajL⋅(1−ajL)

 

我之前之所以算错了softmax的导数,就是因为我以为j≠ij≠i时分子不含ii,所以导数就为0了呢,实际上,是分母中都是含有的。 
当softmax与cross-entropy结合的时候,可以求得输出层的误差为: 

∂E∂zLj=∑k∂E∂aLk⋅∂aLk∂zLj=−yj(1−aLj)+∑k≠jykaLk⋅(aLk⋅aLj)∂E∂zjL=∑k∂E∂akL⋅∂akL∂zjL=−yj(1−ajL)+∑k≠jykakL⋅(akL⋅ajL)

 

=aLj(∑kyk)−yj=aLj−yj=ajL(∑kyk)−yj=ajL−yj

 

所以得到了最后一层的误差值: 

δLj=aLj−yjδjL=ajL−yj

 

softmax的好处

softmax函数的好处经常和cross-entropy的好处放在一块来说。 
用cross-entropy相较于平方误差 square loss function的好处,是能够减少训练缓慢的问题【也可以说是梯度消失的问题】 
因为平方损失函数求导得到的误差结果为【此处假设输出层每个结果用单一的sigmoid函数来表示】: 
δLj=(aLj−yj)σ′(zLj)=(aLj−yj)aLj(1−aLj)δjL=(ajL−yj)σ′(zjL)=(ajL−yj)ajL(1−ajL) 
因为其需要乘以一个sigmoid的导数,因为sigmoid导数会有梯度消失的问题,所以当结果非常好或者非常差的时候,其训练速度都会非常的缓慢【也就是说的饱和的情况】。 
画出图像的话为下图: 
这里写图片描述
即在一开始,随机化初始权重之后,当时分类器肯定结果很差,但是此时导数非常的小,训练起来非常的缓慢。 
而符合直觉的想法是,当结果越差的时候,我们希望梯度也能够越大才可以。而cross-entropy函数能够满足这个性质。 
另外在LR回归之中,如果采用平方损失函数,则损失函数是非凸的,而采用cross-entropy则结果是凸的。

另外一个softmax的好处是,其中一个结果发生了变化,整个输出的所有结果都会发生变化,对变化更加敏感

### 软max函数解释 软Max函数是一种常用于机器学习尤其是多分类问题中的激活函数。其主要作用在于将前一层神经元的输出转换成一个概率分布向量,使得这些值加起来等于1,并且每一个分量都表示对应类别的相对可能性大小[^1]。 对于输入向量 \( z \),经过软Max变换后的输出为: \[ p_i = \frac{e^{z_i}}{\sum_j e^{z_j}} \] 其中\(p_i\)代表第i个类别的预测概率。 这种特性让软Max非常适合用来处理需要从多个离散选项中做出唯一选择的情况,在诸如图像识别、自然语言处理等领域有着广泛应用[^3]。 ### 使用场景 在实际应用当中,软Max不仅限于传统意义上的监督式学习任务;在强化学习领域同样扮演着重要角色。通过调整参数来影响动作的选择倾向——既可以偏向那些已知能带来较大回报的行为(即所谓的“利用”),也可以鼓励尝试未曾经历过的其他可能行为路径(也就是常说的“探索”)。这有助于找到最优策略并提高整体性能表现。 另外值得注意的是,尽管软Max能够很好地完成许多工作,但在特定条件下可能存在不足之处。比如当面对高度不平衡的数据集或是希望得到更加稀疏化的输出时,则可能会考虑采用像Sparsemax这样的变体方案作为替代[^2]。 ### Python代码示例 下面给出一段简单的Python代码片段展示如何使用`numpy`库实现基本版的软Max功能: ```python import numpy as np def softmax(x): """Compute softmax values for each sets of scores in x.""" exp_x = np.exp(x - np.max(x)) # 防止数值溢出 return exp_x / exp_x.sum(axis=0) scores = [1.0, 2.0, 3.0] print(softmax(scores)) ``` 这段程序定义了一个名为`softmax()` 的函数接受列表形式的得分数组作为参数,并返回相应位置上各元素经由软Max运算后的新集合。这里还加入了减去最大值得操作以确保计算过程稳定可靠。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值