在微分学中最重要的应用是优化问题,即考虑如何把事情做到最好。在深度学习中,我们“训练”模型,使它们在看到越来越多的数据时变得越来越好。通常情况下,变得更好意味着最小化一个损失函数,即一个衡量“我们的模型有多糟糕”这个问题的分数。我们将拟合模型的任务分解为两个关键问题:1.优化(optimization):用模型拟合观测数据的过程。2.泛化:数学原理和实践者的智慧,能够指导生成有效性超出用于训练的数据集本身的模型。
在深度学习中,通常选择对于模型参数可微的损失函数。简而言之,对于每个参数,如果我们把这个参数增加或减少一个无穷小的量,我们可以知道损失会以多快的速度增加或减少。
%matplotlib inline
import numpy as np
from IPython import display
from d2l import torch as d2l
def f(x):
return 3 * x ** 2 - 4 * x
def numerical_lim(f, x, h):
return (f(x + h) - f(x)) / h
h = 0.1
for i in range(5):
print(f'h={h:.5f}, numerical limit={numerical_lim(f, 1, h):.5f}')
h *= 0.1
python的print字符串前面加f表示格式化字符串,加f后可以在字符串里面使用用花括号括起来的变量和表达式,如果字符串里面没有表达式,那么前面加不加f输出应该都一样。
此处运行李沐老师的代码结果错误,在网上找了代码运行成功,以下是网上的代码和结果。
#import numpy as np
#from IPython import display
from d2l import torch as d2l
import matplotlib.pyplot as plt
import numpy as np
def f(x):
return 3 * x ** 2 - 4 * x
def numerical_lim(f, x, h):
return (f(x + h) - f(x)) / h
h = 0.1
for i in range(5):
print(f'h={h:.5f}, numerical limit={numerical_lim(f, 1, h):.5f}')
h *= 0.1
plt.figure(figsize=(3.5,2.5)) #图片尺寸大小
def set_axes(axes, xlabel, ylabel, xlim, ylim, xscale, yscale, legend):
"""设置matplotlib的轴。"""
axes.set_xlabel(xlabel)
axes.set_ylabel(ylabel)
axes.set_xscale(xscale)
axes.set_yscale(yscale)
axes.set_xlim(xlim)
axes.set_ylim(ylim)
if legend:
axes.legend(legend)
axes.grid()
def plot(X, Y=None, xlabel=None, ylabel=None, legend=None, xlim=None,
ylim=None, xscale='linear', yscale='linear',
fmts=('-', 'm--', 'g-.', 'r:'), axes=None):
"""绘制数据点。"""
if legend is None:
legend = []
axes = axes if axes else d2l.plt.gca()
# 如果 `X` 有一个轴,输出True
def has_one_axis(X):
return (hasattr(X, "ndim") and X.ndim == 1 or isinstance(X, list)
and not hasattr(X[0], "__len__"))
if has_one_axis(X):
X = [X]
if Y is None:
X, Y = [[]] * len(X), X
elif has_one_axis(Y):
Y = [Y]
if len(X) != len(Y):
X = X * len(Y)
axes.cla()
for x, y, fmt in zip(X, Y, fmts):
if len(x):
axes.plot(x, y, fmt)
else:
axes.plot(y, fmt)
set_axes(axes, xlabel, ylabel, xlim, ylim, xscale, yscale, legend)
x = np.arange(0, 3, 0.1)
y = 2*x-3
plot(x, [f(x), 2 * x - 3], 'x', 'f(x)', legend=['f(x)', 'Tangent line (x=1)'])
plt.show()
plt.figure()中figsize是指定figure的宽和高,单位为英寸。axes.set_xlabel、axes.set_ylabel用于设置x轴、y轴的标签,axes.set_xscale、axes.set_yscale用于设置x轴、y轴的比例,'linear'为默认的缩放类型,axes.set_xlim、axes.set_ylim用于设置x轴、y轴视图限制。axes.legend用于在图上放置图例。axes.grid用于设置图表中的网格线。
None是一个特殊的对象,通常用作占位符,由默认值替换。
*fmts=('-', 'm--', 'g-.', 'r:')是什么意思没查到,待解决。估计是线的形状、颜色这些。
.gca()函数的作用是获得当前的axes对象。axes = axes if axes else d2l.plt.gca()这句未完全理解。
先跳过这里,因为时间原因,先看后面,之后有时间再继续注释。