标签:frac tensor 求导 Softmax pj pi
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,即∑pi=1
为了解决此类问题,就有了Softmax函数,具体的函数表达式为
S(yi)=∑jeyjeyi
另外有一点要注意,Softmax具有差距放大功能,例如原来2.0和1.0是两倍关系,经过Softmax压缩后,变为0.7和0.2,增大到3.5倍关系
Softmax求导
对Softmax函数进行求导,首先写出其函数表达式
pi=∑k=1Neakeai
根据除法求导法则,若f(x)=h(x)g(x),则f′(x)=h2(x)g′(x)h(x)−h′(x)g(x)
当i=j时
KaTeX parse error: No such environment: align* at position 8: \begin{̲a̲l̲i̲g̲n̲*̲}̲ \frac{\nabl…
当i=j时
KaTeX parse error: No such environment: align* at position 8:
\begin{̲a̲l̲i̲g̲n̲*̲}̲
\frac{\nabl…
对以上求导过程进行总结
∇aj∇pi={pi(1−pj)−pj∗pii=ji=j
需要注意的一点是,由于pj和pj均在[0,1]范围内,故pi(1−pj)>0,−pi∗pj<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]),)
这里进行了∇ai∇p0的操作,由于a是[0,2]的tensor,所以返回了一个1∗3的tensor。并且仔细观察会发现,当i=0时,梯度信息为正
参数retain_graph=True
需要解释一下。由于PyTorch在求导一次之后,就会将这个图的梯度信息清除掉,如果第二次再求导,就会报错。但如果写上这个参数,就可以保留梯度信息,就能再求一次导
标签:frac,tensor,求导,Softmax,pj,pi 来源: https://blog.csdn.net/qq_37236745/article/details/103956020
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。