深度学习(非线性优化)
之前做非线性优化一般都是求雅可比矩阵或者数值求导,然后通过高斯牛顿或者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提供的各种优化工具求解。