[英]Finding the Hessian matrix of this function
嗨,我有以下 function:
从 1 到 5000 的总和 -log(1−(xi)^2) -log(1-(a_i)^t*x),其中 a_i 是一个随机向量,我们试图通过 Netwon 的方法最小化这个函数的值。
我需要一种方法来计算关于 (x1, x2, x3, ...) 的 Hessian 矩阵。 我尝试了自动渐变,但花了太多时间。 这是我现在的时间。
from autograd import elementwise_grad as egrad
from autograd import jacobian
import autograd.numpy as np
x=np.zeros(5000);
a = np.random.rand(5000,5000)
def f (x):
sum = 0;
for i in range(5000):
sum += -np.log(1 - x[i]*x[i]) - np.log(1-np.dot(x,a[i]))
return sum;
df = egrad(f)
d2f = jacobian(egrad(df));
print(d2f(x));
我曾尝试调查 sympy,但我对如何继续感到困惑。
PyTorch 有一个 GPU 优化的hessian
操作:
import torch
torch.autograd.functional.hessian(func, inputs)
您可以使用常规的NumPy
向量化数组操作,这将显着加快程序的执行速度:
from autograd import elementwise_grad as egrad
from autograd import jacobian
import autograd.numpy as np
from time import time
import datetime
n = 5000
x = np.zeros(n)
a = np.random.rand(n, n)
f = lambda x: -1 * np.sum(np.log(1-x**2) + np.log(1-np.dot(a, x)))
t_start = time()
df = egrad(f)
d2f = jacobian(egrad(df))
t_end = time() - t_start
print('Execution time: ', datetime.datetime.fromtimestamp(t_end).strftime('%H:%M:%S'))
Output
Execution time: 02:02:27
一般来说,每次处理数值数据时,都应该避免使用loops
进行计算,因为它们通常会成为程序的瓶颈,因为它们的 header 和计数器变量的维护。
另一方面, Z3B7F949B2343F9E5390 NumPy
对每个array
使用非常短的 header ,并且正如您所期望的那样,针对数值计算进行了高度优化。
请注意x**2
将 x 的每个项目平方而不是x
x[i]*x[i]
,以及仅执行np.dot(x, a[i])
的np.dot(a, x)
一个命令(其中x
和a
开关放置以适应所需的尺寸)。
您可以参考这本很棒的电子书,它将更详细地解释这一点。
干杯
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.