Python Numpy一维向量转置:反向传播计算w梯度得标量的解决方案
问题根因
NumPy中一维数组的转置操作不会改变数组维度:你定义的x = np.array([5, 6])是shape为(2,)的一维数组,x.T的shape仍然为(2,);grad和y形状一致,同样是(2,)的一维数组。二者做@运算时会被识别为向量点积,自然输出单个标量,无法得到2×2的梯度矩阵。
解决方案
以下是几种常用的可行方案:
- 方案1:显式为一维数组增加维度,转为二维矩阵后做运算
可以用reshape或者np.newaxis(别名None)实现维度扩展,示例代码如下:# 方法1.1 用reshape指定维度 grad_col = grad.reshape(-1, 1) # 转为shape(2,1)的列向量 x_row = x.reshape(1, -1) # 转为shape(1,2)的行向量 w_grad = grad_col @ x_row # 输出shape(2,2),符合要求 # 方法1.2 用np.newaxis简写 w_grad = grad[:, np.newaxis] @ x[np.newaxis, :] # 也可以写为 grad[:, None] @ x[None, :],效果完全一致 - 方案2:直接调用NumPy外积函数
np.outer
两个一维向量的外积刚好等价于「列向量 × 行向量」的矩阵运算,无需手动调整维度,写法最简洁:w_grad = np.outer(grad, x) - 方案3:初始化数组时直接定义为二维矩阵,从根源避免维度歧义
定义x时直接写为shape(2,1)的二维列向量,后续所有运算都会严格按照矩阵规则执行:# 初始化阶段就指定为二维 x = np.array([[5], [6]]) w = np.array([[1, 2], [3, 4]]) y = w @ x # 输出shape(2,1)的二维列向量 grad = np.ones_like(y) # shape同样为(2,1) w_grad = grad @ x.T # x.T为shape(1,2)的行向量,输出shape(2,2)的梯度矩阵
内容的提问来源于stack exchange,提问作者Sam-gege
相关产品推荐
相关产品推荐

