条件随机场CRF原理介绍 以及Keras实现
本文是对CRF基本原理的一个简明的介绍。当然,“简明”是相对而言中,要想真的弄清楚CRF,免不了要提及一些公式,如果只关心调用的读者,可以直接移到文末。 图示 # 按照之前的思路,我们依旧来对比一下普通的逐帧softmax和CRF的异同。 逐帧softmax # CRF主要用于序列标注问题,可以简单理解为是 给序列中的每一帧都进行分类 ,既然是分类,很自然想到将这个序列用CNN或者RNN进行编码后,接一个全连接层用softmax激活,如下图所示 逐帧softmax并没有直接考虑输出的上下文关联 条件随机场 # 然而,当我们设计标签时,比如用s、b、m、e的4个标签来做字标注法的分词,目标输出序列本身会带有一些上下文关联,比如s后面就不能接m和e,等等。逐标签softmax并没有考虑这种输出层面的上下文关联,所以它意味着把这些关联放到了编码层面,希望模型能自己学到这些内容,但有时候会“强模型所难”。 而CRF则更直接一点,它 将输出层面的关联分离了出来 ,这使得模型在学习上更为“从容”: CRF在输出端显式地考虑了上下文关联 数学 # 当然,如果仅仅是引入输出的关联,还不仅仅是CRF的全部,CRF的真正精巧的地方,是它 以路径为单位,考虑的是路径的概率 。 模型概要 # 假如一个输入有 n n 帧,每一帧的标签有 k k 种可能性,那么理论上就有 k n kn 中不同的输出