转载来源: CreateMoMo
今天是第二部分,给大家推导一下CRF的损失函数如何计算,思路很清楚。
回顾
在前一节中,我们知道CRF层可以从训练数据集中学习一些约束,以确保最终预测的实体标签序列是有效的。
约束条件可以是:
- 句子中第一个单词的标签应该以“B-”或“O”开头,而不是“I-”
- “B-label1 I-label2 I-label3 I-…”,在这个模式中,label1、label2、label3…应该是相同的命名实体标签。例如,“B-Person I-Person”是有效的,但是“B-Person I-Organization”是无效的。
- “O I-label”无效。一个命名实体的第一个标签应该以“B-”而不是“I-”开头,换句话说,有效的模式应该是“O B-label”
- …
阅读本文之后,你将了解为什么CRF层可以学习这些约束。
2. CRF层
在CRF层的损失函数中,我们有两种类型的分数。这两个分数是CRF层的关键概念。
2.1 Emission得分
第一个是emission分数。这些emission分数来自BiLSTM层。例如,如图2.1所示,标记为B-Person的w0的分数为1.5。
为了方便起见,我们将给每个标签一个索引号,如下表所示。
我们用
x
i
y
f
x_{iy_{f}}
xiyf来表示emission分数。i是word的索引,
y
i
y_{i}
yi是label的索引。如图2.1所示,
x
i
=
1
,
y
i
=
2
=
x
w
1
,
B
−
O
r
g
a
n
i
z
a
t
i
o
n
=
0.1
,
=
1
x_{i=1,y_{i}=2}=x_{w_{1},B-Organization}=0.1,=1
xi=1,yi=2=xw1,B−Organization=0.1,=1,即w1作为B-Organization的得分为0.1。
2.2 Transition得分
我们使用 t y i , y j t_{y_{i},y_{j}} tyi,yj来表示transition分数。例如, t B − P e r s o n , I − P e r s o n = 0.9 t_{B-Person,I-Person}=0.9 tB−Person,I−Person=0.9表示标签的transition, B − P e r s o n → I − P e r s o n B-Person\rightarrow I-Person B−Person→I−Person得分为0.9。因此,我们有一个transition得分矩阵,它存储了所有标签之间的所有得分。
为了使transition评分矩阵更健壮,我们将添加另外两个标签,START和END。START是指一个句子的开头,而不是第一个单词。END表示句子的结尾。
下面是一个transition得分矩阵的例子,包括额外添加的START和END标签。
如上表所示,我们可以发现transition矩阵已经学习了一些有用的约束。
- 句子中第一个单词的标签应该以“B-”或“O”开头,而不是“I-”开头**(从“START”到“I- person或I- organization”的transition分数非常低)**
- “B-label1 I-label2 I-label3 I-…”,在这个模式中,label1、label2、label3…应该是相同的命名实体标签。例如,“B-Person I-Person”是有效的,但是“B-Person I-Organization”是无效的。(例如,从“B-Organization”到“I-Person”的分数只有0.0003,比其他分数低很多)
- “O I-label”无效。一个被命名实体的第一个标签应该以“B-”而不是“I-”开头,换句话说,有效的模式应该是“O B-label”(同样, t O , I − P e r s o n t_{O,I-Person} tO,I−Person的分数非常小)
- …
你可能想问一个关于矩阵的问题。在哪里或如何得到transition矩阵?
实际上,该矩阵是BiLSTM-CRF模型的一个参数。在训练模型之前,可以随机初始化矩阵中的所有transition分数。所有的随机分数将在你的训练过程中自动更新。换句话说,CRF层可以自己学习这些约束。我们不需要手动构建矩阵。随着训练迭代次数的增加,分数会逐渐趋于合理。
2.3 CRF损失函数
CRF损失函数由真实路径得分和所有可能路径的总得分组成。在所有可能的路径中,真实路径的得分应该是最高的。
例如,如果我们的数据集中有如下表所示的这些标签:
我们还是有一个5个单词的句子。可能的路径是:
-
- START B-Person B-Person B-Person B-Person B-Person END
-
- START B-Person I-Person B-Person B-Person B-Person END
…
- START B-Person I-Person B-Person B-Person B-Person END
-
- START B-Person I-Person O B-Organization O END
- …
- N) O O O O O O O
假设每条可能的路径都有一个分数 P i P_{i} Pi,并且总共有N条可能的路径,所有路径的总分数是 P t o t a l = P 1 + P 2 + . . . + P N = e S 1 + e S 2 + . . . + e S N P_{total}=P_{1}+P_{2}+...+P_{N}=e^{S_{1}}+e^{S_{2}}+...+e^{S_{N}} Ptotal=P1+P2+...+PN=eS1+eS2+...+eSN。(在第2.4节中,我们将解释如何计算 S i S_{i} Si,你也可以把它当作这条路径的分数。)
如果我们说第10条路径是真正的路径,换句话说,第10条路径是我们的训练数据集提供的黄金标准标签。在所有可能的路径中,得分 P 10 P_{10} P10应该是百分比最大的。
在训练过程中,我们的BiLSTM-CRF模型的参数值将会一次又一次的更新,以保持增加真实路径的分数百分比。
L
o
s
s
F
u
n
c
t
i
o
n
=
P
R
e
a
l
P
a
t
h
P
1
+
P
2
+
.
.
.
+
P
N
LossFunction=\frac {P_{RealPath}}{P_{1}+P_{2}+...+P_{N}}
LossFunction=P1+P2+...+PNPRealPath
现在的问题是:1)如何定义一个路径的分数?2)如何计算所有可能路径的总分?3)当我们计算总分时,我们需要列出所有可能的路径吗?(这个问题的答案是否定的。)
在下面的小节中,我们将看到如何解决这些问题。
2.4 实际路径得分
在2.3节中,我们假设每条可能的路径都有一个得分 P i P_{i} Pi,并且有N条可能的路径,所有路径的总得分为 P t o t a l = P 1 + P 2 + . . . + P N = e S 1 + e S 2 + . . . + e S N P_{total}=P_{1}+P_{2}+...+P_{N}=e^{S_{1}}+e^{S_{2}}+...+e^{S_{N}} Ptotal=P1+P2+...+PN=eS1+eS2+...+eSN。
显然,在所有可能的路径中,一定有一条是真实路径。对于这个例子来说,第1.2节中句子的实际路径是**“START B-Person I-Person O B-Organization O END”**。其他的是不正确的,如“START B-Person B-Organization O I-Person I-Person B-Person”。 e S i e^{S_{i}} eSi是第i条路径的得分。
在训练过程中,CRF损失函数只需要两个分数:真实路径的分数和所有可能路径的总分数。所有可能路径的分数中,真实路径分数所占的比例会逐渐增加。
计算实际路径分数 e S i e^{S_{i}} eSi非常简单。
这里我们主要关注的是 S i S_{i} Si的计算。
选取真实路径,“START B-Person I-Person O B-Organization O END”,我们以前用过,例如:
- 我们有一个5个单词的句子,w1,w2,w3,w4, w4,w5
- 我们增加了两个额外的单词来表示一个句子的开始和结束,w0,w6
- S i S_{i} Si由两部分组成 S i = E m i s s i o n S c o r e + T r a n s i t i o n S c o r e S_{i}=EmissionScore+TransitionScore Si=EmissionScore+TransitionScore
Emission得分:
E
m
i
s
s
i
o
n
S
c
o
r
e
=
x
0
,
S
T
A
R
T
+
x
1
,
B
−
P
e
r
s
o
n
+
x
2
,
I
−
P
e
r
s
o
n
+
x
3
,
O
+
x
4
,
B
−
O
r
g
a
n
i
z
a
t
i
o
n
+
x
5
,
O
+
x
6
,
E
N
D
EmissionScore=x_{0,START}+x_{1,B-Person}+x_{2,I-Person}+x_{3,O}+x_{4,B-Organization}+x_{5,O}+x_{6,END}
EmissionScore=x0,START+x1,B−Person+x2,I−Person+x3,O+x4,B−Organization+x5,O+x6,END
- x i n d e x , l a b e l x_{index,label} xindex,label是第index个单词被label标记的分数
- 这些得分 x 1 , B − P e r s o n + x 2 , I − P e r s o n + x 3 , O + x 4 , B − O r g a n i z a t i o n + x 5 , O x_{1,B-Person}+x_{2,I-Person}+x_{3,O}+x_{4,B-Organization}+x_{5,O} x1,B−Person+x2,I−Person+x3,O+x4,B−Organization+x5,O来自之前的BiLSTM输出。
- 对于 x 0 , S T A R T x_{0,START} x0,START, x − 6 , E N D x-{6,END} x−6,END,我们可以把它们设为0。
Transition得分:
EmissionScore
=
x
0
,
S
T
A
R
T
+
x
1
,
B
−
P
e
r
s
o
n
+
x
2
,
I
−
P
e
r
s
o
n
+
x
3
,
O
+
x
4
,
B
−
O
r
g
a
n
i
z
a
t
i
o
n
+
x
5
,
O
+
x
6
,
E
N
D
\text {EmissionScore}=x_{0, S T A R T}+x_{1, B-P e r s o n}+x_{2, I-P e r s o n}+x_{3, O}+x_{4, B-O r g a n i z a t i o n}+x_{5, O}+x_{6, E N D}
EmissionScore=x0,START+x1,B−Person+x2,I−Person+x3,O+x4,B−Organization+x5,O+x6,END
- t l a b e l 1 − > l a b e l 2 t_{l a b e l 1->l a b e l 2} tlabel1−>label2是从 label1到label2的transition分数
- 这些分数来自CRF层。换句话说,这些transition分数实际上是CRF层的参数。
综上所述,现在我们可以计算出 S i S_{i} Si以及路径得分 e S i e^{S_{i}} eSi。
下一步是如何计算所有可能路径的总分?
2.5 所有可能的路径的得分
如何逐步计算一个toy例子一个句子的所有可能的路径的总分。
在上一节中,我们学习了如何计算一个路径(即 e S i e^{S_{i}} eSi)的标签路径得分。到目前为止,我们还有一个需要解决的问题,就是如何得到所有路径的总分( P total = P 1 + P 2 + … + P N = e S 1 + e S 2 + … + e S N P_{\text {total}}=P_{1}+P_{2}+\ldots+P_{N}=e^{S_{1}}+e^{S_{2}}+\ldots+e^{S_{N}} Ptotal=P1+P2+…+PN=eS1+eS2+…+eSN)。
衡量总分最简单的方法是:列举所有可能的路径并将它们的分数相加。是的,你可以用这种方法计算总分。然而,这是非常低效的。训练的时间将是难以忍受的。
在探索以下内容之前,我建议你先准备一张白纸和一支笔,并按照示例中列出的步骤进行操作。我相信这将有助于你更好地理解算法的细节。此外,你应该知道如何用你喜欢的编程语言实现它。
步骤1: 回想一下CRF损失函数
在section 2.3中,我们将CRF损失函数定义为:
LossFunction
=
P
RealPath
P
1
+
P
2
+
…
+
P
N
\text {LossFunction}=\frac{P_{\text {RealPath}}}{P_{1}+P_{2}+\ldots+P_{N}}
LossFunction=P1+P2+…+PNPRealPath
现在我们把loss函数变成log loss函数:
logLossFunction
=
log
P
RealPath
P
1
+
P
2
+
…
+
P
N
\text {logLossFunction}=\log \frac{P_{\text {RealPath}}}{P_{1}+P_{2}+\ldots+P_{N}}
logLossFunction=logP1+P2+…+PNPRealPath
因为当我们训练一个模型时,通常我们的目标是最小化我们的损失函数,我们加上一个负号:
logLossFunction
=
−
log
P
RealPath
P
1
+
P
2
+
…
+
P
N
=
−
log
e
S
RealPath
e
S
1
+
e
S
2
+
…
+
e
S
N
=
−
(
log
(
e
S
Real
P
ath
)
−
log
(
e
S
1
+
e
S
2
+
…
+
e
S
N
)
)
=
−
(
S
RealPath
−
log
(
e
S
1
+
e
S
2
+
…
+
e
S
N
)
)
=
−
(
∑
i
=
1
N
x
i
y
j
+
∑
i
=
1
N
−
1
t
y
i
y
i
+
1
−
log
(
e
S
1
+
e
S
2
+
…
+
e
S
N
)
)
\text {logLossFunction}=-\log \frac{P_{\text {RealPath}}}{P_{1}+P_{2}+\ldots+P_{N}}=-\log \frac{e^{S_{\text {RealPath}}}}{e^{S_{1}}+e^{S_{2}}+\ldots+e^{S_{N}}}=-\left(\log \left(e^{S_{\text {Real }} P_{\text {ath }}}\right)-\log \left(e^{S_{1}}+e^{S_{2}}+\ldots+e^{S_{N}}\right)\right)=-\left(S_{\text {RealPath }}-\log \left(e^{S_{1}}+e^{S_{2}}+\ldots+e^{S_{N}}\right)\right)=-\left(\sum_{i=1}^{N} x_{i y_{j}}+\sum_{i=1}^{N-1} t_{y_{i} y_{i+1}}-\log \left(e^{S_{1}}+e^{S_{2}}+\ldots+e^{S_{N}}\right)\right)
logLossFunction=−logP1+P2+…+PNPRealPath=−logeS1+eS2+…+eSNeSRealPath=−(log(eSReal Path )−log(eS1+eS2+…+eSN))=−(SRealPath −log(eS1+eS2+…+eSN))=−(i=1∑Nxiyj+i=1∑N−1tyiyi+1−log(eS1+eS2+…+eSN))
在上一节中,我们已经知道如何计算实际路径得分,现在我们需要找到一个有效的解决方案来计算
log
(
e
S
1
+
e
S
2
+
…
+
e
S
N
)
\log \left(e^{S_{1}}+e^{S_{2}}+\ldots+e^{S_{N}}\right)
log(eS1+eS2+…+eSN)。
步骤2: 回忆一下Emission和Transition得分
为了简化,我们假设我们从这个句子中训练我们的模型,它的长度只有3:
x
=
[
w
0
,
w
1
,
w
2
]
x=\left[w_{0}, w_{1}, w_{2}\right]
x=[w0,w1,w2]
此外,在我们的数据集中,我们有两个标签:
L
a
b
e
l
S
e
t
=
{
l
1
,
l
2
}
LabelSet =\{l 1, l 2\}
LabelSet={l1,l2}
我们还有Bi-LSTM层输出的Emission分数:
x
i
j
x_{i j}
xij表示
w
i
\boldsymbol{w}_{i}
wi被标记为
l
j
l_{j}
lj的得分。
此外,Transition分数来自CRF层:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tEKxpfpe-1591423907617)(CRF Layer on the Top of BiLSTM - 2.assets/1585055587948.png)]
t i j t_{i} j tij是从标签i到标签j的transition得分。
步骤3: 开始战斗(准备好纸笔)
记住:我们的目标是:
log
(
e
S
1
+
e
S
2
+
…
+
e
S
N
)
\log \left(e^{S_{1}}+e^{S_{2}}+\ldots+e^{S_{N}}\right)
log(eS1+eS2+…+eSN)
这个过程就是分数的累加。其思想与动态规划相似(如果你不知道什么是动态编程,也可以继续阅读本文)。我将逐步解释这个例子。但我强烈建议你学习动态规划算法。简而言之,计算w0的所有可能路径的总分。然后,我们用总分来计算w0→w1。最后,我们使用最新的总分来计算w0→w1→w2。我们需要的是最后的总分。
在接下来的步骤中,你将看到两个变量:obs和previous。previous存储前面步骤的最终结果。obs表示当前单词的信息。
w
0
:
o
b
s
=
[
x
01
,
x
02
]
previous
=
None
\begin{array}{l} w_{0}: \\ o b s=\left[x_{01}, x_{02}\right] \\ \text { previous }=\text { None } \end{array}
w0:obs=[x01,x02] previous = None
如果我们的句子只有一个单词
w
0
w_{0}
w0,我们就没有前面步骤的结果,因此previous是None。另外,我们只能观察到第一个词
o
b
s
=
[
x
01
,
x
02
]
o b s=\left[x_{01}, x_{02}\right]
obs=[x01,x02]。
x
01
x_{01}
x01和
x
02
x_{02}
x02是上述的Emission分数。
你可能会想,的所有可能路径的总分是多少?答案很简单:
TotalScore
(
w
0
)
=
log
(
e
x
01
+
e
x
02
)
\text {TotalScore}\left(w_{0}\right)=\log \left(e^{x_{01}}+e^{x_{02}}\right)
TotalScore(w0)=log(ex01+ex02)
w 0 − > w 1 o b s = [ x 11 , x 12 ] previous = [ x 01 , x 02 ] \begin{array}{l} w_{0}->w_{1} \\ o b s=\left[x_{11}, x_{12}\right] \\ \text { previous }=\left[x_{01}, x_{02}\right] \end{array} w0−>w1obs=[x11,x12] previous =[x01,x02]
- 把previous展开成:
previous = ( x 01 x 01 x 02 x 02 ) \text {previous}=\left(\begin{array}{ll} x_{01} & x_{01} \\ x_{02} & x_{02} \end{array}\right) previous=(x01x02x01x02) - 把obs展开成:
o b s = ( x 11 x 12 x 11 x 12 ) o b s=\left(\begin{array}{ll} x_{11} & x_{12} \\ x_{11} & x_{12} \end{array}\right) obs=(x11x11x12x12)
你可能想知道,为什么我们需要把previous和obs扩展成矩阵。因为矩阵可以提高计算的效率。在下面的过程中,你将很快看到这一点。
- 对 previous, obs以及transition得分求和:
scores = ( x 01 x 01 x 02 x 02 ) + ( x 11 x 12 x 11 x 12 ) + ( t 11 t 12 t 21 t 22 ) \text {scores}=\left(\begin{array}{cc} x_{01} & x_{01} \\ x_{02} & x_{02} \end{array}\right)+\left(\begin{array}{cc} x_{11} & x_{12} \\ x_{11} & x_{12} \end{array}\right)+\left(\begin{array}{cc} t_{11} & t_{12} \\ t_{21} & t_{22} \end{array}\right) scores=(x01x02x01x02)+(x11x11x12x12)+(t11t21t12t22)
然后:
scores
=
(
x
01
+
x
11
+
t
11
x
01
+
x
12
+
t
12
x
02
+
x
11
+
t
21
x
02
+
x
12
+
t
22
)
\text {scores}=\left(\begin{array}{ll} x_{01}+x_{11}+t_{11} & x_{01}+x_{12}+t_{12} \\ x_{02}+x_{11}+t_{21} & x_{02}+x_{12}+t_{22} \end{array}\right)
scores=(x01+x11+t11x02+x11+t21x01+x12+t12x02+x12+t22)
为下一个迭代修改previous的值:
previous
=
[
log
(
e
x
01
+
x
11
+
t
11
+
e
x
02
+
x
11
+
t
21
)
,
log
(
(
e
x
01
+
x
12
+
t
12
+
e
x
02
+
x
12
+
t
22
)
]
\text {previous}=\left[\log \left(e^{x_{01}+x_{11}+t_{11}}+e^{x_{02}+x_{11}+t_{21}}\right), \log \left(\left(e^{x_{01}+x_{12}+t_{12}}+e^{x_{02}+x_{12}+t_{22}}\right)\right]\right.
previous=[log(ex01+x11+t11+ex02+x11+t21),log((ex01+x12+t12+ex02+x12+t22)]
实际上,第二次迭代已经完成。如果有人想知道如何计算所有可能路径的总分(label1→label1, label1→label2, label2→label1, label2→label2),从w0到w1,可以做如下计算。
我们使用新的previous中的元素:
TotalScore
(
w
0
−
>
w
1
)
=
log
(
e
previous
[
0
]
+
e
previous
[
1
]
)
=
log
(
e
log
(
e
x
01
+
x
11
+
t
11
+
e
x
02
+
x
11
+
t
21
)
+
e
log
(
e
x
01
+
x
12
+
t
12
+
e
x
02
+
x
12
+
t
22
)
)
=
log
(
e
x
01
+
x
11
+
t
11
+
e
x
02
+
x
11
+
t
21
+
e
x
01
+
x
12
+
t
12
+
e
x
02
+
x
12
+
t
22
)
\text {TotalScore}\left(w_{0}->w_{1}\right)=\log \left(e^{\text {previous}[0]}+e^{\text {previous}[1]}\right)=\log \left(e^{\log \left(e^{x_{01}+x_{11}+t_{11}}+e^{x_{02}+x_{11}+t_{21}}\right)}+\right.e^{\log \left(e^{\left.x_{01}+x_{12}+t_{12}+e^{x_{02}+x_{12}+t_{22}}\right)}\right)}=\log \left(e^{x_{01}+x_{11}+t_{11}}+e^{x_{02}+x_{11}+t_{21}}+e^{x_{01}+x_{12}+t_{12}}+e^{x_{02}+x_{12}+t_{22}}\right)
TotalScore(w0−>w1)=log(eprevious[0]+eprevious[1])=log(elog(ex01+x11+t11+ex02+x11+t21)+elog(ex01+x12+t12+ex02+x12+t22))=log(ex01+x11+t11+ex02+x11+t21+ex01+x12+t12+ex02+x12+t22)
你发现了吗?这正是我们的目标:
log
(
e
S
1
+
e
S
2
+
…
+
e
S
N
)
\log \left(e^{S_{1}}+e^{S_{2}}+\ldots+e^{S_{N}}\right)
log(eS1+eS2+…+eSN)
在这个等式中,我们可以看到:
- S 1 = x 01 + x 11 + t 11 ( label 1 − > label 1 ) S_{1}=x_{01}+x_{11}+t_{11}\left(\text {label}_{1}->\text {label}_{1}\right) S1=x01+x11+t11(label1−>label1)
- S 2 = x 02 + x 11 + t 21 ( label 2 − > label 1 ) S_{2}=x_{02}+x_{11}+t_{21}\left(\operatorname{label}_{2}->\operatorname{label}_{1}\right) S2=x02+x11+t21(label2−>label1)
- S 3 = x 01 + x 12 + t 12 ( label 1 − > label 2 ) S_{3}=x_{01}+x_{12}+t_{12}\left(\operatorname{label}_{1}->\operatorname{label}_{2}\right) S3=x01+x12+t12(label1−>label2)
- S 4 = x 02 + x 12 + t 22 ( label 2 − > label 2 ) S_{4}=x_{02}+x_{12}+t_{22}\left(\text {label}_{2}->\text {label}_{2}\right) S4=x02+x12+t22(label2−>label2)
w
0
−
>
w
1
−
>
w
2
w_{0}->w_{1}->w_{2}
w0−>w1−>w2
如果你读到这里了,你已经快要读完了,实际上,在这个迭代里,我们做的事情是和上个迭代一样的。
obs
=
[
x
21
,
x
22
]
previous
=
[
log
(
e
x
01
+
x
11
+
t
11
+
e
x
02
+
x
11
+
t
21
)
,
log
(
(
e
x
01
+
x
12
+
t
12
+
e
x
02
+
x
12
+
t
22
)
]
\begin{array}{l} \text { obs }=\left[x_{21}, x_{22}\right] \\ \text { previous }=\left[\log \left(e^{x_{01}+x_{11}+t_{11}}+e^{x_{02}+x_{11}+t_{21}}\right), \log \left(\left(e^{x_{01}+x_{12}+t_{12}}+e^{x_{02}+x_{12}+t_{22}}\right)\right]\right. \end{array}
obs =[x21,x22] previous =[log(ex01+x11+t11+ex02+x11+t21),log((ex01+x12+t12+ex02+x12+t22)]
- 把previous扩展成:
previous = ( log ( e x 01 + x 11 + t 11 + e x 02 + x 11 + t 21 ) log ( e x 01 + x 11 + t 11 + e x 02 + x 11 + t 21 ) log ( ( e x 01 + x 12 + t 12 + e x 02 + x 12 + t 22 ) log ( ( e x 01 + x 12 + t 12 + e x 02 + x 12 + t 22 ) ) \text {previous}=\left(\begin{array}{cc} \log \left(e^{x_{01}+x_{11}+t_{11}}+e^{x_{02}+x_{11}+t_{21}}\right) & \log \left(e^{x_{01}+x_{11}+t_{11}}+e^{x_{02}+x_{11}+t_{21}}\right) \\ \log \left(\left(e^{x_{01}+x_{12}+t_{12}}+e^{x_{02}+x_{12}+t_{22}}\right)\right. & \log \left(\left(e^{x_{01}+x_{12}+t_{12}}+e^{x_{02}+x_{12}+t_{22}}\right)\right. \end{array}\right) previous=(log(ex01+x11+t11+ex02+x11+t21)log((ex01+x12+t12+ex02+x12+t22)log(ex01+x11+t11+ex02+x11+t21)log((ex01+x12+t12+ex02+x12+t22)) - 把obs扩展成:
o b s = ( x 21 x 22 x 21 x 22 ) o b s=\left(\begin{array}{ll} x_{21} & x_{22} \\ x_{21} & x_{22} \end{array}\right) obs=(x21x21x22x22) - 把previous, obs和transition分数加起来:
scores = ( log ( e x 01 + x 11 + t 11 + e x 02 + x 11 + t 21 ) log ( e x 01 + x 11 + t 11 + e x 02 + x 11 + t 21 ) log ( ( e x 01 + x 12 + t 12 + e x 02 + x 12 + t 22 ) log ( ( e x 01 + x 12 + t 12 + e x 02 + x 12 + t 22 ) ) + ( x 21 x 22 x 21 x 22 ) + ( t 11 t 12 t 21 t 22 ) \text {scores}=\left(\begin{array}{cc} \log \left(e^{x_{01}+x_{11}+t_{11}}+e^{x_{02}+x_{11}+t_{21}}\right) & \log \left(e^{x_{01}+x_{11}+t_{11}}+e^{x_{02}+x_{11}+t_{21}}\right) \\ \log \left(\left(e^{x_{01}+x_{12}+t_{12}}+e^{x_{02}+x_{12}+t_{22}}\right)\right. & \log \left(\left(e^{x_{01}+x_{12}+t_{12}}+e^{x_{02}+x_{12}+t_{22}}\right)\right. \end{array}\right)+\left(\begin{array}{cc} x_{21} & x_{22} \\ x_{21} & x_{22} \end{array}\right)+\left(\begin{array}{ll}t_{11} & t_{12} \\ t_{21} & t_{22}\end{array}\right) scores=(log(ex01+x11+t11+ex02+x11+t21)log((ex01+x12+t12+ex02+x12+t22)log(ex01+x11+t11+ex02+x11+t21)log((ex01+x12+t12+ex02+x12+t22))+(x21x21x22x22)+(t11t21t12t22)
然后:
scores = ( log ( e x 01 + x 11 + t 11 + e x 02 + x 11 + t 21 ) + x 21 + t 11 log ( e x 01 + x 11 + t 11 + e x 02 + x 11 + t 21 ) + x 22 + t 12 log ( ( e x 01 + x 12 + t 12 + e x 02 + x 12 + t 22 ) + x 21 + t 21 log ( e x 01 + x 11 + t 11 + e x 02 + x 11 + t 21 ) + x 22 + t 22 ) \text {scores}=\left(\begin{array}{cc} \log \left(e^{x_{01}+x_{11}+t_{11}}+e^{x_{02}+x_{11}+t_{21}}\right)+x_{21}+t_{11} & \log \left(e^{x_{01}+x_{11}+t_{11}}+e^{x_{02}+x_{11}+t_{21}}\right)+x_{22}+t_{12} \\ \log \left(\left(e^{x_{01}+x_{12}+t_{12}}+e^{x_{02}+x_{12}+t_{22}}\right)+x_{21}+t_{21}\right. & \log \left(e^{x_{01}+x_{11}+t_{11}}+e^{x_{02}+x_{11}+t_{21}}\right)+x_{22}+t_{22} \end{array}\right) scores=(log(ex01+x11+t11+ex02+x11+t21)+x21+t11log((ex01+x12+t12+ex02+x12+t22)+x21+t21log(ex01+x11+t11+ex02+x11+t21)+x22+t12log(ex01+x11+t11+ex02+x11+t21)+x22+t22)
为下一个迭代计算 previous的值:
previous = [ log ( e log ( e x 01 + x 11 + t 11 + e x 02 + x 11 + t 21 ) + x 21 + t 11 + e log ( e x 01 + x 12 + t 12 + e x 02 + x 12 + t 22 ) + x 21 + t 21 ) , log ( e log ( e x 01 + x 11 + t 11 + e x 02 + x 11 + t 21 ) + x 22 + t 12 + e log ( e x 01 + x 12 + t 12 + e x 02 + x 12 + t 22 ) + x 22 + t 22 ) ] = [ log ( ( e x 01 + x 11 + t 11 + e x 02 + x 11 + t 21 ) e x 21 + t 11 + ( e x 01 + x 12 + t 12 + e x 02 + x 12 + t 22 ) e x 21 + t 21 ) log ( ( e x 01 + x 11 + t 11 + e x 02 + x 11 + t 21 ) e x 22 + t 12 + ( e x 01 + x 12 + t 12 + e x 02 + x 12 + t 22 ) e x 22 + t 22 ) ] \begin{aligned} &\begin{array}{l} \text { previous }=[ \\ \qquad \begin{array}{l} \log \left(e^{\log \left(e^{\left.x_{01}+x_{11}+t_{11}+e^{x_{02}+x_{11}+t_{21}}\right)+x_{21}+t_{11}}+e^{\log \left(e^{\left.x_{01}+x_{12}+t_{12}+e^{x_{02}+x_{12}+t_{22}}\right)+x_{21}+t_{21}}\right)}\right.}\right. \\,\\ \log \left(e^{\log \left(e^{\left.x_{01}+x_{11}+t_{11}+e^{x_{02}+x_{11}+t_{21}}\right)+x_{22}+t_{12}}+e^{\log \left(e^{\left.x_{01}+x_{12}+t_{12}+e^{x_{02}+x_{12}+t_{22}}\right)+x_{22}+t_{22}}\right)}\right.}\right. \end{array} \end{array}\\ ]\\ &=\left[\log \left(\left(e^{x_{01}+x_{11}+t_{11}}+e^{x_{02}+x_{11}+t_{21}}\right) e^{x_{21}+t_{11}}+\left(e^{x_{01}+x_{12}+t_{12}}+e^{x_{02}+x_{12}+t_{22}}\right) e^{x_{21}+t_{21}}\right)\right.\\ &\left.\log \left(\left(e^{x_{01}+x_{11}+t_{11}}+e^{x_{02}+x_{11}+t_{21}}\right) e^{x_{22}+t_{12}}+\left(e^{x_{01}+x_{12}+t_{12}}+e^{x_{02}+x_{12}+t_{22}}\right) e^{x_{22}+t_{22}}\right)\right] \end{aligned} ] previous =[log⎝⎜⎛elog(ex01+x11+t11+ex02+x11+t21)+x21+t11+elog(ex01+x12+t12+ex02+x12+t22)+x21+t21),log⎝⎜⎛elog(ex01+x11+t11+ex02+x11+t21)+x22+t12+elog(ex01+x12+t12+ex02+x12+t22)+x22+t22)=[log((ex01+x11+t11+ex02+x11+t21)ex21+t11+(ex01+x12+t12+ex02+x12+t22)ex21+t21)log((ex01+x11+t11+ex02+x11+t21)ex22+t12+(ex01+x12+t12+ex02+x12+t22)ex22+t22)]
就像下一个迭代描述的一样,我们使用新的previous中的元素来计算total score:
TotalScore ( w 0 → w 1 → w 2 ) = log ( e previous [ 0 ] + e previous [ 1 ] ) = log ( e log ( ( e x 01 + x 11 + t 11 + e x 02 + x 11 + t 21 ) e x 21 + t 11 + ( e x 01 + x 12 + t 12 + e x 02 + x 12 + t 22 ) e x 21 + t 21 ) + e log ( ( e x 01 + x 11 + t 11 + e x 02 + x 11 + t 21 ) e x 22 + t 12 + ( e x 01 + x 12 + t 12 + e x 02 + x 12 + t 22 ) e x 22 + t 22 ) ) = log ( e x 01 + x 11 + t 11 + x 21 + t 11 + e x 02 + x 11 + t 21 + x 21 + t 11 + e x 01 + x 12 + t 12 + x 21 + t 21 + e x 02 + x 12 + t 22 + x 21 + t 21 + e x 01 + x 11 + t 11 + x 22 + t 12 + e x 02 + x 11 + t 21 + x 22 + t 12 + e x 01 + x 12 + t 12 + x 22 + t 22 + e x 02 + x 12 + t 22 + x 22 + t 22 ) \begin{array}{l} \text { TotalScore }\left(w_{0} \rightarrow w_{1} \rightarrow w_{2}\right) \\ =\log \left(e^{\text {previous}[0]}+e^{\text {previous}[1]}\right) \\ =\log \left(e^{\log \left(\left(e^{\left.x_{01}+x_{11}+t_{11}+e^{x_{02}+x_{11}+t_{21}}\right) e^{x_{21}+t_{11}}+\left(e^{\left.\left.x_{01}+x_{12}+t_{12}+e^{x_{02}+x_{12}+t_{22}}\right) e^{x_{21}+t_{21}}\right)}\right.}\right.\right.}\right. \\ +e^{\log \left(\left(e^{\left.x_{01}+x_{11}+t_{11}+e^{x_{02}+x_{11}+t_{21}}\right) e^{x_{22}+t_{12}+\left(e^{\left.\left.x_{01}+x_{12}+t_{12}+e^{x_{02}+x_{12}+t_{22}}\right) e^{x_{22}+t_{22}}\right)}\right)}}\right.\right.} \\ =\log \left(e^{x_{01}+x_{11}+t_{11}+x_{21}+t_{11}}+e^{x_{02}+x_{11}+t_{21}+x_{21}+t_{11}}\right. \\ +e^{x_{01}+x_{12}+t_{12}+x_{21}+t_{21}}+e^{x_{02}+x_{12}+t_{22}+x_{21}+t_{21}} \\ +e^{x_{01}+x_{11}+t_{11}+x_{22}+t_{12}}+e^{x_{02}+x_{11}+t_{21}+x_{22}+t_{12}} \\ \left.+e^{x_{01}+x_{12}+t_{12}+x_{22}+t_{22}}+e^{x_{02}+x_{12}+t_{22}+x_{22}+t_{22}}\right) \end{array} TotalScore (w0→w1→w2)=log(eprevious[0]+eprevious[1])=log⎝⎜⎛elog((ex01+x11+t11+ex02+x11+t21)ex21+t11+(ex01+x12+t12+ex02+x12+t22)ex21+t21)+elog((ex01+x11+t11+ex02+x11+t21)ex22+t12+(ex01+x12+t12+ex02+x12+t22)ex22+t22))=log(ex01+x11+t11+x21+t11+ex02+x11+t21+x21+t11+ex01+x12+t12+x21+t21+ex02+x12+t22+x21+t21+ex01+x11+t11+x22+t12+ex02+x11+t21+x22+t12+ex01+x12+t12+x22+t22+ex02+x12+t22+x22+t22)
恭喜!
我们达到了目标, log ( e S 1 + e S 2 + … + e S N ) \log \left(e^{S_{1}}+e^{S_{2}}+\ldots+e^{S_{N}}\right) log(eS1+eS2+…+eSN),我们的toy句子有三个单词,label set有两个label,所以一共应该有8种可能的label path。
附言
在你享用一杯咖啡或一块甜蛋糕休息之前,请允许我说几句话。虽然你发现这个过程相当复杂,但是实现这个算法要容易得多。使用计算机的优点之一是可以完成一些重复性的工作。现在你可以自己实现CRF损失函数,并开始训练自己的模型。
英文原文:https://createmomo.github.io/2017/09/23/CRF_Layer_on_the_Top_of_BiLSTM_2