PyTorch反向传播的数值等价

时间:2019-06-24 18:25:37

标签: python pytorch

我用numpy编写了简单的神经网络后,我想将其与PyTorch内插法进行数值比较。独自运行,似乎我的神经网络实现收敛了,所以似乎没有错误。 我也检查了与PyTorch的正向通行证匹配,因此基本设置正确。

但是反向传播时会发生一些不同的情况,因为一次反向传播后的权重是不同的。

我不想在此处发布完整的代码,因为它已链接到多个.py文件,并且大多数代码与该问题无关。我只想知道PyTorch “基本”梯度下降还是其他一些东西。

我正在查看有关最后一层的全连接权重的最简单示例,因为如果不同,则进一步也会有所不同:

self.weight +=  self.learning_rate * hidden_layer.T.dot(output_delta )

其中

output_delta  = self.expected -  self.output

self.expected是期望值, self.output是前传结果

这里没有激活或其他内容。

过去的火炬是:

optimizer = torch.optim.SGD(nn.parameters() , lr = 1.0)

criterion = torch.nn.MSELoss(reduction='sum')   


output = nn.forward(x_train)


loss = criterion(output, y_train)

loss.backward()

optimizer.step()

optimizer.zero_grad()

因此,通过SGD优化器和MSELoss,它可能使用一些不同的增量或反向传播功能,而不是上面提到的基本功能吗?如果是这样,我想知道如何用pytorch数值检查我的numpy解决方案。

1 个答案:

答案 0 :(得分:1)

  

我只想知道PyTorch是“基本”梯度下降还是其他变化。

如果设置torch.optim.SGD,则意味着随机梯度下降。 您在GD上有不同的实现,但是PyTorch中使用的实现适用于迷你批处理。

有些GD实现会在整个时期之后优化参数。您可能猜到它们非常“慢”,这对于超级计算机进行测试可能非常有用。有GD实现可用于每个样本,因为您可能会认为它们的不完善之处是“巨大的”梯度波动。

这些都是相对术语,因此我使用的是“”

请注意,您使用的学习率过高,例如lr = 1.0,这意味着您一开始并未对数据进行规范化,但这是您可能会随时间推移而掌握的一项技能。

  

那么有可能通过SGD优化器和MSELoss使用一些不同的增量或反向传播功能,而不是上面提到的基本功能吗?

它使用您所说的话。

以下是PyTorch和Python中的示例,以显示对梯度的检测按预期进行(用于反向传播):

x = torch.tensor([5.], requires_grad=True);
print(x) # tensor([5.], requires_grad=True)

y = 3*x**2
y.backward()
print(x.grad) # tensor([30.]) 

如何用普通的python将此值设置为30?

def y(x):
    return 3*x**2

x=5
e=0.01 #etha
g=(y(x+e)-y(x))/e 
print(g) # 30.0299

正如我们期望的那样,如果达到{30},etha越小越好。