随着应用数据的增长,在大规模数据集上进行统计分析和机器学习越来越成为一个巨大的挑战。目前,适用于统计分析/机器学习的语言/库有很多,如专为数据分析用途而设计的R语言,Python语言的机器学习库Scikits,支持分布式环境扩展的有基于Map-Reduce实现的Mahout,以及分布式内存计算框架Spark上的机器学习库MLlib等等。目前Spark框架也推出了R语言的接口SprakR。但是,本文要讨论的,则是另外一种设计思路,在database中实现统计分析和机器学习算法,即In-Database Analysis,Madlib库就是这种设计思路的代表。
把机器学习库内置到database中(通过database的UDF)有许多优点,执行机器学习算法时只需要编写相应的SQL语句就可以了,同时database本身作为分析的数据源,使用非常方便,大大降低了机器学习的应用门槛。当然缺点也是明显的,由于受限于database提供的UDF编程接口,实现算法时会受到很多限制,很多优化难以实现,而大规模数据集上的机器学习,尤其是需要迭代计算的,通常对算法性能和结果收敛速度要求较高,否则很难做到实用。本文的重点就是讨论如何在In-database Analysis的框架下,高效的实现机器学习中的SGD(随机梯度下降)算法。由于很多机器学习算法如linear SVM分类器、K-mean、Logistic Regression都可以采用SGD算法来实现,只需要针对不同算法设计不同的目标函数即可。因此在database上实现高性能的SGD算法框架,便可用来执行一大类机器学习算法。
http://www.infoq.com/cn/articles/in-database-analytics-sdg-arithmetic