我也为这个参数和误导性的帮助文本而苦恼。
因此,我只是简单地测试了一下,比较了不同的日志输出,最终搜索了源代码并打开了PR,它给我带来了以下问题的答案:
学习了哪些参数? alpha 和 beta 是同时学习的还是只学习其中之一?如果是,是哪一个?
这取决于。使用default settings,不会学习任何参数,因为--optimize-interval 为 0。这意味着 alpha(⚠️ 实际上是所有 alpha 先验的总和)保持不变,即 alpha_k = 5.0 / num-topics。 Beta 默认为 0.01。
因此,alpha 和 beta 都是对称的 Dirichlet 先验。
(尽管 alpha 参数已正确记录,但当您习惯使用 gensim 指定 alpha 而不是 alphaSum 时,它仍然会产生误导。)
如果您为参数 --optimize-interval 提供大于 0 的值(以及注意 --num-iterations(默认值:1000)和 --optimize-burn-in(默认值:200)),则启用超参数优化阿尔法和贝塔。
因此,alpha 和 beta 都是从数据中学习到的优化 Dirichlet 先验。
但是,alpha 是作为不对称先验学习的,而 beta 始终是对称先验(即使 concentration parameter 已优化)。
如果您还设置了--use-symmetric-alpha True,则不仅优化了beta,还优化了alpha,但是您最终会得到一个对称的alpha先验(通过参数--alpha传递的初始值)和一个a根据--beta 传递的初始对称先验从数据中学习的对称 beta 先验。等等,什么!?不意味着超参数优化alpha 学习不对称先验?不是这种情况。最初通过的对称先验,准确地说是concentration parameter,还可以进一步优化以更好地拟合数据。
--use-symmetric-alpha 函数背后的原理是什么?
说实话,我不知道。我只观察到上述行为。
也许对于某些数据集,优化但仍然对称的alpha 先验可能更有意义,尽管Wallach et al. 不建议这样做
我之前错误地假设如果设置了--optimize-interval,则为 beta 学习了不对称先验。如here所示,情况并非如此。
mallet 中的帮助说:“...只优化浓度
文档主题分布的先验参数...”。但是
文档主题分布的先验是 alpha,不是吗?
你是对的。 Alpha 是文档-主题分布的先验,而 Beta 是主题-词分布的先验。
所以命令应该在帮助之后命名为--use-symmetric-beta。还是只是帮助文本中有错误?
确实是帮助文本中的mistake。
帮助文本也不包含错误,命令名称也不应更改。如果没有更多关于 Dirichlet 分布的背景知识,很难理解这个选项究竟做了什么。
对于出现同样误解的相关问题,我推荐以下slides by H. Wallach 或this excellent explanation。
不存在的选项 --use-symmetric-beta 未实现,因为 beta 在 Mallet 中始终是对称的!
此外,据我了解的文献(参见例如 Wallach et al. (2009): Rethinking LDA: Why Priors Matter)不对称先验仅对文档主题分布有利,对主题词没有任何好处分配。 Alpha 是文档主题分布的 Dirichlet 先验。接下来我不明白--use-symmetric-alpha函数的意义。
我完全同意你的看法。参数--use-symmetric-beta 会更有意义(根据我的有限理解)。
Wallach et al. 声明主题词分布的不对称先验没有提供真正的好处。
这正是 Mallet 只使用对称 beta 先验的原因。
尽管如此,如果 --optimize-interval 大于 0,β Dirichlet 之前的,更准确地说是 concentration parameter,将进一步 optimized。
Wallach et al. 回答为什么应该使用非对称 alpha 先验而不是对称先验的问题。
此外,帮助文本解释了使用--use-symmetric-alpha的后果如下:
这可能会减少非常小的、估计不佳的主题的数量,但可能会将常用词分散到多个主题中。
经验教训:
你不能(总是)相信帮助文本。它们可能具有误导性或假设某些背景知识会导致误解。如果您无法理解文档,请搜索代码。
源代码从不撒谎。