在 Python 的 for 循环中手动编写逻辑 SGD——我的解释正确吗?

问题描述 投票:0回答:1

我正在遵循 SGD 的步骤,但不确定我是否正确解释了这些步骤。

假设有两个 w 项:

equation1

其中

x
是张量,
w
是两个逻辑函数参数。

equation2

目标是找到

argmin(lambda)

SGD 公式如下:

equation3

这是我到目前为止的代码,有库限制:

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?

python torch
1个回答
0
投票

此代码存在多个问题。

  1. 你永远不会计算任何梯度,所以这不是梯度下降。
  2. 梯度下降始终更新参数值,而不仅仅是在
    lambda < lambda_min
    时更新。顺便说一句,
    lambda
    是一个关键字,不能用作变量名。
  3. w2 = w1 - torch.mul(0.01, lambda_min)
    不是梯度下降步骤:
    1. 梯度下降将新的
      w2
      设置为等于旧的
      w2
      加上一些调整。您的代码将其设置为等于
      w1
      (!) 加上一些调整。
    2. 该调整应该是缩放后的负梯度。在您的代码中,它是损失函数的缩放值,而不是梯度。
    根据你的逻辑函数公式,
  4. (1 + yy) * torch.log(1 - p_x)
  5. 应该是
    (1 - yy) * torch.log(1 - p_x)
    (注意“
    1
    yy”部分)。
    
        
© www.soinside.com 2019 - 2024. All rights reserved.