TensorFlow中input_matrix乘weight_matrix加bias_vector运算为何可行?
你遇到的疑惑本质是深度学习框架对常规矩阵加法规则的扩展实现,也就是广播机制,具体逻辑如下:
仿射变换的整体实现步骤
- 第一步执行标准矩阵乘法:尺寸为
N x M的输入矩阵X与M x U的权重矩阵W做矩阵乘法,得到尺寸为N x U的中间结果矩阵R。其中R的第i行对应输入第i个样本经过权重投影后的输出,共U个维度。 - 第二步执行带广播的逐元素加法:将长度为U的偏置向量
b与R做逐元素相加,得到最终的仿射变换结果。
偏置向量与R的相加规则
你提到的矩阵加法规则是严格的逐元素加法要求,需要两个操作数形状完全一致,而TensorFlow、PyTorch等深度学习框架都实现了广播机制,会自动对形状不匹配但符合广播规则的张量做维度扩展:
- 首先自动将形状为
(U,)的偏置向量b扩展为N x U的矩阵,扩展逻辑是把b的所有元素沿着样本维度(第一个维度)复制N次,扩展后的矩阵每一行都是完全相同的b向量。 - 再对两个形状完全一致的
N x U矩阵执行逐元素相加,最终结果的每个元素满足:output[i][j] = R[i][j] + b[j]。
举个直观的小例子:假设N=2、U=3,偏置b = [0.1, 0.2, 0.3],广播扩展后得到的矩阵为:
[[0.1, 0.2, 0.3], [0.1, 0.2, 0.3]]
再和2×3的R矩阵做逐元素加法即可。
这种设计既符合业务逻辑(同一个输出维度的偏置对所有样本生效),也减少了偏置参数的存储量,不需要存储N×U个偏置值,仅需要存储U个值即可。
对应示例代码的说明
你给出的代码中,矩阵乘法得到的R形状为(10, 2),偏置向量形状为(2,),广播时会把偏置复制10次变成(10, 2)的矩阵再相加,因此最终输出的形状仍然是(10, 2),和代码打印结果一致。
内容的提问来源于stack exchange,提问作者Jared
相关产品推荐
相关产品推荐

