是否使用转置 完全取决于对矩阵维度和乘法顺序的定义,核心是让矩阵乘法的维度能 “对得上”。以下从两个角度拆解:
矩阵相乘要求 左矩阵的列数 = 右矩阵的行数。只要满足这个规则,用不用转置、怎么定义矩阵维度,都可以灵活调整。
- 输入 \(\boldsymbol{x}\) 维度:\([\text{batch_size}, \text{in_features}]\)(比如 \(1 \times 3\) )
- 权重矩阵 A 维度:\([\text{out_features}, \text{in_features}]\)(比如 \(5 \times 3\) )
- 此时 \(A^T\) 维度是 \([\text{in_features}, \text{out_features}]\)(\(3 \times 5\) ),所以 \(\boldsymbol{x} \times A^T\) 维度是 \([1 \times 3] \times [3 \times 5] = [1 \times 5]\),满足需求。
如果不想转置,只要让 左矩阵列数 = 右矩阵行数 即可。比如:
- 重新定义权重矩阵为 \(A'\),维度设为 \([\text{in_features}, \text{out_features}]\)(\(3 \times 5\) )
- 此时公式直接写成 \(\boldsymbol{y} = \boldsymbol{x} \times A' + b\),因为 \([1 \times 3] \times [3 \times 5] = [1 \times 5]\),完全合法。
-
深度学习框架(如 PyTorch、TensorFlow):
很多框架里,全连接层的权重矩阵默认定义为 \([\text{out_features}, \text{in_features}]\),所以计算时会用转置(或等价的矩阵乘法顺序)来适配输入维度。本质是框架开发者选择了一种 “约定俗成” 的维度定义方式。
-
数学教材 / 论文:
可能直接把权重矩阵定义为 \([\text{in_features}, \text{out_features}]\),公式里就不用转置,直接相乘。
是否用转置 不影响数学本质,只是 矩阵维度定义和乘法顺序的选择。只要满足 “左列数 = 右行数”,用 A 还是 \(A^T\) 都能实现全连接层的线性变换。核心是让输入和权重矩阵 “对得上维度”,框架 / 教材的不同写法,本质是同一件事的不同表达~