梯度
梯度是对函数求偏导,在组合,是向量有方向,导数是没有方向的
常见函数的求导
激活函数
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位置正