基于期望最大化(EM)算法的隐马尔可夫模型(HMM)参数估计详解
我来为你详细讲解基于期望最大化算法来估计隐马尔可夫模型参数的完整过程。HMM是序列标注任务(如词性标注、命名实体识别)的基础模型,而EM算法是其参数学习的核心方法。
1. 问题描述
问题:给定观测序列但不知道对应的状态序列,如何自动学习HMM的参数(初始状态概率、状态转移概率、观测生成概率)?
现实背景:假设我们有一批中文句子(观测序列),但不知道每个词语对应的词性标签(隐藏状态)。我们希望从这些无标签的句子中自动学习一个HMM模型,它能捕捉词语和词性之间的关系。
形式化定义:
- 观测序列:\(O = (o_1, o_2, ..., o_T)\),其中 \(o_t\) 是第t时刻的观测(如词语)
- 隐藏状态序列:\(Q = (q_1, q_2, ..., q_T)\),其中 \(q_t \in \{s_1, ..., s_N\}\) 是N个可能状态之一
- HMM参数 \(\lambda = (A, B, \pi)\):
- \(\pi_i = P(q_1 = s_i)\):初始状态概率
- \(a_{ij} = P(q_{t+1} = s_j | q_t = s_i)\):状态转移概率
- \(b_i(k) = P(o_t = v_k | q_t = s_i)\):观测生成概率
关键难点:状态序列Q是隐藏的,无法直接通过计数统计来估计参数。
2. 算法核心思想
EM算法通过迭代方式解决这个"鸡生蛋蛋生鸡"的问题:
- E步(期望步):基于当前参数估计,计算隐藏状态序列的"软分配"(概率分布)
- M步(最大化步):基于E步得到的"软计数",更新参数估计
- 重复迭代直到收敛
直觉理解:先"猜"一个初始模型,然后用这个模型"推测"每个词可能的词性概率,再用这些概率"重新训练"模型,如此反复改进。
3. 详细推导过程
3.1 前向后向算法(E步的核心工具)
在计算期望之前,我们需要两个关键概率:
前向概率 \(\alpha_t(i) = P(o_1, o_2, ..., o_t, q_t = s_i | \lambda)\)
- 表示到t时刻为止观测到 \(o_1...o_t\),且t时刻处于状态 \(s_i\) 的概率
- 递推公式:
\[ \alpha_1(i) = \pi_i b_i(o_1) \]
\[ \alpha_{t+1}(j) = \left[ \sum_{i=1}^N \alpha_t(i) a_{ij} \right] b_j(o_{t+1}) \]
后向概率 \(\beta_t(i) = P(o_{t+1}, o_{t+2}, ..., o_T | q_t = s_i, \lambda)\)
- 表示在t时刻处于状态 \(s_i\) 的条件下,从t+1到T时刻观测到 \(o_{t+1}...o_T\) 的概率
- 递推公式:
\[ \beta_T(i) = 1 \]
\[ \beta_t(i) = \sum_{j=1}^N a_{ij} b_j(o_{t+1}) \beta_{t+1}(j) \]
3.2 两个关键期望统计量(E步的核心计算)
1. 状态占用概率 \(\gamma_t(i) = P(q_t = s_i | O, \lambda)\)
- 在给定整个观测序列的条件下,t时刻处于状态 \(s_i\) 的概率
- 计算公式:
\[ \gamma_t(i) = \frac{\alpha_t(i) \beta_t(i)}{\sum_{j=1}^N \alpha_t(j) \beta_t(j)} \]
- 分母是归一化因子,确保概率和为1
2. 状态转移期望计数 \(\xi_t(i,j) = P(q_t = s_i, q_{t+1} = s_j | O, \lambda)\)
- 在给定观测序列的条件下,t时刻处于状态 \(s_i\) 且t+1时刻转移到状态 \(s_j\) 的概率
- 计算公式:
\[ \xi_t(i,j) = \frac{\alpha_t(i) a_{ij} b_j(o_{t+1}) \beta_{t+1}(j)}{\sum_{i=1}^N \sum_{j=1}^N \alpha_t(i) a_{ij} b_j(o_{t+1}) \beta_{t+1}(j)} \]
3.3 参数更新公式(M步)
有了上述期望统计量,我们可以用"软计数"代替"硬计数"来更新参数:
1. 初始状态概率:
\[\hat{\pi}_i = \gamma_1(i) \]
解释:初始时刻处于状态 \(s_i\) 的期望概率
2. 状态转移概率:
\[\hat{a}_{ij} = \frac{\sum_{t=1}^{T-1} \xi_t(i,j)}{\sum_{t=1}^{T-1} \gamma_t(i)} \]
解释:从状态 \(s_i\) 转移到 \(s_j\) 的期望次数 ÷ 从状态 \(s_i\) 出发的总期望次数
3. 观测生成概率:
对于离散观测:
\[\hat{b}_j(k) = \frac{\sum_{t=1}^{T} \gamma_t(j) \cdot \mathbb{I}(o_t = v_k)}{\sum_{t=1}^{T} \gamma_t(j)} \]
其中 \(\mathbb{I}(o_t = v_k)\) 是指示函数,当 \(o_t\) 等于第k个观测符号时为1,否则为0
解释:在状态 \(s_j\) 下生成观测 \(v_k\) 的期望次数 ÷ 处于状态 \(s_j\) 的总期望次数
4. 完整EM算法流程(Baum-Welch算法)
输入:
- 观测序列集合 \(\{O^{(1)}, O^{(2)}, ..., O^{(M)}\}\)
- 状态数N,观测符号数K
- 最大迭代次数或收敛阈值
步骤:
步骤1:初始化参数
- 随机初始化 \(\pi, A, B\),或使用均匀分布
- 例如:\(\pi_i = 1/N\),\(a_{ij} = 1/N\),\(b_j(k) = 1/K\)
步骤2:E步(对每个观测序列独立计算)
- 使用当前参数 \(\lambda\) 计算前向概率 \(\alpha_t(i)\)
- 计算后向概率 \(\beta_t(i)\)
- 计算 \(\gamma_t(i)\) 和 \(\xi_t(i,j)\)
- 累加所有序列的统计量:
- \(\Gamma(i) = \sum_m \sum_t \gamma_t^{(m)}(i)\)
- \(\Xi(i,j) = \sum_m \sum_t \xi_t^{(m)}(i,j)\)
- \(\Psi_j(k) = \sum_m \sum_t \gamma_t^{(m)}(j) \cdot \mathbb{I}(o_t^{(m)} = v_k)\)
步骤3:M步(参数更新)
- 更新初始概率:\(\pi_i = \frac{\gamma_1(i)}{\sum_j \gamma_1(j)}\)
- 更新转移概率:\(a_{ij} = \frac{\Xi(i,j)}{\Gamma(i)}\)
- 更新生成概率:\(b_j(k) = \frac{\Psi_j(k)}{\Gamma(j)}\)
步骤4:收敛判断
- 计算对数似然:\(\log P(O|\lambda) = \sum_{i=1}^N \alpha_T(i)\)
- 检查似然变化是否小于阈值,或达到最大迭代次数
- 如未收敛,返回步骤2
5. 实例说明
假设一个简化场景:
- 状态:{名词(NN), 动词(VB)}
- 观测:{我, 爱, 学习}
- 观测序列:"我爱学习"
迭代过程:
第一次迭代(随机初始化后):
- E步:计算每个位置是NN或VB的概率
- "我":可能60%是NN,40%是VB
- "爱":可能30%是NN,70%是VB
- "学习":可能50%是NN,50%是VB
- M步:用这些软计数更新
- 从NN到VB的转移概率 = (NN→VB的期望次数)/(处于NN的总次数)
多次迭代后:
- 模型会发现:"我"通常作主语→高概率是NN
- "爱"是动作→高概率是VB
- "学习"可以是动词或名词,但在此上下文中更可能是VB
- 收敛到合理的参数
6. 算法特性与注意事项
收敛性:
- EM算法保证每次迭代后似然不下降
- 但可能收敛到局部最优,与初始化有关
计算复杂度:
- 前向后向算法:\(O(N^2T)\),N为状态数,T为序列长度
- 对长序列需要优化
数值稳定性:
- 概率连乘会导致下溢
- 实际使用对数概率和对数空间的前向后向算法
初始化的影响:
- 随机初始化可能导致不同的局部最优
- 可以用有监督数据(如果有少量标注)初始化
- 或使用均匀初始化多次运行选最优
与有监督学习的对比:
- 有监督:直接统计标注数据
- 无监督EM:用概率软分配替代硬标注
- 半监督:结合少量标注数据和大量无标注数据
这个EM算法训练HMM的方法是统计自然语言处理的经典方法,为后来的条件随机场、神经网络序列模型奠定了基础。虽然现在深度学习更流行,但理解这个算法有助于掌握概率图模型学习的基本思想。