Pytorch -> 梯度

梯度

 每个方向梯度降低,某方向可能会发生震荡

  • 初始点不同,会影响找到全局最优解和局部最优解
  • 学习率影响精度和速度
  • 逃离局部极小值——给一个动量 

 

激活函数

torch.sigmoid(torch.linspace(-100,100,10))

from torch.nn import functional as F
F.sigmoid(...)

tanh/relu

LOSS的梯度

 回归和分类LOSS怎么选?

torch.norm(y-pred,2).pow(2)

mse = F.mse_loss(pred,x)    # (pred-x)^2

w.require_grad_()    # 需要更新梯度信息
torch.autograd.grad(mse,[w])    # 自动计算


x = torch.ones(1)
w = torch.full([1],2)
mse = F.mse_loss(torch.ones(1),x*w)
mse.backward()
w.grad
>>> tensor(2.)

p.backward(remain_graph=True)才能保留图,该报错是因为图已被清理 

grad中的p[0]/p[1]/p[2]表示一次只能对一个变量求导,前一个是因变量,后一个是自变量

 pytorch 中autograd.grad()函数的用法说明 | w3c笔记

单层感知机

x = torch.randn(1,10)
w = torch.randn(1,10,requires_grad=True)

o = torch.sigmoid(x@w.t())    # w.t() -> w的转置
loss = F.mse_loss(torch.ones(1,1),o)    # 1个数值
# w = w-lr*▽σ
loss.backward()    # 相当于loss对10个w求了偏导,即([[x1w1+...+x10w10]]-[[1]])^2求导
w.grad.shape
>>> 1*10

Pytorch的自动求导机制与使用方法(一) - 知乎

多层感知机

 注意:x2与x1无关,即第二行和第一行无关

x = torch.randn(1,10)
w = torch.randn(2,10,requires_grad=True)

o = torch.sigmoid(x@w.t())    # w.t() -> w的转置
loss = F.mse_loss(torch.ones(1,2),o)    # 1个数值

loss.backward()    # 相当于loss对10个w求了偏导,即([[x1w1+...+x10w10]]-[[1]])^2求导
w.grad.shape
>>> 2*10

链式法则 

x = torch.tensor(1.)
w1 = torch.tensor(2., requires_grad=True)
b1 = torch.tensor(1.)
w2 = torch.tensor(2., requires_grad=True)
b2 = torch.tensor(1.)

y1 = w1*x+b1
y2 = w2*y1+b2

dy1_dw1 = torch.autograd.grad(y1,[w1],retain_graph=True)[0]
>>> tensor(1.)    # 不加[0]为(tensor(1.),),★都需要加0
dy2_dy1 = torch.autograd.grad(y2,[y1],retain_graph=True)[0]

dy2_dw1 = torch.autograd.grad(y2,[w1],retain_graph=True)[0]

dy2_dw1 == dy2_dy1*dy1_dw1
>>> True

推导过程:MLP多层感知机梯度推导与反向传播_NotFound1911的博客-CSDN博客

即可求得前三层的偏导数

优化实例

import  numpy as np
from    mpl_toolkits.mplot3d import Axes3D
from    matplotlib import pyplot as plt
import  torch

def himmelblau(x):
    return (x[0] ** 2 + x[1] - 11) ** 2 + (x[0] + x[1] ** 2 - 7) ** 2

x = np.arange(-6, 6, 0.1)
y = np.arange(-6, 6, 0.1)
print('x,y range:', x.shape, y.shape)
X, Y = np.meshgrid(x, y)
print('X,Y maps:', X.shape, Y.shape)
Z = himmelblau([X, Y])

fig = plt.figure('himmelblau')
ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, Z)
ax.view_init(60, -30)
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()


# 初始值
x = torch.tensor([-4., 0.], requires_grad=True)
optimizer = torch.optim.Adam([x], lr=1e-3)
for step in range(20000):
    # 一般对损失函数进行梯度计算,这里是原始函数
    pred = himmelblau(x)

    optimizer.zero_grad()
    pred.backward()
    optimizer.step()

    if step % 2000 == 0:
        print ('step {}: x = {}, f(x) = {}'
               .format(step, x.tolist(), pred.item()))

传统的梯度和累加梯度计算:optimizer.zero_grad() - 云+社区 - 腾讯云

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyTorch是一个开源的机器学习框架,它提供了一个灵活且高效的工具集,可用于构建各种类型的深度学习模型。PyTorch 使用动态计算图的方式来定义和计算网络模型,这使得模型的构建更加灵活,并提供了更好的调试和可视化功能。PyTorch具有丰富的库和接口,可以方便地进行数据加载、模型定义、训练和推断。 PyTorch-Memlab是一个用于分析PyTorch模型内存占用的工具。深度学习模型通常需要大量的内存来存储网络结构、参数和计算中间结果。PyTorch-Memlab通过记录和分析模型的内存使用情况,帮助用户优化模型的内存消耗,提高模型的运行效率。它可以用于查看各个模块和操作的内存使用情况,帮助用户识别内存泄露和优化模型的内存占用。 使用PyTorch,我们可以使用简单而直观的方式来构建深度学习模型,它提供了丰富的API和函数,用于定义和训练模型、优化模型参数、评估模型性能等。PyTorch还支持自动求导,使得梯度计算更加简单和高效。它还提供了用于并行化和分布式训练的工具,使得处理大规模数据和模型变得更加方便和高效。 PyTorch-Memlab可以帮助我们深入了解模型的内存占用情况,它可以告诉我们哪些模块或操作占用了大量的内存,帮助我们找到内存消耗较大的瓶颈和优化空间。通过使用PyTorch-Memlab,我们可以减少模型的内存占用,并提高模型的性能和可扩展性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值