Transformers are Graph Neural Networks
Transformers就是GNNs
原文:https://graphdeeplearning.github.io/post/transformers-are-gnns/
文章翻译,主要是给自己看的
Representation Learning for NLP
总的来说,所有神经网络结构都将输入数据的representations构建为vectors/embeddings,对有用的统计和语义信息进行encode。然后,潜在的或者隐藏的representations可以用于图片分类或者翻译句子。神经网络通过接受反馈(error/loss functions)学习来构造更好的representations。
对于自然语言处理(NLP),传统上,循环神经网络(RNN)以顺序的方式构建句子中每个单词的表示,即一次一个单词。直观地说,我们可以将RNN层想象成一条传送带,从左到右对其上的单词进行自回归处理。最后,我们为句子中的每个单词获得一个隐藏特征,我们将其传递到下一个RNN层或用于我们选择的NLP任务。
Transformers最初是为了机器翻译任务而引入的,现在已经逐渐取代了主流NLP中的RNN。该体系结构采用了一种新的表示学习方法:完全消除循环,Transformers使用注意力机制来构建每个单词的特征,以确定句子中所有其他单词相对于前面的单词的重要性。知道了这一点,单词的更新的features就是所有单词特征的线性变换之和,并根据其重要性进行加权。
分解Transformer
我们在l层到l+1层更新句子
S
\mathcal{S}
S种第i个word的隐藏的**特征
h
\mathcal{h}
h**如下:
其中, j ∈ S j \in \mathcal{S} j∈S表示句子种words的集合, Q ℓ , K ℓ , V ℓ Q^{\ell}, K^{\ell}, V^{\ell} Qℓ,Kℓ,Vℓ时可学习的线性权重(分别表示attention计算中的query,key,value)
注意力机制是对句子中的每个单词并行执行的,在one shot学习(训练中不同类别样本只有一个)中获得它们的更新features——这是Transformer相对于RNN的另一个优点:逐字更新features。
我们可以通过以下pipeline更好地理解注意力机制:
考虑单词特征 h j l h_j^l hjl 和句子中其他词的特征 h i l h_i^l hil, ∀ j ∈ S ∀j∈S ∀j∈S,通过点积计算每对 ( i , j ) (i,j) (i,j)的注意力权重,然后在所有单词$ j $上计算出 s o f t m a x softmax softmax。
最后,我们通过对所有 h j l h_j^l hjl对应的权重 w i j w_{ij} wij进行加权求和来更新单词 i i i特征 h i l + 1 h_i^{l+1} hil+1。
句子中的每个单词并行地通过相同的pipeline来更新其特征。
Multi-head Attention mechanism
事实证明,让这种点积注意力机制发挥作用是很棘手的——糟糕的随机初始化会使学习过程不稳定。我们可以通过并行执行多个注意力“头部”并连接结果来克服这一问题(现在每个头部都有单独的可学习权重):
h i ℓ + 1 = Concat ( head 1 , … , head K ) O ℓ , h_{i}^{\ell+1} = \text{Concat} \left( \text{head}_1, \ldots, \text{head}_K \right) O^{\ell}, hiℓ+1=Concat(head1,…,headK)Oℓ, head k = Attention ( Q k , ℓ h i ℓ , K k , ℓ h j ℓ , V k , ℓ h j ℓ ) , \text{head}_k = \text{Attention} \left( Q^{k,\ell} h_{i}^{\ell} \ , K^{k, \ell} h_{j}^{\ell} \ , V^{k, \ell} h_{j}^{\ell} \right), headk=Attention(Qk,ℓhiℓ ,Kk,ℓhjℓ ,Vk,ℓhjℓ),
Q k , ℓ , K k , ℓ , V k , ℓ Q^{k,\ell}, K^{k,\ell}, V^{k,\ell} Qk,ℓ,Kk,ℓ,Vk,ℓ 是 k k k’th attention head 的可学习权重, O ℓ O^{\ell} Oℓ 是降维投影(匹配 h i ℓ + 1 h_i^{\ell+1} hiℓ+1 和 h i ℓ h_i^{\ell} hiℓ 的维度)
多头允许注意力机制本质上“多处下注”,观察前一层隐藏特征的不同转换或方面。
尺度问题以及前馈层
激励最终Transformer架构的一个关键问题是,注意力机制之后的单词的特征可能处于不同的尺度(?)或magnitudes(重要性):
(1)这可能是由于一些单词在对其他单词的特征进行求和时具有非常尖锐或非常分散的注意力权重。(?)
(2) 在单个feature/vector条目级别,连接多头注意力——这些头可能输出不同尺度的值——可能导致最终feature/vector条目的值的范围很广。按照传统的Machine Learning经验,在pipeline中添加一个norm层是合理的。
Transformer通过LN克服了问题(2),LN在feature level学习仿射变换并进行归一化。此外,通过特征尺寸的平方根来缩放点积注意力有助于解决问题(1)。
最后,作者提出了另一个控制尺度问题的“技巧”:一个position-wise的2层MLP。多头的注意力之后,通过一个可学习的权重把向量
h
i
ℓ
+
1
h_i ^{ℓ+ 1}
hiℓ+1升维,然后通过ReLU降维回原来的维度,再接另一个LN:
h
i
ℓ
+
1
=
LN
(
MLP
(
LN
(
h
i
ℓ
+
1
)
)
)
h_{i}^{\ell+1}=\operatorname{LN}\left(\operatorname{MLP}\left(\operatorname{LN}\left(h_{i}^{\ell+1}\right)\right)\right)
hiℓ+1=LN(MLP(LN(hiℓ+1)))
Transformer层:
Transformer架构也非常适合很深的网络,使得NLP社区在模型参数和数据方面都能进行扩展。每个多头注意子层和前馈子层的输入和输出之间的残差连接是叠加Transformer层的关键部分(但为了清楚起见在图中省略)。
GNNs build representations of graphs
图神经网络(GNN)或图卷积网络(GCN)构建图数据中节点和边的representations。它们通过邻域聚合(或消息传递)来实现这个构建,每个节点从邻居节点那里收集features,以更新其周围局部图结构的表示。堆叠几个GNN层使模型能够在整个图上传播每个节点的features,从邻居节点传播到邻居节点的邻居节点,以此类推。
以这个emoji社交网络为例:GNN生成的节点特征可以用于预测任务,例如识别最具影响力的成员或建议潜在的联系。
在GNN最基本的形式中,GNN通过在节点自己的特征
h
j
l
h_j^l
hjl做非线性转换来更新节点
i
i
i在层
ℓ
\ell
ℓ处的隐藏特征
h
h
h(例如,😆) ,该特征
h
j
l
h_j^l
hjl会参与每个邻居节点
j
∈
N
(
i
)
j\in N(i)
j∈N(i)的消息聚合过程:
h
i
ℓ
+
1
=
σ
(
U
ℓ
h
i
ℓ
+
∑
j
∈
N
(
i
)
(
V
ℓ
h
j
ℓ
)
)
,
h_{i}^{\ell+1} = \sigma \Big( U^{\ell} h_{i}^{\ell} + \sum_{j \in \mathcal{N}(i)} \left( V^{\ell} h_{j}^{\ell} \right) \Big),
hiℓ+1=σ(Uℓhiℓ+j∈N(i)∑(Vℓhjℓ)),
U
ℓ
,
V
ℓ
U^{\ell}, V^{\ell}
Uℓ,Vℓ 是GNN层的可学习的权重矩阵,
σ
\sigma
σ是 非线性激活函数(ReLU).举个例子,
N
\mathcal{N}
N(😆)
=
=
= { 😘, 😎, 😜, 🤩 }.
邻居节点 j ∈ N ( i ) j \in \mathcal{N}(i) j∈N(i) 的summation(聚合)可以被其他input size-invariant aggregation functions (?)例如求平均/求最大或者更强大的方法, 比如加权求和,通过注意力机制.
听起来是不是很耳熟?
可能一个pipeline可以建立两者的连接:
如果我们进行多个并行的邻居节点 j ∈ N ( i ) j\in N(i) j∈N(i)的聚合,并用注意力机制(即加权和)代替对邻居节点 j ∈ N ( i ) j\in N(i) j∈N(i)的summation(聚合),我们就会得到图注意力网络(GAT)。加上Norm和MLP,我们就有了一个图Transformer!
句子就是全联通的字词图
为了让 Transformer 和 GNN 的关系更加明确,我们可以将一个句子想象为一个全联通图,每个词都和其余的词相互连接。现在,我们使用GNN来构建每个节点(词)的features,这之后也可以在其他 NLP 任务运用。
广义来说,这其实就是 Transformer 所做的事情:它们实际上就是有着多头注意力作为邻居节点的aggregation function(邻居节点聚合函数)的 GNN。标准的 GNN 从局部邻居节点 j ∈ N ( i ) j∈N(i) j∈N(i) 中聚合特征,而 Transformer 则将整个句子 S S S 视为一个局部邻居节点,在每层中从每个词 j ∈ S j∈S j∈S 聚合features。
重要的是,各种针对问题的技巧,如位置编码、masked 聚合、规划学习率和额外的预训练——对于 Transformer 的成功很重要,但是很少在 GNN 中见到。同时,从 GNN 的角度来看 Transformer,可以帮助我们在架构上舍弃很多无用的部分。
我们可以从 Transformer 和 GNN 学到什么?
现在我们已经建立起了 Transformer 与 GNN 之间的联系,那么以下问题也就随之而来:
全联通图对于 NLP 来说是最佳的输入格式吗?
在统计 NLP 和 ML 出现之前,诺姆·乔姆斯基等语言学家着重创建语言结构(linguistic structure)的形式理论,如语法树/图等。Tree-LSTM尝试过了,但 Transformers 或者 GNN 架构是否能够更好地拉近语言学理论和统计型NLP 呢?
如何学习长城依赖(long-term dependency)
长程依赖可以理解为:当你想使用语言模型,并有效利用较早时间步的信息,最终产生预测的时候,那么你就要和较长路程前的信息建立一种依赖关系,这就是长程依赖
全联通图的另一个问题是它们会使得学习单词之间的长程依赖变得困难。这只取决于全联通图中的边数随着节点数呈平方地增长,例如在包含 n n n 个单词的句子中,Transformer 或者 GNN 将计算 $n^2 个单词对。 个单词对。 个单词对。n$数越大,计算愈加困难。
NLP 社区对于长序列和长程依赖的观点很有趣:为了获得更好的 Transformers,在输入大小方面执行稀疏或自适应的注意力机制,在每一层添加递归或压缩,以及使用局部敏感哈希(LSH)for efficient attention都是 promising new ideas。
LSH
?
所以,融合 GNN 社区的一些观点有可能收获显著的效果,例如用于句子图稀疏化的二元分区(binary partitioning)似乎就是一个不错的方法。
Transformers 学习『神经句法』(neural syntax)吗?
neural syntax:细胞组装、突触和阅读器。神经科学中一个被广泛讨论的假设是,被称为“细胞组装体”的神经元的短暂活跃集合是大脑从编码记忆到推理的众多操作的基础。
NLP 社区已经有一些论文来探究 Transformers 学习什么的问题。但这需要一个基本前提,即执行句子中所有单词对的注意力(目的在于识别哪些单词对最感兴趣)使得 Transformers 能够学习到特定于任务的neural syntax等。
此外,多头注意力中不同的 head 可能也关注不同的句法特征。
就图而言,通过在全联通图上使用GNN,我们能否从GNN在每一层执行邻居节点聚合的方式中恢复最重要的边——以及它们可能包含的内容?我还不太相信这种观点。
为什么采用多头注意力?为什么用attention?
原作者更赞同多头注意力机制的优化观点,因为拥有多注意力头能够增强学习效果,克服糟糕的随机初始化。例如,论文《Are Sixteen Heads Really Better than One?》中表明,在无重大性能影响的训练之后,Transformer 头可以被『剪枝』或『移除』。
多头邻居节点聚合机制也已证明在 GNN 中有效,例如 GAT 使用相同的多头注意力,论文《Geometric deep learning on graphs and manifolds using mixture model CNNs》中的 MoNet 使用多个高斯核(Gaussian Kernel)来聚合特征。尽管多头方法是用来实现注意力机制的平稳化,但这些方法是否能够成为发挥模型剩余性能的标准呢?
与之相反,用sum 或 max 等更简单聚合函数的 GNN 不需要用多聚合头来实现平稳训练。所以,如果我们不用计算句子中任意单词对之间的成对兼容性,对 Transformers 不是更好吗?
此外,完全摆脱注意力,Transformer 是否又会获益呢?Yann Dauphin 等人所写的论文《Convolutional Sequence to Sequence Learning》提出了一个替代性的 ConvNet 架构。所以,Transformers 最终也可能会做出一些类似于 ConvNets 的改进。
Why is training Transformers so hard?
阅读新的Transformer论文让原作者觉得,在确定最佳学习率时间表、预热策略和衰减设置时很难确定。这可能只是因为模型非常庞大,所研究的NLP任务非常具有挑战性。
但最近的结果表明,这也可能是由于体系结构中Norm和残差连接的特定排列导致的。
在这一点上持怀疑态度:我们真的需要多头的昂贵的成对注意力、过度参数化的MLP子层和复杂的学习时间表吗?
我们真的需要有超耗电的大型模型吗?
对于手头的任务,具有良好inductive biases的架构难道不应该更容易训练吗?
可以读读inductive biases