转载来源:https://mp.weixin.qq.com/s/N1I4mGKzsHJiAluZL17sDQ
作者:Chaitanya Joshi
编译:ronghuaiyang
导读:
这个观点的目的是构建 Transformer 结构背后的 NLP 上的直觉,以及与图神经网络的联系。
工程师朋友经常问我:“图深度学习” 听起来很厉害,但有什么大的商业成功的故事吗?它有没有被部署在实际 app 中?
除了 Pinterest、阿里巴巴和 Twitter 的推荐系统外,一个非常小的成功就是 Transformer 结构,这个结构带来了 NLP 的风暴。
通过这篇文章,我想在 Graph Neural Networks (GNNs) 和 transformer 之间建立联系。我会讨论 NLP 和 GNN 社区中,模型架构背后的直觉,使用方程和图把这两者建立联系,并讨论如何把这两个放到一起工作来得到进展。
让我们先谈谈模型架构的目的 —— 表示学习。
在较高的层次上,所有的神经网络架构都将输入数据构建为向量 / 嵌入的 “表示”,它们编码和数据有关的有用的统计和语义信息。这些潜在的或隐藏的表示可以用于执行一些有用的操作,比如对图像进行分类或翻译句子。神经网络通过接收反馈(通常是通过误差 / 损失函数) 来“学习”,建立越来越好的表示。
对于自然语言处理 (NLP),通常,递归神经网络(RNNs) 以顺序的方式构建句子中每个单词的表示,即,一次一个单词。直观地说,我们可以把 RNN 层想象成一条传送带,上面的文字从左到右进行递归处理。最后,我们得到了句子中每个单词的隐藏特征,我们将其传递给下一个 RNN 层或用于我们的 NLP 任务。
RNNs 以顺序的方式构建句子中每个单词的表示。一次一个单词。另一方面,Transformers 使用一种注意机制来判断句子中其他词对上述词的重要性。
Transformers 最初是为机器翻译而引入的,现在已经逐渐取代了主流 NLP 中的 RNNs。这个架构使用了一种全新的方式来进行表示学习:不需要进行递归,Transformers 使用注意力机制构建每个单词的特征,找出句子中的其他词对于前面之前的词的重要程度。知道了这一点,单词的特征更新就是所有其他单词特征的线性变换的总和,并根据它们的重要性进行加权。
让我们通过将前一段翻译成数学符号和向量的语言来发展关于架构的直觉。我们在句子 S 中从第 l 层到第 l+1 层更新第 i 个单词的隐藏特征 h:
h i ℓ + 1 = Attention ( Q ℓ h i ℓ , K ℓ h j ℓ , V ℓ h j ℓ ) , i. e . , h i ℓ + 1 = ∑ j ∈ S w i j ( V ℓ h j ℓ ) , where w i j = softmax j ( Q ℓ h i ℓ ⋅ K ℓ h j ℓ ) , \begin{array}{c} h_{i}^{\ell+1}=\operatorname{Attention}\left(Q^{\ell} h_{i}^{\ell}, K^{\ell} h_{j}^{\ell}, V^{\ell} h_{j}^{\ell}\right), \\ \quad \text { i. } e ., h_{i}^{\ell+1}=\sum_{j \in \mathcal{S}} w_{i j}\left(V^{\ell} h_{j}^{\ell}\right), \\ \text { where } w_{i j}=\operatorname{softmax}_{j}\left(Q^{\ell} h_{i}^{\ell} \cdot K^{\ell} h_{j}^{\ell}\right), \end{array} hiℓ+1=Attention(Qℓhiℓ,Kℓhjℓ,Vℓhjℓ), i. e.,hiℓ+1=∑j∈Swij(Vℓhjℓ), where wij=softmaxj(Qℓhiℓ⋅Kℓhjℓ),
其中 j∈S 表示句子中的词集,Q、K、V 为可学习的线性权值 (分别表示注意力计算的 Query、Key 和 V 值)。对于 Transformers,注意力机制是对句子中的每个单词并行执行的,RNNs 是一个词一个词的进行更新。
通过以下 pipeline,我们可以更好地了解注意力机制:
用这个词的特征 h_i ℓ 和句子中的其他的词的特征 h_j ℓ,∀j∈S,我们通过点积为每一对 (i, j) 计算注意力权重 wij,然后对所有的 j 计算 softmax。最后,对所有的 h_j ℓ 进行加权求和,产生更新的词的特征 h_i ^{ℓ+ 1}。句子中的每个词都并行地经历同一个 pipeline,以更新其特征。
要让这种点积注意力机制发挥作用是很棘手的,因为随机初始化会破坏学习过程的稳定性。我们可以通过并行地执行多个 “头” 的注意力,并连接结果来克服这个问题(现在每个头都有独立的可学习的权重):
h i ℓ + 1 = Concat ( head 1 , … , head K ) O ℓ , head k = Attention ( Q k , ℓ h i ℓ , K k , ℓ h j ℓ , V k , ℓ h j ℓ ) , \begin{array}{c} h_{i}^{\ell+1}=\text { Concat }\left(\text { head }_{1}, \ldots, \text { head }_{K}\right) O^{\ell} ,\\ \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), \end{array} hiℓ+1= Concat ( head 1,…, head K)Oℓ, head k= Attention (Qk,ℓhiℓ,Kk,ℓhjℓ,Vk,ℓhjℓ),
其中,Qk,Kk,Vk 是第 k 个注意力头的可学习的权重,O 是降维投影,为了匹配特征的维度。
多个头可以让注意力机制从本质上 “对冲赌注”,观察前一层隐藏特征的不同的转换或不同的方面。我们稍后会详细讨论。
Transformer 架构的一个关键问题是,词的特征在注意力机制之后可能是不同尺度,(1) 这是由于当对其他的单词特征进行求和的时候,这些单词的权重可能有非常 shape 的分布。(2) 在个体的特征向量层面上,拼接多个注意力头可能输出不同的尺度的值,导致最后的值具有很宽的动态范围。照传统的 ML 的经验,在 pipeline 中添加一归一化层似乎是合理的。
Transformer 通过 LayerNorm 克服了问题,它在特征级别归一化和学习仿射变换。此外,通过特征维度的平方根来缩放点积注意力有助于抵消问题 (1)。
最后,作者提出了另一个控制尺度问题的 “技巧”:一个 position-wise 的 2 层 MLP。多头的注意力之后,通过一个可学习的权重,他们把向量 h_i ^{ℓ+ 1} 投影到更高的维度上,然后通过 ReLU 再投影回原来的尺寸,再接另一个归一化:
h i ℓ + 1 = L N ( MLP ( L N ( h i ℓ + 1 ) ) ) h_{i}^{\ell+1}=\mathrm{LN}\left(\operatorname{MLP}\left(\mathrm{LN}\left(h_{i}^{\ell+1}\right)\right)\right) hiℓ+1=LN(MLP(LN(hiℓ+1)))
老实说,我不确定这个过于参数化的前馈子层背后的确切直觉是什么,而且似乎也没有人对它提出问题!我认为 LayerNorm 和缩放的点积并没有完全解决这个问题,所以大的 MLP 是一种独立地重新缩放特征向量的 hack。
Transformer 层的最终看起来是这样的:
Transformer 架构也非常适合深度网络,使得 NLP 社区在模型参数和数据方面都能进行扩展。每个多头注意子层和前馈子层的输入和输出之间的残差连接是叠加 Transformer 层的关键 (但为了清楚起见在图中省略)。
让我们暂时离开 NLP。
图神经网络 (GNNs) 或图卷积网络 (GCNs) 构建图数据中的节点和边的表示。它们通过邻域聚合 (或消息传递) 来实现,其中每个节点从其邻域收集特征,以更新其周围的_局部_的图结构的表示。堆叠几个 GNN 层使模型能够在整个图中传播每个节点的特征 —— 从它的邻居传播到邻居的邻居,等等。
以这个表情社交网络为例:GNN 产生的节点特征可以用于预测任务,如识别最有影响力的成员或提出潜在的联系
在其最基本的形式中,GNN 在第_ℓ_层通过对节点自身的特征和邻居节点的特征非线性变换的方式进行聚合,更新节点 i 的隐藏特征 h:
h i ℓ + 1 = σ ( U ℓ h i ℓ + ∑ j ∈ N ( i ) ( V ℓ h j ℓ ) ) h_{i}^{\ell+1}=\sigma\left(U^{\ell} h_{i}^{\ell}+\sum_{j \in \mathcal{N}(i)}\left(V^{\ell} h_{j}^{\ell}\right)\right) hiℓ+1=σ⎝⎛Uℓhiℓ+j∈N(i)∑(Vℓhjℓ)⎠⎞
其中 U、V 为 GNN 层的可学习权重矩阵,_σ_为 ReLU 等非线性变换。
邻居节点的总和 * j∈N(i)* 可以被其他输入大小不变的聚合函数代替,比如简单的 mean/max,或者更强大的函数,比如通过注意力机制的加权和。
听起来耳熟吗?
也许一个 pipeline 有助于建立联系:
如果我们将多个并行的邻域头进行聚合,并将邻域 j 的求和替换为注意力机制,即加权和,我们就得到图注意力网络 (GAT)。加上归一化和前馈 MLP,看,我们得到一个图 Transformer!
为了使这种联系更加明确,可以把一个句子看作是一个完全连通的图,其中每个单词都与其他单词相连。现在,我们可以使用 GNN 为图 (句子) 中的每个节点 (单词) 构建特征,然后我们可以使用它执行 NLP 任务。
广义上说,这就是 Transformers 正在做的事情:它们是带有多头注意力的 GNN,作为邻居的聚合函数。标准的 GNNs 从其局部邻居节点 j∈N(i) 中聚合特征,而 NLP 的 Transformers 将整个句子 S 作为局部邻居,从每一层的每个单词 j∈S 中聚合特征。
重要的是,各种针对特定问题的技巧 —— 比如位置编码、因果 / 隐藏聚合、学习率策略和预训练 ——对 Transformers 的成功至关重要,但很少在 GNN 社区中出现。同时,从 GNN 的角度来看 Transformers 可以让我们摆脱架构中的许多花哨的东西。
现在我们已经在 Transformers 和 GNN 之间建立了联系,让我来谈谈……
在统计 NLP 和 ML 之前,像 Noam Chomsky 这样的语言学家专注于发展语言结构的正式理论,比如语法树 / 图。Tree LSTMs 已经尝试过了,但是也许 transformer/GNNs 是更好的架构,可以让语言理论和统计 NLP 的世界更靠近?
完全连通图的另一个问题是,它们让学习单词之间的长期依赖关系变得很困难。这仅仅是因为图中的边的数量是如何随着节点的数量以平方量级增长的。在一个有 n 个单词的句子中,一个 Transformer/GNN 将对 n2 个单词对进行计算。对于非常大的 n,就没办法处理了。
NLP 社区对长序列和依赖问题的看法很有趣:让注意力力机制变得稀疏或者可以自适应输入的大小,对每一层添加递归或压缩,使用局部敏感哈希来获得有效的注意力,都是改善 Transformer 的有前途的新想法。
看到来自 GNN 社区的想法加入其中将是很有趣的,例如使用划分二部图的方式用于句子图稀疏化似乎是另一种令人兴奋的方法。
有几个有趣的文章来自 NLP 社区,是有关 Transformers 可能正在学习的内容。它的基本前提是,对句子中的所有词进行关注,以确定对哪些词最感兴趣,从而使 “Transformers” 能够学习一些类似于特定任务语法的东西。在多头注意力中,不同的头也可能 “看” 不同的句法属性。
用图的术语来说,通过在全图上使用 GNN,我们能从 GNN 如何在每一层执行邻居的聚合来恢复最重要的边缘 (以及它们可能包含的内容) 吗?对于这个观点,我并不那么信服。
我更赞同多头机制的优化视图 —— 拥有多个注意力头改进了学习并克服了错误的随机初始化。例如,这些论文表明 Transformer 头可以在训练被 “修剪” 或删除,而不会对性能产生显著影响。
多头邻居聚合机制在 GNNs 中也被证明是有效的,例如,GAT 使用相同的多头注意力和 MoNet 使用多个高斯核聚合特征。虽然是为了稳定注意力机制而发明的,但是多头机制会成为压榨模型性能的标准操作吗?
相反,具有简单聚合函数 (如 sum 或 max) 的 GNN 不需要多个聚合头进行稳定的训练。如果我们不需要计算句子中每个词对之间的配对兼容性,对 Transformers 来说不是很好吗?
Transformers 能从完全摆脱注意力中获益吗?Yann Dauphin 和合作者的最近工作提出了一种替代的 ConvNet 的架构。Transformers 也可能最终会做一些类似的事情。
阅读 Transformer 的新论文让我觉得,在确定最佳学习率策略、热身策略和衰变设置时,训练这些模型需要类似于 “黑魔法” 的东西。这可能只是因为模型太大了,而 NLP 的研究任务太具有挑战性了。
最近的研究结果认为,也可能是因为归一化的具体排列和架构内的残差连接的原因。
image-20200611142642846
在这一点上,我很愤怒,但这让我怀疑:我们真的需要多个头的昂贵的两两的注意力吗,过分参数化的 MLP 层,和复杂的学习率策略吗?
我们真的需要拥有这么大的模型吗?
对于手头的任务来说,具有良好的归纳偏差的架构不应该更容易训练吗?
这个博客并不是第一个将 GNNs 和 Transformers 联系起来的博客:以下是 Arthur Szlam 关于注意力 / 记忆网络、GNNs 和 Transformers 之间的历史和联系的精彩演讲:https://ipam.wistia.com/medias/1zgl4lq6nh。同样,DeepMind 的明星云集的 position paper 引入了图网络框架,统一了所有这些想法。DGL 团队有一个关于把 seq2seq 问题转化为 GNN 的很好的教程:https://docs.dgl.ai/en/latest/tutorials/models/4_old_wines/7_transformer.html
英文原文:https://towardsdatascience.com/transformers-are-graph-neural-networks-bca9f75412aa