Matrix multiplication 用jblas乘转置矩阵

Matrix multiplication 用jblas乘转置矩阵,matrix-multiplication,Matrix Multiplication,我正在用Jblas实现反向传播和梯度下降 第1层是向量a:双矩阵(M,1) 第二层是向量B:双矩阵(N,1) 它们之间是权重W:DoubleMatrix(M,N) 在向前传球时,我将B=W\乘以A W.mmulti(A, B) 在反向传播过程中,我计算A=(B^T\乘以W)^T 我已经编写了代码,这样所有的计算都到位了,而且速度相当快。但是Jblas transpose()方法创建了一个全新的对象并复制了所有数据,每次迭代调用两次非常昂贵。有没有办法在乘法过程中使用双矩阵转置,而不进行所有复制

我正在用Jblas实现反向传播和梯度下降

第1层是向量a:双矩阵(M,1)

第二层是向量B:双矩阵(N,1)

它们之间是权重W:DoubleMatrix(M,N)

在向前传球时,我将B=W\乘以A

W.mmulti(A, B)
在反向传播过程中,我计算A=(B^T\乘以W)^T


我已经编写了代码,这样所有的计算都到位了,而且速度相当快。但是Jblas transpose()方法创建了一个全新的对象并复制了所有数据,每次迭代调用两次非常昂贵。有没有办法在乘法过程中使用双矩阵转置,而不进行所有复制?似乎在内部实现起来很容易——使用相同的数据对象,但将调用切换到行和列。

我也问了自己一个很好的问题。 我没有答案,但这个简单的事实可以挽救一个换位:

(B^T\times W)^T=W^T*B

那么你会写信吗


A=W.transpose().mmul(B)
这里是nd4j的作者。我们已经添加了nd数组、恒定时间转置以及矩阵乘法,它们可以处理各种我们称之为“后端”的东西,其中之一就是jblas

API也非常类似于jblas

INDArray arr=Nd4j.create(2,2); INDRARY结果=arr.mmul(arr)

最棒的是你可以免费获得cuda和opencl(很快就会被添加)

我们已经迁移到netlib java,但仍然提供jblas(因为它非常稳定),但在实践中,我们发现在jblas上可以进行整洁的复制操作(因为内部不支持偏移)

A = B.transpose().mmul(W).transpose()