我正在遵循 SGD 的步骤,但不确定我是否正确解释了这些步骤。
假设有两个 w 项:
其中
x
是张量,w
是两个逻辑函数参数。
目标是找到
argmin(lambda)
SGD 公式如下:
这是我到目前为止的代码,有库限制:
import numpy as np
import torch
some_data = torch.rand(1000, 2)
x = some_data[:,0]
y = (x + 0.4 * some_data[:,1] > 0.5).to(torch.int) # doesn't work with bool?
x = torch.split(x, 3) # batch
y = torch.split(y, 3)
# optim problem
w1 = torch.autograd.Variable(torch.tensor([0.1]), requires_grad=True)
w2 = torch.autograd.Variable(torch.tensor([0.1]), requires_grad=True)
lambda_min = torch.zeros(1)
for epoch in range(10):
#print(f'epoch: ', epoch)
for xx, yy in zip(x, y):
p_x = 1 / (1 + torch.exp(-w1 - (torch.mul(w2, x))))
# NLL
lambda = torch.sum(yy * torch.log(p_x) + (1 + yy) * torch.log(1 - p_x))
# Gradient???
if lambda < lambda_min :
lambda_min = lambda # Q: loss value, right?
# Q: update params...?
w2 = w1 - torch.mul(0.01, lambda_min)
print(f'w2 = ', w2)
else:
pass
我想用“Q:”确认零件 那么我如何用
y
和 x
来绘制它,使其看起来像带有张量的常规逻辑函数,与下面类似,但图中包含所有 1 和 0?
此代码存在多个问题。
lambda < lambda_min
时更新。顺便说一句,lambda
是一个关键字,不能用作变量名。w2 = w1 - torch.mul(0.01, lambda_min)
不是梯度下降步骤:
w2
设置为等于旧的w2
加上一些调整。您的代码将其设置为等于 w1
(!) 加上一些调整。(1 + yy) * torch.log(1 - p_x)
(1 - yy) * torch.log(1 - p_x)
(注意“1
减
yy
”部分)。