导入依赖包
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}')