作者 | Chaitanya K. Joshi
译者 | 苏本如,责编 | 夕颜
来源 | CSDN(ID:CSDNnews)
我的工程师朋友经常问我:图深度学习听起来很棒,但是有没有实际应用呢?
虽然图神经网络被用于Pinterest、阿里巴巴和推特的推荐系统,但一个更巧妙的成功案例是Transformer架构,它在NLP(Natural Language Processing ,自然语言处理)世界掀起了一场风暴。
在这篇文章中,我尝试在图神经网络(GNNs)和Transformers之间建立一种联系。我将讨论NLP和GNN社区对于模型架构背后的直觉,用方程和图形建立两者之间的联系,并讨论两者如何合作来共同进步。
让我们从模型架构的目的——表示学习(representation learning)开始。
NLP的表示学习
在较高的层次上,所有的神经网络结构都将输入数据的“表示”构建为嵌入向量,并对有关数据的有用统计和语义信息进行编码。这些潜在的或隐藏的“表示”可以用于执行一些有用的操作,例如对图像进行分类或翻译句子。神经网络通过接收反馈(通常是通过误差/损失函数)来学习构建更好的“表示”。
对于自然语言处理(NLP),通常递归神经网络(RNNs)以顺序的方式构建句子中每个单词的“表示”,即一次一个单词。直观地说,我们可以把一个RNN层想象成一个传送带,上面的文字从左到右进行递归处理。最后,我们得到了句子中每个单词的一个隐藏的特征,我们将其传递给下一个RNN层或用于我们选择的NLP任务。
如果你想回顾一下RNNs和NLP的表示学习,我强烈推荐Chris Olah的博客。
Transformers 最初是为机器翻译而引入的,现在已经逐渐取代了主流NLP中的RNNs。该架构采用了一种全新的表示学习方法:完全不需要使用递归,Transformers使用一种注意力机制(attention mechanism)来构建每个单词的特征,以确定句子中所有其他单词对前述单词的重要性。了解了这一点,单词的更新特征就是所有单词特征的线性变换的和,并根据其重要性进行加权。
在2017年的时候,这种想法听起来非常激进,因为NLP社区已经习惯了使用RNN处理文本的顺序式方式(即一次一个单词)。它的名字可能也起到了推波助澜的作用。
详解Transformer
让我们通过将前一段翻译成数学符号和向量的语言来发展关于架构的直觉。我们将句子S中第i个单词的隐藏特征h从从第 ℓ 层更新到第 ℓ+1层,如下所示:
例如:
这里的:
其中j∈S表示句子中的词集,、、是可学习的线性权重(分别表示注意力计算的Query、Key和Value)。
对于句子中的每个单词,注意力机制是并行执行的,以一个单词一个单词地方式获得更新后的特征,这是RNNs上的Transformer的另一个优点:它逐词逐词地更新特征。
我们可以通过以下管道(pipeline)来更好地理解注意力机制:
考虑到单词的特征 和其他词集的特征,通过向量点积计算每对(i,j)的注意力权重,然后对所有j的注意力权重执行softmax运算。最后。我们得到单词i的最新特征。句子中的每个单词都会并行地通过相同的管道来更新其特征。
多头注意力机制
让这个简单的向量点积注意力机制发挥作用是很棘手的。因为错误的可学习权重的随机初始化会使训练过程变得不稳定。
我们可以通过并行执行多个注意力“头”并将结果串联起来(让每个“头”现在都有独立的可学习权重)来解决这个问题:
式中,是第k个注意力头的可学习的权重,是降维投影,以匹配跨层的和的维度。
多个头部允许注意力机制从本质上“对冲赌注”,可以从上一层观察前一层隐藏特征的不同转换或不同的方面。我们稍后会详细讨论。
规模大小问题
Transformer架构的一个关键问题是,经过注意力机制之后的单词特征可能具有不同的规模和大小。这可能是由于在对一些单词的其他单词特征进行求和的时候,这些单词具有非常尖锐或非常分散的注意力权重。此外,在单个特征向量条目层面上,将多个注意力头拼接在一起,每个注意力头的输出值可以在不同的尺度上,从而导致最终向量的值具有很宽的动态值范围。
按照传统的机器学习(ML)的经验,这时候向pipeline中添加一个归一化层似乎是合理的。
Transformer通过使用LayerNorm克服了第二个问题,LayerNorm在特征级别进行规一化并学习仿射变换。此外,通过特征维度的平方根来调整向量点积注意力有助于解决第一个问题。
最后,Transformer的作者提出了另一个控制尺度问题的“技巧”:一个具有特殊结构的基于位置排列的2层MLP。在多头注意力之后,他们通过一个可学习的权重将投射到一个(荒谬的)更高的维度,在那里它经历了ReLU非线性后,再被投射回其原始维度,然后再进行另一次归一化:
老实说,我不确定这个过于参数化的前馈子层背后的确切直觉是什么。我想LayerNorm和scaled dot products并没有完全解决前面提到的问题,所以大的MLP可以说是一种独立地重新缩放特征向量的hack方法。根据Jannes Muenchmeyer的说法,前馈子层确保了Transformer是一个万能逼近器。因此,投影到一个非常高的维度空间,经历一次ReLU非线性,然后重新投射到原始维度,使模型能够比在隐藏层中保持相同维度时可以“表示”更多的功能。
Transformer层的最终结构图看起来是这样的:
Transformer架构也非常适合深度学习网络,这使得NLP社区在模型参数和扩展数据方面都能够进行扩展。
每个多头注意力子层和前馈子层的输入和输出之间的残差连接是堆叠Transformer层的关键(但为了清晰起见,在图中省略了)。
使用GNNs构建图的表示
现在,我们暂时先不讨论NLP。
图神经网络(GNNs)或图卷积神经网络(GCNs)构建图数据中节点和边的表示。它们通过邻域聚合(或消息传递)来实现这一点,每个节点从其邻域收集特征,以更新其对周围的局部图结构的表示。堆叠几个GNN层使得模型能够在整个图中传播每个节点的特征--从它的邻居传播到邻居的邻居,依此类推。
以这个表情符号社交网络为例: GNN产生的节点特征可以用于预测任务,例如:识别最有影响力的成员或提出潜在的联系。
在其最基本的形式中,GNNs通过对第ℓ层节点(比如说)自身特征的非线性变换,在每个相邻节点j∈N(i)的特征的集合中加入节点自身特征的非线性变换,从而更新第ℓ层节点i的隐藏特征h:
在这里,,是GNN层的可学习权重矩阵,σ是一个类似于ReLU的非线性变换函数。在本示例中, = { }。
邻域节点j∈N(i)上的求和可以用其他输入大小不变的聚合函数来代替,例如简单的mean/max或更强大的函数,比如基于注意力机制的加权求和函数。
这听起来耳熟吗?
也许一个pipeline(管道)将有助于实现连接:
如果我们将多个并行的邻域头进行聚合,并用注意力机制(即加权和)代替邻域j上的求和,加上归一化和前馈MLP,看,我们就得到了一个图Transformer!
句子是全连通的词图
为了使连接更加明确,可以将一个句子看作一个完全连通的图,其中每个单词都与其他每个单词相连。现在,我们可以使用GNN为图(句子)中的每个节点(单词)构建特性,然后我们可以使用它执行NLP任务。
广义地说,这就是Transformers正在做的: 它们是具有以多头注意力作为邻域聚合函数的GNNs。而标准的GNNs从其局部邻域节点j∈N(i)聚合特征,NLP的Transformer将整个句子S视为局部邻域,在每一层聚合来自每个单词j∈S的特征。
重要的是,各种特定于问题的技巧,-- 例如位置编码、因果/屏蔽聚合、学习速率调度器和广泛的预训练 -- 对Transformers 的成功至关重要,但在GNN社区中很少出现。同时,从GNN的角度来看,Transformers可以启发我们摆脱架构中的许多华而不实的东西。
我们学到了什么?
句子都是全连通图吗?
既然我们已经在Transformer和GNNs之间建立了联系,让我来谈谈一些想法。
首先,全连通图是NLP的最佳输入格式吗?
在统计NLP和ML(机器学习)流行之前,像Noam Chomsky这样的语言学家专注于发展语言结构的形式化理论,例如语法树/图。树形长短期记忆网络(Tree LSTMs)模型已经被尝试过了,但是否有可能Transformers/GNNs是可以将语言理论和统计NLP这两个世界结合在一起的更好的架构?例如,MILA(蒙特利尔学习算法研究所和斯坦福大学最近的一项研究探索了使用语法树增强预训练的Transformer,如Sachan等人在2020年提出的基于Transformer的双向编码器表示( BERT)。
图片来源: 维基百科
长期依赖性
全连通图的另一个问题是,它们使得学习单词之间的长期依赖关系变得困难。原因很简单,这是因为图的边数量和节点的数量成平方量级关系,即在一个有着n个单词的句子中,Transformer/GNN将在对单词的量级上进行计算。对于非常大的n来说,这个计算规模大到无法控制。
NLP社区对长序列和依赖关系问题的看法很有趣:使注意力机制在输入大小方面变得稀疏或自适应,在每一层中添加递归或压缩,以及使用局部敏感哈希来获得有效的注意力,这些都是可能使得Transformers变得更好的新想法。
看到来自GNN社区的想法加入其中是一件很有趣的事,例如用于句子图稀疏化的二分法(BP- Binary Partitioning)似乎是另一种令人兴奋的方法。BP-Transformers递归地将句子分为两部分,直到它们能够从句子标记中构造出一个分层二叉树。这种结构化的归纳偏置有助于模型以内存级效率的方式处理较长的文本序列。
资料来源:Ye等人,2019年
Transformers正在学习“神经语法吗” ?
在一些有关Transformers学习的文章中,基本假设是Transformers对句子中的所有词对进行注意力计算,以确定哪些词对是最有趣的,也就是能让“Transformer”学习一些类似于特定任务语法的东西。在多头注意力中,不同的头也可以“观察”不同的句法属性。
用图的术语来说,通过在全图上使用GNN,我们能从GNN在每一层执行邻域聚合的方式恢复最重要的边以及它们可能包含的内容吗?我还不太相信这个观点。
资料来源:Clark等人, 2019
为什么是多头注意力?为什么是注意力?
我更赞同多头机制的优化观点,即拥有多个注意力头可以改进学习,并克服糟糕的随机初始化。例如,这些论文表明,Transformer头可以在训练后被“修剪”或移除,而不会对性能产生显著影响。
多头邻域聚合机制在GNNs中也被证明是有效的,例如,GAT使用相同的多头注意力,MoNet使用多个高斯核来聚合特征。虽然这些是为了稳定注意力机制而发明的,但这些多头技巧会成为挤出额外模型性能的标准吗?
相反,具有简单聚合函数(如sum或max)的GNN不需要多个聚合头来进行稳定的训练。如果我们不必计算句子中每个词对之间的配对兼容性,那对Transformers来说不是很好吗?
Transformers能从完全摆脱注意力中获益吗?Yann Dauphin和合作者的最近工作提出了一种替代的ConvNet的架构。Transformers也可能最终会做一些类似的事情。
资料来源:Wu等人,2019年
为什么Transformers的训练这么难?
阅读最新的Transformer论文让我觉得,训练这些模型需要一些类似于黑魔法的东西来确定最佳学习速率调度器、热身策略和衰减设置。这可能只是因为模型太过庞大,而NLP的研究任务又太具有挑战性了。
但是最近的结果表明,这也可能是因为归一化的具体排列和架构内的残差连接所导致的。
我很喜欢阅读最新的@DeepMind Transformer论文,但是训练这些模型为什么需要它样的黑魔法呢?”对于基于单词的语言模型(LM),我们使用了16,000个warmup-step和500,000个decay-step,并牺牲了9000个goat。”
https://t.co/dP49GTa4zepic.twitter.com/1K3Fx4s3M8
- Chaitanya K.Joshi(@chaitjo)于2020年2月17日
我知道自己过分激动了,但这让我提出疑问:我们真的需要多头的昂贵的配对的注意力,过分参数化的MLP子层,和复杂的学习速度调度器吗?
我们真的需要如此之大的模型吗?对于手头的任务来说,具有良好的归纳偏差的体系结构不应该更容易训练吗?
原文链接:
https://thegradient.pub/transformers-are-graph-neural-networks/
更多精彩推荐
Azure Arc 正式商用、Power Platform+GitHub 世纪牵手,一文看懂 Ignite 2020
起底 ARM:留给中国队的时间不多了