FastAi PDLC-3:实践随机梯度下降算法

导入依赖包

from ipywidgets import interact
from fastai.basics import *

plt.rc('figure', dpi=90)

定义函数图像输出函数

def plot_function(f, title=None, min=-2.1, max=2.1, color='b', ylim=None):
    x = torch.linspace(min,max, 100)[:,None]
    if ylim: plt.ylim(ylim)
    plt.plot(x, f(x), color)
    if title is not None: plt.title(title)

定义一个二次函数,并添加噪声(以模拟实际情况)

def f(x): return 3*x**2 + 2*x + 1
def quad(a, b, c, x): return a*x**2 + b*x + c
def mk_quad(a,b,c): return partial(quad, a,b,c)

def noise(x, scale): return np.random.normal(scale=scale, size=x.shape)
def add_noise(x, mult, add): return x * (1+noise(x,mult)) + noise(x,add)

定义“绝对平均误差”函数1(以观察模型与数据点的拟合程度)

def mae(preds, acts): return (torch.abs(preds-acts)).mean()

模拟实际问题(数据点图)

np.random.seed(42)

x = torch.linspace(-2, 2, steps=20)[:,None]
y = add_noise(f(x), 0.15, 1.5)

plt.scatter(x, y)
plt.show()

在这里插入图片描述

手动模拟梯度下降(观察绝对平均误差"mae"调节参数)

@interact(a=1.1, b=1.1, c=1.1)
def plot_quad(a, b, c):
    f = mk_quad(a,b,c)
    plt.scatter(x,y)
    loss = mae(f(x), y)
    plot_function(f, ylim=(-3,12), title=f"mae: {loss:.2f}")

在这里插入图片描述

定义“绝对平均误差”函数2(以自动化梯度下降)

def quad_mae(params):
    f = mk_quad(*params)
    return mae(f(x), y)

构建自动化梯度下降

abc = torch.tensor([1.1,1.1,1.1])
abc.requires_grad_()

loss = quad_mae(abc)
lr = 0.05

运行自动化梯度下降

for i in range(10):
    loss = quad_mae(abc)
    loss.backward()
    with torch.no_grad(): abc -= abc.grad*lr
    print(f'step={i}; loss={loss:.2f}')
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值