动手学深度学习 06

敖炜 Lv5

矩阵计算

矩阵计算其实是求矩阵如何求导数

标量导数

标量导数

亚导数

将导数拓展到不可微的函数
亚导数

梯度


梯度
就是y(标量)对X(向量)求导。梯度是一个(行)向量,其分量是多变量函数相对于其所有变量的偏导数。梯度一定指向值变化最大的方向

拓展

  1. 当Y是向量,x是标量时,微分为列向量,这个称之为分子布局符号,反过来的版本叫分母布局符号。可以理解为f为标量到向量的映射,在Y中,只对某个x求导
  2. 当Y是向量,X也是向量,微分为一个矩阵

拓展到矩阵

微积分

在深度学习中,我们“训练”模型,不断更新它们,使它们在看到越来越多的数据时变得越来越好。通常情况下,变得更好意味着最小化一个损失函数(loss function),即一个衡量模型有多糟糕的分数。最终,我们真正关心的是生成一个模型,它能够在从未见过的数据上表现良好。但“训练”模型只能将我们实际能看到的数据相拟合。因此,我们可以将拟合模型的任务分解为两个关键问题

  • 优化(optimization):用模型拟合观测数据的过程
  • 泛化(generalization):数学原理和实践者的智慧,能够指导我们生成出有效性超出用于训练的数据集本身的智慧

导数与微分

  1. 为了对导数的解释进行可视化,我们将使用matplotlib,这是一个Python中流行的绘图库。要配置matplotlib生成图形的属性,我们需要定义几个函数。在下面,use_svg_display函数指定matplotlib软件包输出svg图表以获得更清晰的图像。注释#@save是一个特殊的标记,会将对应的函数、类或语句保存在d2l包中。因此,以后无需重新定义就可以直接调用它们(例如,d2l.use_svg_display()
    1
    2
    3
    def use_svg_display():  #@save
    """使用svg格式在jupyter中显示绘图"""
    backend_inline.set_matplotlib_formats('svg')
  2. 我们定义set_figsize函数来设置图表大小。注意,这里可以直接使用d2l.plt,因为导入语句from matplotlib import pyplot as plt已标记为保存到d2l包中
    1
    2
    3
    4
    def set_figsize(figsize=(3.5, 2.5)):  #@save
    """设置matplotlib的图表大小"""
    use_svg_display()
    d2l.plt.rcParams['figure.figsize'] = figsize
  3. 下面的set_axes函数用于设置由matplotlib生成图表的轴的属性
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #@save
    def set_axes(axes, xlabel, ylabel, xlim, y,lim, 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()
  4. 通过这三个用于图形配置的函数,定义一个plot函数来简洁地绘制多条曲线,因为我们需要在整本书中可视化许多曲线
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    #@save
    def plot(X, Y=None, xlabel=None, ylabel=None, legend=None, xlim=None, ylim=None, xscale='linear', yscale='linear', fmts=('-', 'm--', 'g-', 'r:'), figsize=(3.5, 2.5), axes=None):
    """绘制数据点"""
    if legend is None:
    legend = []

    set_figsize(figsize)
    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), Y
    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)
  5. 可绘制及其在处的切线
    1
    2
    x = np.arange(0, 3, 0.1)
    plot(x, [f(x), 2 * x -3], 'x', 'f(x)', legend=['f(x)', 'Tangent line(x=1)'])

偏导数

  1. 在深度学习中,函数通常依赖于许多变量,因此我们需要将微分的思想推广到多元函数上

梯度

  1. 我们可以连结已多元函数对其所有变量的偏导数,以得到该函数的梯度(gradient)向量。具体而言,设函数的输入是
    一个维向量,并且输出是一个标量。
    函数相对于的梯度是一个包含个偏导数的向量:

    其中通常在没有歧义时被取代。

    假设维向量,在微分多元函数时经常使用以下规则:

    • 对于所有,都有
    • 对于所有,都有
    • 对于所有,都有

    同样,对于任何矩阵,都有
    正如我们之后将看到的,梯度对于设计深度学习中的优化算法有很大用处。

链式法则

  1. 上面的方法可能很难找到梯度。这是因为在深度学习中,多元函数通常是复合(composite)的,所以难以应用上述任何规则来微分这些函数。幸运的是,链式法则可以被用来微分复合函数
  • 标题: 动手学深度学习 06
  • 作者: 敖炜
  • 创建于 : 2023-07-25 14:55:12
  • 更新于 : 2024-04-19 09:27:57
  • 链接: https://ao-wei.github.io/2023/07/25/动手学深度学习-06/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论