【问题标题】:VowpalWabbit: Differences and scalabilityVowpalWabbit:差异和可扩展性
【发布时间】:2012-02-22 07:45:24
【问题描述】:

我试图确定 VowpalWabbit 的“状态”是如何随着输入集大小的增长而保持的。在典型的机器学习环境中,如果我有 1000 个输入向量,我希望一次发送所有这些,等待模型构建阶段完成,然后使用模型创建新的预测。

在大众汽车中,算法的“在线”性质似乎将这种范式转变为更高性能并能够实时调整。

  1. 这种实时模型修改是如何实现的?

  2. 随着时间的推移,大众是否会在总输入数据大小方面占用越来越多的资源?也就是说,当我向我的 VW 模型添加更多数据时(当它很小时),一旦特征向量输入的累积数量增加到 1000、10000 或数百万,实时调整计算是否开始花费更长的时间?

【问题讨论】:

  • 这取决于您所说的 “[higher] 总输入数据大小随时间变化” 的含义。如果您使用的是分类特征,那么如果“更多数据”意味着“分类中的更多级别”,特别是如果您打开高阶交互,则会出现影响准确性的哈希冲突,所以是的,您最终需要增加'- b' 哈希位深度,因此您对特征哈希的内存要求。然而,权重向量(保存在内存中)仍然很小。

标签: performance machine-learning scalability vowpalwabbit online-algorithm


【解决方案1】:

只是为了补充 carlosdc 的好答案。

使 vowpal wabbit 与众不同并使其能够扩展到 tera-feature (1012) 数据大小的一些功能是:

在线权重向量: vowpal wabbit 在内存中维护一个weight-vector,它本质上是它正在构建的模型的权重向量。这就是您在问题中所说的“状态”。

无限数据大小: 权重向量的大小与特征(独立输入变量)的数量成正比,而不是与示例(实例)的数量成正比。这就是 vowpal wabbit 与许多其他(非在线)学习者不同,在空间上扩展的原因。由于它不需要像典型的批处理学习器那样将所有数据加载到内存中,它仍然可以从太大而无法放入内存的数据集中进行学习。

集群模式: vowpal wabbit 支持在集群中的多台主机上运行,​​在节点上施加二叉树图结构并使用从叶到根的all-reduce 减少。

哈希技巧: vowpal wabbit 使用所谓的hashing trick。所有功能名称都使用murmurhash-32 散列成一个整数。这有几个优点:非常简单且省时,不必处理哈希表管理和冲突,同时允许功能偶尔发生冲突。事实证明(在实践中)具有数千个不同特征的训练集中的少量特征冲突类似于添加隐式正则化项。这与直觉相反,通常会提高而不是降低模型的准确性。它也与特征空间的稀疏性(或密度)无关。最后,它允许输入特征名称是任意字符串,这与大多数传统学习器不同,后者要求特征名称/ID 既是 a) 数字又是 b) 唯一的。

并行度: vowpal wabbit 通过在两个单独的线程中运行解析和学习来利用多核 CPU,从而进一步提高其速度。这就是使vw 能够像读取数据一样快速学习的原因。事实证明,与直觉相反,vw 中大多数支持的算法都受到 IO 速度的瓶颈,而不是学习速度。

检查点和增量学习: vowpal wabbit 允许您在学习时将模型保存到磁盘,然后加载模型并使用 --save_resume 选项从上次中断的地方继续学习。

类似测试的错误估计: vowpal wabbit 计算的平均损失总是在看不见的(样本外)数据上(*)。这消除了对预先计划的保留或进行交叉验证的麻烦。您在训练期间看到的错误率类似于“测试”。

超越线性模型: vowpal wabbit 支持多种算法,包括矩阵分解(大致稀疏矩阵 SVD)、潜在狄利克雷分配 (LDA) 等。它还支持动态生成术语交互(双线性、二次、三次和前馈 sigmoid 神经网络,具有用户指定的单元数)、多类分类(除了基本回归和二元分类)等等。

github上the official vw wiki有教程和很多例子。

(*) 一个例外是,如果您使用带有--passes N 选项的多次传递。

【讨论】:

  • 我以为 vw 只做了 1 层神经网络? (例如 --nn 10 表示具有 10 个神经元的单层)。你会如何做一个多层网络?
  • @Zach:我认为你是对的。我相应地编辑了答案。谢谢和抱歉。
  • 关于大众利用多核,我的印象是大众只使用一个核,不管你有多少核。是的,它有 2 个线程:一个用于 I/O,一个用于计算。就是这样。
  • 是的,vw 在两个线程中运行,因此如果您有多个内核,它们将在两个内核上运行。如果您time vw ....,您可以看到时间摘要如何包含超过 100% 的 CPU 利用率(通常为 150%)。 libSVM 或 liblinear 等类似实用程序没有此功能。
  • 您能否详细说明您所说的“大众中最受支持的算法受到 IO 速度的瓶颈”的部分?从他们的论文来看,实际上似乎并非如此。
【解决方案2】:

VW 是随机梯度下降的(非常)复杂的实现。你可以阅读更多关于随机梯度下降here

事实证明,随机梯度下降的良好实现基本上是 I/O 限制的,它会尽可能快地获取数据,因此 VW 有一些复杂的数据结构来“编译”数据。

因此,问题 (1) 的答案是随机梯度下降,而问题 (2) 的答案肯定不是。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 2018-04-26
    • 2015-05-25
    • 1970-01-01
    • 2017-01-13
    • 2012-05-10
    相关资源
    最近更新 更多