上篇文章中介绍了一种 parsing 算法 CYK,这篇文章要介绍的 inside-outside 是另一个 parsing 算法。
算法输入
- 一句话 s=x1…xn
- 满足 CNF 的 CFG
- potential function
什么是 potential function?
对于一个规则 r ,使用 ψ(r) 代表这个规则的 potential,在这里也就是概率:
ψ(A→BC,i,k,j)=q(A→BC)
ψ(A,i)=q(A→xi)
因此对于一个 parse tree t ,它的概率为 ψ(t)=∏r∈tψ(r).
算法输出
Z=∑t∈Tψ(t) 表示所有可能的 parse tree 的概率和。
对于所有规则 r, 定义
μ(r)=t∈(T):r∈t∑ψ(t)
也就是所有包括规则 r 的 parse tree 概率和。
以及对于 A∈N,1≤i≤j≤n,
μ(A,i,j)=t∈(T):(A,i,j)∈t∑ψ(t)
也就是所有 parse tree 中,以 A 为根节点,叶节点扩散到 xi…xj 这些单词的子树的概率和。
我们使用 α(A,i,j) 和 β(A,i,j) 分别代表 inside 和 outside 算法。
Inside
inside 算法实际上就是把 CYK 中对所有 parse tree 取最大概率的操作换成了求和。
即
α(A,i,j)=t∈T(A,i,j)∑ψ(t)
以这个 parse tree 为例:
它关于 (NP,4,5) 的 inside tree t2就是
同样地,outside tree t1是
这个 outside tree 根节点是 S,叶节点是 x1…x3NPx6…xn
易知
ψ(t)=ψ(t1)×ψ(t2)
Outside
由上述定义知,对于一个 outside tree t ,它的 potential 为 ψ(t),也就是这个 tree 里所有规则的乘积。
我们使用符号 O(A,i,j) 来代表所有可能的 outside tree 的集合(以 A 为根节点,扩散到 i 和 j 之间的所有单词),那么
β(A,i,j)=t∈O(A,i,j))∑ψ(t)
也就是说,β(A,i,j) 是所有 O(A,i,j) 中 potential 的和。
根据上述定义推出一些性质:
Z=t∈T∑ψ(t)=α(S,1,n)
μ(A,i,j)=t∈T:(A,i,j)∈t∑ψ(t)=t1∈O(A,i,j)∑t2∈T(A,i,j)∑(ψ(t1)×ψ(t2))=⎝⎛t1∈O(A,i,j)∑ψ(t1)⎠⎞×⎝⎛t2∈T(A,i,j)∑ψ(t2)⎠⎞=α(A,i,j)×β(A,i,j)
Inside-outside 算法的全部过程如图:
PCFG 中的 EM 算法
在掷硬币中的 EM 算法中我们介绍了 EM 算法,EM 算法在 PCFG 中起着非常重要的作用,它的实质是参数的更新。
算法的输入有 n 个训练样本(n 句话),例如 x1(i) 代表第 i 个样本中的第一个单词。
设 Ti 为第 i 轮迭代时所有可能的 parse tree,q(r) 为规则 r 的参数(概率),
初始 q0(r) 可以设为随机值,然后算出 q1,q2,… 直到收敛。
q 的更新过程如下,首先需要算出在 t−1 次迭代时 qt−1 下的 expected counts f(r) ,那么 qt就能求得:
qt(A→γ)=∑A→γ∈Rf(A→γ)f(A→γ)
那么如何计算 f(r) 呢?
Expected Counts
设count(t,r) 为规则 r 出现在 t 中的次数,θ 是代表所有规则概率的 vector,那么有
ft−1(r)=i=1∑nt∈Ti∑p(t∣xi;θt−1)count(t,r)
第一个求和代表所有的训练样本,对于每个训练样本,再求和所有可能的 parse tree。对于每个 parse tree,将条件概率与 count 二者相乘。
因此对于单个训练样本,
count(r)=t∈Ti∑p(t∣xi;θt−1)count(t,r)
可以使用 inside-outside 算法计算 count(r) ,如图:
References