想象一场奇妙的握手仪式:工程师 A 和 B 要合并成一个新团队。两人各自摊开双手,每根手指上都贴着一个数字标签,并且编号一一对应。规则很简单——编号相同的手指先相触,两个数字相乘,然后把所有相触手指产生的乘积统统加在一起。仪式结束时,两人原本用来相握的那只手便“消失”了,A 和 B 合并成一个掌握了全部协作信息的新角色 C。 在张量世界里,A 和 B 就是两个张量,手指上的编号叫作“指标”,手指的数量就是该维度的长度。这场“编号配对→相乘→累加→维度消失”的仪式,正是张量缩并。矩阵乘法是它最简单的模样,Transformer 的注意力机制处处藏着它的影子,物理学家手中的张量网络更是把缩并当作唯一的基本玩法。本文将用“握手”这个比喻,一步步拆解缩并的数学定义、指标约定、它与矩阵乘法及迹运算的关系,以及 einsum 一行代码背后的原理。你会发现,那些符号堆砌的式子,本质上只是把一场握手仪式记录下来的速记法。

岗位关联

掌握张量缩并,你就拿到了看懂矩阵乘法、注意力评分、张量网络乃至大模型底层计算的通用钥匙,也能写出更高效、更易读的张量运算代码。

目录
  1. 可视化演示
  2. 缩并的直觉:双手相握
  3. 缩并三步走
  4. 指标约定:爱因斯坦求和
  5. 单指标缩并:矩阵乘法
  6. 多指标缩并:迹与内积
  7. einsum:把仪式写进一行字符串
  8. 张量网络收缩:一张大网的接力赛
  9. 注意力机制:一场全员握手会
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

本节配有交互动效(进入视口后自动加载,约 3KB)。

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

缩并的直觉:双手相握

想象两位工程师 A 和 B 要合体成一个新的项目组。A 摊开双手,每根手指上都贴着一个数字标签;B 也摊开双手,标签编号与 A 一一对应。合作的规矩只有一条:编号相同的手指先相触,两个数字相乘,然后所有相触的手指之间得到的乘积再统统加起来。当这场仪式结束,A 和 B 原本用来相握的那只手就“消失”了,两人合并成一个掌握了全部协作信息的新角色 C。

在张量世界里,A 和 B 就是两个张量,手指上的编号就是“指标”,手指的数量就是该维度的长度。这场“编号配对→相乘→累加→维度消失”的仪式,正是张量缩并。它不关心张量里面装的是图片像素、词向量还是物理量,只关心你指定哪两根“手指”去相握。缩并的定义就这样朴素:从两个张量各指定一个维度,要求这两个维度长度相同,然后把对应位置的元素逐项相乘,再沿这个维度求和。

完成之后,被指定的维度就合并进了求和号里,不再出现在结果中。这个操作像乐高积木上的卡扣:两个卡扣一旦扣紧,原来的凸起和凹槽都看不见了,剩下的是一块形状更精简的新积木。第一次见到缩并的人常常会想:这有什么了不起?可恰恰是这条简单规矩,撑起了矩阵乘法、矩阵的迹、爱因斯坦求和、张量网络乃至 Transformer 的注意力机制。可以说,它是一套贯穿整个现代 AI 数学的最小动作。

缩并三步走

握手仪式看起来眼花缭乱,其实只有三步。第一步“确认接口”:“A 伸出的手有几根手指,B 伸出的手也必须有几根,长度不匹配就无法配对”,这在张量中叫维度匹配。第二步“逐项相乘”:编号相同的手指两两相触,产生一系列中间乘积。第三步“累加求和”:把所有中间乘积加在一起,编号通道随之关闭,退出张量的世界。

用数学语言重写这三步。设 A 是一个三阶张量,元素记作 $A_{ijk}$;B 也是一个三阶张量,元素记作 $B_{jkl}$;我们让 j 和 k 这两对“手指”分别相握。缩并后的结果张量 C 只剩下 i 与 l 两个编号:

不管张量是二阶、三阶还是更高阶,三步仪式永不改变:确认接口、逐项相乘、累加求和。这也是为什么缩并被称作“乘法在维度上的投影”——它把一个维度从舞台中央压进了求和号的后台。

Cil=∑j∑kAijkBjkl\displaystyle C_{il}=\sum_{j}\sum_{k}A_{ijk}B_{jkl}
这个式子把缩并的“先乘后加”翻译成了双重求和:对 j、k 的所有组合,把 A 和 B 对应位置的乘积加起来,得到 C 的一个元素。
  1. $C_{il}$(结果张量)缩并产出的新张量,只有 i 和 l 两个自由指标,它们分别来自 A 和 B,像两位工程师各自留下的“非握手手”。
    CilC_{il}
  2. 双重求和号对哑指标 j、k 的所有取值做累加,每一个 (j,k) 组合都贡献一个乘积项。
    ∑j∑k\sum_{j}\sum_{k}
  3. $A_{ijk}$(左张量元素)A 中由 i、j、k 三个编号定位的一个数值,其中 j、k 是拿去握手的手指。
    AijkA_{ijk}
  4. $B_{jkl}$(右张量元素)B 中以 j、k、l 定位的数值,它们要与 A 中的 j、k 编号相同才能配对。
    BjklB_{jkl}
  5. 乘积与累加编号相同则相乘,所有乘积并入求和号,这就是“乘加一体”的缩并内核。
    AijkBjklA_{ijk}B_{jkl}

指标约定:爱因斯坦求和

握手仪式的记录很烧脑:每个编号要写进求和号、每个配对要写明手指位置。物理学家爱因斯坦发现,根本不需要把“求和”显式写出来。他提出一个约定:只要某个编号在一个乘积项里出现两次,就默认要对它求和。这个约定叫爱因斯坦求和约定。

例如两个向量的点积本来要写成 $c=\sum_i a_i b_i$,在约定下直接写作 $c=a_ib_i$。i 出现两次,求和号自动补上,像开会时有人说“按老规矩办”——重复出现的编号就是“老规矩”,大家心照不宣地执行求和。

哑指标像握手后消失的手——只留在仪式的记忆中,不再出现在最终合影里。而自由指标则是没有参与握手的那只手,会原封不动地出现在结果张量上。分清这两种指标,是读懂一切缩并公式的第一步。

c=aibi\displaystyle c=a_ib_i
这里的 i 是“哑指标”,出现两次就自动求和;c 是一个标量,也是缩并之后维度归零的极致形态。
  1. $c$(结果标量)向量 a 和 b 缩并后得到的数,也叫内积。没有任何自由指标被保留。
    cc
  2. $a_i$(向量 a 的第 i 个分量)i 在这里第一次出现,相当于待定的手指编号。
    aia_i
  3. $b_i$(向量 b 的第 i 个分量)i 第二次出现,与 a 中的 i 配对握手。
    bib_i
  4. 哑指标自动求和按爱因斯坦约定,i 出现两次,自动执行求和,求和号可以省略。
    ∑i\sum_i

单指标缩并:矩阵乘法

当两个张量都只有二阶,而且只握一只手(共享一个指标)时,缩并就变成了每个人在本科都见过的矩阵乘法。矩阵 A 的形状是 (i, j),矩阵 B 的形状是 (j, k),缩并掉 j 之后得到 C(i, k)。C 的每一个元素,都来自 A 的第 i 行与 B 的第 k 列的点积:

注意缩并的“维度匹配”在这里表现为 A 的列数必须等于 B 的行数;如果不等,矩阵乘法本身就是非法的,就像两个人伸出手指数量对不上会握空一样。把矩阵乘法想成“行向量与列向量握一次手”,你会发现它只是缩并大家族里最出名的一场握手。

[AB]ik=∑jAijBjk\displaystyle [AB]_{ik}=\sum_{j}A_{ij}B_{jk}
矩阵乘法不是新知识,而是缩并在二阶张量上的特例:行向量与列向量握手一次,乘积逐个累加。
  1. $[AB]_{ik}$(结果矩阵元素)矩阵乘积中第 i 行第 k 列的数。
    [AB]ik[AB]_{ik}
  2. $A_{i\cdot}$(A 的第 i 行)把这一行的所有元素视为一个行向量。
    Ai⋅A_{i\cdot}
  3. $B_{\cdot k}$(B 的第 k 列)把这一列的元素视为一个列向量。
    B⋅kB_{\cdot k}
  4. 点积即缩并行向量与列向量对应位置相乘再相加,就是一次单指标缩并。
    ∑jAijBjk\sum_j A_{ij}B_{jk}

多指标缩并:迹与内积

握手不只有两人各出一只手的情况。A 和 B 可以同时伸出两只手(共享两个指标),甚至同一个人自己的两只手也可以互握。后者就是矩阵的迹运算:M 是一个方阵,让它的行指标 i 和列指标 i 直接握手,于是对角线上的元素被挑出来全部相加:

类似地,两个同形矩阵做 Frobenius 内积 $\langle A,B\rangle_F=\sum_{ij}A_{ij}B_{ij}$,意味着 A 和 B 同时伸出两只手互为配对,最终缩成一个标量。多指标缩并需要确保所有配对的“手指数量”都一致,否则仪式进行到一半就会有人把手悬在空中。当缩并的指标数等于张量全部指标数时,结果阶数为零,得到的就是一个数——这是缩并最彻底的形态。

tr⁡(M)=Mii\displaystyle \operatorname{tr}(M)=M_{ii}
爱因斯坦约定下,$M_{ii}$ 自动对 i 求和,结果是一个标量——矩阵对角线的和,也是张量缩并“自己和自己握手”的经典例子。
  1. $\operatorname{tr}(M)$(矩阵迹)对角线元素之和,是缩并一族中最常被低估的特例。
    tr⁡(M)\operatorname{tr}(M)
  2. $M_{ii}$(对角元素)i 同时担当行与列,只保留主对角线。
    MiiM_{ii}
  3. 哑指标 i 自动求和同一指标出现两次,不需要写出求和号。
    ∑i\sum_i

einsum:把仪式写进一行字符串

工程师们觉得写求和号太累,于是发明了一种速记语言 einsum(爱因斯坦求和约定的英文缩写)。它的语法像一句话:输入字符串用逗号分隔每个张量的指标,箭头右边写结果张量保留的指标。例如 'ij,jk->ik' 从左往右读:A 用 ij 编号,B 用 jk 编号,结果保留 i、k;j 在箭头左边出现两次,自动成为求和对象。因此:

在 numpy 和 PyTorch 中,einsum 都被底层优化过:它能自动识别缩并可转为矩阵乘法的形式,调用高效的 BLAS 库,同时避免中间张量的爆炸式存储。对 AI 工程师来说,写 einsum 就像给两位工程师递一张纸条:“你们俩把编号 j 的手握上,结果给 C”,既干脆又不会传错话。

∑jAijBjk=Cik⟺einsum(’ij,jk->ik’, A, B)\displaystyle \sum_{j}A_{ij}B_{jk}=C_{ik}\quad\Longleftrightarrow\quad \texttt{einsum('ij,jk->ik', A, B)}
einsum 并非创造新运算,它只是把缩并的“谁和谁握手、保留什么编号”浓缩成一条提示语,让代码既简洁又不容易出错。
  1. 左端数学缩并这次缩并的结果是二阶张量 C,保留自由指标 i 与 k。
    ∑jAijBjk=Cik\sum_j A_{ij}B_{jk}=C_{ik}
  2. 右端 einsum 字符串'ij,jk->ik' 中,逗号左边是 A 的指标,右边是 B 的指标。
    ’ij,jk->ik’\texttt{'ij,jk->ik'}
  3. 箭头分工箭头左边的 j 出现两次,是哑指标;箭头右边的 i、k 是自由指标。
    ’ij,jk’→’ik’\texttt{'ij,jk'}\rightarrow\texttt{'ik'}

张量网络收缩:一张大网的接力赛

单独的握手不过瘾,物理学家让成千上万个张量手拉手连成一张网络:每个节点是一个张量,每条边就是一个共享指标,两个节点相遇就缩并一次。整张网络围成一个环时的缩并结果,就是配分函数 Z:

张量网络收缩不仅在量子物理中计算基态能量,也出现在 AI 模型压缩、量子化学模拟等场景。聪明的收缩顺序能把指数级计算量压到多项式量级,这就像接力赛里跑手交接棒的方法,有时换一条传棒路线就能节省十倍体力。张量网络把“大而重”的张量拆成一组“小而韧”的节点,再用缩并做胶水,把碎片重新粘成整体。

Z=∑i1,i2,i3Ti1i2(1) Ti2i3(2) Ti3i1(3)\displaystyle Z=\sum_{i_1,i_2,i_3} T^{(1)}_{i_1i_2}\,T^{(2)}_{i_2i_3}\,T^{(3)}_{i_3i_1}
三个张量像三个人围成一圈握手,每个人的左手与右手都交给邻座;对所有被传递的编号求和,就得到整张网络的“总账”。
  1. Z(网络缩并总结果)每一条边都被缩并之后,整张网络收缩成一个标量。
    ZZ
  2. 求和号遍历哑指标$i_1$、$i_2$、$i_3$ 是出现在两条边上的编号,全部求和。
    ∑i1,i2,i3\sum_{i_1,i_2,i_3}
  3. 节点张量$T^{(1)}$ 等是网络中的小张量,下标表示它连接了哪些边。
    Ti1i2(1)T^{(1)}_{i_1i_2}
  4. 连乘节点之间按共享编号相乘,最终围成闭环。
    Ti1i2(1)Ti2i3(2)Ti3i1(3)T^{(1)}_{i_1i_2}T^{(2)}_{i_2i_3}T^{(3)}_{i_3i_1}

注意力机制:一场全员握手会

如果说张量网络是物理学家的大网,那么 Transformer 的注意力机制就是深度学习界的全员握手会。输入里有 N 个词向量,每个词要和其他所有词交换一次信息。做法是准备三份角色:查询 Q、键 K、值 V。Q 与 K 先握手一次,得到两两之间的相关性分数:

多头注意力只是把 N 个词的“握手会”分成 h 组同时进行,每组拥有不同的 Q/K/V 子空间,最终拼接输出。底层实现中,工程师正是用 einsum 同时完成 batch、head、token 三个维度的缩并。注意力机制本质上是在一个平面上让所有元素两两握手,而缩并是每一次握手的数学落点;理解了缩并,就等于拿到了读懂注意力公式的钥匙。

Attention(Q,K,V)=softmax(QK⊤dk)V\displaystyle \mathrm{Attention}(Q,K,V)=\mathrm{softmax}\left(\frac{QK^{\top}}{\sqrt{d_k}}\right)V
注意力公式里,$QK^{\top}$ 就是一次缩并:沿向量维度相乘累加,得到 (N, N) 的分数矩阵;之后用 softmax 归一化,再与 V 缩并聚合信息。
  1. $Q,K,V$(查询、键、值)每个 token 同时扮演三种角色,都是从输入向量线性变换而来。
    Q, K, VQ,\ K,\ V
  2. $QK^{\top}$(相关性矩阵)把 Q 与 K 转置做矩阵乘法,等价于沿特征维做一次缩并。
    QK⊤QK^{\top}
  3. 除以 $\sqrt{d_k}$对分数做缩放,防止内积过大把 softmax 推向梯度消失。
    QK⊤dk\frac{QK^{\top}}{\sqrt{d_k}}
  4. softmax 归一化对每一行做归一化,让所有相关性权重为正且和为 1。
    softmax(⋅)\mathrm{softmax}(\cdot)
  5. 乘 V 聚合权重矩阵再与 V 做一次矩阵乘法(缩并),把信息按权重汇总到每个 token。
    Attention(Q,K,V)\mathrm{Attention}(Q,K,V)

AI 应用场景

张量网络收缩:量子多体模拟

阶段:数据建模与数值计算

解决的问题:量子多体系统的状态空间随粒子数指数爆炸,传统暴力计算在十几个粒子时就寸步难行。张量网络把指数级大的整体张量拆成许多小张量,通过可控次数的缩并求物理量,把指数代价降为多项式代价。

具体案例:一维量子链的 DMRG 算法每次优化都对环境张量做收缩,从而精确计算基态能量;Google 量子人工智能团队也用张量网络模拟随机线路采样的结果。在 AI 领域,矩阵乘积态这类张量网络还被用于压缩大模型权重,在不显著掉点的情况下减小显存占用。

Transformer 注意力计算:大模型的每一次“看见”

阶段:模型训练与推理

解决的问题:早期 RNN 只能按顺序传递信息,长距离依赖难以捕捉。注意力机制通过 Q 与 K 的一次缩并,让每个 token 同时“看见”所有 token,彻底改变了序列建模的方式。

具体案例:GPT 系列在计算 self-attention 时,输入 $(batch, seq, d)$ 的 Q、K 沿最后一维缩并得到 $(batch, seq, seq)$ 的分数矩阵;softmax 归一化后,权重再与 V 做第二次缩并聚合信息。工程师常用 einsum('bqhd,bkhd->bhqk', Q, K) 这类写法一次性完成批量、多头、序列三个维度的缩并,比手写循环快几个数量级。

Python 演示

python30 行
import numpy as np  def contract_by_loop(A, B, axes):    """沿指定轴对两个张量做缩并: 先配对相乘, 再对哑指标求和."""    a_axes, b_axes = axes    rest_a = [i for i in range(A.ndim) if i not in a_axes]    rest_b = [i for i in range(B.ndim) if i not in b_axes]    out_shape = tuple(A.shape[i] for i in rest_a) + tuple(B.shape[i] for i in rest_b)    out = np.zeros(out_shape, dtype=np.float64)    for a_idx in np.ndindex(A.shape):        for b_idx in np.ndindex(B.shape):            if all(a_idx[ia] == b_idx[ib] for ia, ib in zip(a_axes, b_axes)):                o_idx = tuple(a_idx[i] for i in rest_a) + tuple(b_idx[i] for i in rest_b)                out[o_idx] += A[a_idx] * B[b_idx]    return out  A = np.arange(24, dtype=float).reshape(2, 3, 4)   # A[i, j, k]B = np.arange(60, dtype=float).reshape(4, 3, 5)   # B[k, j, m]manual = contract_by_loop(A, B, ([1, 2], [1, 0]))fast = np.einsum('ijk,kjm->im', A, B)print("手动结果与 einsum 一致:", np.allclose(manual, fast)) M = np.random.rand(4, 4)print("迹等价:", np.allclose(np.einsum('ii->', M), np.trace(M))) X = np.random.rand(3, 4)Y = np.random.rand(4, 5)print("矩阵乘法等价:", np.allclose(np.einsum('ij,jk->ik', X, Y), X @ Y))
目的:手写循环实现张量缩并,验证它和 NumPy 的 einsum 完全一致,并展示缩并与迹、矩阵乘法之间的等价关系。
  1. out = np.zeros(out_shape, dtype=np.float64)先按结果形状清出一块空地,预备累加。
  2. for a_idx in np.ndindex(A.shape)依次访问 A 的每一个元素,检查它是否该与 B 的某个元素配对。
  3. if all(a_idx[ia] == b_idx[ib] for ia, ib in zip(a_axes, b_axes))只有当哑指标处的索引完全相同时,两个元素才握手。
  4. out[o_idx] += A[a_idx] * B[b_idx]乘积累加进输出位置,这就是缩并的内核动作。
  5. fast = np.einsum('ijk,kjm->im', A, B)用 einsum 字符串一次完成相同的缩并。
  6. np.allclose(manual, fast)比较手写结果与 einsum 结果,确认两者数学上一致。

常见误区

误区矩阵乘法我熟得很,张量缩并无非就是换个名字罢了。神经网络里到处是矩阵乘,从没听说谁在“做缩并”。

正解矩阵乘法只是缩并在二阶张量上共享一个指标的特例。高阶张量可以缩并多个指标,可以把两个三阶张量缩成四阶,还可以让矩阵的两个指标自己互握得到迹,这些都不是矩阵乘法能直接表达的。把特例当全部,就像见过一次握手就说所有人际交往都是握手。

为何常见:深度学习框架里最常见的运算就是矩阵乘,初学者自然容易用一个高频特例去理解整个家族。

误区爱因斯坦求和约定里反正有指标要自动求和,那写成 `'ij,jk->ik'` 还是 `'ij,jk->ki'` 应该无所谓吧,结果都一样。

正解哑指标(被求和的 j)顺序确实无所谓,但输出中自由指标的排列顺序决定结果张量的形状与数据布局。'ik' 和 'ki' 输出的就是转置关系。指标顺序像握手的左右手位置,左手握右手和右手握左手,合影效果截然不同。

为何常见:因为“重复指标可交换”是正确的,人们容易把这个局部结论过度泛化到所有指标上。

误区两个张量相乘好像应该让信息变多、维度变大,所以缩并之后参与的维度都应该留在输出里。

正解缩并的方向恰恰相反。被指定的哑指标在乘累加中完成使命,从输出中消失;输出只保留未参与握手的自由指标。每缩并一对指标,张量的阶数就减少一,例如二阶×二阶共享一个指标后仍是二阶。就像握手时两只手扣在一起看不见了,剩下的是合并后的新角色。

为何常见:日常直觉里“相乘增加复杂度”,而缩并强调“配对后合并”,这种反直觉的维度收缩容易让人记混。

误区einsum 的字符串要解析、要拆解,用起来舒服但性能肯定不如手写循环或者直接调矩阵乘法。

正解现代 numpy 与 PyTorch 的 einsum 实现了下标解析和路径优化,能自动判断哪些缩并可复用 BLAS 矩阵乘,还能避免先广播再求和带来的中间张量内存爆炸。合理使用时它既简洁又高效。当然,某些极端形状下手写优化循环可能更快,但“einsum 一定慢”是刻板印象。

为何常见:从“Python 字符串解析开销大”的直觉出发,容易低估底层 C 程序与 BLAS 的优化能力。

面试题

Q1. 张量缩并的本质操作是什么?

单选题 · easy

  • A.对应元素相加
  • B.对应元素相乘
  • C.配对乘后累加← 正确答案
  • D.拼接两个数组

答案:C。缩并 = 匹配共享维度 → 逐项相乘 → 累加求和。A 只有加法、B 只有乘法、D 是拼接,均未抓住“乘后累加”的灵魂。它像握手仪式:手指对上后要乘积相加,而不只是碰一下。

Q2. 在爱因斯坦求和约定中,重复出现的指标叫什么?

单选题 · easy

  • A.自由指标
  • B.哑指标← 正确答案
  • C.角标张量
  • D.动态指标

答案:B。重复出现两次的指标自动求和,称为哑指标;没有重复、保留在输出中的是自由指标。哑指标像握完手就消失的那只手,只参与过程,不出现在结果里。

Q3. 矩阵乘法 C=AB 等价于下列哪种缩并描述?

单选题 · mid

  • A.沿 A 行指标与 B 列指标缩并
  • B.沿 A 列指标与 B 行指标缩并← 正确答案
  • C.沿 A 行指标与 B 行指标缩并
  • D.沿 A 列指标与 B 列指标缩并

答案:B。标准矩阵乘法要求 A 的列数与 B 的行数相等,缩并掉这对共享维度。A 选项会变成另一种矩阵组合,C、D 则完全违反维数匹配。记住:列对行,握手才握得上。

Q4. 对 4×4 矩阵 M 计算迹,相当于哪种缩并?

单选题 · mid

  • A.与自身转置共享两指标缩并
  • B.把行列视为自由指标不动
  • C.把两个指标视为哑指标缩并← 正确答案
  • D.沿对角线分成两个三角矩阵

答案:C。迹 $tr(M)=M_{ii}$,就是让行指标和列指标作为同一个哑指标自己与自己握手,得到标量。A 描述的是 Frobenius 内积,B 没有发生缩并,D 只是几何分解。

Q5. einsum('ij,jk->ik', A, B) 与下列哪个表达式等价?

单选题 · mid

  • A.逐元素相乘再全部求和
  • B.矩阵乘法 A 乘 B← 正确答案
  • C.对 A 求矩阵的迹
  • D.逐元素相乘不进位

答案:B。字符串中 j 出现两次自动求和,结果是保留 i、k 的二阶张量,这正是矩阵乘法 $C=AB$。A 等价于把 A 和 B 逐元素乘完再全体求和,D 是逐元素相乘,C 是迹,都不是这个缩并。

Q6. 下列哪些操作本质上属于张量缩并?

多选题 · easy

  • A.计算向量的内积← 正确答案
  • B.进行矩阵的乘法← 正确答案
  • C.求解矩阵的迹← 正确答案
  • D.对矩阵逐元素平方

答案:ABC。向量内积是两个一阶张量共享唯一指标缩并成标量;矩阵乘法是共享一个指标缩并成二阶;矩阵迹是行、列自缩并成标量。逐元素平方不涉及配对求和,不是缩并。

Q7. 关于缩并后的维度,下列说法正确的是?

多选题 · mid

  • A.哑指标会从输出中消失← 正确答案
  • B.自由指标会保留在输出中← 正确答案
  • C.输出维度等于输入维度之和
  • D.缩并掉一对指标,张量阶数减一← 正确答案

答案:ABD。哑指标完成乘累加使命后从输出消失,自由指标原样保留;每缩并一对指标,阶数减一。C 是错误说法,输出维度并不等于输入维度的简单相加,而是由保留的自由指标决定。

Q8. 在注意力公式 Attention(Q,K,V)=softmax(QK^T/√d)V 中,哪些步骤包含张量缩并?

多选题 · mid

  • A.Q 与 K 转置的矩阵乘法← 正确答案
  • B.Softmax 逐行归一化
  • C.注意力权重与 V 做矩阵乘法← 正确答案
  • D.除以根号维度做缩放

答案:AC。QK^T 沿特征维做矩阵乘法,是一次缩并;权重与 V 再乘也是缩并。Softmax 是逐元素归一化,除以√d 是标量缩放,都不涉及配对求和。

Q9. 张量网络中的“边”代表什么?

单选题 · hard

  • A.输出结果的维度
  • B.待缩并的哑指标← 正确答案
  • C.张量内部的数值
  • D.网络训练的误差

答案:B。张量网络中节点是张量,边是两个节点共享的指标。缩并时沿边做乘累加,就像握手时连接两人的那只手。边不表示输出维度、数值大小或训练误差,而是缩并发生的通道。

Q10. 下列哪项最能说明“缩并顺序影响计算代价”?

单选题 · extreme

  • A.不同顺序会得到不同数值
  • B.不同顺序会改变结果形状
  • C.矩阵链乘括号影响乘法数← 正确答案
  • D.缩并顺序只影响显存占用

答案:C。矩阵乘法是缩并的特例,矩阵链乘中括号的放置方式(即缩并顺序)不同,乘法次数可相差多个数量级,但最终数值与形状不变。A、B 错误,D 把影响只归结为显存,忽视了计算时间的巨大差异。