【问题标题】:High volume SVM (machine learning) system大容量 SVM(机器学习)系统
【发布时间】:2011-01-23 22:41:21
【问题描述】:

我正在从事一个可能的机器学习项目,预计该项目将使用 SVM(支持向量机)和可能的一些 ANN 进行机器学习的高速计算。

我对使用这些在 matlab 上工作感到非常自在,但主要是在小型数据集中,只是为了进行实验。我想知道这种基于 matlab 的方法是否会扩展?还是我应该研究其他东西?基于 C++ / gpu 的计算? java包装matlab代码并将其推送到应用引擎?

顺便说一句,关于 GPU 的文献似乎很多,但关于它们在使用 matlab 的机器学习应用程序中的用处却不多,而且钱能买到最便宜的支持 CUDA 的 GPU?这还值得吗?

【问题讨论】:

    标签: java c matlab machine-learning svm


    【解决方案1】:

    我研究模式识别问题。如果您打算有效地解决 SVM/ANN 问题并且您真的无法访问计算机集群,请让我给您一些建议:

    1) 不要使用 Matlab。改为使用 Python 及其大量数值库来可视化/分析您的计算。
    2) 使用 C 更好地实现关键部分。您可以很容易地将它们与 Python 脚本集成。
    3) 如果你主要处理机器学习中典型的非多项式时间复杂度问题,CUDA/GPU 不是一个解决方案,因此它不会带来很大的加速;点/矩阵乘积只是 SVM 计算的一小部分——您仍然必须处理特征提取和列表/对象处理,而是尝试优化您的算法并设计有效的算法方法。如果您需要并行性(例如,对于 ANN),请使用线程或进程。
    4) 使用 GCC 编译器来编译你的 C 程序——它将构建非常快速的可执行代码。为了加快数值计算,您可以尝试 GCC 优化标志(例如流式 SIMD 扩展)
    5) 在 Linux 操作系统下的任何现代 CPU 上运行您的程序。

    要获得真正好的性能,请使用 Linux 集群。

    【讨论】:

    • Matlab 对 SVN 有那么糟糕吗,还是您认为 Python 通常更可取?
    • @Jonas:是的,不推荐使用 Matlab,因为:1)它是专有的非开源产品 --> 它只能在非常有限的一组环境中运行(例如 OS={Windows, Mac}、CPU={x86} 等)。 2)Matlab 使用括号来索引数组和调用函数--> 阅读足够大的程序时会遇到问题。 3)Matlab 非常慢,因为函数的输入参数是复制的,而不是像 Python 中那样引用。
    • 其实(1)Matlab 可以在所有常见的环境中运行。例如,我在 64 位 Windows、OSX 和 Linux 上使用它。 (2) 由于对数组的索引基本上是调用一个函数(subsref,如果你愿意,你可以重载它),我不明白为什么这应该是一个问题 - 至少对我来说,可读性来自于结构化和注释代码,而不是括号中的代码,并且 (3) Matlab 确实进行了写时复制,无论如何这更多的是内存问题而不是速度问题。也就是说,Matlab的SVN实现似乎没有问题,只是你不喜欢这个程序。
    • 很有趣 - 我会很酷地学习 python,但是与使用 python 的 matlab 相比会不会有很大的性能损失?我还打算进行大量的文本挖掘(它是一个学术项目,所以获得 matlab 许可证不是问题)
    • 忽略这个答案中明显的 linux-opensource 偏见......操作系统不会影响受 CPU 限制的应用程序的性能。 GCC 不是 Linux 上可用的最佳优化编译器(到目前为止)。不使用内在函数的 SIMD 优化可能只会带来百分之几的性能提升。无论是否是多项式问题,快两倍总是快两倍,算法不会取代硬件。用 C 和 Python 一起编写需要两种小众语言的知识,这两种语言都不适合这份工作。
    【解决方案2】:

    libsvmSVM light 都有 matlab 接口。此外,大多数学习任务都是可并行化的,因此请查看 parfor 等 matlab 命令和并行计算工具箱的其余部分。

    【讨论】:

      【解决方案3】:

      我建议不要将 Matlab 用于原型设计之外的任何事情。 当项目变得更加复杂和广泛时,与 matlab 和工具箱提供的功能相比,您自己的代码比例将会增加。项目发展得越多,您从 matlab 中受益越少,您需要的功能、库以及(更重要的是)通用语言的实践、流程和工具就越多。

      matlab 解决方案的缩放是通过与非 matlab 代码交互来实现的,我已经看到 matlab 项目变成了一个用多用途语言编写的胶水调用模块。给所有相关人员造成日常痛苦。

      如果您对 Java 感到满意,我建议您将它与一些好的数学库一起使用(至少,您总是可以连接 MKL)。即使使用最近的 Matlab 优化,MKL + JVM 也快得多 - 可扩展性和可维护性是无法比拟的。

      具有处理器特定内在函数的 C++ 可以提​​供更好的性能,但代价是开发时间和可维护性。添加 CUDA 可以进一步提高性能,但工作量和特定知识几乎不值得。如果您没有 GPU 计算方面的经验,当然不会。一旦超越了单处理器,向系统添加一两个 CPU 比处理 GPU 计算要有效得多。

      【讨论】:

      • ima,谢谢 - 我已经用 java 完成了相当多的编码,所以我想这是我需要为这个项目研究更多的东西。我似乎在网上找到的绝大多数东西都是福音派的,无论哪种方式-很难找到平衡的意见-所以感谢您的 cmets :)
      【解决方案4】:

      到目前为止,没有任何东西可以扩展超出限制。 libsvm 有一个子集选择工具,可以选择一组数据点进行训练。忘记人工神经网络,它不会泛化,也没有理论可以帮助选择隐藏节点的数量等。它必须手动优化很多,并且可能会陷入局部最小值。仅使用 SVM

      【讨论】:

        【解决方案5】:

        您可以在这里找到一些可以非常快速地处理大量数据的半参数近似:

        http://www.dabi.temple.edu/budgetedsvm/

        https://robedm.github.io/LIBIRWLS/

        【讨论】:

          猜你喜欢
          • 2020-04-24
          • 2017-11-04
          • 2018-01-21
          • 2011-04-27
          • 2020-12-10
          • 1970-01-01
          • 2019-10-05
          • 1970-01-01
          相关资源
          最近更新 更多