在线性代数与机器学习领域,矩阵向量相乘是最基础且最重要的运算之一。它不仅是理解高维空间变换的钥匙,也是神经网络前向传播的核心计算逻辑。许多初学者在面对复杂的矩阵乘法时容易混淆维度,因此,明确矩阵向量相乘公式的定义是掌握后续所有高级应用的第一步。
设 A 是一个 m × n 的矩阵,x 是一个 n × 1 的列向量。它们的乘积 y = Ax 是一个 m × 1 的列向量。
其中 A ∈ ℝm×n, x ∈ ℝn, y ∈ ℝm
如果 x 是一个行向量(1 × n),则通常写作 x^T A^T 或 xA(取决于约定),但在深度学习的标准定义中,我们通常默认向量为列向量。
在进行矩阵向量相乘之前,必须检查维度是否兼容。这是编程报错(如 NumPy 的 Shape Mismatch)最常见的原因。
| 操作类型 | 矩阵 A 的维度 | 向量 x 的维度 | 结果 y 的维度 | 是否合法 |
|---|---|---|---|---|
| 矩阵 × 列向量 | m × n | n × 1 | m × 1 | ✅ 合法 |
| 矩阵 × 行向量 | m × n | 1 × n | ❌ 非法 | ❌ 非法 (需转置) |
| 行向量 × 矩阵 | 1 × m | m × n | 1 × n | ✅ 合法 |
| 向量 × 向量 (内积) | 1 × n | n × 1 | 1 × 1 (标量) | ✅ 合法 (点积) |
理解矩阵向量相乘公式不仅要知道结果是什么,更要清楚计算过程。我们可以通过两种视角来理解:线性组合法和点积法。
将矩阵 A 看作是由 n 个列向量 a_1, a_2, ..., a_n 组成的。那么 Ax 的结果就是这些列向量的线性组合,组合系数正是向量 x 中的元素。
优势:这种方法在几何意义上更直观,它表明矩阵乘法本质上是在对基向量进行缩放和旋转,最后求和。在理解神经网络的特征提取时,这种视角至关重要。
这是大多数教材介绍的方法。结果向量 y 中的第 i 个元素 y_i,等于矩阵 A 的第 i 行与向量 x 的点积(Dot Product)。
优势:便于计算机实现,因为现代CPU和GPU的矩阵乘法单元(MMU)通常基于行-列点积优化。
计算以下矩阵向量相乘:
使用线性组合法:
y = 7 [1, 3, 5]^T + 8 [2, 4, 6]^T
y = [7, 21, 35]^T + [16, 32, 48]^T
y = [23, 53, 83]^T
使用点积法:
y_1 = 17 + 28 = 23
y_2 = 37 + 48 = 53
y_3 = 57 + 68 = 83
为什么我们要学习矩阵向量相乘公式?因为从几何角度看,矩阵乘法是一种线性变换(Linear Transformation)。它将空间中的点(向量)移动到新的位置,或者改变空间的形状。
如果矩阵 A 是对角矩阵,例如 diag(2, 2),那么 Ax 会将向量 x 的长度拉伸为原来的2倍,方向不变。
旋转矩阵 R = [[cosθ, -sinθ], [sinθ, cosθ]] 作用于向量 x,会将其在二维平面上逆时针旋转 θ 角度。这是计算机图形学的基础。
投影矩阵会将向量映射到某个子空间上。例如,将3D空间中的点投影到2D平面上,这在PCA(主成分分析)降维中非常常见。
许多工程师在调试神经网络时,如果只关注代数运算,很难理解为什么权重矩阵会收敛或发散。理解矩阵向量相乘的几何意义,能帮助你直观地感知数据在高维空间中的流动和变形。
在实际的人工智能和数据分析工作中,我们很少手动计算矩阵向量相乘公式,而是使用高效的库。以下是 Python 中 NumPy 库的标准实现方式。
import numpy as np定义矩阵 A (3x2)
A = np.array([[1, 2], [3, 4], [5, 6]])定义向量 x (2,)
x = np.array([7, 8])使用 @ 运算符进行矩阵向量相乘
y = A @ x print("结果 y:", y)输出: [23 53 83]
import numpy as np
A = np.array([[1, 2],
[3, 4],
[5, 6]])
x = np.array([7, 8])
使用 dot 函数
y = np.dot(A, x)
print("结果 y:", y)
import numpy as np假设我们有一个批量数据,A 是 (Batch_Size, Features)
我们想对每一行应用同一个权重向量 w
A_batch = np.random.rand(10, 5) w = np.random.rand(5)方法:使用 apply_along_axis (效率较低,不推荐用于大规模计算)
更推荐的方式是直接矩阵乘法: A_batch @ w
y_batch = A_batch @ w print("批量处理结果形状:", y_batch.shape)
矩阵向量相乘不仅仅是数学题,它是现代科技的基石。以下是几个核心领域的应用解析。
在深度学习中,一个全连接层(Dense Layer)的计算本质上就是 y = Wx + b。其中 W 是权重矩阵,x 是输入向量,b 是偏置向量。理解这个矩阵向量相乘公式是理解反向传播梯度推导的前提。
3D 游戏和 CAD 软件使用 4x4 矩阵(齐次坐标)来执行旋转、缩放和平移。每一个顶点的变换都是矩阵向量相乘的结果。GPU 的并行架构正是为了加速这一运算而设计的。
在协同过滤中,用户-物品评分矩阵与用户偏好向量的乘法,可以预测用户对未评分物品的喜好程度。这是 Netflix 或 Amazon 推荐算法的底层逻辑之一。
PCA 降维的核心步骤是将数据矩阵投影到主成分向量上。这个过程涉及大量的矩阵向量相乘,目的是在高维数据中找到方差最大的方向。
以下是关于矩阵向量相乘公式最常见的疑问及其深度解答。
A: 是的。如果矩阵是 m×n,向量是 n×1,结果一定是 m×1 的列向量。如果向量是行向量 1×n,结果通常是 1×m 的行向量(取决于具体定义,但在标准线性代数中,矩阵左乘列向量是标准形式)。
A: 记住“中间维度必须相等”。对于 A(m×n) 和 B(n×p),中间的 n 必须一致。对于矩阵向量乘法,矩阵的列数必须等于向量的维度(行数)。
A: 非常快。NumPy 底层使用 C 和 Fortran 编写的 BLAS(基本线性代数子程序)库,并利用 SIMD 指令集和 GPU 加速。对于大规模数据,速度差异可达数百万倍。
A: 严格来说,NumPy 的 @ 运算符不支持广播。但在使用 运算符时,广播机制允许标量或向量与矩阵进行逐元素运算。在矩阵乘法中,如果需要对每一行加偏置,通常先计算 Ax,再利用广播机制加 b。
A: 如果已知 y = Ax 和 A,求 x 的问题称为线性方程组求解。如果 A 是可逆方阵,则 x = A^(-1)y。如果 A 不是方阵,可以使用伪逆(Moore-Penrose Pseudoinverse)求解最小二乘解。