梯度详解与优化实战

什么是梯度

对所有自变量求偏微分构成的向量,它是一个向量(有大小和函数值增长方向)

导数是一个标量
在这里插入图片描述

找最小值点坐标的案例

在这里插入图片描述

import torch

import numpy as np
import matplotlib.pyplot as plt
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)
# print(x)
y = np.arange(-6,6,0.1)

X,Y = np.meshgrid(x,y)
# print(X,"hhhhh\n",Y)

Z = himmelblau([X,Y])

fig = plt.figure("himmelbu")
ax = fig.gca(projection="3d")
ax.plot_surface(X,Y,Z)
ax.view_init(60,-30)

plt.show()

# 使得x包含x,y两个变量,最终要求最小值
x = torch.tensor([4,0],requires_grad=True,dtype=float)

# a.下面这句话相当于 x' = x - 0.001*△x  y'=...
optimizer = torch.optim.Adam([x],lr=1e-3)

for step in range(20000):
    pred = himmelblau(x)

    # 先将梯度清零  防止梯度累积
    optimizer.zero_grad()

    # 生成x y的梯度信息
    pred.backward()

    # 这句话相当于执行a  有了梯度信息后,代入a式求值
    optimizer.step()

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值