我正在用Jblas实现反向传播和梯度下降。
第一层是一个向量A: DoubleMatrix(M,1)
第二层是一个向量B: DoubleMatrix(N,1)
它们之间是权重W: DoubleMatrix(M,N)
在前向传递过程中,我将B=W\乘以A
W.mmulti(A, B)在反向传播过程中,我计算A= (B^T \乘以W)^T
A = B.transpose().mmul(W).transpose()我已经写了代码,所以所有的东西都是就地计算的,而且速度很快。但是Jblas transpose()方法创建一个全新的对象并复制所有数据,这在每次迭代中调用两次是相当昂贵的。有没有办法在乘法过程中使用DoubleMatrix转置,而不进行所有这些复制?这似乎很容易在内部实现-使用相同的数据对象,但将调用切换为行和列。
发布于 2014-09-30 13:58:10
我也问过自己一个很好的问题。我没有答案,但这个简单的事实可以避免其中一个换位:
(B^T \乘以W) ^T = W^T *B
所以你会写下
A = W.transpose().mmul(B)
发布于 2015-09-17 21:22:13
nd4j的作者在这里。我们已经添加了nd数组和常量时间转置以及矩阵乘法,它们可以与我们所说的各种“后端”一起工作,其中之一就是jblas。
该API也非常类似于jblas。
结果arr = Nd4j.create(2,2);INDArray结果= arr.mmul(arr);
最好的部分是你得到了cuda和(很快就会添加!)免费的opencl。
对于大多数事情,我们已经迁移到netlib-java,但仍然提供jblas (因为它非常稳定),但在实践中,我们发现在jblas上执行拷贝操作更方便(因为内部不支持偏移)。
https://stackoverflow.com/questions/22288888
复制相似问题