- CRF技术
- Viterbi(维特比)算法
- Word Embedding 词嵌入
Preliminaries
CRF
CRF,全称 Conditional Random Fields,中文名:条件随机场。
什么时候用CRF
当输出序列的每一个位置的状态,需要考虑到相邻位置的状态的时候。举两个例子:
- 假设有一堆小明日常生活的照片,可能的状态有吃饭、洗澡、刷牙等,大部分情况,我们是能够识别出小明的状态的,但是如果你看到一张小明露出牙齿的照片,在没有相邻的小明的状态为条件的情况下,是很难判断他是在吃饭还是刷牙的。这时,就可以用CRF。
- 假设有一句话,这里假设是英文,我们要判断每个词的词性,那么对于一些词来说,如果不知道相邻词的词性的情况下,是很难准确判断每个词的词性的。这时,也可以用CRF。
什么是随机场
随机变量的集合称为随机过程。由一个空间变量索引的随机过程,称为随机场。
一组随机变量按照某种概率分布随机赋值到某个空间的一组位置上时,这些赋予了随机变量的位置就是一个随机场。
比如上面的例子中,小明的一系列照片分别是:什么状态组成了一组位置,我们从一组随机变量{吃饭、洗澡、刷牙}中取值,随机变量遵循某种概率分布,随机赋给一组照片的某一张的输出位置,并完成这组照片的所有输出位置的状态赋值后,这些状态和所在的位置全体称为随机场。
为什么叫条件随机场
马尔可夫随机场:
如果一个位置的赋值只和与它相邻的位置的值有关,与和它不相邻的位置的值无关,那么这个随机场就是一个马尔可夫随机场。
这个假设用在小明和词性标注的例子中的话就是我们是通过前一张照片或者后一张照片的状态来判断当前照片的状态是刷牙还是吃饭,我们是根据前一个词的词性或者后一个词的词性来判断当前词的词性是什么。
条件随机场(CRF):
给定了一组观测状态(照片可能的状态/可能出现的词)下的马尔可夫随机场。
CRF考虑到了观测状态这个先验条件
CRF如何提取特征
CRF中有两类特征函数,分别是状态特征和转移特征
状态特征用当前节点(某个输出位置可能的状态中的某个状态称为一个节点)的状态分数表示
转移特征用上一个节点到当前节点的转移分数表示。
损失函数: \[ LossFunction = \frac{P_{RealPath}}{P_1+P_2+...+P_N} \] \(P_{RealPath}\)表示真实路径分数(包括状态分数和转移分数),\(P_i\)表示其他所有可能的路径的分数(包括状态分数和转移分数)。
这里的路径用词性来举例就是一句话对应的词性序列,真实路径表示真实的词性序列,其他可能的路径表示其他的词性序列。
对于词性标注来说,给定一句话和其对应的词性序列,那么其似然性的计算公式:
- \(l\)表示某个词上定义的状态特征的个数,\(k\)表示转移特征的个数,\(i\)表示词在句子中的位置。
- \(t_k\)和\(s_l\)分别是转移特征函数和状态特征函数。
- \(λ_k\)和\(μ_l\)分别是转移特征函数和状态特征函数的权重系数,通过最大似然估计可以得到。
- 上面提到的状态分数和转移分数都是非规范化的对数概率,所以概率计算都是加法,这里加上一个exp是为了将对数概率转为正常概率。实际计算时还会除以一个规范化因子\(Z(x)\),其实就是一个softmax过程。
在只有CRF的情况下,上面说的两类特征函数都是人工设定好的:人工设定了观测序列的特征
人为设定状态特征模板,比如设定“某个词是名词”等。
人为设定转移特征模板,比如设定“某个词是名词时,上一个词是形容词”等。
给定一句话的时候,就根据上面设定的特征模板来计算这句话的特征分数,计算的时候,如果这句话符合特征模板中的特征规则,则那个特征规则的值就为1,否则就为0。
所以如果我们能使用深度神经网络的方式,特征就可以由模型自己学习得到,这就是使用BERT+CRF的原因。
命名实体识别中的BERT和CRF是怎么配合的
由BERT学习序列的状态特征(实体标注),从而得到一个状态分数(每个可能的状态的softmax前的概率),该分数直接输入到CRF层,省去了人工设置状态特征模板。
实体标注:
通常用\(BIO\)标注,\(B\)表示词的开始,\(I\)表示词的延续,\(O\)表示非实体词
比如我们要识别人名和地点
小 | 明 | 爱 | 北 | 京 | 的 | 天 | 安 | 门 | 。 |
---|---|---|---|---|---|---|---|---|---|
B-Person | I-Person | O | B-Location | I-Location | O | B-Location | I-Location | I-Location | O |
BERT层学到了句子中每个字符最可能对应的实体标注是什么,这个过程是考虑到了每个字符左边和右边的上下文信息的,但是输出的最大分数对应的实体标注依然可能有误,不会100%正确的。所以需要CRF
CRF需要的两个特征函数,其中状态特征函数BERT已经提供了,所以CRF需要特征转移函数(特征转移矩阵),该矩阵表示了所有标注状态之间的组合。
比如上述一共5个状态,加上START和END就是7种状态,那么这个矩阵就是一个\(7\times 7\)的矩阵。这个矩阵一开始是随机初始化的,通过训练后慢慢会知道哪些组合更符合规则,哪些更不符合规则。
Viterbi(维特比)算法
举个例子:
小 | 明 | 爱 | 北 | 京 | 。 |
---|---|---|---|---|---|
B-Person | I-Person | O | O | O | O |
状态集合:\(\{B-P,I-P,O\}\)
首先,我们分别计算红、黄、蓝三个节点的输入连线的概率,以红色节点举例,我们先假设红色节点在最优路径上,那么输入到该节点的三条连线中,概率最大的那条一定在最优路径上,同理得出黄、蓝的连线。
最后递归获得所有的最优路线。由于就有三个起始状态,所以最后就有三条路径。
路线1 | B-P | I-P | O | O | O |
---|---|---|---|---|---|
路线2 | B-P | O | I-P | B-P | I-P |
路线3 | O | B-P | B-P | I-P | B-P |
然后利用上文所提到的状态转移矩阵:
初始节点的概率计算为:\(Π(B-P) \times P(小|B-P)\)
迭代方式是:$ P_{上一层} P_{转移概率} P(明|B-P)$
最后选取概率最大的路径。
Word Embedding 词嵌入
Embedding在数学上表示一个maping,\(f: X \to Y\), 也就是一个function,其中该函数是injective(就是我们所说的单射函数,每个\(Y\)只有唯一的\(X\)对应,反之亦然)和structure-preserving (结构保存,比如在X所属的空间上\(X1 < X2\),那么映射后在\(Y\)所属空间上同理 \(Y1 < Y2\))。
那么对于word embedding,就是将单词word映射到另外一个空间,其中这个映射具有injective和structure-preserving的特点。
通俗的翻译可以认为是单词嵌入,就是把X所属空间的单词映射为到Y空间的多维向量,那么该多维向量相当于嵌入到Y所属空间中,一个萝卜一个坑。