gpt4 book ai didi

algorithm - 在 Jurafsky + Martin,第 2 版中实现前向后向/Baum-Welch

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:34:11 25 4
gpt4 key购买 nike

我正在实现前向后向/Baum-Welch 算法,如 Jurafsky + Martin 的语音和语言处理(第 2 版)中所述,作为词性标注器。我的代码大致结构如下:

#Initialize transition probability matrix A and observation likelihood matrix B
(A,B) = init() #Assume this is correct

#Begin forward-backward/Baum-Welch algorithm
for training_sentence in training_data:
(A,B) = forward_backward(A,B,training_sentence, vocabulary, hidden_state_set)

#Use new A,B to test
i = 0
for test_sentence in test_data:
predicted_tag_sequence = viterbi(test_sentence, vocabulary, A,B)
update_confusion_matrix(predicted_tag_sequence, actual_tag_sequences[i])
i += 1

我的实现在调用 forward_backward 之前初始化 A 和 B。那么forward_backward每次迭代使用的A,B就是上一次迭代计算的A,B。

我遇到了 2 个问题:

  1. 在第一次迭代之后,A 和 B 非常稀疏,以至于 forward_backward 的 future 迭代不会执行期望最大化步骤。
  2. 最终的 A 和 B 非常稀疏,以至于在应用 Viterbi 时,每个单词都被分配了一些任意标签(因为 A 和 B 非常稀疏,句子中几乎任何标签序列的概率都是 0)。

我做错了什么?我最大的担忧是理论上的:我用上一次迭代中的 A、B 调用 forward_backward 是否正确?或者我应该使用我的初始 A、B 进行 forward_backward 的所有迭代,并将我的最终 A、B 作为结果的平均值?如果我的代码理论上没问题,还有什么地方可能出错?

最佳答案

不,你不应该在每个句子之后更新 A 和 B 矩阵;每次遍历训练数据时,A 和 B 应该只更新一次。您应该使用上一次迭代的 A 和 B 来计算每个句子的部分计数,然后将这些计数相加以获得新的 A 和 B,用于下一次传递数据。

程序应该是:

  1. 初始化A和B
  2. 对于每个句子,使用前向-后向计算预期计数
  3. 将预期计数相加得到下一个A和B
  4. 重复步骤 2 和 3 直到收敛。

关于algorithm - 在 Jurafsky + Martin,第 2 版中实现前向后向/Baum-Welch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13349304/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com