对于大规模机器学习问题,调参的难度显然是更大的:
首先,一次训练和测试过程的时间和计算资源开销都是庞大的,不管采用什么调参方法,多次实验都会带来很大的时间和计算资源消耗。
其次,大规模机器学习问题通常都是数据变化很快的问题,如计算广告和推荐系统,之前确定好的参数在随着数据的变化,也有劣化的风险。
目前来说大规模机器学习存在的主要挑战是两个:第一是计算资源的消耗比较大,训练时间较长的问题,第二是调参比较困难,效率较低。TalkingData在大规模机器学习的实践中也深受这两个问题的困然,特别是公司在早起阶段硬件资源十分有限,这两个问题特别突出。我们为了解决这个问题,做了很多努力和尝试。TalkingData最近开源的Fregata项目[4],就是我们在这方面取得的一些成果的总结。
二. Fregata的优点
Fregata是TalkingData开源的大规模机器学习算法库,基于Spark,目前支持Spark 1.6.x, 很快会支持Spark 2.0。目前Fregata包括了Logistic Regression, Softmax, 和Random Decision Trees三中算法。
三种算法中Logistic Regression, Softmax可以看作一类广义线性的参数方法,其训练过程都依赖于凸优化方法。我们提出了Greedy Step Averaging[5]优化方法,在SGD优化方法基础上实现了学习率的自动调整,免去了调参的困扰,大量的实验证明采用GSA 优化方法的Logstic Regression和Softmax算法的收敛速度和稳定性都是非常不错的,在不同数据规模,不同维度规模和不同稀疏度的问题上都能取得很好的精度和收敛速度。
基于GSA优化方法,我们在Spark上实现了并行的Logistic Regression和Softmax算法,我们测试了很多公开数据集和我们自己的数据,发现在绝大部分数据上都能够扫描一遍数据即收敛。这就大大降低了IO开销和通信开销。
其中Logsitic Regression算法还有一个支持多组特征交叉的变种版本,其不同点是在训练过程中完成维度交叉,这样就不需要在数据准备过程中将多组特征维度预先交叉准备好,通常这意味着数据量级上的数据量膨胀,给数据存储和IO带来极大压力。而这种多组特征交叉的需求在计算广告和推荐系统中又是非常常见的,因此我们对此做了特别的支持。
而Random Decision Trees[6][7]算法是高效的非参数学习方法,可以处理分类,多标签分类,回归和多目标回归等问题。而且调参相对也是比较简单的。但是由于树结构本身比较复杂而庞大,使得并行比较困难,我们采用了一些Hash Trick使得对于二值特征的数据可以做到扫描一遍即完成训练,并且在训练过程中对内存消耗很少。
总结起来,Fregata的优点就两个,第一是速度快,第二是算法无需调参或者调参相对简单。这两个优点降低了减少了计算资源的消耗,提高了效率,同时也降低了对机器学习工程师的要求,提高了他们的工作效率。
三. GSA算法介绍
GSA算法是我们最近提出的梯度型随机优化算法,是Fregata采用的核心优化方法。它是基于随机梯度下降法(SGD)的一种改进:保持了SGD易于实现,内存开销小,便于处理大规模训练样本的优势,同时免去了SGD不得不人为调整学习率参数的麻烦。
事实上,最近几年关于SGD算法的步长选取问题也有一些相关工作,像Adagrad, Adadelta, Adam等。但这些方法所声称的自适应步长策略其实是把算法对学习率的敏感转移到了其他参数上面,并未从本质上解决调参的问题,而且他们也引入了额外的存储开销。GSA和这些算法相比更加轻量级,易于实现且易于并行,比起SGD没有额外的内存开销,而且真正做到了不依赖任何参数。
我们把GSA算法应用于Logistic回归和Softmax回归,对libsvm上16个不同类型规模不等的数据集,和SGD,Adadelta,SCSG(SVRG的变种)这些目前流行的随机优化算法做了对比实验。结果显示,GSA算法在无需调任何参数的情况下,和其他算法做参数调优后的最佳表现不相上下。此外,GSA比起这些流行的方法在计算速度和内存开销方面也有一定的优势。
GSA算法的核心原理非常简单:在迭代的每一步对单个样本的损失函数做线搜索。具体来说,我们对逻辑回归和softmax回归的交叉熵损失函数,推导出了一套仅用当前样本点的梯度信息来计算精确线搜索步长的近似公式。我们把利用这套近似公式得到的步长做时间平均来计算当前迭代步的学习率。这样做有两方面的好处:基于精确线搜索得到的步长包含了当前迭代点到全局极小的距离信息——接近收敛时步长比较小,反之则更大,因而保证收敛速度;另一方面平均策略使算法对离群点更鲁棒,损失下降曲线不至剧烈抖动,为算法带来了额外的稳定性。