我正在尝试使用MXNet进行一些约束优化,这种优化不是前馈网络中的反向传播,而是涉及类似的计算,大型阵列的产品,一些梯度下降等......
例如,为了最小化M-2 * Id的轨迹,因为M在正交矩阵集上变化,我可以使用numpy和scipy通过矢量化矩阵来实现这一点,如下所示:
import numpy as np
from scipy.optimize import minimize
# make matrix to vector and vector to matrix functions
def toVector(m):
return np.hstack(m.flatten())
def toMatrix(vec):
return vec[:4*4].reshape(4,4)
# Define objective function to minimize
def f(x):
matM=toMatrix(x)
return(np.trace(matM-2*np.identity(4)))
# Define the constraint that X be orthogonal, i.e. X X^t = I
cons = ({'type': 'eq',
... 'fun' : lambda x: np.array(np.linalg.norm(
... np.dot(toMatrix(x),np.transpose(toMatrix(x)))-np.eye(4)))
... })
# Define an initial point randomly
m0=np.random.rand(4,4)
# And minimize
result = minimize(f, toVector(m0), constraints=cons,
... method='SLSQP', options={'disp': True})
toMatrix(result.x)
现在,假设我正在为N大的NxN矩阵做这种计算,我想多次重复计算,更新一些参数。是否有一种很好的方法可以使用MXNet在GPU内核,计算约束梯度等方面进行这种约束优化...而无需对输入进行矢量化并使用simple-gradient-descent-using-mxnet中描述的前馈网络解决方法。
答案 0 :(得分:1)
您不需要使用MxNet的神经网络部分来使用GPU。您也可以避免矢量化,但由于需要在CPU和GPU之间进行同步,因此代码会变慢。
在GPU上使用Mxnet进行自定义数学运算非常简单。您只需通过NDArray上的操作来限制数学运算。此数据结构与NumPy非常相似,但它支持在CPU,GPU和mupliple GPU上执行。
这意味着只要您使用mx.nd. *中的函数并提供mx.gpu()作为执行上下文,您的数学运算将在GPU上执行。这也意味着您无法使用NumPy中的任何内容,因为NumPy仅在CPU上执行。您仍然可以使用“for”和“if”语句来避免向量化,但由于控制流程是在CPU上完成的,因此它必须来回进行GPU同步。
请参考示例https://mxnet.apache.org/tutorials/basic/ndarray.html#advanced-topics的这一部分,了解如何使用NDArray在GPU上进行数学运算。