如何提取网络架构的先验知识?为它画幅素描吧!
五花八门的深度神经网络看似结构各不相同,其内在学习逻辑实则有迹可循。且看谷歌的研究人员如何通过「递归速写」方法提取知识、进行神经网络压缩,最终实现在未曾训练过的场景下的智能推理。
许多经典的机器学习方法专注于如何利用可获得的数据来做出更准确的预测。最近,研究者们也开始关注其他重要的目标,比如怎样设计一个小巧、高效又鲁棒的算法。在这些目标的驱动下,一个自然的研究课题就是设计一个基于神经网络的系统,该网络可以高效地存储其中编码的信息。换句话说,也就是设计一种概括复杂深度网络处理输入的方法的简单机制(像「速写」(sketch)一样)。「神经网络速写」是一个被广泛研究的领域,可以追溯到 Alon、Matias 和 Szegedy 的奠基性工作「The space complexity of approximating the frequency moments」。这项工作中,研究者们使得神经网络可以高效地概括输入的信息。
论文地址:http://www.math.tau.ac.il/~nogaa/PDFS/amsz4.pdf
举个例子,假设你进入了一个房间,大略地扫了一眼里面的物体。如果你要求现代机器学习算法回答一些它在训练时见过的问题,它可以立刻给出很好的答案:「这里有猫吗?如果有,它多大?」现在,假设我们在一年中每一天都会看一遍这个房间,人类可以回想起他们在这段时间观察房间的情景:「房间里有出现一只猫的频率如何?我们通常是在早上还是晚上看这个房间?」那么,我们是否可以设计一类系统,它们能高效地回答这类基于记忆的问题呢(即使它们在训练中没有出现过)?
在 ICML2019 上发表的文章「Recursive Sketches for Modular Deep Learning(https://arxiv.org/abs/1905.12730)中,我们探索了如何简洁地概括机器学习模型理解输入的方式。对于一个现有的(训练好的)机器学习模型,我们用其计算的「速写」增强它,并用这些「速写」来高效地回答基于记忆的问题——比如计算图像间的相似度,并总结一些统计数据(尽管事实上相比于将完整的原始计算过程存储下来,这些「速写」占用的内存要少得多)。
基础「速写」算法
总体上来说,一个「速写」算法接收输入一个向量 x,输出一个与 x 表现相似但是存储开销的小得多的「速写」向量。事实上这种小得多的存储开销让我们能够简洁地存储有关网络的信息,这在高效地回答基于记忆的问题时是至关重要的。在最简单的情况下,一个线性的「速写 向量」x 由矩阵和向量的乘积 *Ax *得到。其中 A 是一个「宽」矩阵,它的列数是 x 的原始维数,行数是新的降维后的向量维数。这种方法在大数据集的一些基本任务上衍生出了许多高效的算法(http://db.cs.berkeley.edu/cs286/papers/synopses-fntdb2012.pdf),比如估计基本统计量(例如,直方图、分位数、四分位数等),寻找高频项(frequenct elements),估计不同的元素的数量(support size),以及一些和范数、熵估计相关的任务。
将向量 x 乘上一个宽矩阵 A,得到一个低维向量 y,这是得到「速写」的一个简单的方法。这个基本的方法在一些像线性回归之类相对简单的情况中效果很好,在这种情况下,它仅仅通过权重的大小就可以识别重要的数据维度(在方差一致性的常见假设下)。然而,很多现代机器学习模型是基于高维嵌入(如 Word2Vec、Image Embeddings、Glove、DeepWalk、BERT 等)的深度神经网络,这使得概括模型对于输入的操作变得异常困难。但另一方面,这些复杂网络的很多部分都是模块化的,即使它们非常复杂,我们也可以对于它们的行为生成准确的「速写」。
神经网络的模块性
一个模块化的神经网络由数个独立的神经网络模块组成,它们只通过「将某个模块的输出作为另一个模块输入」这样的方式来传递信息。这种思想启发了许多实用架构的出现,比如 Neural Modular Networks、Capsule Neural Networks 和 PathNet。我们也可以拆分其它经典的神经网络架构,把它们看作模块化的网络,并应用我们的方法。比如,卷积神经网络(Convolutional Neural Networks,CNNs)通常被认为是以模块化的方式工作的,网络在低层检测出图像中基本的概念和属性,而在较高层检测更加复杂的物体。在这种观点下,各种卷积核就对应于各种模块。在下图中,我们给出了模块化网络一个形象的描述。
上图是用模块化神经网络进行图像处理过程的一个形象的图示。数据从底端经过蓝色方框代表的模块流向顶端。请注意,在较低层中,模块对应的是一些基本的元素(比如图像的边缘);而较高层的模块对应着更加复杂的物体(比如人或者猫)。我们还应该注意,在这个想象的模块化网络中,检测脸的模块的输出有足够的通用性,使它能够同时被检测人和检测猫的模块所利用。
「速写」的要求
为了针对这些模块化网络优化我们的方法,我们明确定义了几个网络「速写」应该满足的性质:
「速写」间的相似性:两个不相关的网络操作(无论从模块本身还是向量属性来说)的「速写」应当是非常不同的;同理,两个相似网络计算的「速写」应该很相像近。属性恢复:属性向量(即图中任何结点的激活函数值),都可以根据顶层「速写」大致恢复。概要统计量:如果有多个相似的物体,我们可以恢复出这些物体的概要统计量。比如,如果一张图像中有多只猫,那么我们可以数出有多少只。请注意,这些问题在训练中是不会出现的。可擦除性:擦除顶层「速写」的后缀仍可以保留以上特性(但会稍微增大误差)。网络恢复:给定足够多的(输入,「速写」)对,可以粗略地会付出网络边的连接方式以及「速写」函数。
上图是一个形象的「速写」间相似性的二维示意图。每个向量都表示了一个「速写」,相关的「速写」更倾向于聚集在一起。
「速写」机制
我们提出的「速写」机制可以应用在预训练好的模块化网络上。这种机制为网络的运算提供了一个顶层「速写」式的概括,同时满足了上面提到的那些性质。为了理解这种机制的工作方式,我们不妨考虑一个单层的网络。在这种情况下,我们保证某个特定结点预训练得到的所有信息可以被封装到两个不同的子空间去,其中一个对应着结点本身,另一个对应着和该节点相关的模块。通过恰当的投影,第一个子空间可以恢复该节点的属性,而第二个子空间可以快速地估计概要统计量。两个子空间强化了上面提到的「速写」间的相似性特性。我们说明了,只要涉及到的这些子空间是独立随机选取的,那么上述特性一定成立。
当然,如果想要将这种思想扩展到多于一层的网络上,还需要考虑更多的问题——这就引出了我们的「递归速写」(recursive sketching)机制。由于网络的递归性质,这些「速写」可以被「展开」,从而识别子组件,掌握更加复杂的网络结构。最后,我们使用针对该问题特别设计的字典学习(dictionary learning)算法来证明:只要有足够多的(输入,「速写」)对,那么我们就可以恢复出组成「速写」机制的随机选取的子空间和网络结构。
未来的研究方向
简洁地概括网络的操作似乎和模型可解释性有着密切的联系,所以进一步探究「速写」相关的思想能否被应用在模型可解释性领域是一个有趣的方向。我们的「速写」也可以被组织成一个「知识图谱」(knowledge graph),使模式可以被快速识别和检索。此外,我们的「速写」机制允许无缝地向「速写」库中添加新的模块,所以探究这种特性在神经网络架构搜索(architecture search)和网络拓扑演进中的应用也是一个有趣的想法。最后,「速写」可以认为是组织记忆中之前遇到信息的一种方式(例如,共享相同模块或属性的图像,它们的「速写」也会共享相同的子模块)。高屋建瓴地说,这和人类使用先验信息来识别物体并且泛化到未曾遇到的情境中的过程非常相似。