基于动态规划的维特比(Viterbi)算法详解
题目描述
维特比算法是一种用于求解隐马尔可夫模型(HMM)中最可能状态序列(即最优路径)的动态规划算法。在自然语言处理中,它广泛应用于序列标注任务,如词性标注、命名实体识别和中文分词。其核心问题是:给定一个观测序列(如一个句子)和HMM模型参数(状态转移概率、观测发射概率、初始状态概率),如何高效地找出最可能生成该观测序列的隐含状态序列(如每个单词对应的词性标签)。
解题过程讲解
我们以一个简单的词性标注场景为例:观测序列是一个句子“I love NLP”,隐含状态是词性标签(如“PRP”代词、“VBP”动词、“NN”名词)。目标是找到最可能的词性序列,如“[PRP, VBP, NN]”。
第一步:问题形式化与HMM模型回顾
- 定义HMM模型参数:
- 状态集合 \(S = \{s_1, s_2, ..., s_N\}\),如 \(\{PRP, VBP, NN\}\)。
- 观测集合 \(O = \{o_1, o_2, ..., o_T\}\),如 \(\{I, love, NLP\}\),其中 \(T=3\)。
- 初始状态概率 \(\pi_i = P(s_i)\),表示句子第一个词属于状态 \(s_i\) 的概率。
- 状态转移概率 \(a_{ij} = P(s_j | s_i)\),表示从状态 \(s_i\) 转移到 \(s_j\) 的概率。
- 观测发射概率 \(b_j(o_t) = P(o_t | s_j)\),表示在状态 \(s_j\) 下生成观测 \(o_t\) 的概率。
- 目标:求最可能的状态序列 \(Q = (q_1, q_2, q_3)\),使得条件概率 \(P(Q | O)\) 最大。根据贝叶斯定理,这等价于最大化联合概率 \(P(Q, O)\)。
第二步:维特比算法的动态规划思想
- 暴力枚举所有状态序列的复杂度为 \(O(N^T)\),不可行。维特比算法利用动态规划将复杂度降至 \(O(T \times N^2)\)。
- 核心思路:
- 定义 \(\delta_t(i)\) 为在时刻 \(t\),所有到达状态 \(s_i\) 的路径中,路径的最大概率值。
- 递推公式:
\[ \delta_t(j) = \max_{1 \leq i \leq N} [\delta_{t-1}(i) \cdot a_{ij}] \cdot b_j(o_t) \]
其中,$ \delta_1(j) = \pi_j \cdot b_j(o_1) $。
- 同时,用 \(\psi_t(j)\) 记录使 \(\delta_t(j)\) 最大的前一时刻状态索引,用于回溯最优路径。
第三步:逐步计算示例
假设模型参数简化如下(概率值为示例,非真实数据):
- 初始概率:\(\pi = [0.6 (PRP), 0.3 (VBP), 0.1 (NN)]\)。
- 转移概率矩阵 \(A\)(行:当前状态,列:下一状态):
PRP VBP NN PRP 0.1 0.7 0.2 VBP 0.3 0.2 0.5 NN 0.4 0.4 0.2 - 发射概率 \(B\)(状态生成单词的概率):
- PRP生成“I”概率0.8,VBP生成“I”概率0.1,NN生成“I”概率0.1。
- VBP生成“love”概率0.7,其他状态生成“love”概率0.1。
- NN生成“NLP”概率0.9,其他状态生成“NLP”概率0.05。
计算过程:
- 初始化(\(t=1\),观测“I”):
- \(\delta_1(PRP) = 0.6 \times 0.8 = 0.48\),\(\psi_1(PRP)=0\)。
- \(\delta_1(VBP) = 0.3 \times 0.1 = 0.03\),\(\psi_1(VBP)=0\)。
- \(\delta_1(NN) = 0.1 \times 0.1 = 0.01\),\(\psi_1(NN)=0\)。
- 递推(\(t=2\),观测“love”):
- 对状态 \(j = PRP\):
\[ \delta_2(PRP) = \max(0.48\times0.1, 0.03\times0.3, 0.01\times0.4) \times 0.1 = 0.048 \times 0.1 = 0.0048 \]
最大值来自 $ i=PRP $,记录 $ \psi_2(PRP)=PRP $。
- 对状态 \(j = VBP\):
\[ \delta_2(VBP) = \max(0.48\times0.7, 0.03\times0.2, 0.01\times0.4) \times 0.7 = 0.336 \times 0.7 = 0.2352 \]
$ \psi_2(VBP)=PRP $。
- 对状态 \(j = NN\):
\[ \delta_2(NN) = \max(0.48\times0.2, 0.03\times0.5, 0.01\times0.2) \times 0.1 = 0.096 \times 0.1 = 0.0096 \]
$ \psi_2(NN)=PRP $。
- 递推(\(t=3\),观测“NLP”):
- 对状态 \(j = PRP\):
\[ \delta_3(PRP) = \max(0.0048\times0.1, 0.2352\times0.3, 0.0096\times0.4) \times 0.05 = 0.07056 \times 0.05 = 0.003528 \]
$ \psi_3(PRP)=VBP $。
- 对状态 \(j = VBP\):计算得 \(\delta_3(VBP)=0.016464\),\(\psi_3(VBP)=VBP\)。
- 对状态 \(j = NN\):
\[ \delta_3(NN) = \max(0.0048\times0.2, 0.2352\times0.5, 0.0096\times0.2) \times 0.9 = 0.1176 \times 0.9 = 0.10584 \]
$ \psi_3(NN)=VBP $。
第四步:回溯最优路径
- 终止:在 \(t=3\) 时,最大概率 \(P^* = \max \delta_3(j) = 0.10584\),对应状态 \(q_3^* = NN\)。
- 回溯:
- \(q_3 = NN\),由 \(\psi_3(NN)=VBP\) 得 \(q_2 = VBP\)。
- 由 \(\psi_2(VBP)=PRP\) 得 \(q_1 = PRP\)。
- 最优状态序列:\([PRP, VBP, NN]\),即“I”为代词,“love”为动词,“NLP”为名词。
第五步:算法总结与应用扩展
- 维特比算法通过动态规划避免指数爆炸,是序列标注任务的基础。
- 实际应用中,概率通常取对数转换为加法运算,防止浮点数下溢。
- 扩展:可与深度学习结合,如用BiLSTM输出状态分数替代HMM概率,再用维特比解码(如CRF层)。