啥是softmax,他到底怎么梯度下降的(老子终于搞明白了)

778 阅读2分钟

softmax可以用于将多个输出值转换成多个概率值,使每个值都符合概率的定义,范围在[0, 1],且概率相加和为1,非常适合多分类问题。Softmax往往用在最后对输出值y的处理上。它会将原来大的值相对缩放得更大,而原来很小的值压缩到比较密集的空间,这从指数函数图像就可以理解。(大家都知道的屁话)

给老子上代码

import torch
from torch.nn import functional as F
 
y = torch.rand(3, requires_grad=True)
print(y)
# 指定在哪一个维度上进行Softmax操作,比如有两个维度:[batch, feature],
# 第一个维度为batch,第二个维度为feature,feature为一个三个值的向量[1, 2, 3],
# 则我们指定在第二个维度上进行softmax操作,则[1, 2, 3] => [p1, p2, p3]的概率值
# 因为y只有一个维度,所以下面指定的是在dim=0,第一个维度上进行的操作
p = F.softmax(y, dim=0)
print(p)

y:生成矩阵 p:对y做不可描述的事(softmax)

上吧亚古兽:

tensor([0.7440, 0.1704, 0.7994], requires_grad=True)
tensor([0.3816, 0.2150, 0.4034], grad_fn=<SoftmaxBackward>)

注意,因为Softmax涉及其它结点的值的信息,每个结点yk 经Softmax得到结点pk,计算导数时也要计算对其它结点的偏导(i不等于j的情况)

注意:i=j梯度是正值,否则为负值
额?不明白,我脱光给你看

p_i=\frac{e^{y_i}}{e^{y_1}+e^{y_2}+e^{y_3}}(i=1,2,3)

现在明白了吗? p有 p_1,p_2,p_3,y 有y_1,y_2,y_3,排列组合,都能求导。

既然都脱光了,那各位嫔妃你们就一起上吧


# 注意计算导数时,loss只能是一个值的,不能是有多个分量的
# 但是可以对多个参数求偏导
# 因此,只能分别对p[0]、p[1]、p[2]对应的loss求导
# 计算p1对y0,y1,y2的导数,y0、y2是i!=j的情况求导,得到的是负值
print(torch.autograd.grad(p[1], [y], retain_graph=True))
# 计算p2对y0,y1,y2的导数
print(torch.autograd.grad(p[2], [y]))

给我生儿子(输出结果):

(tensor([-0.0821,  0.1688, -0.0867]),)
(tensor([-0.1539, -0.0867,  0.2407]),)

blog.csdn.net/weicao1990/…