神经网络前向传播中向量-矩阵与矩阵-向量乘法表示疑问
刚入坑深度学习的时候,我也被这个问题绕晕过——明明线性代数课上学的都是矩阵乘向量,怎么到了TensorFlow这类框架里就变成向量乘矩阵了?其实这完全是维度约定差异和工程效率优先的选择,核心逻辑和数学本质我给你拆解清楚:
1. 两种乘法的核心差异:维度枚举逻辑
先明确两种形式的数学定义(假设输入向量维度为m,输出神经元数量为n):
- 线性代数标准(矩阵-向量右乘):
y = W @ x,其中W是n×m矩阵,x是m×1的列向量,输出y是n×1列向量。
这个形式下,我们是按神经元枚举:W的每一行对应一个神经元的权重,计算第i个神经元输出时,取W[i, :]和x做内积。 - 深度学习框架常用(向量-矩阵左乘):
y = x @ W,其中x是1×m的行向量,W是m×n矩阵,输出y是1×n行向量。
这个形式下,我们是按样本特征枚举:W的每一列对应一个神经元的权重,计算第i个神经元输出时,取W[:, i]和x做内积。
本质上两者是数学等价的——把左乘里的W转置,就得到右乘里的W,只是权重的存储顺序反过来了。
2. 框架偏爱左乘的核心原因:批量计算的直观性
深度学习里几乎都是批量处理样本,这是框架选择左乘的关键:
- 线性代数的右乘形式如果要处理
N个样本,需要把每个样本的列向量拼成m×N的矩阵,计算W @ X得到n×N的输出矩阵(每一列是一个样本的结果)。但这种存储方式不符合代码里的直觉——我们通常会把每个样本的特征存成一个一维数组(行向量),批量堆叠后就是N×m的矩阵(每一行是一个样本)。 - 用左乘的话,直接对
N×m的样本矩阵X和m×n的权重矩阵W做X @ W,就能得到N×n的输出矩阵(每一行对应一个样本的输出),完全不需要转置操作,代码写起来更直观,也避免了不必要的张量转置开销。
比如TensorFlow的Dense层,默认权重矩阵的维度是(input_dim, output_dim),就是为了直接和(batch_size, input_dim)的输入张量做左乘,一步得到(batch_size, output_dim)的输出,逻辑链非常顺畅。
3. 参数反向传播的逻辑差异
两种形式对应的反向传播逻辑,本质上只是权重梯度的维度顺序不同:
- 右乘场景:对
W的梯度dy/dW维度是n×m,每个元素dy/dW[i,j]表示第i个神经元对第j个输入特征的权重梯度。 - 左乘场景:对
W的梯度dy/dW维度是m×n,每个元素dy/dW[j,i]表示第j个输入特征对第i个神经元的权重梯度。
你会发现,这两个梯度矩阵其实是转置关系——数学上的梯度计算逻辑完全一致,只是框架根据自己的维度约定,调整了梯度的存储顺序而已,最终的更新效果是等价的。
总结
其实两种乘法形式没有对错,只是应用场景的选择:线性代数的右乘更偏向于单个向量的数学变换,符合传统的数学教学逻辑;而深度学习框架的左乘是为了适配批量样本的行优先存储,让代码更简洁高效,同时保持数学上的等价性。搞清楚维度约定的本质,就不会再被这种“反向”的写法困惑了。
内容的提问来源于stack exchange,提问作者Matias Haeussler
相关产品推荐
相关产品推荐

