LDA的训练算法貌似并不复杂,主要的工作就是在维护两个频率计数矩阵N_td和N_wt。然而在这个时代,我们要面对的是互联网的海量数据,想象一下,如果在图15中,左边的文档节点是十亿、中间的主题个数是百万、右边不同的词的个数也是百万,我们将需要处理一张多大的图!
图15文档d_1中词w主题重新采样
在实际应用中,我们希望使用更多的数据训练更大的模型,这包含了两重意思:
下面分别从数据并行和模型并行两个方面来介绍怎样解决上述两个问题。“数据并行”和“模型并行“是Google大神JeffDean在深度学习训练系统DistBelief[13]中新提出的两个概念,尽管Peacock系统开发的时候,DistBelief还没有真正对外公布。随着深度学习的持续升温,大家现在已经逐渐熟悉了这两个形象的名词,此处请允许我们借用一下这两个概念。
“数据并行”通俗的理解:通过多任务(每个任务都包含一份完整的模型)并行的处理数据训练模型,任务之间的模型或同步或异步的进行融合。借用王益[3]的说法,“如果一个算法可以做数据并行,很可能就是可扩展的了”。幸运的是,DavidNewman团队发现基于吉布斯采样的LDA训练算法可以“数据并行”,并给这个算法取了一个名字叫AD-LDA[14]。
注意,AD-LDA算法是吉布斯采样的近似算法,因为严格的吉布斯采样要求串行采样,不能并行。直观的理解就是语料中前一个词w_1采样更新后的N_wt和N_t应该应用于后一个词w_2的采样,而不是w_1和w_2的采样都基于相同状态的N_wt和N_t。AD-LDA算法会使得LDA的训练收敛速度变慢,但在多几轮迭代后,AD-LDA算法可以收敛到与串行吉布斯采样相同的点。
图17给出了AD-LDA算法的示意图:
AD-LDA算法的整个过程和MapReduce的执行过程非常一致,所以早期有非常多的团队使用MapReduce来实现AD-LDA算法[5]:
因为MapReduce使用磁盘进行数据交换,同时整个训练任务需要调度几百个Jobs,所以基于MapReduce的AD-LDA实现是非常低效的。
图17AD-LDA算法
图18模型并行1
上文提到,训练大模型时,N_wt太大而无法整体放入任务的内存,直观的解决方法如图18所示,将N_wt沿词的维度进行分片,每个采样任务只加载一个模型分片N_wt^((i))。相应的,语料数据块也需要做对应的词维度切分,因为单个任务i只能采样N_wt^((i))包含的词w。细心的童鞋可能已经发现,图18所示的模型并行方式在N_td上采用了类似AD-LDA算法的近似,LN_td间的融合与LN_wt间的融合类似,相应的算法也会减缓收敛(因为N_wt是所有训练语料上的聚合结果,而N_td只和具体文档d有关,后者变化比前者更加“快速”,N_td的并行近似采样更加“危险”,很容易造成训练不收敛)。
图19模型并行2
有没有办法不进行N_td的并行近似采样,同时保持上述的模型切片方式呢?Peacock系统设计了图19所示的并行采样方式:加载了不同N_wt^((i))切片的任务并行的沿对角线方向对训练语料数据块(W,T)进行采样,一条对角线采样完成后,依次进行下一条对角线。这样在对同一个文档的不同数据块间的词进行采样时,仍然保持了“串行性”,应用了之前数据块中的词对N_td的更新。图19的模型并行采样方式收敛性同AD-LDA是一致的。
图20Peacock中的数据并行和模型并行
为了“利用更多的数据训练更大的模型”,Peacock系统结合了上述的“数据并行”和“模型并行”(图20):
同上一小节“模型并行”的分析类似,Peacock系统的采样方式收敛性同AD-LDA是一致的。MaxWelling团队提出的Async-LDA[6]证明了异步融合LN_wt^i方式的收敛性。当Peacock采用异步方式融合LN_wt^i时,相当于同时结合了AD-LDA和Async-LDA算法,实践证明收敛性是没有问题的。
当然,Peacock系统在具体实现上除了上述的主要设计思想,还有很多的实用技巧,比如:
图21文本分析示例
为了理解互联网上海量、多样化、非结构化的自然语言描述的文本,我们通常会从词法、句法、语义等维度进行分析。受限于文本字面信息量小,存在歧义现象,词法和句法分析容易遭遇VocabularyGap的问题,从海量文本数据中归纳“知识”,从语义角度帮助理解文本,是一种非常重要的途径。
图22文本分析平台TextMiner
图25pCTR增加不同粒度topic特征模型AUC的提升
从图25可以看出,加入Peacock语义特征后AUC得到了显著提升,尤其当增加topic规模为100,000的Peacock语义特征时,AUC提升最大,约为1.8%,线上A/BTest实验AdCTR有8.82%的提升。