LR的并行化

LR的并行化主要从样本数量以及样本维度两个方面分析,将样本形成的矩阵形式,分解为按照行分,列分。 (之所以按照列分,是因为点乘加和等运算)
思考:用LR需要做归一化处理,而XGBOOST等树模型在做分类问题不需要。因为LR需要特征之间的权重加和表示,特征的量级不同会影响到实验结果,但是XGBOOST主要是统计信息,影响较小,故而可以不用归一化。同理onehot等特征处理也是这个道理。在XGBOOST 中使用label编码即可,不会占用较多的内存。

不同的优化算法的区别就在于目标函数下降方向Dt的计算。下降方向是通过对目标函数在当前的W下求一阶倒数(梯度,Gradient)和求二阶导数(海森矩阵,Hessian Matrix)得到。常见的算法有梯度下降法、牛顿法、拟牛顿法。

(1) 梯度下降法(Gradient Descent)

梯度下降法直接采用目标函数在当前W的梯度的反方向作为下降方向:

其中为目标函数的梯度,计算方法为:

公式(2)

(2) 牛顿法(Newton Methods)

牛顿法是在当前W下,利用二次泰勒展开近似目标函数,然后利用该近似函数来求解目标函数的下降方向:。其中Bt为目标函数f(W)在Wt处的海森矩阵。这个搜索方向也称作牛顿方向。

(3) 拟牛顿法(Quasi-Newton Methods):

拟牛顿法只要求每一步迭代中计算目标函数的梯度,通过拟合的方式找到一个近似的海森矩阵用于计算牛顿方向。最早的拟牛顿法是DFP(1959年由W. C. Davidon提出,并由R. Fletcher和M. J. D. Powell进行完善)。DFP继承了牛顿法收敛速度快的优点,并且避免了牛顿法中每次迭代都需要重新计算海森矩阵的问题,只需要利用梯度更新上一次迭代得到的海森矩阵,但缺点是每次迭代中都需要计算海森矩阵的逆,才能得到牛顿方向。

BFGS是由C. G. Broyden, R. Fletcher, D. Goldfarb和D. F. Shanno各自独立发明的一种方法,只需要增量计算海森矩阵的逆Ht=Bt-1,避免了每次迭代中的矩阵求逆运算。BFGS中牛顿方向表示为:

L-BFGS(Limited-memory BFGS)则是解决了BFGS中每次迭代后都需要保存N*N阶海森逆矩阵的问题,只需要保存每次迭代的两组向量和一组标量即可:

在L-BFGS的第t次迭代中,只需要两步循环既可以增量计算牛顿方向:

2. 并行LR的实现

由逻辑回归问题的求解方法中可以看出,无论是梯度下降法、牛顿法、拟牛顿法,计算梯度都是其最基本的步骤,并且L-BFGS通过两步循环计算牛顿方向的方法,避免了计算海森矩阵。因此逻辑回归的并行化最主要的就是对目标函数梯度计算的并行化。从公式(2)中可以看出,目标函数的梯度向量计算中只需要进行向量间的点乘和相加,可以很容易将每个迭代过程拆分成相互独立的计算步骤,由不同的节点进行独立计算,然后归并计算结果。

将M个样本的标签构成一个M维的标签向量,M个N维特征向量构成一个M*N的样本矩阵,如图3所示。其中特征矩阵每一行为一个特征向量(M行),列为特征维度(N列)。


图3 样本标签向量 & 特征向量

如果将样本矩阵按行划分,将样本特征向量分布到不同的计算节点,由各计算节点完成自己所负责样本的点乘与求和计算,然后将计算结果进行归并,则实现了“按行并行的LR”。按行并行的LR解决了样本数量的问题,但是实际情况中会存在针对高维特征向量进行逻辑回归的场景(如广告系统中的特征维度高达上亿),仅仅按行进行并行处理,无法满足这类场景的需求,因此还需要按列将高维的特征向量拆分成若干小的向量进行求解。

 (1) 数据分割

假设所有计算节点排列成m行n列(m*n个计算节点),按行将样本进行划分,每个计算节点分配M/m个样本特征向量和分类标签;按列对特征向量进行切分,每个节点上的特征向量分配N/n维特征。如图4所示,同一样本的特征对应节点的行号相同,不同样本相同维度的特征对应节点的列号相同。


图4 并行LR中的数据分割

一个样本的特征向量被拆分到同一行不同列的节点中,即:

其中Xr,k表示第r行的第k个向量,X(r,c),k表示Xr,k在第c列节点上的分量。同样的,用Wc表示特征向量W在第c列节点上的分量,即:


(2) 并行计算

观察目标函数的梯度计算公式(公式(2)),其依赖于两个计算结果:特征权重向量Wt和特征向量Xj的点乘,标量和特征向量Xj的相乘。可以将目标函数的梯度计算分成两个并行化计算步骤和两个结果归并步骤:

① 各节点并行计算点乘,计算,其中k=1,2,…,M/m表示第t次迭代中节点(r,c)上的第k个特征向量与特征权重分量的点乘,Wc,t为第t次迭代中特征权重向量在第c列节点上的分量。

②对行号相同的节点归并点乘结果:


计算得到的点乘结果需要返回到该行所有计算节点中,如图5所示。
             
                                                           图5 点乘结果归并


③ 各节点独立算标量与特征向量相乘:

G(r,c),t可以理解为由第r行节点上部分样本计算出的目标函数梯度向量在第c列节点上的分量。

④ 对列号相同的节点进行归并:

Gc,t就是目标函数的梯度向量Gt在第c列节点上的分量,对其进行归并得到目标函数的梯度向量:

这个过程如图6所示。


图6 梯度计算结果归并

综合上述步骤,并行LR的计算流程如图7所示。比较图1和图7,并行LR实际上就是在求解损失函数最优解的过程中,针对寻找损失函数下降方向中的梯度方向计算作了并行化处理,而在利用梯度确定下降方向的过程中也可以采用并行化(如L-BFGS中的两步循环法求牛顿方向)。

阅读更多
个人分类: 机器学习
上一篇reset_index()
下一篇短文本分类总结
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭