PyTorch中随机初始化的w和b的损失梯度取值相同的原因是什么
这个现象和参数初始化没有任何关系,完全是输入全1的特性导致的,原理推导如下:
- 首先明确前向计算逻辑:你的输入
x是长度为5的全1向量,和形状为(5,3)的权重w做矩阵乘法时,输出z的第j个元素就是w第j列所有元素的和,再加上对应位置的偏置b[j],即z_j = sum_{i=0}^4 w[i][j] + b[j] - 接下来推导梯度计算规则:你使用的
binary_cross_entropy_with_logits损失,对logit值z_j的梯度可以简化为sigmoid(z_j) - y_j,这里标签y_j全为0,所以上游梯度直接等于sigmoid(z_j),我们记为g_j:- 偏置
b的梯度就是上游梯度本身:因为z对b[j]的偏导数为1,所以b.grad[j] = g_j,和你输出的结果完全匹配 - 权重
w[i][j]的梯度等于上游梯度乘z对w[i][j]的偏导,而后者就是输入x的第i个值。由于你输入x的所有元素都为1,所以不管i取什么值,w[i][j]的梯度都是g_j,最终就表现为w的所有行取值完全相同,且和b的梯度一致。
- 偏置
你可以做简单验证:修改x的任意元素为非1值,比如设置x[0] = 2,再运行代码就会发现w第一行的梯度是其他行的2倍,符合常规的梯度计算逻辑。
内容的提问来源于stack exchange,提问作者Hossein
相关产品推荐
相关产品推荐

