维特比算法中的对数概率(处理零概率)

问题描述 投票:0回答:2

我正在使用维特比算法在 Python 中编写概率词性标注器。在这种情况下,时间 t 的维特比概率是前一时间步 t-1 的维特比路径概率、从前一个 POS 标签到当前 POS 标签的转移概率以及给定的观察词的发射概率的乘积。 POS 标签。我通过在句子中的每个单词查看此时可能的每个标签/状态(根据观察到的训练数据)来计算此值,然后对于每个可能的标签计算由维特比概率给出的最有可能的路径多于。可以在here找到简单的伪代码实现。

重复乘以概率的一个实际问题是它可能会导致下溢。文献中经常提出的一种解决方案是使用对数概率。据我了解,你应该这样做:

current_probability = math.log(emission_probability) + math.log(transition_probability) + previous_probability

而不是

current_probability = emission_probability * transition_probability * previous_probability

假设三个概率存储在相应的变量中。

然而,我发现很难理解的一个问题是当发射概率或转移概率为 0 时该怎么办。Michael Collins 写道:“新算法的一个问题是 log 0 = −∞。有些人关心需要处理等于 0 的概率值。一个简单的解决方案是设置 log 0 = −B,其中 B 是一个很大的数。”

我应该使用多大的数字?

-math.inf

model hidden markov part-of-speech viterbi
2个回答
0
投票

处理这个问题的一种方法是添加一些平滑处理,例如 https://i.stack.imgur.com/LdNgP.png 哪里,

局部变量

word_tag:训练语料库中的单词数。 tag_total :标记为 TAG 的单词数,即 P(word|TAG)


0
投票

可能有点晚了,但我今天也遇到了同样的问题。

scipy.stats
中有一个特定的函数可以比仅使用
np.log(stats.poisson().pmf())
更有效地处理零概率的对数。您可以使用
stats.poisson.logpmf()
https://docs.scipy.org/doc/scipy/reference/ generated/scipy.stats.rv_discrete.logpmf.html)。

我不知道它是如何工作的,但它确实返回一个很大的负数(泊松分布的 lambda = 16,它大约返回 -832)。

© www.soinside.com 2019 - 2024. All rights reserved.