Softmax

Softmax函数概述
  • soft version of max
  • 大的越来越大,小的越来越小

    Softmax常与crossentropy(交叉熵)搭配连用

上图中假设有三个输出,分别是2.0,1.0和0.1,如果将数值转换成概率的话,我们希望概率最大的值作为预测的label。即我们希望将最大值2.0所对应的索引作为相应的label输出,那么如何作为probilities输出呢?

sigmoid函数可以将input压缩到[0,1]的范围,但是对于分类问题来说,我们不仅要求概率范围是[0,1],还要求所有的概率和为1,即 ∑ p i = 1 \sum p_i = 1 pi=1

为了解决此类问题,就有了Softmax函数,具体的函数表达式为
S ( y i ) = e y i ∑ j e y j S(y_i) = \frac{e^{y_i}}{\sum_j e^{y_j}} S(yi)=jeyjeyi

另外有一点要注意,Softmax具有差距放大功能,例如原来2.0和1.0是两倍关系,经过Softmax压缩后,变为0.7和0.2,增大到3.5倍关系

Softmax求导

对Softmax函数进行求导,首先写出其函数表达式
p i = e a i ∑ k = 1 N e a k p_i = \frac{e^{a_i}}{\sum_{k=1}^Ne^{a_k}} pi=k=1Neakeai

根据除法求导法则,若 f ( x ) = g ( x ) h ( x ) f(x)=\frac{g(x)}{h(x)} f(x)=h(x)g(x),则 f ′ ( x ) = g ′ ( x ) h ( x ) − h ′ ( x ) g ( x ) h 2 ( x ) f'(x) = \frac{g'(x)h(x)-h'(x)g(x)}{h^2(x)} f(x)=h2(x)g(x)h(x)h(x)g(x)

i = j i=j i=j

KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \frac{\nabl…

i ≠ j i\neq j i=j
KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \frac{\nabl…

对以上求导过程进行总结
∇ p i ∇ a j = { p i ( 1 − p j ) i = j − p j ∗ p i i ≠ j \frac{\nabla p_i}{\nabla{a_j}}=\begin{cases}p_i(1-p_j) & i = j \cr -p_j*p_i &i \neq j\end{cases} ajpi={pi(1pj)pjpii=ji=j
需要注意的一点是,由于 p j p_j pj p j p_j pj均在 [ 0 , 1 ] [0,1] [0,1]范围内,故 p i ( 1 − p j ) > 0 p_i(1-p_j)>0 pi(1pj)>0 − p i ∗ p j < 0 -p_i*p_j<0 pipj<0

下面使用代码举例

import torch
import torch.nn.functional as F
a = torch.rand(3, requires_grad=True) # dim=1, len=3 tensor
p = F.softmax(a, dim=0)# 需要指定进行sfotmax操作的dim维度
print('softmax:', p)
torch.autograd.grad(p[0],[a], retain_graph=True)
# 注意Loss必须是长度为1的值,由于p是dim=1,len=3的值,因此取必须取p中的一个

输出softmax: tensor([0.2732, 0.3780, 0.3489], grad_fn=<SoftmaxBackward>)
(tensor([ 0.1985, -0.1033, -0.0953]),)

这里进行了 ∇ p 0 ∇ a i \frac{\nabla p_0}{\nabla{a_i}} aip0的操作,由于 a a a [ 0 , 2 ] [0,2] [0,2]的tensor,所以返回了一个 1 ∗ 3 1*3 13的tensor。并且仔细观察会发现,当 i = 0 i=0 i=0时,梯度信息为正

参数retain_graph=True需要解释一下。由于PyTorch在求导一次之后,就会将这个图的梯度信息清除掉,如果第二次再求导,就会报错。但如果写上这个参数,就可以保留梯度信息,就能再求一次导

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数学家是我理想

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值