同上一篇《以序列标注为例学习隐马尔可夫模型HMM》一样,仍旧以序列标注问题为例。
序列标注问题是给定一个序列XXX,求一个函数fff,使得XXX通过fff映射得到想要的序列YYY,即:
f:X→Y
f:X \rightarrow Y
f:X→Y
1.CRF基本假设
与HMM模型认为P(x,y)是转移概率和发射概率的乘积不同,CRF认为:
P(x,y)∝exp(ωϕ(x,y))
P(x,y) \varpropto exp(\omega \phi(x,y))
P(x,y)∝exp(ωϕ(x,y))
其中ω\omegaω 代表一个权重,ϕ(x,y)\phi(x,y)ϕ(x,y)是关于x,y序列的特征向量。由于exp(ωϕ(x,y))exp(\omega \phi(x,y))exp(ωϕ(x,y))可以大于1,因此不能假设它等于这个概率,而是正比于概率。
因此:
P(y∣x)=P(x,y)P(x)=P(x,y)∑y′P(x,y)=exp(ωϕ(x,y))/R∑y′exp(ωϕ(x,y′))/R=exp(ωϕ(x,y))∑y′exp(ωϕ(x,y′))
P(y|x) = \frac{P(x,y)}{P(x)} = \frac{P(x,y)}{\sum_{y^{'}} P(x,y)} = \frac{exp(\omega\phi(x,y))/R}{\sum_{y^{'}}exp(\omega\phi(x,y^{'}))/R} = \frac{exp(\omega\phi(x,y))}{\sum_{y^{'}}exp(\omega\phi(x,y^{'}))}
P(y∣x)=P(x)P(x,y)=∑y′P(x,y)P(x,y)=∑y′exp(ωϕ(x,y′))/Rexp(ωϕ(x,y))/R=∑y′exp(ωϕ(x,y′))exp(ωϕ(x,y))
2.HMM和CRF本质相同
HMM和CRF模型的其实是同一个东西,可以认为CRF是HMM模型的另一种表示和训练方法,只是两者略有不同。
在HMM中:
P(x,y)=P(y1∣start)∏l=1L−1P(yl+1)P(yL∣end)∏l=1LP(xL∣yL)P(x,y) = P(y_1|start)\prod_{l=1}^{L-1}P(y_{l+1})P(y_L|end)\prod_{l=1}^LP(x_L|y_L)P(x,y)=P(y1∣start)l=1∏L−1P(yl+1)P(yL∣end)l=1∏LP(xL∣yL)
对等式两边取log对数:
logP(x,y)=logP(y1∣start)+∑l=1L−1logP(yl+1)+logP(yL∣end)+∑l=1LlogP(xL∣yL)logP(x,y) = logP(y_1|start)+\sum_{l=1}^{L-1}logP(y_{l+1})+logP(y_L|end)+\sum_{l=1}^LlogP(x_L|y_L)logP(x,y)=logP(y1∣start)+l=1∑L−1logP(yl+1)+logP(yL∣end)+l=1∑LlogP(xL∣yL)
以∑l=1LlogP(xL∣yL)\sum_{l=1}^LlogP(x_L|y_L)∑l=1LlogP(xL∣yL)为例:
∑l=1LlogP(xL∣yL)=∑s,tlogP(t∣s)×Ns,t(x,y)
\sum_{l=1}^LlogP(x_L|y_L) = \sum_{s,t}logP(t|s)\times N_{s,t}(x,y)
l=1∑LlogP(xL∣yL)=s,t∑logP(t∣s)×Ns,t(x,y)
即序列中标签序列元素yLy_LyL对应单词序列元素xLx_LxL的概率累加等于单词t被标记为标签s的概率乘以序列中单词t被标记为标签s的次数。
下例演示了该公式的一个实例:
logP(x,y)logP(x,y)logP(x,y)中其他公式同理可得:
因此logP(x,y)logP(x,y)logP(x,y)可以写成:
其中紫色部分及代表1中的权重ω\omegaω,红色部分代表1中关于x,y的特征向量ϕ(x,y)\phi(x,y)ϕ(x,y)。
3. CRF的训练
给定数据集{(x1,yˇ1),(x2,yˇ2),...,(xn,yˇn)}\{(x^1,\check{y}^1),(x^2,\check{y}^2),...,(x^n,\check{y}^n)\}{(x1,yˇ1),(x2,yˇ2),...,(xn,yˇn)},要训练ω∗\omega^*ω∗,使得ω∗=argmaxωO(ω)\omega^* = argmax_\omega O(\omega)ω∗=argmaxωO(ω)
O(ω)=∑n=1NlogP(yˇn∣xn)O(\omega) = \sum_{n=1}^N logP(\check{y}^n|x^n)O(ω)=n=1∑NlogP(yˇn∣xn)
有1中:P(y∣x)=exp(ωϕ(x,y))∑y′exp(ωϕ(x,y′)) P(y|x) =\frac{exp(\omega\phi(x,y))}{\sum_{y^{'}}exp(\omega\phi(x,y^{'}))} P(y∣x)=∑y′exp(ωϕ(x,y′))exp(ωϕ(x,y))
logP(yˇn∣xn)=logP(xn,yˇn)−log∑y′P(xn,y′)
logP(\check{y}^n|x^n) = logP(x^n,\check{y}^n)-log\sum_{y^{'}}P(x^n,y^{'})
logP(yˇn∣xn)=logP(xn,yˇn)−logy′∑P(xn,y′)
也就是最大化我们序列中看到的标记,最小化那些不仅在正确序列中能看到,在其他可能的错误序列中也经常出现的标记。
计算梯度:
由于是最大化目标函数,因此是梯度上升而非梯度下降:
ws,t=ws,t+η∂O(ω)∂ωs,tw_{s,t} = w_{s,t} + \eta \frac{\partial O(\omega)}{\partial\omega_{s,t}}ws,t=ws,t+η∂ωs,t∂O(ω)
训练得到ω\omegaω后
y=argmaxy∈YP(y∣x)=argmaxy∈YP(x,y)=argmaxy∈Yωϕ(x,y)
y = argmax_{y\in Y}P(y|x) = argmax_{y\in Y}P(x,y) = argmax_{y\in Y}\omega \phi(x,y)
y=argmaxy∈YP(y∣x)=argmaxy∈YP(x,y)=argmaxy∈Yωϕ(x,y)
可以使用维特比算法得到最优序列。