现有的方法利用 BERT 编码器和基于拷贝的 RNN 解码器,其中编码器预测状态操作,并由解码器生成新的插槽值。然而,在这种堆叠的编码器 - 解码器结构中,操作预测目标 只
影响 BERT 编码器,而值生成目标 主要
影响 RNN 解码器。此外,在框架中,编码器是预先训练的,而解码器则没有预先训练。
在 SOM-DST(2019)上已经观察到了第二个问题,其所提出的解决方案是在训练过程中对编码器和解码器使用两种不同的优化器。该解决方案进一步分离了编码器和解码器,或 SOP 和 VG 过程,这使得进行全局优化变得更加困难。
另外,DST 任务与机器翻译等任务有些不同,它并非一个真正意义上的生成任务。例如,生成一个对话响应需要与对话历史相一致,或者翻译一个句子通常需要翻译编码器(输入)侧的每个单词。相比之下,在 DST 中生成的值只涉及模型输入的一小部分(在对话历史和以前的对话状态中),该输入通常由一个或几个 token 组成。在这种情况下,要求解码器考虑到所有的编码器输出可能会 模糊焦点
。
在本文中,提出了一个纯粹的基于 Transformer 的框架,其中一个单一的 BERT 同时作为编码器和解码器。这样,操作预测目标和值生成目标可以共同优化 DST 的 BERT。在解码步骤中,利用相应编码器层的自注意机制中编码器的隐藏状态,构建一个平面编码解码器架构,实现有效的参数更新。
当前的研究都使用编码器 - 解码器结构来进行 DST 任务。现有最先进的生成框架(如 SOM-DST、TRADE、TripPy、Simple-DST 等)将 DST 分解为两个子任务:操作预测 (SOP) 和值生成 (VG)。首先, 编码器
读取对话历史记录和以前的对话状态,并决定是否需要更新(域、插槽)对的值。然后,解码器
为(域、插槽)对生成一个插槽值。
T 回合的对话表示为:(D_1,S_1),...,(D_T,S_T),其中 D_t 表示第 t 回合的用户话语和系统话语,S_t 表示第 t 回合的对话状态,且 S_t = {(d_j,s_j,v_j)|1\le j \le J },如果没有给定 (d_j,s_j) 其值就为 NULL。DST 的目标就是给定 {(D_1,S1),..,(D{t-1},S_{t-1}),(D_t) } 来预测 S_t .
上图给出了本文提出的框架的概述。该模型是用 BERT 初始化的多层 Transformer,既用作状态操作预测的编码器,也用作值生成的解码器。这两个过程之间的区别在于输入、自我注意 Mask 和目标函数,这在下文会被详细介绍。
编码器的输入为 D{t-1};D{t};S{t-1},其中 S{t-1} = [SLOT]\oplus d_j \oplus - \oplus s_j \oplus - \oplus v_j 且 s_j,vj 可能由好几个 token 组成。并且,[SLOT] 位的隐藏状态 {X{slj}^L | 1 \le j \le J } 被用来作状态操作预测。并且我们希望 [SLOT] 位置的隐藏状态能后聚合对应的 (d,s,v) 的信息,如 X{sl_j}^l 聚合了 (d_j,s_j,v_j) 的信息。
输入 X^0 为 token 嵌入,位置嵌入以及类型嵌入的和。应用类型嵌入来引入编码器侧和解码器侧之间的分离。多层 Transformer 通过 X^i = Trans^i(X^{i-1}),i \in [1,L] 来更新隐藏状态。在 Transformer 块内,多头注意力机制为:
Q_j,K_j,V_j \in \R^{n\times d_k} : X^{l-1} \in \R^{|x|\times d_h} 分别利用线性映射 W_j^Q,W_j^K,W_j^V 转换而来。 M^x \in \R^{|x|\times |x|}, M{ij}^x \in {0,-\infty}: 自注意力的 Mask , 决定一个位置是否可以注意到其他位置。在状态操作预测过程中 M{ij}^x = 0, \forall i,j .
编码器的一些隐藏状态将在解码器中被重用。编码器的输出记为 X^L = [x_{cls}^L,x1^L,...,x{sl1}^L,...,x{sl_J}^L,...],将用于操作预测。
操作被预测为 4 类:CARRYOVER,DELETE,DONTCARE,UPDATE,根据编码器的输出 x_{sl_j}^L | 1\le j \le J , 用一个 MLP 层来执行每一个槽的操作预测。只有在预测为 UPDATE 时,解码器才会为(domain、slot)对生成一个新的槽值。
解码器应用不同类型的嵌入来表示其输入和从左到右的自我注意掩码来生成槽值,以避免信息泄漏。解码器 重用多头自注意机制中编码器的隐藏状态
,构建一个 flat 的编码器 - 解码器结构,使编码器中的参数更新更加高效:
$$
Q_j = Y^{l-1} W_j^Q \
\hat{K}_j = concat([\hat{X}^{l-1},Y^{l-1}]) W_j^K \
V_j = concat([\hat{X}^{l-1},Y^{l-1}]) W_j^V \
head_j = softmax(\frac{Q_j\hat{K}_j^T}{\sqrt{d_k}} + M^y) \hat{V}_j
$$
\hat{X} : 被重用的隐藏状态 Q_j \in \R^{|y|\times d_k}, \hat{K}_j,\hat{V}_j \in \R^{(|\hat{x}| + |y|) \times d_k} M^y \in \R^{y\times (|\hat{x}| \times |y|)} : 自注意力 Mask, 且当 j \le i 时 M^y_{ij} = 0
由于应用了双向注意,编码器的被重用的隐藏状态已经在一定程度上对整个输入进行了编码。我们将在实验中表明,仅重用当前的对话回合 D_t 和第 j 个 [SLOT] 位置的隐藏状态就可以获得最好的性能。
槽值生成过程的目标为生成槽子与真实值相比的自回归损失,追踪的训练目标是状态操作预测损失和槽值生成损失的和。
这篇文章是关于隐式语篇上下文关系编码的,其将段落建模层一个图 (PAG),节点就是段落中的句子,每个句子通过不同类型的边缘从复杂的话语中追踪它们密切相关的上下文。然后,通过一种特殊设计的 跨粒度更新机制
从 PAG 中提取上下文表示,该机制可以有效地集成 句子级和 token 级
的上下文语义。
该方法或许会对具有长对话历史的 DST 中存在长距离遗忘的问题有一定帮助,值得关注。
对于输入段落 P = {S_1,S2,...,S{n-1}, Sn } , 其中 S{n-1}, S_n 为邻接的句子对,S1,...,S{n-2} 为具有背景信息的上下文。模型的目标是判断出 S_{n-1},S_n 之间的关系。首先为 P 构建了一个段落关联图 (PAG),然后在 PAG 上使用MARKDOWN_HASHa9f45278674c1319f58b05408e67daafMARKDOWNHASH 来提取 S{n−1}, S_n 的上下文表示。
本文提出的 CT-Net 其输入为一个 PAG,即段落关联图。图 \mathcal{G} = (\mathcal{V}, \mathcal{E}) 的结构如下:
PAG 包含句子节点(蓝色)和 token 节点(橙色)。每个 token 节点都与其对应的句子节点相连接。
其包含 3 种边,对应 3 种关系,分别为:
的状态为:
状态从
在执行 T 轮后,我们最终得到了 S_{n-1}, Sn 的最终上下文表示 c{n-1}^T, c_{n}^T , 它集成了句子级别和 token 级别的上下文语义信息。
, 二者为不考虑更广泛的上下文的局部表示。然后,将连接全局和局部特性如下:
将
应用多任务学习来提高性能。主要任务是隐式语篇关系识别 (IDRR),辅助任务是显式语篇关系识别(EDRR) 和结缔预测(CP)。这三个任务共享相同的编码器,但使用三种不同的 MLP。目标函数如下:
尽管图上的深度学习模型过多,但很少有人提出处理本质上动态的图(例如随着时间的推移演化的特征或连通性)。大多数对图的深度学习的方法都假设底层图是静态的。然而,大多数现实生活中的交互系统,如社交网络或生物交互组,都是动态的。本文提出了时间图网络(TGNs),一个通用的、有效的框架,用于深度学习以时间事件序列表示的动态图。
在本文中,首先提出了时间图网络 (TGNs) 的通用框架,并证明了 许多以前的方法都是 TGNs 的特定实例
。其次,提出了一种 新的训练策略
,允许模型在保持高效并行处理的同时从数据的序列性中学习。第三,对框架的不同组件进行了详细的 消融研究
,并分析了 速度和准确性之间的权衡
。最后,我们在转换和感应设置下的多个任务和数据集上展示了 最先进的性能,同时比以前的方法要快得多。
静态图 \mathcal{G} = (\mathcal{V}, \mathcal{E}) 由节点集合 \mathcal{V} 和边集合 \mathcal{E} \subseteq \mathcal{V} \times \mathcal{V} , 他们具有的特征表示为 \bf{v}i, e{ij} , i,j = 1,...,n . 一个典型的图神经网络 GNN 通过学习该形式的局部聚合规则来创建一个节点的嵌入 \bf{z}_i:
被解释为从 i 的邻居 j 传递的消息。这里,\mathcal{N}_i={j:(i,j)∈\mathcal{E}} 表示节点 i 的邻域,msg 和 h
动态图主要有两种模型。离散时间动态图 (DTDG) 是每隔时间间隔拍摄的静态图快照序列。连续时间动态图 (CTDG) 更一般,可以表示为事件列表,其中可能包括边添加或删除、节点添加或删除以及节点或边缘特征转换。
本文提出的时间图被建模为一系列时间戳事件 \mathcal{G} = {x(t_1),x(t_2),... }, 表示在时间 0 \le t_1 \le t_2 \le ... 时节点的添加或更改或一对节点之间的交互,一个时间 x(t) 可以是两种类型:
将 \mathcal{V}(T) = {i: \exist vi(t) \in \mathcal{G}, t\in T } 和 \mathcal{E}(T) = {(i,j) : \exist e{ij}(t) \in \mathcal{G}, t\in T } 分别表示节点和边的时间集,T 时刻节点 i 的邻居集合表示为 \mathcal{N}_i(T) = {j:(i,j)\in \mathcal{E}(T) },\mathcal{N}_i^k(T) 表示节点 i 的 k 跳邻居集合。图 \mathcal{G} 在 t 时刻的快照是具有 n_t 个节点的图,表示为 \mathcal{G} = (\mathcal{V}[0,t],\mathcal{E}[0,t])。
动态图的神经模型可以视为 编码器 - 解码器 对,其中 编码器是从动态图映射到节点嵌入的函数,解码器将一个或多个节点嵌入作为输入,并进行特定任务的预测,例如节点分类或边缘预测 。本文的关键贡献是一种 新的时间图网络 (TGN) 编码器,应用于连续时间动态图表示的时间戳事件序列,并为每个时间节点 t 产生嵌入图节点 Z(t) = (z1(t),...,z{n(t)}(t)) .
模型在时间 t 时的内存(状态)由模型迄今为止所看到的每个节点 i 的向量 s_i(t) 组成。节点的内存在事件之后更新(例如与另一个节点交互或节点级更改),其目的是以压缩格式表示节点的历史信息。
由于这个特定的模块,TGN 能够记忆图中每个节点的长期依赖关系(就像 RNN 一般)。当遇到一个新节点时,其内存被初始化为零向量,然后为模型涉及该节点的每个事件进行更新,即使在模型完成训练后也是如此。虽然也可以将全局(图形)内存添加到模型中来跟踪整个网络的演变,但目前没有这么做。
m_i(t) = msg_s(s_i(t^-),sj(t^-),\Delta t,e{ij}(t)) \ m_j(t)= msg_d(s_j(t^-),si(t^-),\Delta t,e{ij}(t)) 类似地,如果是节点级事件 v_i(t),则可以为该事件中涉及的节点计算一条消息: m_i(t) = msg_n(s_i(t^-),t,v_i(t))
s_i(t^-): 时刻 t 之前的节点 i 的状态表示 msg_s,msg_d,msg_n : 可学习的消息函数,如 MLP
:
agg : 聚合函数,可以用多种方式实现,例如 RNN、注意力机制等。本文中为了简单起见,我们采用了两种实现方式:
如前所述,一个节点的内存状态会在涉及该节点本身的每个事件上进行更新,更新方式如下:
对于涉及两个节点
考虑到节点的 memory 是一个随时间更新的向量,最直接的方法是直接使用它作为 节点 Embedding。然而,在实践中,这不是一个好的方法 由于 the staleness problem:如果只有在节点相互作用的时候才更新 memory,那么节点长时间不活动会导致 memory 会 staleness。
举个例子,假设一个用户离开 Twitter 好几个月。当用户返回时,他们的兴趣可能已经转移,所以他们过去的活动记忆不再相关。因此,我们需要一种更好的方法来计算嵌入。
一种解决方案是参考 节点的邻居。为了解决 staleness problem,Embedding 模块通过对节点的 spatiotemporal neighbours 进行 graph aggregation 来计算该节点的 temporal embedding。即使一个节点已经不活动一段时间,它的一些邻居可能已经活动,并且通过聚集他们的 memory,TGN 可以计算一个节点的 up-to-date embedding。在我们的例子中,即使用户离开 Twitter,他们的朋友仍然活跃,所以当用户返回时,朋友最近的活动可能 比 用户自己的历史活动更相关。
其中 h 是一个可学习的函数,可以由多种方法实现:
图嵌入模块通过聚合从节点的邻居内存中获得的信息来减轻持久性问题。当一个节点在一段时间不活动的情况下,可以通过其邻居节点来更新它的 embedding。时间图注意还可以根据特征和时间信息选择哪些邻居更重要。
TGN 对一批训练数据执行的计算。一方面,Embedding 由 embedding module 使用时序图和节点的 memory (1)生成。然后使用 Embedding 来预测批处理交互并计算损失(2)(3)。另一方面,这些 same interactions 被用于更新 memory(4)(5)。
memory-related modules (Message function, Message aggregator, and Memory updater) 的训练方式:
考虑到它们似乎不直接影响 loss,因此不计算梯度。为了让这些模块能够影响 loss,我们需要在预测 batch interactions 之前更新 memory。然而这将导致 leakage,因为 memory 中已经包含了我们想要预测的信息。针对这个问题的解决方案是 使用前面的 batches 的信息来更新 memory,然后预测 interactions。下图显示了 TGN 的操作流程,这是训练 the memory-related modules 所必需的:
Flow of operations of TGN necessary to train the memory-related modules. 引入了一个新的模块,the raw message store,用来存储计算 message 的必须信息,我们称之为 原始信息(raw messages),用于过去已被模型处理过的 interactions。这允许模型将 interaction 导致的 memory 更新延迟到以后的 batch。
在各种 dynamic graphs 的大量实验验证中,TGN 在未来边缘预测(future edge prediction)和动态节点分类(dynamic node classification)的任务上,无论在精度还是速度上都明显优于竞争的方法(competing methods)。其中一个动态图是 Wikipedia,其中用户和页面是节点,interaction 表示用户编辑页面。编辑文本的编码被用作交互特性。本例中的任务是预测用户在给定时间将编辑哪个页面。我们比较了不同的 TGN 变形 与基线方法:
这些消融研究表明了 TGN 不同模块的重要性。