梯度、激活函数 及Loss的梯度

梯度

梯度是对函数求偏导,在组合,是向量有方向,导数是没有方向的

 常见函数的求导


激活函数

Sigmoid / Logistic

 将数据压缩在(0,1)之间

sigmoid函数梯度

 使用

import torch

a = torch.linspace(-100,100,10)     #生成10个线性间隔的数
b = torch.sigmoid(a)            

print(a)
print(b)
tensor([-100.0000,  -77.7778,  -55.5556,  -33.3333,  -11.1111,   11.1111,
          33.3333,   55.5556,   77.7778,  100.0000])

tensor([0.0000e+00, 1.6655e-34, 7.4564e-25, 3.3382e-15, 1.4945e-05, 9.9999e-01,
        1.0000e+00, 1.0000e+00, 1.0000e+00, 1.0000e+00])    #值从0到1

tanh

 tanh 函数梯度

 使用

a = torch.linspace(-1,1,10)
b = torch.tanh(a)

print(a)
print(b)
tensor([-1.0000, -0.7778, -0.5556, -0.3333, -0.1111,  0.1111,  0.3333,  0.5556,
         0.7778,  1.0000])

tensor([-0.7616, -0.6514, -0.5047, -0.3215, -0.1107,  0.1107,  0.3215,  0.5047,
         0.6514,  0.7616])    #对应值

relu函数

用的多

from torch.nn import functional as F    #另一种使用方法,三种激活函数都能用
a = torch.linspace(-1,1,10)
b = torch.relu(a)
c = F.relu(a)

print(a)
print(b)
print(c)
tensor([-1.0000, -0.7778, -0.5556, -0.3333, -0.1111,  0.1111,  0.3333,  0.5556,
         0.7778,  1.0000])    #

tensor([0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1111, 0.3333, 0.5556, 0.7778,
        1.0000])

tensor([0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.1111, 0.3333, 0.5556, 0.7778,
        1.0000])

loss的梯度

1. Mean Squared Error

2. Cross Entropy Loss           --> softmax

loss必须是dim=1,size=1的或者dim=0

MSE 均方误差

用一个tensor减去一个模型的输出值对应平方后求和


  mse_loss(input, target, size_average=None, reduce=None, reduction='mean') 

        input:输入tensor

        target:模型输出值,因为平方,顺序都可

  

from torch.nn import functional as F
x = torch.ones(1)
w = torch.full([1],2)
mse = F.mse_loss(torch.ones(1),x*w)    #(1-1*2)平方
print(mse)
tensor(1.)


torch.autograd.grad( outputs,inputs)

        outputs:loss

        inputs:对谁求梯度,w1,w2,w3...

from torch.nn import functional as F
x = torch.ones(1)
w = torch.full([1],2.)
mse = F.mse_loss(torch.ones(1),x*w)
w.requires_grad_()  #grad后面的_表示替换,对原来的W更新,使它需要求导信息
# w = torch.tensor([2.],requires_grad=True) #这种方法和上面结果的一样
mse = F.mse_loss(torch.ones(1),x*w)     # 更新动态图的建图  >-<
h = torch.autograd.grad(mse,[w])        #mse 对 w 的偏导
print(h)
(tensor([2.]),)

loss.backward()        

对最后的loss进行backward,会把整个图的梯度信息返回给需要的tensor,并且会把图的梯度信息清除掉

backward(retain_graph=True)会保留梯度信息,可以再次backward,若保留信息还要再加

mse = F.mse_loss(torch.ones(1),x*w)     # w更新了,还要更新图,反正就是都得更新
# h = torch.autograd.grad(mse,[w])        #mse 对 w 的偏导
mse.backward()  #不直接返回梯度信息
print(w.grad)
tensor([2.])    

softmax

 会将相对大的变得更大,小的集中在一起

 

a = torch.rand(3)
a.requires_grad_()
p = F.softmax(a,dim=0)      #得到变化后的三个值
m = torch.autograd.grad(p[1],[a],retain_graph=True)     #loss的size=1,
n = torch.autograd.grad(p[2],[a])     #该指定loss对a的三个值求偏导,p的[i]=a的[i]时,值为正
print(m)
print(n)
(tensor([-0.1017,  0.1688, -0.0671]),)    #1位置正

(tensor([-0.1476, -0.0671,  0.2147]),)    #2位置正
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

onlywishes

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

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

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

打赏作者

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

抵扣说明:

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

余额充值