Skip to content

Basis and Duality(基与对偶)

Basis 定义了 vector space 的坐标系,duality 揭示了线性函数如何作用于 vector。本节涵盖线性无关性、生成集、基变换、dual space 和 covector——这些概念是 PCA、feature 变换以及 ML 中 attention 查询机制的基础。

  • 我们已经知道 vector 存在于具有特定维数的空间中。但是什么定义了这些维度?这就是 basis vector 的用武之地。

  • Basis 是一组 vector,它们可以通过缩放和相加(线性组合)构建空间中的任意其他 vector,且没有冗余。它们是空间的基本构建块。

  • Basis 必须满足两个条件:

    • 线性无关:没有任何一个 basis vector 能由其他 vector 构建。每个 vector 都贡献一个全新的方向。

    • 生成性:空间中的任意 vector 都可以用这些 basis vector 的组合来表示。没有任何遗漏。

  • Basis 中 vector 的数量等于空间的维度。在 \(\mathbb{R}^2\) 中需要 2 个,在 \(\mathbb{R}^3\) 中需要 3 个,以此类推。

  • 最自然的 basis 是标准 basis——沿每条坐标轴的 unit vector:

    • \(\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)\)
  • 任何 vector 不过是这些 basis vector 的加权和。Vector \((3, 2)\) 实际上就是 \(3\hat{\mathbf{i}} + 2\hat{\mathbf{j}}\)。这些权重(3 和 2)就是该 vector 在此 basis 下的坐标

  • 但标准 basis 并不是唯一有效的 basis。在 \(\mathbb{R}^2\) 中,vector \((1, 1)\)\((-1, 1)\) 也构成一组 basis。它们线性无关,可以到达平面上的任意一点。同一个 vector 在新 basis 下只是有了不同的坐标。

  • 基变换(change of basis) 用不同的构建块来重新表达同一个 vector。Vector 本身没有移动,我们只是从不同的视角来描述它。

  • 这可以通过乘以基变换矩阵 \(P\) 来实现,\(P\) 的各列是用旧坐标写出的新 basis vector。要逆变换,则乘以 \(P^{-1}\)

  • 在 ML 中,基变换非常常见。例如,PCA 找到一组新的 basis(主成分),使数据更易于理解——各轴与最大方差方向对齐。

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

  • 每一次这样的测量都是一个线性泛函——一个接受 vector 并返回单个数的函数。所有这类线性泛函的集合构成了 dual space \(V^\ast\)

  • 可以这样理解:vector 是对象,线性泛函是尺子——用来度量它们的工具。Dual space 就是所有可能尺子的集合。

  • 对于每组 basis \(\{\mathbf{e}_1, \mathbf{e}_2, \ldots, \mathbf{e}_n\}\),都有一组对应的 dual basis \(\{\mathbf{e}_1^\ast, \mathbf{e}_2^\ast, \ldots, \mathbf{e}_n^\ast\}\)。每个 dual basis vector 精确地提取一个坐标:

\[ \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。它完美地提取了第一个坐标。

  • Dot product 连接了这两个世界。当你计算 \(\mathbf{u} \cdot \mathbf{v}\) 时,可以把一个 vector 看作"尺子",用来度量另一个。Dot product \(\mathbf{u} \cdot \mathbf{v}\) 等同于将 \(\mathbf{u}\) 定义的线性泛函作用于 vector \(\mathbf{v}\)

  • 这意味着每个 vector 都暗中定义了一个线性泛函,每个线性泛函都可以用一个 vector 来表示。在有限维中,dual space 本质上是原始空间的镜像。

  • Duality 现在看起来可能很抽象,但它是许多实际概念的基础:坐标是 dual basis 的赋值,dot product 是 duality 的配对,而神经网络中的 attention 等变换通过一组 vector"查询"另一组 vector 来运作——这正是 duality 的体现。

编程练习(使用 CoLab 或 notebook)

  1. 在两个不同的 basis 下表达一个 vector,验证它们表示的是同一个点。尝试创建自己的 basis,看看 vector 得到了什么坐标。

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

  2. 验证 dual basis 的性质:每个 dual basis vector 精确提取一个坐标,对其他坐标返回零。

    import jax.numpy as jnp
    
    # R3 中的标准 basis
    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])
    
    # 每个 dot product 提取一个坐标
    print(f"e1 · v = {jnp.dot(e1, v)}")
    print(f"e2 · v = {jnp.dot(e2, v)}")
    print(f"e3 · v = {jnp.dot(e3, v)}")