序列标注
CRF通常用于序列标注的场景,旨在为输入序列的每一个位置都赋予一个标签,假设模型的输入为Q,输出目标是一个序列a_1,a_2,\dots,a_n,按照通常的建模逻辑,我们希望目标输出序列的概率最大,即:
P(a_1,a_2,\dots,a_n|Q)
不论是传统方法还是深度学习方法,直接对完整序列建模是比较困难的,因此我们通常会使用一些假设来简化它,比如直接使用朴素假设,即可得到
P(a_1,a_2,\dots,a_n|Q)=P(a_1|Q)P(a_2|Q) \dots P(a_n|Q)
此时的Q不一定是原始输入,也可能是LSTM等网络的输出,我们可以认为LSTM的输出中已经具备了序列的特征信息,而且还可以在此基础之上假设输出序列之间互不相关,于是就可以得到:
P(a_1|Q) = P(a_1|q_1,q_2,\dots,q_n) = P(a_1|q_1)
P(a_2|Q) = P(a_2|q_1,q_2,\dots,q_n) = P(a_2|q_2)
P(a_3|Q) = P(a_1|q_1,q_2,\dots,q_n) = P(a_3|q_3)
…
P(a_n|Q) = P(a_1|q_1,q_2,\dots,q_n) = P(a_n|q_n)
从而
P(a_1|q_1,q_2,\dots,q_n|Q) = P(a_1|q_1)P(a_2|q_2)\dotsP(a_n|q_n)
这样就得到了最常用的方案,逐位输出概率值最大的标签。
条件随机场
在使用逐位输出概率值最大的标签的方法进行序列标注时,如果我们使用BIOES对实体信息进行标注,可能会出现BBB这样序列,但这个序列违反了我们的解码规则,B后应当只能为I或者E。之所以会出现这个问题,是因为我们假设输出序列之间互不相关,只要引入上下文信息,就可以解决这个问题。按照以往的方式,通常会建立一个转移矩阵,把不合理的转移概率设为0,如P(b|b)=0,然后通过动态规划保证得到合理的序列。
P(a_1,a_2,\dots,a_n|Q) = P(a_1|Q)P(a_2|a_1)P(a_3|a_1,a_2) \dots P(a_n|a_1,a_2,\dots,a_(n-1))=P(a_1|Q)P(a_2|a_1,Q) \dots P(a_n|a_(n-1),Q)
通过使用上述方法建立输出之间的联系,其中每一项都是转移概率。而CRF的做法是,假设序列之间存在关系f(x,y;Q),然后直接令
P(a_1|q_1,q_2,\dots,q_n|Q) = \frac{1}{Z} exp (\sum_k f(a_(k-1),a_k;Q))
其中Z是归一化因子,与前者相比,P(a_k|a_(k-1))是有概率意义的(条件概率),而单项的e^(f(a_(k-1),a_k;Q))/Z是没有概率意义额,所以CRF是更一般的形式。