使用MXNet NDArray进行梯度下降

时间:2017-07-18 11:25:07

标签: optimization multidimensional-array mxnet

我正在尝试使用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中描述的前馈网络解决方法。

1 个答案:

答案 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上进行数学运算。