沐神-动手学习深度学习 2.4 - 微积分课后习题

2.4 微积分 题目
  1. 绘制函数y=f(x)=x3−1xy = f(x) = x^3 - \frac{1}{x}y=f(x)=x3−x1和其在x=1x = 1x=1处切线的图像。
  2. 求函数f(x)=3x12+5ex2f(\mathbf{x}) = 3x_1^2 + 5e^{x_2}f(x)=3x12+5ex2的梯度。
  3. 函数f(x)=∥x∥2f(\mathbf{x}) = \|\mathbf{x}\|_2f(x)=∥x∥2的梯度是什么?
  4. 尝试写出函数u=f(x,y,z)u = f(x, y, z)u=f(x,y,z),其中x=x(a,b)x = x(a, b)x=x(a,b),y=y(a,b)y = y(a, b)y=y(a,b),z=z(a,b)z = z(a, b)z=z(a,b)的链式法则。
解答

{"value":"","field":"reasoning_content"}

以下是四个问题的解答:

  1. 绘制函数y = x\^3 - \\frac{1}{x}及其在x=1处的切线
    步骤:

计算导数:f'(x) = 3x\^2 + \\frac{1}{x\^2}

求x=1处的导数值:f'(1) = 3(1)\^2 + \\frac{1}{1\^2} = 4

求x=1处的函数值:f(1) = 1\^3 - \\frac{1}{1} = 0

切线方程:y = 4(x-1) + 0 \\Rightarrow y = 4x - 4

图像特征:

原函数在x\>0时,随x增大快速上升;在x\<0时,因-1/x项主导,左侧有垂直渐近线。

切线在x=1处与函数相切,斜率为4。

  1. 求函数f(\\mathbf{x}) = 3x_1\^2 + 5e\^{x_2}的梯度

    梯度计算:

    \\nabla f = \\begin{bmatrix} \\frac{\\partial f}{\\partial x_1} \\frac{\\partial f}{\\partial x_2} \\end{bmatrix} = \\begin{bmatrix} 6x_1 5e\^{x_2} \\end{bmatrix}

  2. 函数f(\\mathbf{x}) = \|\\mathbf{x}\|_2的梯度

    定义:f(\\mathbf{x}) = \\sqrt{x_1\^2 + x_2\^2 + \\dots + x_n\^2}

    梯度公式(当\\mathbf{x} \\neq \\mathbf{0}时):

    \\nabla f = \\frac{\\mathbf{x}}{\|\\mathbf{x}\|_2}

特例:若\\mathbf{x} = \\mathbf{0},梯度不存在(原点处不可导)。

  1. 链式法则应用:u = f(x,y,z),其中x = x(a,b), y = y(a,b), z = z(a,b)
    链式法则表达式:

    \\frac{\\partial u}{\\partial a} = \\frac{\\partial f}{\\partial x} \\cdot \\frac{\\partial x}{\\partial a} + \\frac{\\partial f}{\\partial y} \\cdot \\frac{\\partial y}{\\partial a} + \\frac{\\partial f}{\\partial z} \\cdot \\frac{\\partial z}{\\partial a}

    \\frac{\\partial u}{\\partial b} = \\frac{\\partial f}{\\partial x} \\cdot \\frac{\\partial x}{\\partial b} + \\frac{\\partial f}{\\partial y} \\cdot \\frac{\\partial y}{\\partial b} + \\frac{\\partial f}{\\partial z} \\cdot \\frac{\\partial z}{\\partial b}

公式总结

问题 关键公式
1 f'(x) = 3x\^2 + \\frac{1}{x\^2},切线y = 4x - 4
2 \\nabla f = \[6x_1, 5e^{x_2}^T]
3 [\nabla f = \frac{\mathbf{x}}{
4 链式法则如上述分步公式
如需进一步代码实现(如绘制图像),可提供具体编程语言要求。

以下是针对代码的逐层解析,主要围绕plot()set_axes()两个绘图函数的功能实现:


一、函数功能概览

这两个函数是深度学习教材《动手学深度学习》(D2L) 中封装的标准化绘图工具,主要作用是通过简化matplotlib的API调用流程,实现快速创建规范化的科研图表。


二、set_axes()函数解析

python 复制代码
#@save
def set_axes(axes, xlabel, ylabel, xlim, ylim, xscale, yscale, legend):
    """设置matplotlib的轴"""
    axes.set_xlabel(xlabel)          # 设置X轴标签
    axes.set_ylabel(ylabel)          # 设置Y轴标签
    axes.set_xscale(xscale)          # 设置X轴刻度类型(linear/log)
    axes.set_yscale(yscale)          # 设置Y轴刻度类型
    axes.set_xlim(xlim)              # 设置X轴范围
    axes.set_ylim(ylim)              # 设置Y轴范围
    if legend:
        axes.legend(legend)          # 添加图例
    axes.grid()                      # 显示网格

核心作用:集中配置坐标轴属性,通过参数化实现以下功能:

  • 坐标标签设置(xlabel/ylabel
  • 坐标范围控制(xlim/ylim
  • 刻度类型转换(xscale/yscale支持线性/对数坐标)
  • 图例与网格的显示控制

三、plot()函数解析

python 复制代码
#@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()  # 获取当前axes或新建

    # 数据维度检测函数
    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):
        axes.plot(x, y, fmt) if len(x) else axes.plot(y, fmt)
    
    # 调用set_axes配置坐标轴
    set_axes(axes, xlabel, ylabel, xlim, ylim, xscale, yscale, legend)
关键设计亮点
  1. 智能数据适配

    • 通过has_one_axis()自动检测一维数据,将其包装为二维列表
    • 支持Y=None时自动用X作为Y值(此时X索引作为X轴)
  2. 多曲线绘制

    • fmts参数预设4种线条样式(实线、品红虚线、绿点划线、红点线)
    • 通过zip(X,Y,fmts)实现多组数据对应不同样式的自动匹配
  3. 灵活的画布控制

    • figsize=(3.5,2.5)默认采用论文常用的小尺寸图表
    • 支持传入外部axes对象实现多子图绘制

四、典型使用示例

python 复制代码
import numpy as np
x = np.linspace(0, 10, 100)
y1 = np.sin(x)
y2 = np.cos(x)

# 绘制双曲线
plot([x, x], [y1, y2], 
     xlabel='x', ylabel='y', 
     legend=['sin(x)', 'cos(x)'], 
     xlim=(0, 10), ylim=(-1.5, 1.5))
输出效果:
  • 生成尺寸为3.5x2.5英寸的图表
  • X轴标签为"x",范围0-10;Y轴标签为"y",范围-1.5~1.5
  • 两条曲线分别以实线('-')和品红虚线('m--')呈现
  • 右下角显示图例说明

五、与原生matplotlib的对比

功能 原生matplotlib实现 D2L plot()函数优势
多曲线绘制 需手动循环调用plt.plot(),样式需逐个设置 自动匹配数据与样式,支持批量绘制
坐标轴配置 需分别调用xlabel()xlim()等多个函数 通过set_axes()集中配置,参数化更简洁
画布尺寸 需记忆plt.figure(figsize=(w,h)) 预设科研常用尺寸,通过set_figsize()快捷调整
数据维度处理 需手动处理一维/二维数据转换 自动检测数据维度并进行标准化包装

该工具函数的设计充分体现了封装常用模式降低使用门槛的理念,特别适合深度学习实验中快速可视化训练曲线、数据分布等场景。