我正在使用Wolfram细胞自动机的规则110。给定零和一线,您可以使用以下规则计算下一行:
从00000000 .... 1开始,最后得到以下序列:
出于好奇,我决定用多项式近似这些规则,以便像元不仅可以是0和1,还可以是介于两者之间的灰色:
def triangle(x,y,z,v0):
v=(y + y * y + y * y * y - 3. * (1. + x) * y * z + z * (1. + z + z * z)) / 3.
return (v-v0)*(v-v0)
因此,如果x,y,z和v0与表中的任何规则匹配,它将返回0,否则返回正非零值。
接下来,我将所有4个邻居的所有可能的组加到一个总和中,对于整数解,该总和为零:
def eval():
s = 0.
for i in range(W - 1):
for j in range(1, W + 1):
xx = x[i, (j - 1) % W]
yy = x[i, j % W]
zz = x[i, (j + 1) % W]
r = x[i + 1, j % W]
s += triangle(xx, yy, zz, r)
for j in range(W - 1): s += x[0, j] * x[0, j]
s += (1 - x[0, W - 1]) * (1 - x[0, W - 1])
return torch.sqrt(s)
同样在此函数的底部,我为第一行添加了普通条件,因此除最后一个元素(即1)外,所有元素均为0。最后,我决定用pytorch最小化W * W矩阵的平方和:
x = Variable(torch.DoubleTensor(W,W).zero_(), requires_grad=True)
opt = torch.optim.LBFGS([x],lr=.1)
for i in range(15500):
def closure():
opt.zero_grad()
s=eval()
s.backward()
return s
opt.step(closure)
这是full code,您可以自己尝试。问题在于,对于10 * 10,它会以约20个步骤收敛到正确的解:
但是,如果我使用15 * 15的纸板,它将永远无法完成收敛:
右图显示了每次下一次迭代的平方和如何变化,您可以看到它从未达到零。我的问题是为什么会发生这种情况,我该如何解决。尝试过使用不同的pytorch优化器,但它们的性能均比LBFGS低。尝试了不同的学习率。有什么想法为什么会发生这种情况,以及如何在优化过程中达到最终目的?
UPD:改进的收敛图,SOS的日志:
UPD2:我也尝试过使用dlib在C ++中执行相同的操作,而且我那里没有任何收敛性问题,它可以用更少的时间深入了解:
我正在使用以下代码在C ++中进行优化:
find_min_using_approximate_derivatives(bfgs_search_strategy(),
objective_delta_stop_strategy(1e-87),
s, x, -1)
最佳答案
您要在此处进行的工作是非凸优化,这是一个非常困难的问题。一旦您考虑了它,就有意义了,因为几乎所有实用的数学问题都可以表述为优化问题。
1.前奏
因此,在向您提示在哪里可以找到特定问题的解决方案之前,我想说明为什么某些优化问题很容易解决。
我将从讨论凸形问题开始。即使在受约束的情况下,也很容易解决这些问题,其原因是,当您计算梯度时,您实际上会获得很多无法达到最小值的信息(凸函数的泰勒展开f总是低估了f),此外,只有一个最小值,没有鞍点。如果您想了解有关凸优化的更多信息,建议您在YouTube上查看Stephen Boyd的凸优化类
现在,如果非凸优化是如此困难,那么我们怎么能在深度学习中解决它呢?答案很简单,我们在深度学习中最小化的非凸函数非常好,如Henaff et al所示。
因此,重要的是,机器学习从业者必须认识到,如果深度学习中使用的操作过程首先收敛到其他非凸问题上的最小值,则它们很可能不会产生很好的最小值。
2.回答你的问题
现在来回答您的问题,因为非凸优化是NP完整的,您可能不会找到快速解决方案。但是不要担心,SciPy有一些全局优化算法可供选择。 Here是到另一个堆栈溢出线程的链接,可以很好地回答您的问题。
3.故事的寓意
最后,我想提醒您,融合保证很重要,忘记了它导致了oil rig collapsing。
PS。请原谅错字,我正在为此使用我的手机
更新:关于BFGS与dlib配合使用的原因,可能有两个原因,首先,BFGS在使用曲率信息方面比L-BFGS更好,其次,它使用线搜索来找到最佳步长。我建议检查PyTorch是否允许进行行搜索,如果不允许,则设置减小的步长(或者只是很小的步长)。
关于python - LBFGS永远不会在火炬中大尺寸收敛,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50621786/