加入收藏 | 设为首页 | 会员中心 | 我要投稿 常州站长网 (https://www.0519zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 动态 > 正文

2020年的物联网成功

发布时间:2021-02-17 13:45:06 所属栏目:动态 来源:互联网
导读:此表显示了深度图神经网络架构在CoauthorsCS引文网络的结点分类任务上的一般结果。深度越深,基线(带有残差连接的GCN)的表现越差,性能也从88.18%急剧下降至39.71%。使用NodeNorm技术的神经网络架构随着深度的增加会变得更好, 但是性能却开始下降(虽然仅是

此表显示了深度图神经网络架构在CoauthorsCS引文网络的结点分类任务上的一般结果。深度越深,基线(带有残差连接的GCN)的表现越差,性能也从88.18%急剧下降至39.71%。使用NodeNorm技术的神经网络架构随着深度的增加会变得更好, 但是性能却开始下降(虽然仅是从89.53%降低到87.40%)。总体而言,64层深层架构获得的最佳结果(87.40%)还不如简单的基线(88.18%)。此外,我们注意到NodeNorm规则化可以改善浅层2层架构的性能(从88.18%增至89.53%)。上表源自论文《 Effective training strategies for deep graph neural networks》

从上表可以清晰看到,我们很难区分神经网络的“优势”是从深度网络架构获得的,还是从训练此类神经网络的“技巧”所获得的。上述示例中的NodeNorm还改进了仅有两层的浅层架构,从而实现了最佳性能。因此,我们无法确定在其他条件均相同的情况下,更深层数的图神经网络是否会表现得更好。

这些结果与基于网格结构数据的传统深度学习形成了鲜明的对比。在传统深度学习中,“超深度”架构能带来性能上的突破,在当今也得到了广泛应用。

接下来,作者尝试从以下几个方面来探索文章开头所提出的问题:图神经网络的深度越深,真的优势越大吗?不过作者也表示,他目前也没有一个明确的答案,希望下面这些探讨能够对大家的思考有所启发。

1、图结构

因为网格属于特殊图,目前也有一些案例可以说明深度对这类图有益。除网格图外,研究发现深度结构对一些象征结构的几何图(如分子、点云、网格等)是有促进作用的。为什么这些图与常用于评估图神经网络的引文网络(如Cora、PubMed与CoauthorsCS)如此不同呢?其中一个差异是引文网络就像直径小的“小世界”( small world),在这个“小世界”里,任意节点都可以在短短几步跳到其他节点。因此,感受野只需具备几层卷积层即能够覆盖整个图,再增加层数也无更大助益。另一方面,在计算机视觉中,感受野成倍增长,需要更多层数来建立一个能捕捉图中物体背景的感受野。

 

深度图神经网络”是否被误用了?或者说,我们是否应该重新审视以前认为“图神经网络越深,效果就会越好”的思路,说不定“深度”反而对基于图的深度学习不利呢?

众所周知,深度图神经网络的训练过程非常艰难。除了研究者们能够在深层神经体系结构中观察到的典型难点外(比如大量参数导致反向传播梯度消失和过度拟合),还有一些图特有的难点,例如“过度平滑”:由于应用了多个图卷积层,节点特征趋于收敛到同一向量并逐渐变得难以区分。这个现象最早在GCN模型中观察到,其作用类似于低通滤波器。另一个图所特有的现象是“信息瓶颈”,会将信息从指数级数量的临域“过度挤压”到大小固定的向量中。

近日来,人们致力于解决图神经网络中的深度问题,希望图神经网络能有更好的表现,至少能避免“名义上是深度学习、实际上图神经网络却只应用了两层”的尴尬。

解决之道分为两派:第一类是正则化技术(regularisation techniques),例如 DropEdge 方法,结点特征之间的成对距离归一化(PairNorm)或结点均值和方差归一化(NodeNorm);第二类是架构调整,包括各类残差连接,例如知识跳跃或仿射残差连接。

虽然这些方法可以训练出具有数十层深度图神经网络(这是一项壮举,并非不可能实现),但却没有产生令人满意的效果。更糟糕的是,使用深度结构体系通常会导致性能的倒退。下表显示了一个典型的实验评估结果,比较了node-wise分类任务上不同深度的图神经网络的表现。

 

可以看到,比较两个字符串的时候,首先比较两个字符串对象是否地址相同,不同再挨个比较字符。这样就大大加快了比较的速度。否则若每次都挨个比较将是非常耗时的。

7. 使用ThreadLocal造成内存泄漏

使用ThreadLocal时,每个线程只要处于存活状态就可保留对其ThreadLocal变量副本的隐式调用,且将保留其自己的副本。使用不当,就会引起内存泄漏。

一旦线程不再存在,该线程的threadLocal对象就应该被垃圾收集,而现在线程的创建都是使用线程池,线程池有线程重用的功能,因此线程就不会被垃圾回收器回收。所以使用到ThreadLocal来保留线程池中的线程的变量副本时,ThreadLocal没有显式地删除时,就会一直保留在内存中,不会被垃圾回收。

解决办法:不再使用ThreadLocal时,调用remove()方法,该方法删除了此变量的当前线程值。不要使用ThreadLocal.set(null),它只是查找与当前线程关联的Map并将键值中这个threadLocal对象所对应的值为null,并没有清除这个键值对。

最后


(编辑:常州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读