r - 计算数组中的索引是否比让编译器这样做更有效?

标签 r performance indexing

我试图将神经网络函数推广到任意多层,因此我需要多个矩阵来保存每一层中每个神经元的权重。我最初是在 R 中明确声明矩阵对象来保存每一层的权重。不是每层有一个矩阵,我想到了一种方法(不是说它是原始的),将我的所有权重存储在单个数组中,并定义一个“索引函数”以将权重映射到数组中的适当索引。

我将函数定义如下:



哪里是第 i 层中第 j 个神经元的第 k 个权重,L(r) 是第 r 层中神经元的数量。写完这些定义后,我意识到stackoverflow不允许像mathoverflow这样的 latex ,这是不幸的。
现在的问题是:以这种方式计算我的权重指数是更有效,还是实际上效率更低?
在查看一般如何为数组计算索引之后,如果我只是在每一层中保留一个包含权重的矩阵,这基本上就是在编译时所做的,所以看起来我可能只是让我的代码过于复杂和难以理解了解时间效率是否没有差异。

最佳答案

TL;博士 使用矩阵更容易理解并利用优化的 CPU 指令。

用计算机科学的话来说,算法的效率(可扩展性)是关于使用 Big O cost 来推理的。 .可以给时间和空间复杂度打分。
使用大 O 符号让我们比较这两种方法:
阵列方法
时间复杂度 :
数组索引访问是 O(1)时间,无论数组变得有多大,访问给定索引的元素在计算上同样容易。
由于您已经创建了一个函数来计算 k-th 的索引重量,这会增加一些小的复杂性,但可能会以常数 O(1) 运行时间因为是数学表达式,所以可以忽略不计。
空间复杂度 :O(N)哪里N是所有层的权重数。
矩阵方法
时间复杂度 :
矩阵本质上是一个带有 O(1) 的二维数组使用权
空间复杂度O(N + M) ,其中 N是神经元的数量和 M是权重的数量。

从概念上讲,我们可以看到这两种方法具有等效的时间和空间复杂度分数。
然而,还涉及其他权衡(并且作为一个优秀的 SO-er 必须通知您这些)
在处理数组与矩阵方法中的数据时,数组方法效率较低,因为它避开了 MISD operations 的机会。 .正如@liborm 所提到的,矢量化 (MISD) 操作由较低级别的系统库处理,例如 LAPACK/BLAS ,它为某些矩阵运算“批处理”CPU 指令(与每次发送一条新指令相比,在 CPU 上传输和计算数据的开销成本更低)

Instead of having one matrix per layer, I thought of a way ... to store all of my weights in a single array


很难理解为什么您会选择后者,因为它需要您创建定制的索引功能。也许把所有的权重都放在一个长数组的地方会更好?但是,我认为维护数组映射所需的心理负担高于将多个矩阵专用于一个层。
像矩阵结构的哈希表会更容易推理
layers <- list(layer1 = [[...]], layer2 = [[...]], layerN = [[...]])
进一步阅读
http://www.noamross.net/blog/2014/4/16/vectorization-in-r--why.html

关于r - 计算数组中的索引是否比让编译器这样做更有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49111815/

相关文章:

r - 用 R igraph 绘制多个图形

r - 在数据集中拟合多条逻辑增长曲线

r - 更改数据框的列类型

R 语言感知代码重新格式化/重构工具?

对象数组上的 Javascript indexOf

mysql - 查询优化 - 在 SQL 中有效地整理一对多关系表的结果

c++ - const-correctness 可以提高性能吗?

javascript - 如何减少多个 if 语句的代码

oracle - oracle 索引的 last_analysed 日期是什么意思?

java - 如何在SOLR中实现 "starts with"搜索?