在mallet中训练主题模型时,可以通过--optimize-interval [INTEGER]
函数在推理过程中学习超参数。关于这个功能,我有以下问题:
-
学习了哪些参数?阿尔法和贝塔是同时学习的还是只学习其中一个?如果是,是哪一个?
-
-use-symmetric-alpha
函数的有理性是什么?mallet中的帮助说:"……只优化文档主题分布的先验的集中参数……"。但文档主题分配的先验是alpha,不是吗?因此,根据帮助,该命令应命名为-use-symmetric-beta
。或者只是帮助文本中有一个错误?此外,就我对文献的理解而言(例如,参见Wallach等人(2009):重新思考LDA:为什么优先级很重要),不对称先验只对文档主题分布有利,对主题词分布没有好处。Alpha是文档主题分布的dirichlet先验。在此之后,我不理解-use-symmetric-alpha
函数的意义。 -
在mallet中是否有可能只学习文档主题分发之前的内容?
感谢您的帮助。
我也很难处理这个参数和误导性的帮助文本。因此,我简单地测试了它,比较了不同的日志输出,最终搜索了源代码,并打开了一个PR,为您的问题提供了以下答案:
学习了哪些参数?阿尔法和贝塔是同时学习的还是只学习其中一个?如果是,是哪一个?
这取决于情况。使用默认设置时,不会学习任何参数,因为--optimize-interval
为0。这意味着,alpha(⚠️其实际上是所有阿尔法先验的总和)保持不变,即阿尔法_k=5.0/num个主题。默认情况下,Beta为0.01。因此,阿尔法和贝塔都是对称的狄利克雷先验。(尽管alpha参数记录正确,但当您习惯于在指定alpha
而非alphaSum
的情况下生成sim时,它仍然具有误导性。)
如果为参数--optimize-interval
提供大于0的值(同时注意--num-iterations
(默认值:1000)和--optimize-burn-in
(默认值为200)),则可以同时为alpha和beta启用超参数优化。因此,α和β都是从数据中学习的优化的狄利克雷先验。然而,α被学习为不对称先验,β始终是对称先验(即使浓度参数被优化)
如果同时设置--use-symmetric-alpha True
,则不仅优化了β,还优化了α,但最终会得到对称的α先验(通过参数--alpha
传递的初始值)和基于--beta
传递的初始对称先验从数据中学习到的a对称β先验。等等,什么!?这并不意味着超参数优化alpha
学习不对称先验?事实并非如此。最初通过的对称先验,准确地说是浓度参数,也可以进一步优化以更好地拟合数据。
--use-symmetric-alpha
函数背后的有理数是什么?
老实说,我不知道。我只观察到了上述行为。也许对于某些数据集,优化但仍然对称的alpha
先验可能更有意义,尽管Wallach等人不建议这样做。
我之前错误地假设,如果设置了--optimize-interval
,那么β的不对称先验是学习的。从这里可以看出,情况并非如此。
mallet中的帮助说:";。。。仅优化浓度先验超文档主题分布的参数&";。但是文档的主题分发是alpha,不是吗?
你说得对。Alpha是文档主题分发的首选,beta是主题词分发的首选。
因此该命令应在帮助之后命名为
--use-symmetric-beta
。或者只是帮助文本中有一个错误?
的确,这是帮助文本中的一个错误帮助文本中既不包含错误,也不应更改命令名称。如果没有更多关于狄利克雷分布的背景知识,很难理解这个选项的确切作用。我推荐H.Wallach的以下幻灯片,或者对发生同样误解的相关问题进行出色的解释。
不存在的选项--use-symmetric-beta
未实现,因为beta在Mallet中始终是对称的!
此外,就我对文献的理解而言(例如,参见Wallach等人(2009):重新思考LDA:为什么优先级很重要),不对称先验只对文档主题分布有利,对主题词分布没有好处。Alpha是文档主题分布的Dirichlet先验。在此之后,我不理解
--use-symmetric-alpha
函数的意义。
我完全同意你的看法。参数Wallach等人指出,主题词分布的不对称先验并没有带来真正的好处。这正是Mallet只使用对称贝塔先验的原因。然而,如果--use-symmetric-beta
会更有意义(根据我有限的理解)--optimize-interval
大于0,则β-狄利克雷先验,更准确地说是浓度参数,将被进一步优化。Wallach等人回答了为什么应该使用不对称的α先验而不是对称的α先验的问题。
此外,帮助文本解释了使用--use-symmetric-alpha
的后果如下:
这可能会减少非常小、估计不准确的主题的数量,但可能会将常用词分散到几个主题上。
经验教训:你不能(总是)相信帮助文本。它们可能具有误导性,或者假定某些背景知识,从而导致误解。如果您在理解文档时遇到困难,请搜索代码。源代码从不说谎。