Matrix multiplication 用jblas乘转置矩阵
我正在用Jblas实现反向传播和梯度下降 第1层是向量a:双矩阵(M,1) 第二层是向量B:双矩阵(N,1) 它们之间是权重W:DoubleMatrix(M,N) 在向前传球时,我将B=W\乘以AMatrix 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()方法创建了一个全新的对象并复制了所有数据,每次迭代调用两次非常昂贵。有没有办法在乘法过程中使用双矩阵转置,而不进行所有复制
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()