通过对比学习提升预训练语言模型对于实体和关系的理解
ERICA: Improving Entity and Relation Understanding for Pre-trained Language Models via Contrastive Learning
论文链接: https://arxiv.org/abs/2012.15022
代码链接:https://github.com/thunlp/ERICA
一、背景
以ELMo和BERT为代表的预训练语言模型(PLMs)带来了NLP领域的变革。
-
PLMs:通过采用自监督学习的方法,将大量的无监督文本送入到模型中进行学习,即可得到通用的预训练模型。
-
PLMs特点:参数量多、数据量大 ->计算量大 (增大参数、增大数据,可有效提高性能)
二、预训练语言的实体与关系的理解
(1)结合知识库知识(产生新的结构/新的预训练对象)
(2)增强实体表示
(3)增强关系表示
(4)实体和关系表示
1.实体关系分类问题范式
有监督场景:适合于标签量充足的情况,但其实最终的效果不太好。
few-shot场景:query和candidate都进行编码,不需要太多标签,效果较好
2.实体表示方法
注:
[CLS] 标志放在第一个句子的首位,经过 BERT 得到的的表征向量 C 可以用于后续的分类任务。
[SEP] 标志用于分开两个输入句子,例如输入句子A和B,要在句子A,B后面增加 [SEP] 标志。
[UNK]标志指的是未知字符
[MASK] 标志用于遮盖句子中的一些单词,将单词用 [MASK] 遮盖之后,再利用 BERT 输出的 [MASK] 向量预测单词是什么。
-
STANDARD - [CLS]
用[CLS]来作为2个实体的关系的表示 ,仅限于含有2个实体的句子,且可能不准确 -
STANDARD - MENTION POOLING
将实体的平均池化结果作为实体的表示
(每个Entity可能对应多个tokens,每个token经过PLMs都会得到一个hidden layer的表示,将这些token进行Mean Pooling) -
POSITIONAL EMB. - MENTION POOL
用token type embedding标识当前词是普通词还是Entity
引入ENTITY MARKERS:对实体i,在其前插入[Eistart],其后插入[Eiend] ,在输入层面就把实体位置区分开 -
ENTITY MARKERS - [CLS]
-
ENTITY MARKERS - MENTION POOL
-
ENTITY MARKERS - ENTITY START
实验表明,在进行句子级别任务时,ENTITY MARKERS - ENTITY START效果最好(输入为ENTITY MARKERS,输出为ENTITY START)
推广到文档级别:
文档:多句子,含多实体
- [CLS]模式不适用
- Entity marker最好不要用相同的token(便于区分不同实体);可能出现的问题:超过PLM的输入边界
- Mean Pooling的方式不受影响
- Entity marker在监督信号充足的情况下效果优于Mean Pooling;而在偏few-shot场景下,mean pooling效果更优
三、ERICA
(1)现有增强实体与实体间关系的PLMs存在的问题
- 仅考虑对实体本身的理解,忽视了实体间关系的理解
- 仅考虑句子级别的实体关系理解,忽略了对实体本身的理解,也忽视了文档中多个实体间的互相关系涉及到的复杂推理
针对存在的问题进行改进
- 实体区分任务
- 关系区分任务
- 远程监督+文档级预训练
(2)预训练数据收集
-
从Wikipedia爬取得到大量段落 - 利用spaCy找出各个段落的实体 - 将段落实体与wikidata实体链接,得到段落实体的ID - 利用远程监督进行关系注释
(对每个文档的词数、关系数、实体数有限制) -
符号表示:
Ti = {tijk = (di, eij, rijk, eik) | j≠k}, T = T1∪T2∪…T|D|
其中,di表示第i个文档,eij表示di里第j个实体,eik表示di里第k个实体, rijk表示这两个实体之间的关系。
关系r可能为“no relation”,将T中含“no relation”的元组去掉,得到正元组集T+.
T+既包含句子内的实体对,也包含句子间的实体对,即 T + = T s i n g l e + ∪ T c r o s s + T^+ = T_{single}^+∪T_{cross}^+ T+=Tsingle+∪Tcross+
(3)实体/关系表示
首先,对文档di,首先使用PLMs对其进行编码,获得一系列的hidden表示{h1,h2,…,h|di|}
-
实体表示:
一个实体可能会在文档中出现多次,每次出现的mention可能不同。
对第 i 次出现,作MeanPool平均池化操作,mkeij = MeanPool(hnkstart, …, hnkend)
将此entity每次出现取得的mkeij作平均,得到的结果就是该实体的表示。 -
关系表示:
由上述方法得到实体表示之后,将两个实体表示连接,即可得到二者的关系表示,如:riej1,j2 = [ej1; ej2]
(4)实体区分任务(ED)
从T+ 中抽样一个元组tijk = (di, eij, rijk, eik)
ED的任务就是通过给定的头实体eij和关系rijk来找尾实体eik
先对文档进行修饰,如下:
di* = “relation_name entity_mention [SEP] di”
所以ED任务即为求 P(eik|eij, rijk) 的最大值,P(eik|eij, rijk) = softmax (f(eik))
而实验表明,直接对P(eik|eij, rijk)求最大值效果并不是很好
由此,引入对比学习:LED = ∑tijk∈T+ log
e
x
p
(
c
o
s
(
e
i
j
,
e
i
k
)
/
τ
)
∑
l
=
1
,
l
≠
j
∣
ε
i
∣
e
x
p
(
c
o
s
(
e
i
j
,
e
i
l
)
/
τ
)
\frac{exp(cos(e_{ij},e_{ik})/\tau)}{\sum_{l=1,l≠j}^{|\varepsilon_i|} exp(cos(e_{ij},e_{il})/\tau)}
∑l=1,l=j∣εi∣exp(cos(eij,eil)/τ)exp(cos(eij,eik)/τ)
(6)关系区分任务(RD)
从
T
s
+
(
或
T
c
+
)
T_s^+(或T_c^+)
Ts+(或Tc+) 中取两个元组样本:
t
A
=
(
d
A
,
e
A
1
,
r
A
,
e
A
2
)
,
t
B
=
(
d
B
,
e
B
1
,
r
B
,
e
B
2
)
t_A = (d_A,e_{A1},r_A,e_{A2}), t_B = (d_B,e_{B1},r_B,e_{B2})
tA=(dA,eA1,rA,eA2),tB=(dB,eB1,rB,eB2),其中
r
A
=
r
B
r_A = r_B
rA=rB,任务二者为正样本,拉进它们在语义空间中的距离
又从
T
T
T 中取负样本
t
C
(
t
A
≠
t
C
)
t_C(t_A≠t_C)
tC(tA=tC)
L R D T 1 , T 2 = − ∑ t A ∈ T 1 , t B ∈ T 2 l o g e x p ( c o s ( r t A , r t B ) / τ ) Z L_{RD}^{T_1,T_2} = -\sum_{t_A\in T_1,t_B\in T_2} log \frac{exp(cos(r_{t_A},r_{t_B})/\tau)}{Z} LRDT1,T2=−∑tA∈T1,tB∈T2logZexp(cos(rtA,rtB)/τ)
Z = ∑ t C ∈ T / t A N e x p ( c o s ( r t A , r t C ) / τ ) Z = \sum_{t_C\in T/{t_A}}^{N} exp(cos(r_{t_A},r_{t_C})/\tau) Z=∑tC∈T/tANexp(cos(rtA,rtC)/τ)
L R D = L R D T s + , T s + + L R D T s + , T c + + L R D T c + , T s + + L R D T c + , T c + L_{RD} = L_{RD}^{T_s^+,T_s^+}+L_{RD}^{T_s^+,T_c^+}+L_{RD}^{T_c^+,T_s^+}+L_{RD}^{T_c^+,T_c^+} LRD=LRDTs+,Ts++LRDTs+,Tc++LRDTc+,Ts++LRDTc+,Tc+
负样本中引入
n
o
no
no_
r
e
a
l
t
i
o
n
realtion
realtion 的元组可以提升性能
(5)整体训练目标
L
=
L
E
D
+
L
R
D
+
L
M
L
M
L = L_{ED}+L_{RD}+L_{MLM}
L=LED+LRD+LMLM
(MLM:Mask Language Model)
四、实验
进行多种实验,均能得到较好的效果。
包括关系抽取实验、实体类型区分实验、QA实验等