代码之家  ›  专栏  ›  技术社区  ›  Stepan Yakovenko

LBFGS在pytorch中从来没有大尺寸收敛

  •  1
  • Stepan Yakovenko  · 技术社区  · 6 年前

    enter image description here

    从00000000….1开始,最后得到以下序列:

    enter image description here

    出于好奇,我决定用多项式来近似这些规则,这样细胞不仅可以是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,否则返回正的非零值。

    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步内收敛到正确的解:

    enter image description here

    但如果我用15*15的板,它永远不会收敛:

    enter image description here

    UPD:改进的收敛图,SOS日志:

    enter image description here

    enter image description here

    我在C++中使用这个代码进行优化:

    find_min_using_approximate_derivatives(bfgs_search_strategy(),
            objective_delta_stop_strategy(1e-87),
            s, x, -1)
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   Yngve Moe    6 年前

    你要做的是非凸优化,这是一个众所周知的难题。一旦你想到它,它是有意义的,因为几乎任何实际的数学问题都可以表述为一个优化问题。

    一。序曲
    所以,在给你提示在哪里可以找到解决你特定问题的方法之前,我想说明为什么某些优化问题很容易解决。

    YouTube

    那么,如果非凸优化是如此困难的话,为什么我们能够在深入学习中解决它呢?答案很简单,我们在深入学习中最小化的非凸函数,如 Henaff et al .

    2。回答你的问题
    现在要回答你的问题,你可能不会找到快速的解决方案,因为非凸优化是NP完全的。但不用担心,SciPy有一些全局优化算法可供选择。 Here 是指向另一个堆栈溢出线程的链接,并给出了问题的正确答案。


    最后,我想提醒大家,收敛性保证是很重要的,忘记了它已经导致 oil rig collapsing

    附言。

    更新: 至于BFGS与dlib的协同工作,可能有两个原因:一是BFGS比L-BFGS更善于利用曲率信息,二是利用线搜索来寻找最优步长。我建议检查PyTorch是否允许行搜索,如果不允许,则设置一个减小的步长(或一个非常低的步长)。