2017-07-18 114 views
1

我試圖使用MXNet來做一些約束優化,而不是在前饋網絡中反向推廣,但涉及類似的計算,大型陣列產品,一些梯度下降等等......使用MXNet的梯度下降NDArray

例如,爲了最小化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×N矩陣進行這種計算,其中N很大,我想多次重複計算,更新一些參數ameters。有沒有一種很好的方法來進行這種使用MXNet在GPU內核上工作的有限優化,計算約束梯度等等,而無需對輸入進行矢量化並使用simple-gradient-descent-using-mxnet中描述的前饋網絡解決方案。

回答

1

您不需要使用MxNet的神經網絡部分來使用GPU。你也可以避免向量化,但是你的代碼會比較慢,因爲需要在CPU和GPU之間進行同步。

在GPU上使用Mxnet進行定製數學很簡單。你只需在NDArray上限制你的數學運算。這個數據結構與NumPy非常相似,但它支持在CPU,GPU和多個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上進行數學運算。