Skip to content

基与对偶

基定义了向量空间的坐标系,而对偶揭示了线性函数如何作用于向量。本章涵盖线性无关、生成集、基变换、对偶空间和余向量,这些概念是机器学习中 PCA、特征变换和注意力查询背后的基础。

  • 我们已经看到向量存在于具有特定维数的空间中。但什么定义了这些维度?这就是基向量发挥作用的地方。

  • 一组是向量空间中的一组向量,它们通过缩放和相加(线性组合)能够构建空间中的每一个其他向量,并且没有冗余。它们是空间的构建块。

  • 一组基必须满足两个条件:

    • 线性无关:没有一个基向量可以由其他基向量构建而来。每个基向量都贡献一个真正新的方向。

    • 张成:空间中的每一个向量都可以表示为基向量的组合。没有任何向量被遗漏。

  • 一组基中向量的个数等于空间的维数。在 \(\mathbb{R}^2\) 中你需要 2 个,在 \(\mathbb{R}^3\) 中你需要 3 个,依此类推。

  • 最自然的基是标准基,即沿每个坐标轴的单位向量:

    • \(\mathbb{R}^2\) 中:\(\hat{\mathbf{i}} = (1, 0)\)\(\hat{\mathbf{j}} = (0, 1)\)
    • \(\mathbb{R}^3\) 中:\(\hat{\mathbf{i}} = (1, 0, 0)\)\(\hat{\mathbf{j}} = (0, 1, 0)\)\(\hat{\mathbf{k}} = (0, 0, 1)\)
  • 任何向量都是这些基向量的加权和。向量 \((3, 2)\) 实际上是 \(3\hat{\mathbf{i}} + 2\hat{\mathbf{j}}\)。权重(3 和 2)就是该向量在该组基下的坐标

  • 但标准基并不是唯一有效的基。在 \(\mathbb{R}^2\) 中,向量 \((1, 1)\)\((-1, 1)\) 也构成一组基。它们线性无关,并且可以到达平面上的任何点。同一个向量在这组新基下将具有不同的坐标。

  • 基变换使用不同的构建块重新表达同一个向量。向量本身没有移动,我们只是从不同的角度描述它。

  • 这是通过乘以一个基变换矩阵 \(P\) 来实现的,\(P\) 的列是用旧坐标表示的新基向量。要变换回去,则乘以 \(P^{-1}\)

  • 在机器学习中,基变换频繁出现。例如,PCA 找到一组新基(主成分),在其中数据更容易理解,这些坐标轴与最大变化方向对齐。

  • 现在,这里隐藏着一个更深层次的想法。当我们写 \(\mathbf{v} = (3, 2)\) 时,坐标 3 和 2 实际上是沿着每个基方向“测量” \(\mathbf{v}\) 的结果。第一个坐标问的是“\(\mathbf{v}\) 中有多少 \(\hat{\mathbf{i}}\) 的分量?”,第二个问的是“有多少 \(\hat{\mathbf{j}}\) 的分量?”

  • 每一次这样的测量都是一个线性泛函,一个接受向量并返回一个标量的函数。所有这样的线性泛函的集合构成了对偶空间 \(V^\ast\)

  • 可以这样理解:向量是对象,而线性泛函是测量它们的尺子。对偶空间就是所有可能的尺子的集合。

  • 对于每一组基 \(\{\mathbf{e}_1, \mathbf{e}_2, \ldots, \mathbf{e}_n\}\),存在相应的对偶基 \(\{\mathbf{e}_1^\ast, \mathbf{e}_2^\ast, \ldots, \mathbf{e}_n^\ast\}\)。每个对偶基向量恰好提取一个坐标:

\[ \mathbf{e}_i^\ast(\mathbf{e}_j) = \delta_{ij} = \begin{cases} 1 & \text{若 } i = j \\ 0 & \text{若 } i \neq j \end{cases} \]
  • \(\mathbf{e}_1^\ast\) 作用于 \(\mathbf{e}_1\) 时返回 1,作用于其他任何向量时返回 0。它完美地分离出第一个坐标。

  • 点积连接了这两个世界。当你计算 \(\mathbf{u} \cdot \mathbf{v}\) 时,你可以把其中一个向量看作测量另一个向量的“尺子”。点积 \(\mathbf{u} \cdot \mathbf{v}\) 等价于将由 \(\mathbf{u}\) 定义的线性泛函作用于向量 \(\mathbf{v}\)

  • 这意味着每个向量都暗含地定义了一个线性泛函,并且每个线性泛函都可以由一个向量表示。在有限维空间中,对偶空间本质上是原始空间的镜像。

  • 对偶性现在看起来可能抽象,但它支撑着许多实际思想:坐标是对偶基的求值,点积是对偶配对,而神经网络中的注意力机制等变换通过让一组向量“查询”另一组向量来工作,这正是对偶性在发挥作用。

编程任务(使用 CoLab 或 notebook)

  1. 在两个不同的基下表达同一个向量,并验证它们表示同一个点。尝试创建自己的基,观察向量得到什么坐标。

    import jax.numpy as jnp
    
    v = jnp.array([3.0, 2.0])
    
    # 标准基:坐标就是分量本身
    print(f"标准基坐标: {v}")
    
    # 新基:(1,1) 和 (-1,1)
    P = jnp.array([[1.0, -1.0],
                   [1.0,  1.0]])
    new_coords = jnp.linalg.solve(P, v)
    print(f"新基坐标: {new_coords}")
    
    # 验证:从新坐标重构原向量
    reconstructed = new_coords[0] * P[:, 0] + new_coords[1] * P[:, 1]
    print(f"重构向量: {reconstructed}")
    

  2. 验证对偶基性质:每个对偶基向量恰好提取一个坐标,而对其他基向量返回零。

    import jax.numpy as jnp
    
    # R3 中的标准基
    e1 = jnp.array([1.0, 0.0, 0.0])
    e2 = jnp.array([0.0, 1.0, 0.0])
    e3 = jnp.array([0.0, 0.0, 1.0])
    
    v = jnp.array([5.0, 3.0, 7.0])
    
    # 每个点积提取一个坐标
    print(f"e1 · v = {jnp.dot(e1, v)}")
    print(f"e2 · v = {jnp.dot(e2, v)}")
    print(f"e3 · v = {jnp.dot(e3, v)}")