如何分解大型 SVM 分类模型?

数据挖掘 scikit-学习 支持向量机
2022-02-23 02:05:33

我有一个大类的分类问题:特征集是 512 维,类数在 3000 左右。这是一个人脸识别问题。(从 3000 位名人中识别出是谁的脸。特征是使用 FaceNet 提取的。)

训练这样一个 SVM 模型的问题太慢了:

我使用了 sklearn SVC,结果如下:

RAM usage: > 100GB // I eventually ended up using virtual memory of 100GB
Training time: > 30 hours
Classification time: > 1 hour per face
Other issue: Single CPU usage, no parallelization

总而言之,对这样的 SVM 模型使用上述幼稚的训练方式是不切实际的。

我的问题:优化 SVM 训练/使用这种规模输入数据的实用方法是什么?(~ 3000 个类,feature_size = 512)

1个回答

我认为将 SVM 用于您的模型是主要问题。

SVM(线性或其他)最初用于二进制分类。有多种程序可以将它们扩展到多类问题。最常见的方法是将问题转化为一组二元分类问题。最常见的策略是使用“One-Versus-All”分类器(OVA 分类),并选择对测试数据进行最大边缘分类的类。另一种策略是构建一组 One-Versus-One 分类器,并选择由最多分类器选择的类。这两种策略在训练和测试中的计算成本都很高。我知道还有其他更复杂的方法,但我不认为它们中的任何一个都适用于如此多的类。

最简单的方法是使用神经网络模型来解决此类问题。如果您想使用更经典的算法之一,也许使用决策树会起作用(甚至是 k-最近邻)。