使用已知目标函数实现梯度下降

Posted

技术标签:

【中文标题】使用已知目标函数实现梯度下降【英文标题】:Implementing gradient descent on with known objective function 【发布时间】:2020-08-18 03:41:11 【问题描述】:

我有一篇论文中的目标函数,我想通过梯度下降来最小化它。我还没有“从头开始”做这件事,并且想要一些关于如何手动编码的建议。目标函数为:

T(L) = tr(X.T L^s X) - beta * ||L||。

其中L是要估计的N x N矩阵正半定矩阵,X是N x M矩阵,beta是正则化常数,X.T = X转置,||.||是弗罗贝尼乌斯范数。

另外,L^s 是矩阵指数,其中 L^s = F Λ^s F.T,其中 F 是 L 的特征向量的矩阵,Λ 是 L 的特征值的对角矩阵。

目标函数的导数为:

dT/dL = sum_从 r = 0 到 r = s - 1 L^r (XX.T) L^(s-r-1) - 2 * beta * L

我已经完成了非常基本的梯度下降问题(例如矩阵分解),其中优化了矩阵的每个元素,或者使用包/库。这种问题我习惯了比较复杂,我希望你们中的一些对这种事情更有经验的人可以帮助我。

非常感谢任何一般性建议以及如何在 python 或 R 中编写代码的具体建议。

这是具有此功能的论文的链接: https://journals.plos.org/plosone/article?id=10.1371/journal.pone.0128136#sec016

非常感谢您的帮助!

保罗

【问题讨论】:

问题很广泛,您需要搜索 - SO 和其他地方的大量优化原始/源代码:***.com/questions/43217617/… 这很公平 - 我想我应该更具体一些。我熟悉如何在更简单的问题上实现梯度下降,例如线性回归。我只是不知道要估计的变量何时是矩阵形式/目标函数是否不像 SSE 那样简单,是否应该采用相同的方法。我很难在 GD 和我正在尝试做的事情之间找到“介于”GD 之间的材料,并且只想要一般指导或示例,无论对回答问题的人来说是最容易的。我将来会尝试更具体。谢谢! 【参考方案1】:

一般来说,最好使用机器学习库,例如 tensorflow 或 pytorch。如果你走这条路,你有几个优势 1) 张量操作的高效 C++ 实现 2) 自动微分 3) 轻松访问更复杂的优化器(例如 ADAM)。 ` 如果您更喜欢自己进行梯度计算,您可以通过在优化步骤之前手动设置梯度 L.grad 来做到这一点

一个简单的实现如下所示:

import torch

n=10
m=20
s = 3
b=1e-3
n_it=40

# L=torch.nn.Parameter(torch.rand(n,n))
F=torch.nn.Parameter(torch.rand(n,n))
D=torch.nn.Parameter(torch.rand(n))
X=torch.rand((n,m))
opt=torch.optim.SGD([F,D],lr=1e-4)


for i in range(n_it):
    loss = (X.T.matmul(F.matmul((D**s).unsqueeze(1)*F.T)).matmul(X)).trace() - b * F.matmul((D**s).unsqueeze(1)*F.T).norm(2)
    print(loss)
    opt.zero_grad()
    loss.backward()
    opt.step()

【讨论】:

很高兴能帮上忙。如果您能接受答案,如果它对您有用,我将不胜感激

以上是关于使用已知目标函数实现梯度下降的主要内容,如果未能解决你的问题,请参考以下文章

梯度下降法及其Python实现

(转)梯度下降法及其Python实现

梯度下降法及其Python实现

Tensorflow细节-P84-梯度下降与批量梯度下降

Python实现梯度法(最速上升(下降)法)寻找函数极大(极小)值

梯度下降法及其Python实现