Gokix

一言(ヒトコト)

序列模型

隐马尔可夫模型 Hidden Markov Model

HMM是最简单的序列模型,满足2条独立性假设:

  1. 马尔可夫性:每个隐藏状态仅取决于前一隐藏状态,即\(\text{Pr}[h_t \mid h_0, h_1, \dots h_{t-1}] = \text{Pr}[h_t \mid h_{t-1}]\)
  2. 观测独立性:每个输出结果仅取决于当前隐藏状态,即\(\text{Pr}[y_t \mid h_0, h_1, \dots h_{t}, y_0, y_1, \dots, y_{t-1}] = \text{Pr}[y_t \mid h_t]\)

HMM的构成部分有:

  • 隐藏状态集\(Q = \{q_1, q_2 ,\dots, q_n \}\):任意隐藏状态\(h_i\)一定属于\(Q\)
  • 输出结果集\(V = \{v_1, v_2, \dots, v_m \}\):任意输出结果\(y_i\)一定属于\(V\)
  • 状态转移矩阵\(A_{(nn)}\):描述隐藏状态之间转换的概率,其中\(a_{ij}\)表示从\(q_i\)转移到\(q_j\)的概率,即\(\text{Pr}[h_{t+1} = q_j \mid h_{t} = q_i]\)
  • 发射概率矩阵\(B_{(nm)}\):描述某个隐藏状态下得到某个输出的概率,其中\(b_{ij}\)表示隐藏状态\(q_i\)下输出\(y_j\)的概率,即\(\text{Pr}[y_{t} = v_j \mid h_{t} = q_i]\)
  • 初始状态\(\pi_{(n)}\):初始状态是某个隐藏状态的概率,其中\(\pi_i = \text{Pr}[h_0 = q_i]\)

HMM能解决的常见问题包括:

  1. 评估:对于一个HMM模型,判断某个输出结果\(\tilde{y}\)在该模型下的概率。
  2. 解码:对于一个HMM模型,给定一个输出结果\(\tilde{y}\),寻找其最有可能的对应隐藏序列\(\tilde{h}\)
  3. 学习:给定若干输出结果\(\{\tilde{y}\}\),构建最有可能输出这些输出的HMM模型。

以下通过NER问题(Named Entity Recogniti)展示HMM在解码问题上的流程。

NER问题给定训练集和测试集,数据集中每一条数据是一个句子,句子中每个词语有对应的意义标注。需要通过训练集得出一个HMM,再用这个HMM对测试集的句子中每个词语进行标注,通过比较HMM的标注和真实标注衡量准确率。

我们可以将HMM中的\(Q\)视为标注集合,\(V\)视为词语集合。通过训练集得到HMM无需像CNN等进行迭代训练,而是直接统计频率并平滑化算出\(\pi, A, B\)
具体地,\(\pi_{i}\)直接由每个标记出现在句首的次数除以总句子数得到,此外,为了保证不要出现某个值为0导致HMM永远不会选择这条路径,我们对所有的分子加1(保证非0)并分母加\(|Q|\)(保证\(\sum \pi = 1\)),得到平滑化的\(\{\pi\}\)
类似的,\(A\)的计算也是通过频率统计和平滑化得到。计算\(a_{ij}\)为统计句子中\(q_{i}\)之后紧挨着\(q_{j}\)的次数除以\(q_{i}\)后有单词的次数(句末以外\(q_{i}\)出现次数),再分子加1分母加\(|Q|\)得到。\(B\)的计算也是通过频率统计和平滑化得到。计算\(b_{ij}\)\(q_{i}\)输出\(v_{j}\)的次数除以\(q_{i}\)出现次数,再分子加1分母加\(|V|\)得到。
这样通过训练集直接计算出一个HMM:\(\lambda= \{\pi, A, B, Q, V\}\)。接下来使用\(\lambda\)在测试集上推断。

测试的时候通过Viterbi算法实现。目标是根据\(\lambda\)和给定的\(Y\),还原出最优可能的\(H\),即最大化\(\text{Pr}[H \mid Y]\)。由于\(\text{Pr}[H \mid Y] = \dfrac{\text{Pr}[H , Y]}{{\text{Pr}[Y]}}\),而\(Y\)是已知的,于是条件概率和积概率只差常数倍,于是目标转化为最大化\(\text{Pr}[H, Y]\)。而\(\text{Pr}[H, Y] = \text{Pr}[h_0] \cdot \text{Pr}[y_0 \mid h_0] \cdot \text{Pr}[h_1 \mid h_0, y_0] \cdot \text{Pr}[y_1 \mid h_0, y_0, h_1] \cdots \text{Pr}[y_{T-1} \mid h_0, y_0, h_1, y_1, \cdots, h_{T-1}] \\ = \text{Pr}[h_0] \cdot \text{Pr}[y_0 \mid h_0] \cdot \text{Pr}[h_1 \mid h_0] \cdot \text{Pr}[y_1 \mid h_1] \cdots \text{Pr}[y_{T-1} \mid h_{T-1}] \\ = \pi_{h_0} b_{h_0, y_0} \prod\limits_{t=1}^{T-1} (a_{h_{t-1},h_{t}} \cdot b_{h_{t},y_{t}})\)
由于只需要最大化,为了计算简便和精度要求,对等式两边同时取对数,得到\(\log \text{Pr}[H, Y] = \log \pi_{h_0} + \log b_{h_0, y_0} + \sum\limits_{t=1}^{T-1} (\log a_{h_{t-1}, h_{t}} + \log b_{h_t, y_t})\)。以下\(\pi, A, B\)默认指的是对数概率,即原值取对数后得到的值。

Viterbi算法使用动态规划,记录每一步的当前概率最大值和当前最大值由哪一状态更新而来,最后求得全局概率最大值后反向回溯更新路径得到所求\(\hat{H}\)。具体地,令\(\delta_t(q_j)\)表示\(t\)时刻,以\(q_j\)结尾的隐序列最大概率值,\(\psi_t(q_j)\)表示这个最大值是由\(t-1\)时刻的哪个序列更新而来。初始\(\delta_0(q_j) = \pi(q_j) + b_{q_j, y_0}\),更新\(\delta_t(q_j) = \max\limits_{q_i}\{\delta_{t-1}(q_i) + a_{q_i, q_j} \} + b_{q_j, y_t}\),而\(\psi_t(q_j) = \arg\max\limits_{q_i}\{\delta_{t-1}(q_i) + a_{q_i, q_j} \}\)。这样一直推理到最后,找到最大的一个\(\delta_{T-1}(q_j)\),沿着其\(\psi\)序列回溯即得到所求的标记序列。

条件随机场 Conditional Random Field

CRF是一种判别式序列模型,直接对\(\text{Pr}[Y \mid X]\)建模。满足假设:

  1. 马尔可夫性:每个输出状态仅取决于前后紧邻输出状态和整个观测序列,即\(\text{Pr}[y_t \mid X,Y] = \text{Pr}[y_t \mid X, y_{t-1}, y_{t+1}]\)
  2. 实际使用时由于参数限制,\(y_t\)不依赖于整个观测序列,而是只取相近的几个。

特征:CRF为每个词手动设计若干特征,这些特征类型多样,如“当前词是什么”、“当前词的前一个词是什么”、“当前词的后一个词是什么”、“当前词处于句子的开始/中间/结尾”等。这些特征构成\(X\)进入模型与标签\(Y\)之间具有条件概率。

CRF有两种转移权重(注意不是概率),都是可学习参数。一个是发射权重emit[f, t],表示特征f支持标签t的权重。另一个是trans[s, t],表示标签s转移到标签t的偏好权重。

CRF的优化目标是最大化标签对句子的条件概率\(\text{Pr}[y \mid x] = \dfrac{\exp(\operatorname{score}(x, y))}{Z(x)}\)。其中\(x\)是给定句子,\(y\)是给定标签,\(\operatorname{score}(x, y)\)的定义是发射得分与转移得分之和,\(Z(x)\)是归一化因子。具体的,发射得分emit_score是句子中对每个个词生成其对应若干特征,求所有特征对该词对应特征的发射权重之和;转移得分trans_score是对于给定标签所有转移权重之和。归一化因子通过计算所有可能\(y\)对给定\(x\)的得分得到,即\(Z(x) = \sum\limits_{\text{any possible } \check{y}}\exp(\operatorname{score}(x, \check{y}))\)(或者说,在所有可能的标签序列构成的空间上应用softmax)。
在实际计算时,由于无法直接枚举所有可能的\(\check{y}\)(时间复杂度是指数级),因此采用动态规划计算\(Z(x)\)。设句子长度为\(T\),记\(\alpha_t(j)\)表示前\(t\)个词,且第\(t\)个位置的标志是\(j\)\(\sum\exp(\operatorname{score})\)。初始化\(\alpha_0(j) = \exp(\text{emit_score[0, j]})\),递推\(\alpha_t(j) = (\sum\limits_{i}\alpha_{t-1}(i) \cdot \exp(\text{trans[i, j]})) \cdot \exp(\text{emit_score[i, j]})\)。最终\(Z(x) = \sum\limits_{j}\alpha_{T-1}(j)\)

CRF一般使用负对数似然损失函数,即\(\text{loss} = - \log \text{Pr}[y \mid x] = \log Z(x) - \operatorname{score(x, y)}\)

解码时还是使用Viterbi算法。给定一个句子\(X\),求\(\hat{Y}\)使\(\text{Pr}[\hat{Y} \mid X]\)最大化。用\(\delta_{t}(j)\)表示到第\(t\)个位置,第\(t\)个位置标志为\(j\)的最大分数,更新公式为\(\delta_t(j) = (\max\delta_{t-1}(i) + \text{trans[i, j]}) + \text{emit_score[i, j]}\),同时用\(\psi_t(j)\)记录最大值更新来源,到最后回溯即得到所求序列。

CRF with transformer encoder

传统CRF的问题在于特征需要人为规定,既复杂又有感受野小等缺点。

于是考虑使用BERT完成解码工作。BERT可以将词映射到768维向量,然后设置一个线性层将这个768维向量映射到emit中。于是直接用BERT得到每个词的768个特征,而不需要像传统CRF一样手动设置特征。其余trans计算都保持不变。

posted @ 2026-05-03 23:34  Gokix  阅读(28)  评论(0)    收藏  举报