训练示例的列向量

数据挖掘 机器学习 数据
2022-03-03 23:48:43

我对机器学习的训练示例有疑问。我知道大多数人都会对列向量进行训练示例。然而,大多数情况下,当我们得到一个训练样本时,比如从熊猫数据框对象并将其传输到 NumPy 数组中,每个样本都是一个行向量。我知道我可以使用转置将其更改为列向量。但我想问为什么我们要这样做?是什么让列向量更适合训练示例?

1个回答

我们使用列向量是因为它以列主要格式提供了高效的内存访问。

例如:CUDA,通常用于加速 tensorflow 等库,在合并内存时运行效率最高。并行化应用程序中的跨步内存访问会导致显着减速;线程(它们本身是顺序索引的)应该在顺序索引的内存上操作,而不是跨步等于矩阵行大小的元素数量。即使对于 cpu 应用程序也是如此,主要是因为 CPU 缓存。您希望进行尽可能少的事务,当然只有以列为主的列向量或行为主的行向量可以提供。

列优先和行优先都不是普遍“优越”的,而且通常可以任意决定。但是,在某些应用程序中使用 row-major 但在其他应用程序中不使用的原因有几个。特别是关系数据库当您考虑每个条目必须是单行时,它们本质上是行主要的。C 编程语言本质上也是行优先的,因为当您考虑第一个维度是行索引时,二维矩阵是一个数组数组,它​​们逐行堆叠,就像您在数学中所做的那样。列主要格式的原因是为了反映数学解释,这也与一些遗留集成有关;例如,Fortran 使用列优先,其中 C 是行优先。Fortran 仍在科学计算应用程序中使用,尽管大多数已经离开它,但最初用 Fortran 编写的一些最流行的库无论使用哪种语言都保持一致的 API。布拉斯例如,最初是用 Fortran 编写的,但它在其他语言中的许多实现(包括用于 cuBLAS 的 C/C++)通常都保留了它的 API。许多其他流行的数学编程工具,例如 MATLAB,使用列主要格式。从数学角度来看,将第一个维度视为行索引是有意义的。