从向量到张量图解‘内积’、‘外积’与‘克罗内克积’在PyTorch/TensorFlow里的那些事儿当你第一次在PyTorch或TensorFlow中看到torch.matmul、tf.tensordot、*这些运算符时是否感到困惑它们有什么区别什么时候该用哪一个本文将用直观的图解和代码示例带你理清这些概念让你在编写神经网络模型时能够游刃有余。1. 向量运算从基础到框架实现1.1 内积点积神经网络中的基础构建块内积Inner Product也称为点积Dot Product是深度学习中最基础的运算之一。在PyTorch和TensorFlow中实现向量内积有多种方式# PyTorch实现 import torch a torch.tensor([1, 2, 3]) b torch.tensor([4, 5, 6]) dot_product torch.dot(a, b) # 32 dot_product_alt torch.sum(a * b) # 等价实现 # TensorFlow实现 import tensorflow as tf a tf.constant([1, 2, 3]) b tf.constant([4, 5, 6]) dot_product tf.tensordot(a, b, axes1) # 32内积在神经网络中的应用场景包括全连接层的计算注意力机制中的query-key相似度计算损失函数如余弦相似度的实现注意框架中的dot函数通常只支持一维向量的点积运算。对于更高维度的张量需要使用matmul或tensordot。1.2 外积两种容易混淆的概念在中文语境中外积实际上对应着两个不同的数学概念Outer Product张量积结果是一个矩阵计算方式列向量 × 行向量框架实现# PyTorch a torch.tensor([1, 2, 3]) b torch.tensor([4, 5]) outer torch.outer(a, b) # 3x2矩阵 # TensorFlow outer tf.tensordot(a, b, axes0)Exterior Product叉积/叉乘仅适用于3D空间中的向量结果是一个垂直于输入向量的新向量框架实现# PyTorch a torch.tensor([1, 0, 0]) b torch.tensor([0, 1, 0]) cross torch.cross(a, b) # [0, 0, 1] # TensorFlow cross tf.linalg.cross(a, b)特性Outer ProductExterior Product输入维度任意向量仅3D向量输出维度矩阵向量数学符号⊗×主要应用特征交互、核方法3D图形学、物理模拟2. 矩阵运算从基础概念到框架API2.1 矩阵乘法神经网络的核心运算矩阵乘法matmul是深度学习中最常见的运算之一。在框架中有几种等效的实现方式# PyTorch A torch.randn(2, 3) B torch.randn(3, 4) matmul torch.matmul(A, B) # 2x4 matmul_alt A B # 等效写法 # TensorFlow matmul tf.matmul(A, B)矩阵乘法在神经网络中的应用包括全连接层的前向传播卷积运算的im2col实现注意力机制中的QKV变换2.2 逐元素乘法与哈达玛积逐元素乘法Element-wise Multiplication和哈达玛积Hadamard Product实际上是相同的概念# PyTorch A torch.randn(2, 2) B torch.randn(2, 2) hadamard A * B # 逐元素相乘 # TensorFlow hadamard tf.multiply(A, B)应用场景注意力权重与value的加权门控机制如LSTM中的门控数据增强中的掩码操作3. 高阶张量运算克罗内克积与张量缩并3.1 克罗内克积矩阵的升维运算克罗内克积Kronecker Product是一种将两个矩阵组合成更大矩阵的运算# PyTorch实现 def kronecker(A, B): return torch.einsum(ab,cd-acbd, A, B).reshape(A.size(0)*B.size(0), A.size(1)*B.size(1)) # TensorFlow实现 def kronecker(A, B): return tf.reshape(tf.einsum(ab,cd-acbd, A, B), [A.shape[0]*B.shape[0], A.shape[1]*B.shape[1]])克罗内克积在深度学习中的应用卷积神经网络中的膨胀卷积Dilated Convolution某些类型的注意力机制参数矩阵的结构化扩展3.2 张量缩并einsum的强大威力爱因斯坦求和约定einsum是处理高阶张量运算的利器# 矩阵乘法 torch.einsum(ij,jk-ik, A, B) # 批量矩阵乘法 torch.einsum(bij,bjk-bik, batch_A, batch_B) # 注意力分数计算 torch.einsum(bqd,bkd-bqk, Q, K)常见缩并模式及其应用缩并模式等效运算应用场景ij,jk-ik矩阵乘法全连接层bij,bjk-bik批量矩阵乘序列模型bqd,bkd-bqk矩阵乘转置注意力分数bhqd,bhkd-bhqk多头注意力Transformer4. 实战应用从理论到代码实现4.1 自注意力机制中的各种积让我们看看这些运算如何在Transformer的自注意力机制中发挥作用def scaled_dot_product_attention(Q, K, V, maskNone): Q, K, V的形状: (batch_size, seq_len, d_model) d_k Q.size(-1) # 计算注意力分数内积的批量版本 scores torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(d_k) if mask is not None: scores scores.masked_fill(mask 0, -1e9) # 计算注意力权重softmax attention_weights torch.softmax(scores, dim-1) # 应用注意力权重到V上加权求和 output torch.matmul(attention_weights, V) return output, attention_weights在这个实现中我们使用了matmul计算query和key的相似度本质是批量内积逐元素运算softmax和masking最后的matmul实现注意力权重对value的加权4.2 核方法中的外积应用外积在核方法中有着重要应用特别是在特征映射方面def polynomial_kernel(X, Y, degree2): 多项式核函数 # 先计算内积 inner torch.matmul(X, Y.T) # 然后加上偏置并取幂 return (inner 1) ** degree def rbf_kernel(X, Y, gammaNone): RBF核函数 if gamma is None: gamma 1.0 / X.size(1) # 计算两两距离 XX torch.sum(X**2, dim1, keepdimTrue) YY torch.sum(Y**2, dim1, keepdimTrue) XY torch.matmul(X, Y.T) distances XX - 2 * XY YY.T return torch.exp(-gamma * distances)在实际项目中选择合适的运算需要考虑以下因素输入张量的形状和维度期望的输出形状计算效率某些运算在特定硬件上更高效数值稳定性如softmax前的缩放