监督学习系统上的输入优化

人工智能 神经网络 人工智能设计 优化
2021-11-03 20:59:04

问题

给定一组对 (X, y),其中 X 属于 R^n 并且 y 属于 R,找到 X 使得关联的 y 最大。

例子

鉴于:

  • (X=(1, 2), y=-9)
  • (X=(-2, 4), y=-36)
  • (X=(-4, 2), y=-24)
  • ...

该算法应该能够检测到应用于 X 的函数是 y=-(X[0]^2+2*(X[1]^2)) 并找到使该函数最大化的输入,在这种情况下为 X =(0,0) 因为 y=0^2+2*0^2=0 并且 0 是最大可能值,因为所有其他值都是负数。

我是如何尝试解决的

我的第一个猜测是创建一个在给定 X 的情况下预测 y 的神经网络,但是在完成之后,我不知道如何优化输入。

问题

在这种情况下是否有任何算法可以帮助?

此外,其他一些监督学习算法会比神经网络更适合这里吗?

2个回答

您可以为此(有点)使用神经网络,并且您已经迈出了正确的第一步 - 训练网络进行预测y给定x(即训练它来逼近函数f这样y=f(x))。因为整个神经网络是可微的(大概),你可以取输入的梯度(一些x) 相对于预测的输出。然后你可以用它来更新x与您在网络训练期间更新权重的方式相同。这使您可以从x. 我不知道用这样的神经网络找到全局最优值的方法,除了在许多附近找到局部最优值x的,然后采取最好的那些。

如果您想要一个具体的示例,请查看使用 PyTorch 进行神经样式迁移的教程:这里您有一个噪声图像作为输入,并对其进行优化以最小化与参考样式图像的“样式距离”和“内容距离” " 到参考内容图像(即从噪声开始,使其看起来像一张图像的内容,但采用另一张图像的风格)。那里有完整的代码,但这里有一个简短的 PyTorch 片段,显示了主要思想:

# I'm just optimizing one input; clone so that you don't modify the
# original tensor; let it know that we want gradients computed
inputs = train_inputs[0:1].clone().requires_grad_()
input_optimizer = torch.optim.Adam([inputs])

def optimize_input():
    input_optimizer.zero_grad()
    # where `model` is your trained neural network
    output = model(inp)
    (-output).backward()
    return output

output = []
for _ in range(10000):
    output.append(input_optimizer.step(optimize_input).detach().numpy())

output是在优化输入的每一步之后预测输出的末尾的列表。您可以使用它来查看您是否已经收敛到局部最优值(并根据需要采取更多步骤/下一次更少)。inputs将是最后的优化输入。请注意,如果您的输入应该满足某些约束,您需要自己强制执行这些约束(例如,在神经风格迁移中,他们必须强制这些值对 RGB 图像有效)。

另请注意,它的效果实际上取决于您的网络的近似程度f; 你很可能会得到一些不合理的x网络预测一个非常大的y因为没有类似的训练数据x因此网络不受该区域的限制。一般来说,您可能应该谨慎对待x您生成的这种方式似乎与您的训练数据不相似(例如,具有比任何数据更大/更小的值x网络以前见过;插值比外插容易得多)。

我假设您有一个数据集;如果您能够查询y给定的值x的,那么你可能想看看贝叶斯优化 - 本质上是试图找到的领域x最大化y=f(x)什么时候f评估起来很昂贵,而且你没有梯度。贝叶斯优化寻求全局最优。

您真的需要神经网络从数据中返回最大值吗?这个算法帮不了你?

xdata = [
    (1, 2),
    (-2, 4),
    (-4, 2),
]

for test in list_tests:
    y = -(test[0]^2+2 * (test[1]^2))
    if y > 0:
        print("(X(%s, %s), y=%s)" % (test[0], test[1], y))

输出:

(X(-2, 4), y=16)
(X(-4, 2), y=2)