我用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解决方案。
答案 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
越小越好。