主题模型的一些思考

微信扫一扫,分享到朋友圈

主题模型的一些思考

最近有在用主题模型对信息流推荐的一些策略召回和深度召回对文本进行表征。在做的过程中有一些关于主题模型的思考和理解。这边《LDA》和《SentenceLDA》没啥价值,就是一些口语话的解释,实战的总结大家可以一起看下,我觉得比较有价值。

我在实际用的过程中,词表征用LDA,句表征用了SentenceLDA,文章表征的时候用了512维,2048维,4096维的LDA进行concat。

LDA

参考各算法库中的LDA源码

LDA整体流程,先定义一些字母的含义:文档集合D,topic集合T

D中每个文档d看作一个单词序列< w1,w2,…,wn >,wi表示第i个单词,设d有n个单词。(LDA里面称之为word bag,实际上每个单词的出现位置对LDA算法无影响)。D中涉及的所有不同单词组成一个大集合VOCABULARY(简称VOC)。LDA以文档集合D作为输入(会有切词,去停用词,取词干等常见的预处理,略去不表),希望训练出的两个结果向量(设聚成k个Topic,VOC中共包含m个词):

对每个D中的文档d,对应到不同topic的概率θd < pt1,…, ptk >,其中,pti表示d对应T中第i个topic的概率。计算方法是直观的,pti=nti/n,其中nti表示d中对应第i个topic的词的数目,n是d中所有词的总数。

对每个T中的topic t,生成不同单词的概率φt < pw1,…, pwm >,其中,pwi表示t生成VOC中第i个单词的概率。计算方法同样很直观,pwi=Nwi/N,其中Nwi表示对应到topic t的VOC中第i个单词的数目,N表示所有对应到topic t的单词总数。

LDA的核心公式如下:

p(w|d) = p(w|t)*p(t|d)

直观的看这个公式,就是以Topic作为中间层,可以通过当前的θd和φt给出了文档d中出现单词w的概率。其中p(t|d)利用θd计算得到,p(w|t)利用φt计算得到。

实际上,利用当前的θd和φt,我们可以为一个文档中的一个单词计算它对应任意一个Topic时的p(w|d),然后根据这些结果来更新这个词应该对应的topic。然后,如果这个更新改变了这个单词所对应的Topic,就会反过来影响θd和φt。

LDA算法开始时,先随机地给θd和φt赋值(对所有的d和t)。然后上述过程不断重复,最终收敛到的结果就是LDA的输出。

SentenceLDA

参考论文 : On a topic Model for Sentence

核心思想:传统的lda的假设是一篇文章的主题多个主题组合成,每个单词有对应的主题,考虑生成文章对应的词的最大联合概率分布即可。SentenceLDA是假设文章中的每一句话都是一个主题,每个句子里的每个词都是由该主题生成,考虑生成这句话对应的词最大联合概率分布即可。

流程

  • 对于每个主题 z,刻画主题-词分布矩阵 Φz ,它是服从参数为 β 的狄利克雷分布生成的多项式分布,表示为:Φz~Dirichlet(β),z~Φz
  • 对于每个文本d
    • 刻画文本-主题分布矩阵 θd ,它服从参数为 α 的狄利克雷分布生成的多项式分布,表示为θd ~ Dirichlet(α)
    • 对于每个文本d中的每个句子s
      • 基于多项式分布文本-主题矩阵 θd ,选择一个主题 z,获取这个句子的主题
      • 基于多项式分布主题-词矩阵 Φz ,获取这个句子唯一主题的一个主题词
      • 其中,句子的主题z的获取来自于如下:

推导来自于Sentence-based text analysis for customer reviews论文的附录

实战的总结

训练的技巧

  • 迭代次数在1000-1200次基本上均可收敛,亲测了20万条的小样本数据和1亿2000万条的大样本数据均在1100-1400收敛,loss提升小于十万分之一,收益太小了。
  • 超参数alpha越大,先验起的作用就越大,推导的topic分布就越倾向于在每个topic上的概率都差不多。alpha的经验选择为50/topic的个数,beta一般为0.01
    3个彩图中,每一个点对应一个主题分布,高度代表某个主题分布被dirichlet分布选中的概率,且选不同的alpha,dirichlet 分布会偏向不同的主题分布
  • K × 词典的大小 ~ 语料库中词的总数,这个是老师上课说的,但是实锤无效,在数据量足够大的情况下(500万条以上有效文本),建议做k~512,2048,4096组合
  • 不要用变分推断,实测吉布斯采样的WarpLda,LightLda效果比GensimLDA要好,聚出来的主题一致性更高。WarpLda支持Familia框架更方便部署,LightLda的训练结果更快,各有千秋

数据预处理的技巧

  • 去除一些TF/DF较低/高的词,较低的词在拟合的过程中会被平滑掉,较高的词没有区分力
  • 手动合并2-gram的一些词,会增强生成主题的表述能力
  • 可以通过相似文本合并,相似用户合并,解决短文本主题生成不准的问题。如果数据量很大则不用考虑,直接剔除短文本即可
  • 数据分布不平衡会导致小主题识别不出来。原因是LDA设计思路就是使得通过主题-词分布+文本-主题分布矩阵最大化语料库词出现的似然概率,如果某个类别特别大,小主题可以拆开单独训练一个model

微信扫一扫,分享到朋友圈

主题模型的一些思考

数据仓库上云那些事儿

上一篇

抖音上的那些普通人:用短视频写诗,在隔离病房里创作

下一篇

你也可能喜欢

主题模型的一些思考

长按储存图像,分享给朋友