★★★ 本文源自AlStudio社区精品项目,【点击此处】查看更多精品内容 >>>

1 脚本事件预测概述

脚本就是描述了特定人物一系列行为的一个事件序列[1],如“学生进入教室”、“学生翻开书本”、“学生听老师讲课”等一系列事件相继发生,而脚本事件预测是指对这一系列结构化事件的演化推理。脚本事件预测任务的处理通常是从非结构化的文本中抽取出结构化表示的脚本事件,通过推断出的事件之间的关系预测未来可能发生的事件[2]。对脚本事件叙事链进行预测有助于计算机理解非结构化文本中的事件,对于许多自然语言理解任务来说至关重要。具体而言,脚本事件叙事链预测任务主要包括两个重要子任务:脚本事件表示和脚本事件预测。

1.1 脚本事件表示方法

脚本事件表示方法中,这里选用了一种带有多论元的事件表示方法[3],直接捕捉多个实体之间的交互。他们将事件表示为 v ( e s , e o , e p ) v\left(e_s,e_o,e_p\right) v(es,eo,ep),其中 v v v表示事件的核心动词, e s e_s es表示事件的主语, e o e_o eo表示事件的宾语, e p e_p ep表示事件的介词宾语。除了 v v v之外的任何参数都可以是用 N u l l Null Null(也可以使用 − - 表示),指参数与动词之间没有任何语义上的依赖关系。

1.2 脚本事件预测方法

脚本事件预测方法可以划分为基于事件序列本身的事件预测和基于外部知识增强的事件预测,可以参考这篇文章:https://mp.weixin.qq.com/s/qQVmkqXgjAjr8t5Eok3oug

1.2.1 基于事件序列本身

基于事件序列本身的脚本事件预测方法通过挖掘当前事件序列在不同维度上的语义与表示来预测接下来会发生的事件,根据事件语义和表达的深入程度不同,可以划分为基于事件对基于事件链基于事件片段的预测方法。

基于事件对关联建模的事件预测方面,学者们主要通过深度学习对事件进行向量表示,而后计算得到事件间的相关性程度,并取最大相关性的事件作为模型预测的下一事件。如使用Word2Vec[4]计算事件对的向量余弦相似性来衡量事件对的关联出现强度;以及在Eventcomp[5]模型中,使用全连接网络对事件对是否满足顺承关系进行分类。

然而基于事件对的方法重点关注事件之间的相关性,却忽略了整个事件序列中的语义交互,因此基于事件链建模的事件预测方法被广泛提出,核心思想是将已发生的事件视为事件序列并认为待预测事件是序列的下一元素。其中,PairLSTM模型[6]使用长短时记忆神经网络(LSTM)将事件序列的时间顺序融入事件表示,并提出了一种动态记忆网络来获取上下文事件和候选事件之间的一致性;NEEG模型[7]使用事件图的形式来学习事件之间的更密集广泛的联系,并基于图嵌入算法对事件进行向量表示;MCer模型[8]通过集成事件在事件要素级别、事件级别、事件链三个粒度级别上的特征,增强了事件的语义表示。

还有学者认为多个事件首先构成语义关联较强的事件子序列,再构成事件序列,因而产生了基于事件片段的事件预测方法,并首先在SAM-Net[9]模型中运用。具体而言,首先使用事件级别的自注意力机制建模事件间的语义关联性,将关联性强的一组事件划分为一个事件片段,并使用DenseNet[10]得到事件链的向量表示;而后分别使用通过事件级注意力机制和链级注意力机制获得的事件级上下文表征和链级上下文表征,与事件链的向量表示进行交互以实现对后续事件的预测。

1.2.2 基于外部知识增强

根据引入的外部知识不同,基于外部知识增强的预测方法可以分为话语关系增强知识库增强原文本增强三种事件预测方法。

基于话语关系增强的事件预测方法通过挖掘事件间的原因、时序、转折等关系,为事件预测提供强有力的线索。[11,12]引入话语数据库PDTB中的话语关系,基于事件间三大类11小类关系,分别通过TransE[13]和TransR[14]策略进行事件表示学习,从而进行事件预测。

基于知识库增强的事件预测方法中根据知识库类型的不同,可以分为基于事件知识库的语义增强和基于常识知识库的语义增强。比起话语关系,事件知识图谱能更直观地表达事件间的语义关系信息,因此[15]根据脚本序列事件检索事件知识图谱中对应的事件,并设计了融入尾实体(Tail only)、事件模板转换(Event Template)和关系嵌入表示(Relation Embedding)三种知识融合方法获取结合了外部知识的事件表示。除了事件知识图谱,常识知识库也能为事件预测提供有效线索。[16]通过引入EventMind[17]和ATOMIC[18]两个常识知识库中的情感和意图知识来增强事件表示的语义信息,从而辨别易混淆的事件。

事实上,导致脚本事件语义稀疏的很重要的一个原因是事件本身只用事件元组来表示,脱离了上下文语境,因此可以使用脚本事件对应的原始文本来增强脚本事件的语义。[19]通过抽象意义表示(Abstract Meaning Represent,AMR)对事件原属文本进行解析,避免了由于缺失事件所处上下文而导致的谓语动词语义模糊问题,更准确描述事件内涵,并通过Transformer编码器来捕捉事件要素之间的关联关系,取得了很好的实验效果。

2 EMDF模型

这里基于个人理解介绍了IJIS2022的一篇论文: What happens next? Combining enhancedmultilevel script learning and dual fusionstrategies for script event prediction(DOI: 10.1002/int.23025),通过构建EMDF模型,同时建模事件对级别、事件链级别和事件片段级别三种粒度的语义来实现事件预测。

根据1.1,将事件表示为事件四元组 ( v , e s , e o , e p ) \left(v,e_s,e_o,e_p\right) (v,es,eo,ep),即一个事件可以由四个元素来构成。这里可以利用一些嵌入方法来得到各事件元素的向量表示,可以参考个人构建的一个数据集说明相应的图嵌入示例

在MCNC评测标准下进行脚本事件预测的本质其实是,在得到上下文事件序列表示(假设一共有 n n n个上下文事件,一般取8个)和候选事件表示(假设一共有 j j j个候选事件,一般取5个)后,通过计算二者的向量相似度来建模二者的相关性,并取相关性分数最高的候选事件作为最优预测结果输出。

2.1 事件对级别

基于事件对的脚本事件表示建模方法,即计算候选事件和单个上下文事件之间的相关度分数,首先需要考虑构成事件的参数的表示。论文中采用[26]提出的掩蔽的自注意力机制来表达事件,以捕获参数之间的细粒度连接,以学习更好的参数表示。

自注意力机制允许序列中的每个元素关注来自不同表示子空间的所有元素,因此在事件要素之间的上下文建模中非常有效。具体来说,给定链 ε \varepsilon ε和候选事件 e c j e_{c_j} ecj,对其中的每个事件要素创建一个查询向量 Q Q Q、一个键向量 K K K和一个值向量 V V V,然后通过将查询向量和对应的键向量计算点积来获得输入事件序列的每个要素和所有要素之间的得分,再进一步除以比例系数以便在训练中具有更稳定的梯度,最后应用softmax函数获得归一化的注意力权重 A t t e n t i o n ( Q , K , V ) Attention\left(Q,K,V\right) Attention(Q,K,V)

Q , K , V = X W Q , X W K , X W V (1) Q,K,V=XW^Q,XW^K,XW^V \tag{1} Q,K,V=XWQ,XWK,XWV(1)
A t t e n t i o n ( Q , K , V ) = S o f t m a x ( Q K T / q ) V (2) Attention\left(Q,K,V\right)=Softmax\left(QK^T/\sqrt q\right)V \tag{2} Attention(Q,K,V)=Softmax(QKT/q )V(2)
其中, X ∈ R 4 ( n + 1 ) × d X\in\mathbb{R}^{4(n+1)\times d} XR4(n+1)×d是由事件链 ε \varepsilon ε和候选事件 e c j e_{c_j} ecj中所有要素向量组成的矩阵。 W Q , W K , W V ∈ R d × d W^Q,W^K,W^V\in\mathbb{R}^{d\times d} WQ,WK,WVRd×d是可训练的权重矩阵, q q q是比例系数。

在自注意力机制的基础上,进一步采用多头机制以实现每个要素关注不同嵌入子空间中事件序列的所有要素,从多个角度衡量每两个要素之间的注意力权重,并重新创建所有要素的向量表示矩阵 X H X^H XH
H z = A ( Q z , K z , V z ) , z = 1 , ⋯   , Z (3) H_z=A\left(Q_z,K_z,V_z\right),z=1,\cdots,Z \tag{3} Hz=A(Qz,Kz,Vz),z=1,,Z(3)
X H = C o n c a t ( H 1 , ⋯   , H z , ⋯   , H Z ) W 0 (4) X^H=Concat\left(H_1,\cdots,H_z,\cdots,H_Z\right)W^0 \tag{4} XH=Concat(H1,,Hz,,HZ)W0(4)
其中, Q z , K z , V z ∈ R 4 ( n + 1 ) × ( d Z ) Q_z,K_z,V_z{\in\mathbb{R}}^{4(n+1)\times(\frac{d}{Z})} Qz,Kz,VzR4(n+1)×(Zd)由对每一个嵌入子空间使用公式(1)计算得到, Z Z Z代表嵌入子空间的数量, C o n c a t ( ⋅ ) Concat(\cdot) Concat()是一个拼接操作, W 0 ∈ R d × d W^0{\in\mathbb{R}}^{d\times d} W0Rd×d是可训练的权重矩阵。

事件序列是存在一定的先后顺序的,因此对各要素使用了掩码机制以约束自注意力机制仅作用于当前事件及先前事件的要素,使得当前事件不会受后续事件的影响,契合事件序列的演进规律。最后,分别拼接每个事件中的所有要素表示,经由tanh函数获得每一个事件的表示 V e i V_{e_i} Vei
V e i = t a n h ( C o n c a t ( x i v , x i s , x i o , x i p ) W E ) , i = 1 , ⋯   , n , n + 1 (5) V_{e_i}=tanh{\left(Concat\left(x_i^v,x_i^s,x_i^o,x_i^p\right)W^E\right),i}=1,\cdots,n,n+1 \tag{5} Vei=tanh(Concat(xiv,xis,xio,xip)WE),i=1,,n,n+1(5)
其中, x i v , x i s , x i o , x i p ∈ R d x_i^v,x_i^s,x_i^o,x_i^p{\in\mathbb{R}}^d xiv,xis,xio,xipRd是将 X H X^H XH切片后得到的事件 e i e_i ei e n + 1 e_{n+1} en+1即候选事件)所包含要素的向量表示, W E ∈ R 4 d × 4 d W^E{\in\mathbb{R}}^{4d\times4d} WER4d×4d是可训练的权重矩阵。

在得到了每一个事件的表示之后,就可以通过神经网络计算事件之间的相关性程度,进而计算两个事件在同一个事件序列中的相关性程度。但在不同的上下文事件中,两个事件的相关性也可能不同。

基于以上考虑,从某一候选事件出发,使用注意力机制(公式(6-7)))学习事件序列 ε \varepsilon ε中的n个事件的不同权重 α i E \alpha_i^E αiE,并使用公式(8)来获取所有事件表示在经过注意力系数加权之后的总和 V E V^E VE,即事件序列 ε \varepsilon ε在事件对级别上的向量表示。
u i E = t a n h ( W 1 E V e i + W 2 E V e c j + b ) (6) u_i^E=tanh{\left(W_1^EV_{e_i}+W_2^EV_{e_{c_j}}+b\right)} \tag{6} uiE=tanh(W1EVei+W2EVecj+b)(6)
α i E = e x p ( u i E ) Σ k e x p ( u k E ) (7) \alpha_i^E=\frac{exp{\left(u_i^E\right)}}{\mathrm{\Sigma}_kexp{\left(u_k^E\right)}} \tag{7} αiE=Σkexp(ukE)exp(uiE)(7)
V E = ∑ i α i E ⋅ V e i (8) V^E=\sum_{i}\alpha_i^E\cdot V_{e_i} \tag{8} VE=iαiEVei(8)
其中, W 1 E , W 2 E ∈ R 1 × 4 d W_1^E,W_2^E{\in\mathbb{R}}^{1\times4d} W1E,W2ER1×4d b ∈ R b\in\mathbb{R} bR是可训练的模型参数, u i E u_i^E uiE表示事件 e i e_i ei与某一候选事件 e c j e_{c_j} ecj交互之后得到的事件 e i e_i ei的重要性,其通过softmax函数后归一化为 α i E \alpha_i^E αiE

2.2 事件链级别

基于事件对的向量表示方法主要关注事件和候选事件之间的相关性,更适合应对无固定顺序的事件序列,但在描述事件序列中各个事件之间存在的时序关系时较为薄弱。

而基于事件链的向量表示方法将已知的事件序列作为一系列元素来看待,将待发生事件作为事件序列的下一个元素来进行预测工作。基于MCer模型,通过构建事件图谱来表达事件序列中的顺承关系,并使用DGCN(directed graph convolutional network)对事件表示进行更新,从而得到事件序列 ε \varepsilon ε在事件链级别上的向量表示。

DGCN是一种有向的图卷积算法,简单来说就是将一个节点周围的邻居按照不同的权重叠加起来,提取节点自身的信息以及与邻居节点的关系,并将这些信息结合起来以获得更全面的节点表示,核心计算公式见公式(9)

H ( l + 1 ) = R e L U ( D ~ − 1 2 A ~ D ~ − 1 2 H l W ( l ) ) (9) H^{\left(l+1\right)}=ReLU\left({\widetilde{D}}^{-\frac{1}{2}}\widetilde{A}{\widetilde{D}}^{-\frac{1}{2}}H^lW^{\left(l\right)}\right) \tag{9} H(l+1)=ReLU(D 21A D 21HlW(l))(9)

其中, H l ∈ R ( n + m ) × 4 d H^l\in\mathbb{R}^{\left(n+m\right)\times4d} HlR(n+m)×4d表示第l层的节点表示,第0层即为节点初始表示,由公式(4)得到; A ~ = A + I ( n + m ) ∈ R ( n + m ) ( n + m ) \widetilde{A}=A+I_{(n+m)}\in\mathbb{R}^{\left(n+m\right)\left(n+m\right)} A =A+I(n+m)R(n+m)(n+m),表示事件序列(包括上下文事件序列 ε \varepsilon ε和候选事件库 C ε C_\varepsilon Cε)的添加自环的非对称邻接矩阵, I ( n + m ) I_{(n+m)} I(n+m)是一个 ( n + m ) × ( n + m ) (n+m)\times(n+m) (n+m)×(n+m)的单位矩阵; D i i ~ = Σ j A i j \widetilde{D_{ii}}=\mathrm{\Sigma}_jA_{ij} Dii =ΣjAij,表示出度矩阵,等价于邻接矩阵对行求和,除对角线外均为0,而对角线上的值表示每个节点的出度; W ( l ) ∈ R 4 d × 4 d W^{\left(l\right)}\in\mathbb{R}^{4d\times4d} W(l)R4d×4d,表示在模型在第l层的权重矩阵,可以通过训练更新。

具体而言, A ~ H l W ( l ) {\widetilde{A}H}^lW^{\left(l\right)} A HlW(l)表示在第l层对节点进行线性变换后,按邻居节点的特征进行叠加;对 A ~ \widetilde{A} A 左乘 D ~ − 1 2 {\widetilde{D}}^{-\frac{1}{2}} D 21表示对邻居特征以度数为标准进行加权平均,出度越大,说明该邻居传递的信息量越小;对 A ~ \widetilde{A} A 右乘 D ~ − 1 2 {\widetilde{D}}^{-\frac{1}{2}} D 21表示对加权平均后的邻居特征进行缩放,以保证模型对节点度数的不敏感性。这里设定当节点j是节点i的后继节点时 A i , j A_{i,j} Ai,j的值为1,否则为0。

在经历了若干层消息传递之后,可以得到更新后每个上下文事件的向量表示 ( h 1 , … , h n ) \left(h_1,\ldots,h_n\right) (h1,,hn)和每个候选事件的向量表示 ( h C 1 , ⋯   , h c m ) \left(h_{C_1},\cdots,h_{c_m}\right) (hC1,,hcm)

而后采用事件链级别的注意力机制,与公式(6-8)类比可以得到公式(10-12),进而计算得到所有事件表示在经过注意力系数加权之后的总和 V C V^C VC,即事件序列 ε \varepsilon ε在事件链级别上的向量表示。
u i C = t a n h ( W 1 E h i + W 2 E h c i + b ) (10) u_i^C=tanh{\left(W_1^Eh_i+W_2^Eh_{c_i}+b\right)} \tag{10} uiC=tanh(W1Ehi+W2Ehci+b)(10)
α i C = e x p ( u i C ) Σ k e x p ( u k C ) (11) \alpha_i^C=\frac{exp{\left(u_i^C\right)}}{\mathrm{\Sigma}_kexp{\left(u_k^C\right)}} \tag{11} αiC=Σkexp(ukC)exp(uiC)(11)
V C = ∑ i α i C ⋅ h i (12) V^C=\sum_{i}\alpha_i^C\cdot h_i \tag{12} VC=iαiChi(12)

2.3 事件片段级别

虽然一个事件序列是由若干个单独的事件构成,但其中单独的一个事件从语义层面上并不能对一件事情进行完整全面地表达。例如“小明回到了宿舍、小明打开了电脑、小明开始写论文”,这三个事件独立存在时只能对一个事件进行模糊地描述,但其组合构成的事件序列片段表述了一个语义更加完备的事件,这样语义关联较强的事件构成的事件子序列就是事件片段。

论文中使用了事件片段数量可变的MLP自注意力机制来获取事件片段级别的事件序列表示。

2.2中使用了事件图谱描述事件之间的丰富联系,利用这些联系可以更容易地发现语义空间中的相关事件片段,因此将事件序列 ε \varepsilon ε在事件链级别上的向量表示H作为本节自注意力机制的输入。利用MLP自注意力机制获取数量可变的事件片段过程如下。

a = s o f t m a x ( w s 2 t a n h ( W s 1 H T ) ) (13) a=softmax\left(w_{s2}tanh\left(W_{s1}H^T\right)\right) \tag{13} a=softmax(ws2tanh(Ws1HT))(13)
A = s o f t m a x ( W s 2 t a n h ( W s 1 H T ) ) (14) A=softmax\left(W_{s2}tanh\left(W_{s1}H^T\right)\right) \tag{14} A=softmax(Ws2tanh(Ws1HT))(14)
其中, W s 1 ∈ R d a × 4 d W_{s1}\in\mathbb{R}^{d_a\times4d} Ws1Rda×4d W s 2 ∈ R 1 × d a W_{s2}\in\mathbb{R}^{1\times d_a} Ws2R1×da是两个不同的可训练的权重矩阵, d a d_a da是超参数,在使用softmax将得到的权重进行归一化后得到上下文事件的注意力权重 a ∈ R n a\in\mathbb{R}^n aRn。在当前子空间内, a a a为相关事件分配更大的注意力权重,而对不相关事件分配较小的权重以排除在事件片段之外,进而将相关事件囊括进有意义的事件片段。通过在 r r r个子空间内重复公式(13),可以得到 r r r个事件片段及对应的注意力权重矩阵 A ∈ R r × n A\in\mathbb{R}^{r\times n} ARr×n,即公式(14),其中 W s 2 ∈ R n × d a W_{s2}\in\mathbb{R}^{n\times d_a} Ws2Rn×da

在公式(15)中,通过将注意力矩阵A和上下文事件表示H做点乘可以得到包含了事件序列中的 r r r个事件片段的 M ∈ R r × 4 d M\in\mathbb{R}^{r\times4d} MRr×4d
M = A H (15) M=AH \tag{15} M=AH(15)

在提取的事件片段 M M M中,每一个事件片段都可能会对后续事件预测有不同的贡献,因此类比事件对级别和事件链级别的注意力机制,采用了事件片段级别的注意力机制,即公式(16-18),进而计算得到所有事件表示在经过注意力系数加权之后的总和 V S V^S VS,即事件序列 ε \varepsilon ε在事件片段级别上的向量表示。
u i S = t a n h ( W 1 E M i + W 2 E h c i + b ) (16) u_i^S=tanh{\left(W_1^EM_i+W_2^Eh_{c_i}+b\right)} \tag{16} uiS=tanh(W1EMi+W2Ehci+b)(16)
α i S = e x p ( u i S ) Σ k e x p ( u k S ) (17) \alpha_i^S=\frac{exp{\left(u_i^S\right)}}{\mathrm{\Sigma}_kexp{\left(u_k^S\right)}} \tag{17} αiS=Σkexp(ukS)exp(uiS)(17)
V S = ∑ i α i S ⋅ M i (18) V^S=\sum_{i}\alpha_i^S\cdot M_i \tag{18} VS=iαiSMi(18)

2.4 特征融合层

V E V^E VE V C V^C VC V S V^S VS进行集成进而表示事件序列向量的过程如公式(19)所示,同时在公式(20)中对 V e c j V_{e_{c_j}} Vecj h c j h_{c_j} hcj进行集成进而表示候选事件的向量。
V F F = R e L U ( W 1 F F V E + W 2 F F V C + W 3 F F V S + b 1 F F ) (19) V^{FF}={ReLU(W}_1^{FF}V^E+W_2^{FF}V^C+W_3^{FF}V^S+b_1^{FF}) \tag{19} VFF=ReLU(W1FFVE+W2FFVC+W3FFVS+b1FF)(19)
V C j F F = R e L U ( W 4 F F V e c j + W 5 F F h c j + b 2 F F ) (20) V_{C_j}^{FF}={ReLU(W}_4^{FF}V_{e_{c_j}}+W_5^{FF}h_{c_j}+b_2^{FF}) \tag{20} VCjFF=ReLU(W4FFVecj+W5FFhcj+b2FF)(20)

2.5 分数融合层

以特征融合级为例, P F F ( e c j ) P^{FF}(e_{c_j}) PFF(ecj)为其中 e c j e_{c_j} ecj的相关性得分,计算公式如公式(21)所示。
P F F ( e c j ) = ∣ ∣ V F F − V C j F F ∣ ∣ (21) P^{FF}(e_{c_j})=\left|\left|V^{FF}-V_{C_j}^{FF}\right|\right| \tag{21} PFF(ecj)= VFFVCjFF (21)

在获得事件对级、事件链级、事件片段级和特征融合级的预测分数后,可以进一步将这些分数融合为统一的分数,用于预测后续事件。它以“加权融合”的方式实现,如公式(22)所示:
P S F ( e c j ) = W 1 P P E ( e c j ) + W 2 P P C ( e c j ) + W 3 P P S ( e c j ) + W 4 P P F F ( e c j ) (22) P^{SF}(e_{c_j})=W_1^PP^E(e_{c_j})+W_2^PP^C(e_{c_j})+W_3^PP^S(e_{c_j})+W_4^PP^{FF}(e_{c_j}) \tag{22} PSF(ecj)=W1PPE(ecj)+W2PPC(ecj)+W3PPS(ecj)+W4PPFF(ecj)(22)

3 训练模型

# 安装包
!pip install icecream pgl

# 切换路径
%cd /home/aistudio/EMDF

3.1 使用NYT数据集

NYT数据集的简要介绍请移步:脚本事件预测NYT数据集

import paddle
from icecream import ic
from paddle.io import DataLoader,BatchSampler
from datasources import *
from trainfunc import *
import pickle
import numpy as np
import time
import json
import logging
import paddle.nn as nn
import paddle.nn.functional as F
import models
from config_NYT import *
from visualdl import LogWriter
cfg = DefaultConfig()
new_config = {
    "root_path": "/home/aistudio/data/data192764/",
    "embedding_size": 128}
cfg.parse(new_config)
paddle.device.set_device(cfg.device)
logWriter_path = '/home/aistudio/VDL/EMDF_NYT'
logwriter = LogWriter(logdir=logWriter_path)


train_set = ScriptData(data_path=cfg.root_path+cfg.train_file_name, one=True, direct=True)
val_set = ScriptData(data_path=cfg.root_path+cfg.val_file_name, one=True, direct=True)

# 训练集data_loader
train_batch_sampler = BatchSampler(train_set, batch_size=cfg.train_batch, shuffle=True)
train_data_loader = DataLoader(train_set, batch_sampler=train_batch_sampler, collate_fn=my_collate_fn)

global_steps = len(train_data_loader)*cfg.max_epochs
ic(len(train_set),len(val_set),global_steps)

# 验证集data_loader
val_batch_sampler = BatchSampler(val_set, batch_size=cfg.train_batch, shuffle=False)
val_data_loader = DataLoader(val_set, batch_sampler=val_batch_sampler, collate_fn=my_collate_fn)
word_embedding = get_word_embedding(cfg.root_path,emb_name=cfg.emb_name)
user config:
parse <bound method DefaultConfig.parse of <config_NYT.DefaultConfig object at 0x7f01b098ec50>>


W0415 17:10:40.662448 11391 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 11.2
W0415 17:10:40.665704 11391 gpu_resources.cc:91] device: 0, cuDNN Version: 8.2.
ic| len(train_set): 140331, len(val_set): 10000, global_steps: 540
model = models.FusionNet(
    vocab_size= len(word_embedding),
    embedding_size=cfg.embedding_size,
    word_embedding=word_embedding,
    hidden_size= cfg.hidden_size,
    dropout=cfg.dropout,
    num_layers= cfg.n_layers,
    positional_size=cfg.positional_size,
    n_heads= cfg.n_heads,
    d_a = cfg.d_a,
    r = cfg.r
)

# 优化器
other_params = [p for name, p in model.named_parameters() if 'embedding' not in name]
grad_clip = paddle.nn.ClipGradByGlobalNorm(clip_norm=cfg.clip_norm)
optimizer = paddle.optimizer.Adam(
    learning_rate=cfg.lr,
    parameters=[{"params": other_params},
                {"params": model.embedding.parameters(), "lr": cfg.lr*0.06}],
    weight_decay=cfg.weight_decay,
    grad_clip=grad_clip)

# 使用动态的学习率衰减
lr_scheduler = paddle.optimizer.lr.CosineAnnealingDecay(
    learning_rate=cfg.lr_decay,
    T_max=cfg.max_epochs,
    eta_min=0.0)
    
# loss_fn = focal_loss  # 感觉使用这个损失函数的效果会更好
loss_fn = margin_loss

train(model,train_data_loader,val_data_loader,optimizer,lr_scheduler,loss_fn,logwriter,cfg)

最后的运行结果大概是:


global step 540, feature_acc: 0.536597, score_acc: 0.543292, loss: 13.502595, speed: 0.52 step/s
epoch: 29, event_acc: 0.32, chain_acc: 0.39, segment_acc: 0.43, feafusion_acc: 0.48, scofusion_acc: 0.45

准确率的值与论文中存在较大差距,并且各层输出的准确率也没有像原论文中相差的那么小,不过训练方法也不太一样,仅供参考

3.2 使用网络犯罪事件数据集

网络犯罪事件数据集是自建的一个数据集,详情请移步:网络犯罪事实预处理数据集

注意在连续运行单元格使用两个数据集时,32G显存不够,可以分开运行,或者清除缓存

# 解压数据集
!unzip -d /home/aistudio/dataset/ /home/aistudio/data/data199729/dataset_large.zip
%cd /home/aistudio/EMDF
/home/aistudio/EMDF

/EMDF

这里使用了五种词向量来作为EMDF模型的输入

  1. base:使用hanlp中的预训练模型对事件元素进行词嵌入
  2. GS_pretrain:使用base进行初始化词向量,而后在事件元素图中使用GraphSage算法进行图嵌入,调整事件元素的词向量表示
  3. GS_random:对事件元素词向量进行随机初始化,而后在事件元素图中使用GraphSage进行图嵌入,调整事件元素的词向量表示
  4. DW_pretrain:类似于GS_pretrain,但使用的是DeepWalk算法
  5. DW_random:类似于GS_random,但使用的是DeepWalk算法

损失函数方面使用了focal_loss,具体为:

def focal_loss(logits_list, labels, cfg, model):
    all_focal_loss = 0
    if not isinstance(logits_list,list):
        logits_list = [logits_list]
    for logits in logits_list:
        ce_loss = F.cross_entropy(logits, labels, reduction='none')
        pt = paddle.exp(-ce_loss)
        focal_loss = cfg.alpha * ((1 - pt) ** cfg.gamma) * ce_loss   
        focal_loss = focal_loss.mean()
        all_focal_loss += focal_loss
    # all_focal_loss = all_focal_loss.mean()    # 选用

    param_norms = [paddle.sum(paddle.square(paddle.abs(p))) for p in model.parameters()]
    regularizer = paddle.sum(paddle.stack(param_norms)) * cfg.penal_coeff
    loss = all_focal_loss+regularizer
    return loss

准确率计算方面,将EMDF模型在事件对级别事件链级别事件片段级别特征融合层分数融合层共5个维度上的输出分别计算准确率,具体可以在/home/aistudio/VDL/中进行可视化查看

!python train.py --emb_name "base"
!python train.py --emb_name "GS_pretrain"
!python train.py --emb_name "GS_random"
!python train.py --emb_name "DW_random"
!python train.py --emb_name "DW_pretrain"

训练后5种词向量在特征融合层上的准确率如图所示,DW的两种向量效果最好,GS次之。

5种向量的最佳实验结果如下:

epoch: 1, event_acc: 0.47, chain_acc: 0.46, segment_acc: 0.52, feafusion_acc: 0.65, scofusion_acc: 0.62 # base
epoch: 2, event_acc: 0.45, chain_acc: 0.57, segment_acc: 0.58, feafusion_acc: 0.68, scofusion_acc: 0.66 # GS_pretrain
epoch: 3, event_acc: 0.43, chain_acc: 0.54, segment_acc: 0.53, feafusion_acc: 0.68, scofusion_acc: 0.66 # GS_random
epoch: 4, event_acc: 0.61, chain_acc: 0.69, segment_acc: 0.68, feafusion_acc: 0.82, scofusion_acc: 0.80 # DW_random
epoch: 4, event_acc: 0.61, chain_acc: 0.69, segment_acc: 0.69, feafusion_acc: 0.82, scofusion_acc: 0.80 # DW_pretrain

一般在脚本事件预测的研究中,使用的是DeepWalk算法进行图嵌入以得到预测模型的输入。

但DeepWalk是一种直推式学习(Transductive Learning),需要把所有节点都加入到训练过程当中才能得到每一个节点的向量表示。

因此这里额外试了一种归纳式学习(Inductive Learning)模型——GraphSage模型。仅作为抛砖引玉,当然也可以使用其他图嵌入算法。

此前的事件元素图实际是全事件要素(相当于全图),而这里仅使用了事件训练集中所涉及的事件要素(相当于子图)来训练GraphSage模型,而后用在子图上训练得到的模型来获取全图的向量表示,进而作为预测模型的输入。

  1. GS_sub_pretrain:使用base进行初始化词向量,而后在事件元素子图中使用GraphSage算法进行图嵌入,调整事件元素全图的词向量表示
  2. GS_sub_random:对事件元素词向量进行随机初始化,而后在事件元素子图中使用GraphSage进行图嵌入,调整事件元素全图的词向量表示
!python train.py --emb_name "GS_sub_pretrain"
!python train.py --emb_name "GS_sub_random"

在子图上训练后GS的两种词向量以及base词向量在特征融合层上的准确率如图所示,GS的两种向量效果更好。

epoch: 1, event_acc: 0.47, chain_acc: 0.46, segment_acc: 0.52, feafusion_acc: 0.65, scofusion_acc: 0.62 # base
epoch: 2, event_acc: 0.49, chain_acc: 0.58, segment_acc: 0.57, feafusion_acc: 0.71, scofusion_acc: 0.69 # GS_sub_pretrain
epoch: 4, event_acc: 0.54, chain_acc: 0.60, segment_acc: 0.59, feafusion_acc: 0.75, scofusion_acc: 0.74 # GS_sub_random

在NYT数据集方面复现EMDF的效果并不好,调参应该弥补不了这么大的差距,欢迎指正看看是哪里出了问题。

在自己构建的数据集上准确率还行,但新试验的GS算法效果其实也一般,主打的就是个重在学习参与。

参考文献

[1] SCHANK R, ABELSON R. Scripts, Plans and Knowledge[C/OL]//International Joint Conference on Artificial Intelligence. 1975[2023-03-18]. https://www.semanticscholar.org/paper/Scripts%2C-Plans-and-Knowledge-Schank-Abelson/70bf67dd1c9052e8360d28bc73d9f3b559cc3e41.

[2] 刘玉婷, 刘茗, 王保卫, 等. 脚本事件预测:方法、评测与挑战[J/OL]. 计算机应用研究: 1-11. https://doi.org/10.19734/j.issn.1001-3695.2022.09.0494.

[3] PICHOTTA K, MOONEY R. Statistical Script Learning with Multi-Argument Events[C/OL]//Proceedings of the 14th Conference of the European Chapter of the Association for Computational Linguistics. Gothenburg, Sweden: Association for Computational Linguistics, 2014: 220-229[2023-03-18]. http://aclweb.org/anthology/E14-1024.

[4] MIKOLOV T, SUTSKEVER I, CHEN K, 等. Distributed Representations of Words and Phrases and their Compositionality[M/OL]. arXiv, 2013[2023-03-11]. http://arxiv.org/abs/1310.4546.

[5] GRANROTH-WILDING M, CLARK S. What Happens Next? Event Prediction Using a Compositional Neural Network Model[J/OL]. Proceedings of the AAAI Conference on Artificial Intelligence, 2016, 30(1)[2023-02-15]. https://ojs.aaai.org/index.php/AAAI/article/view/10344.

[6] WANG Z, ZHANG Y, CHANG C Y. Integrating Order Information and Event Relation for Script Event Prediction[C/OL]//Proceedings of the 2017 Conference on Empirical Methods in Natural Language Processing. Copenhagen, Denmark: Association for Computational Linguistics, 2017: 57-67[2023-02-17]. https://aclanthology.org/D17-1006.

[7] LI Z, DING X, LIU T. Constructing Narrative Event Evolutionary Graph for Script Event Prediction[M/OL]. arXiv, 2018[2023-02-15]. http://arxiv.org/abs/1805.05081.

[8] WANG L, YUE J, GUO S, 等. Multi-level Connection Enhanced Representation Learning for Script Event Prediction[C/OL]//Proceedings of the Web Conference 2021. Ljubljana Slovenia: ACM, 2021: 3524-3533[2023-02-15]. https://dl.acm.org/doi/10.1145/3442381.3449894.

[9] LV S, QIAN W, HUANG L, 等. SAM-Net: Integrating Event-Level and Chain-Level Attentions to Predict What Happens Next[J/OL]. Proceedings of the AAAI Conference on Artificial Intelligence, 2019, 33(01): 6802-6809. https://doi.org/10.1609/aaai.v33i01.33016802.

[10] HUANG G, LIU Z, VAN DER MAATEN L, 等. Densely Connected Convolutional Networks[M/OL]. arXiv, 2018[2023-03-18]. http://arxiv.org/abs/1608.06993.

[11] LEE I T, GOLDWASSER D. Multi-Relational Script Learning for Discourse Relations[C/OL]//Proceedings of the 57th Annual Meeting of the Association for Computational Linguistics. Florence, Italy: Association for Computational Linguistics, 2019: 4214-4226[2023-03-18]. https://aclanthology.org/P19-1413.

[12] LEE I T, PACHECO M L, GOLDWASSER D. Weakly-Supervised Modeling of Contextualized Event Embedding for Discourse Relations[C/OL]//Findings of the Association for Computational Linguistics: EMNLP 2020. Online: Association for Computational Linguistics, 2020: 4962-4972[2023-03-18]. https://aclanthology.org/2020.findings-emnlp.446.

[13] BORDES A, USUNIER N, GARCIA-DURÁN A, 等. Translating embeddings for modeling multi-relational data[C]//Proceedings of the 26th International Conference on Neural Information Processing Systems - Volume 2. Red Hook, NY, USA: Curran Associates Inc., 2013: 2787-2795[2023-03-19].

[14] LIN Y, LIU Z, SUN M, 等. Learning Entity and Relation Embeddings for Knowledge Graph Completion[J/OL]. Proceedings of the AAAI Conference on Artificial Intelligence, 2015, 29(1)[2023-03-19]. https://ojs.aaai.org/index.php/AAAI/article/view/9491.

[15] LV S, ZHU F, HU S. Integrating External Event Knowledge for Script Learning[C/OL]//Proceedings of the 28th International Conference on Computational Linguistics. Barcelona, Spain (Online): International Committee on Computational Linguistics, 2020: 306-315[2023-02-15]. https://aclanthology.org/2020.coling-main.27.

[16] DING X, LIAO K, LIU T, 等. Event Representation Learning Enhanced with External Commonsense Knowledge[C/OL]//Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing and the 9th International Joint Conference on Natural Language Processing (EMNLP-IJCNLP). Hong Kong, China: Association for Computational Linguistics, 2019: 4894-4903[2023-03-18]. https://aclanthology.org/D19-1495.

[17] RASHKIN H, SAP M, ALLAWAY E, 等. Event2Mind: Commonsense Inference on Events, Intents, and Reactions[C/OL]//Proceedings of the 56th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers). Melbourne, Australia: Association for Computational Linguistics, 2018: 463-473[2023-03-18]. https://aclanthology.org/P18-1043.

[18] SAP M, LE BRAS R, ALLAWAY E, 等. ATOMIC: An Atlas of Machine Commonsense for If-Then Reasoning[J/OL]. Proceedings of the AAAI Conference on Artificial Intelligence, 2019, 33(01): 3027-3035. https://doi.org/10.1609/aaai.v33i01.33013027.

[19] BAI L, GUAN S, LI Z, 等. Rich Event Modeling for Script Event Prediction[M/OL]. arXiv, 2022[2023-03-18]. http://arxiv.org/abs/2212.08287.

此文章为搬运
原项目链接

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐