「GNN,简直太烂了」,一位Reddit网友的深度分析火了

「这就是我对图神经网络不感冒的原因」

金磊 发自 凹非寺
量子位 报道 | 公众号 QbitAI

图神经网络(GNN)这个概念近几年很火,确实如此。

然而今天,一位Reddit网友却“背道而驰”地提出了强烈反对观点。例如:

  • 过去5年中,大多数GNN论文提供的结果,对从业者没有太多帮助。
  • 我太烦Node2Vec了,引用量不应该达到7500这个数量。
  • 就玩那些没用的、小数据,效率提不上来,很难取得进步。
  • 添加一些新的图层/超参数,编一个可爱的数学故事来解释它为什么重要。
  • 当前的图形数据结构,简直糟糕透了。
  • 全局方法,是个死胡同。
  • ……

点评、分析之犀利,瞬间引来了众多网友的围观。

「GNN,简直太烂了」,一位Reddit网友的深度分析火了

接下来便来细看下这位网友,为什么对GNN如此之厌恶。

(为了方便阅读,以下内容将以第一人称进行表述)

模型与压缩有关

先来简单回顾一下基础知识。

大家都说图(graph)是一种“非欧几里得”数据类型,但事实并非如此。

一个正则图(regular graph)只是思考特殊矩阵(邻接矩阵)的另一种方式而已。

「GNN,简直太烂了」,一位Reddit网友的深度分析火了

很奇怪的一点就是,当我们看到满满都是实数的矩阵时候,就决定称之为“非欧几里得矩阵”。

但这背后也有其实际的原因,因为大多数的图都是非常稀疏的,也就是说矩阵里面大多数的数值都是零。

基于这一点,矩阵里面非零的数字就显得格外重要。这就使得问题更加接近离散数学,而不是简单连续、梯度友好的数学。

如果你有一个全矩阵(full matrix),那事情就会变得相当容易

如果我们暂时不考虑这些恼人的点,假设用一整个邻接矩阵也没什么大不了的,那我们就决绝了一大堆的问题。

首先,网络节点嵌入(network node embedding)就不再是个难题了。一个节点只是矩阵中的一行,所以它已经是一个数字向量。

其次,还解决了所有的网络预测问题。

一个足够强大且经过良好调优的模型,将提取网络和我们附加到节点上的任何目标变量之间的所有信息。

NLP也只是花式的矩阵压缩

让我们从图形切入到NLP。

正如我们将要看到的,我们所做的大多数NLP问题,都可以用图来表示,所以这并不是什么“题外话”。

首先,请注意,像Word2Vec和GloVe这样的Ye Olde词嵌入模型,只是矩阵分解。

GloVe 算法是对旧的词袋(bag of word)矩阵的一种变形。它遍历这些句子,并创建一个(隐含的)共现图(co-occurence graph),其中节点是单词,而边则根据单词在句子中出现的频率进行加权。

然后,GloVe对共生图的矩阵表示进行矩阵分解,Word2Vec在数学上是等价的。

甚至语言模型也只是矩阵压缩

语言模型风靡一时,可以说,它们主宰了 NLP 的大部分技术。

让我们以BERT为例,BERT会根据句子的上下文,来预测了一个单词:

「GNN,简直太烂了」,一位Reddit网友的深度分析火了

这使得我们要构造的矩阵,从对单词的平均共现(co-occurence),增加到了对句子上下文的条件共存:

「GNN,简直太烂了」,一位Reddit网友的深度分析火了

正如 Hanh 和 Futrell 的论文中所指出,我们正在组合地构造“理想矩阵”:

人类语言和语言模型具有无限的统计复杂性,但是在较低的层次上可以很好地近似。这个观察结果有两个含义:

1)我们可以用相对较小的模型获得较好的结果;2)我们的模型有很大的扩展潜力。

语言模型处理如此大的问题空间,以至于他们可能近似于柯氏复杂性(Kolmogorov Complexity)意义上的整个语言的压缩。也有可能庞大的语言模型,只是记住了大量的信息,而不是压缩信息。

那我们能像语言模型一样,对图进行上采样吗?

答案是:我们已经在做了。

我们把图的一阶嵌入,称为直接分解图的邻接矩阵或拉普拉斯矩阵(Laplacian Matrix)的方法。

如果使用拉普拉斯特征映射或者取拉普拉斯主分量来嵌入图,则为一阶。

同样,GloVe 方法也是对词共现图的一阶方法。

我最喜欢的图的一阶方法之一是ProNE,它和大多数方法一样好用,但是速度快两个数量级。

高阶方法就是我们在图上做的 “上采样”。

在大型邻域“上采样”的 GNN 和 node2vec 等基于随机漫步的方法都是在做高阶嵌入。

性能增益,在哪儿呢?

过去5年中,大多数GNN论文提供的结果,对从业者没有太多帮助。

正如OpenGraphsBenchmark(OGB)论文所指出的那样,GNN论文的实证部分是在少数具有2000-20000个节点的小图(Cora、CiteSeer、PubMed)上进行的。

这些数据集不能区分不同的方法。

最近的一些研究工作虽然解决了这个难题,但是为什么研究人员长期关注小型的、无用的数据集,是值得讨论的问题。

性能表现受任务分类的影响

一个让很多可能会感到惊讶的事实是,即使语言模型在很多NLP任务中有着良好的表现,但如果你所做的只是将句子嵌入到下游模型中,那么通过简单的方法,比如将单个 Word2Vec单词嵌入相加,从语言模型嵌入中并不会得到多少好处。

类似地,我发现对于许多图而言,简单的一阶方法在图聚类和节点标记预测任务上的表现,与高阶嵌入方法一样好

事实上,高阶方法对于这些用例来说,在计算上是非常浪费的。

但高阶方法并不是说没有用,它通常在链路预测任务中表现得更好。

有趣的是,链接预测性能的差距,在人工创建的图中是不存在的。这表明高阶方法,确实学习了一些真实世界图形固有的结构。

但对于可视化而言,一阶方法会更好一些。高阶方法的可视化往往有其采样的伪影。

例如,Node2Vec可视化往往具有拉长/丝状结构,这些结构来自于长单链随机漫步的嵌入。

下面是 Owen Cornec 的可视化效果:

「GNN,简直太烂了」,一位Reddit网友的深度分析火了

最后,有时简单的方法胜过高阶方法(在 OGB 论文中有一个实例)。

这里存在的一个问题是,我们不知道一个方法什么时候比另一个方法会更好些,我们绝对不知道其中的原因。

不同的图类型,对于不同的方法表示所反映出来的性能好坏,是有其原因的,但这是一个悬而未决的问题。

很大一部分的原因,是研究领域被没用的新算法给淹没了。

为什么会这样呢?继续往下看。

学术的激励(incentive),与学术的进步背道而驰

下面是“愤世嫉俗者”对机器学习论文制作的一些观点:

  1. 采用现存的一些算法
  2. 添加一些新的图层/超参数,编一个可爱的数学故事来解释它为什么重要
  3. 网格搜索你的超参数,直到你打破原始文件的基线
  4. 绝对不要在你的搜索结果区域中,将你正在比较的东西网格化
  5. 为你的新方法做一个可爱的首字母缩写,把不可能使用的Python2代码放到GitHub上

BTW:我太讨厌Node2Vec了

我一个副项目是一个节点嵌入库,目前最流行的方法是 Node2Vec。

不要使用Node2Vec!

取p=1和q=1的Node2Vec是Deepwalk算法,Deepwalk是一种实际的创新。

Node2Vec 的作者们紧跟着刚才提到的那5个步骤,包括步骤5提到的名字上的加分(因为word2vec很出名)。

这并不是什么学术造假,而是让ML社区变得更糟。

当然,Node2Vec也不应该被引用7500次。

学术进步,应该更加关注实际

40多年来,我们已经知道如何训练神经网络。然而,直到2012年,它们才在 AlexNet 上大受欢迎。

是因为实现和硬件达到了深度学习可行的程度。

类似地,我们至少在20年前就知道把单词共现矩阵分解成单词嵌入。

但词条嵌入直到2013年,随着Word2Vec才爆发。

这里的突破在于,基于小批量(minibatch)的方法,可以让你在硬件上训练维基百科规模的嵌入模型。

如果对少量数据进行训练,还需要数天或数周,那么一个领域的方法就很难取得进展。

效率对于学术进步至关重要

深度学习研究之所以能够取得如此成功,是因为它提高了效率,并且拥有了更好的库和硬件支持。

学术规范太糟糕

你花费在 p 和 q 上的 Node2Vec 网格搜索的时间,都可以更好地利用 Deepwalk 本身的网格搜索。

问题是人们不会在Deepwalk中网格搜索,因为实现都很糟糕。

体系结构并不重要

今年最重要的论文之一是 OpenAI 的“Scaling laws”论文,其中模型中参数的原始数量是整体性能最具预测性的特征。

这一点,甚至在原始的BERT论文中也有所提及,并且推动了2020年大规模语言模型的增长。

Transformer也可能取代卷积。正如Yannic Kilcher所说,Transformer正在毁掉一切,他们在图上进行研究,事实上,它是在基准测试时似乎是比较成功的方法之一。

研究人员似乎在结构上投入了大量的精力,但是最终这并不重要,因为你可以通过叠加更多的层来近似任何东西。

效率的胜利是伟大的,但神经网络架构只是实现这一目标的一种方式,而且由于对这一领域的过度研究,我们将在其他地方留下遗憾。

图形数据结构简直糟糕透了

NetworkX是个糟糕的库。

如果你在为婴儿做小图,它很好,但对于任何严肃的事情,它都会让你窒息,迫使你重写所有的东西……

这叫库?Really?

「GNN,简直太烂了」,一位Reddit网友的深度分析火了

在这一点上,大多数处理大型图的人,最终都会手工滚动一些数据结构。

但这很困难,因为你的计算机内存是一个由1和0组成的一维数组,一个图没有明显的一维映射。

如果我们考虑更新图表(添加/删除一些节点/边) ,这就更难了。

全局方法是个死胡同

一次处理整个图的方法不能利用计算,因为它们在一定规模上耗尽了RAM。

因此,任何希望成为新标准的方法,都需要能够对图的某些部分进行逐段更新。

今后,采样效率(Sampling Efficiency)将在未来更加重要:

  • 边缘局部方法:我所知道的包括GloVe 和 GGVec。
  • 随机漫步采样:Deepwalk 及其后代使用这种方法,通常用于节点嵌入,而不是 GNN 方法。
  • 近邻采样:这是目前GNN中最常见的一种,可以是低阶或高阶,这取决于邻居的大小。

网友评论

但对于这样的猛烈抨击,Reddit网友们mhwalker,似乎有不一样的声音。

大多数情况下,规模问题在工业上得到了解决。我们在数十亿个节点和数百亿个边上训练GNN。我们可以毫无问题地水平扩展。

但也正如你说的,这些文献大多数是无用的。

「GNN,简直太烂了」,一位Reddit网友的深度分析火了

至于被问如何解决的,帖子作者做出了回复,并提到了阿里巴巴的一篇论文:

阿里巴巴有一篇关于其基础设施的论文,阐述了他们是如何做到这一点的。

Pinterest主要使用GraphSAGE与邻里抽样。Instagram使用一个node2vec实现(可能是handrolled)。

「GNN,简直太烂了」,一位Reddit网友的深度分析火了

那么对于这样的讨论,你怎么看?

参考链接:

https://www.reddit.com/r/MachineLearning/comments/kqazpd/d_why_im_lukewarm_on_graph_neural_networks/

版权所有,未经授权不得以任何形式转载及使用,违者必究。