深度学习(非线性优化)

发布时间 2023-10-29 22:00:33作者: Dsp Tian

之前做非线性优化一般都是求雅可比矩阵或者数值求导,然后通过高斯牛顿或者LM迭代求解。

这次用pytorch中的方法求解试试。

下面给一个用pytorch求解的代码,例子是之前文章中的。

import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np

a = [1.0, 2.0, 1.0]
x = np.linspace(start=0, stop=1, num=100)
y = np.exp(a[0]*x*x+a[1]*x+a[2])

par = torch.tensor([0.0, 0.0, 0.0], requires_grad=True)

x = torch.tensor(x)
y = torch.tensor(y)

optimizer = optim.Adam([par], lr=0.4)
lossfun = nn.MSELoss()

for step in range(1000):
    # 前向传播
    outputs = torch.exp(par[0]*x*x+par[1]*x+par[2])
    loss = lossfun(outputs, y)

    # 反向传播和优化
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

    if step % 10==0:
        print(loss.item())

print('result:', par.detach().numpy())

结果也是可以收敛到原始参数上的。

区别应该在于如果有很好的数学求导模型时,依靠雅可比矩阵能够更快的收敛,方便实时计算。

而对于图像识别等更复杂的无法求雅可比矩阵的问题,可以用pytorch提供的各种优化工具求解。