使用Pytorch解决普通优化问题

王 茂南 2019年12月15日07:03:47
评论
1293字阅读4分18秒
摘要这一篇文章主要介绍关于使用Pytorch来手动进行优化问题的解决. 这里会使用线性回归作为例子, 使用Pytorch来手动梯度下降, 求出系数w和偏置b.

简介

Pytorch可以对神经网络进行梯度下降并优化网络的参数. 但同时, 对于普通的优化问题, 我们也可以使用Pytorch来进行解决. 即我们也可以利用梯度下降的思路来寻求最优解.

这一篇文章, 会给出一个简单的例子, 来介绍使用Pytorch来手动进行参数的优化.

关于具体的应用, FunkSVD算法, 我们已经在, 基于矩阵分解的协同过滤, 中进行来叙述. 其实相关的代码也是在那里叙述过了, 我们就不再这里过多的叙述了.

 

Pytorch解决普通优化问题

下面我们手动的使用Pytorch, 来进行梯度下降, 优化参数, 得到最优解. 我们看下面一个简单的例子(这个例子来自于下面的参考链接, 参考了部分内容, 但进行了修改).

下面是一个简单的线性回归的问题, 我们用Pytorch来解出参数w和b.

  1. import torch
  2. import torch.optim as optim
  3. from torch.autograd import Variable
  4. w = Variable(torch.randn(3, 5), requires_grad=True# 这里变量的定义需要注意, 是需要梯度的
  5. b = Variable(torch.randn(3), requires_grad=True)
  6. x = Variable(torch.randn(5))
  7. y = Variable(torch.randn(3))
  8. optimizer = optim.SGD([w,b], lr=0.01) # 我们要优化的是w和b两个参数
  9. num_epochs = 100
  10. for epoch in range(num_epochs):
  11.     optimizer.zero_grad()
  12.     y_pred = torch.mv(w, x) + b # torch.mv表示矩阵与向量相乘
  13.     loss = ((y_pred-y)**2).sum()
  14.     loss.backward()
  15.     optimizer.step()
  16.     if epoch % 5 == 0:
  17.         print(loss)
  18. y_pred = torch.mv(w, x) + b
  19. print('y: \n', y)
  20. print('y_pred: \n', y_pred)

最终我们获得了如下的结果, 可以看到我们最终还是很好的求出了w和b的取值.

使用Pytorch解决普通优化问题

参考资料: Manually feeding trainable parameters to the optimizer

 

一些其他操作

矩阵转置

  1. pt_matrix_ex # 原始矩阵
  2. pt_matrix_ex.t() # 转置后的矩阵

参考资料: Transpose A Matrix In PyTorch

 

矩阵相乘

在Pytorch中, 我们使用torch.mm(a,b)来完成矩阵a和矩阵b的相乘. 比如我们希望矩阵P和矩阵Q的转置相乘, 我们就可以写成下面的这个样子.

  1. torch.mm(P, Q.t())

关于矩阵相乘, 参考资料: Pytorch中的矩阵相乘

 

矩阵与向量相乘

关于矩阵与向量相乘使用torch.mv来进行运算. 与矩阵相乘的区别可以看下面的例子.

使用Pytorch解决普通优化问题

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2019年12月15日07:03:47
  • 转载请务必保留本文链接:https://mathpretty.com/11519.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: