极市导读
本文以作者自身工作出发对深度学习中如何建模“全局信息”、“全局信息”如何改善了表示的质量、如何训练以优化算法作为网络结构的隐式模型等话题进行探讨。 >>加入极市CV技术交流群,走在计算机视觉的最前沿
本文以Hamburger (https://github.com/Gsunshine/Enjoy-Hamburger)为出发点,对深度学习中如何建模“全局信息”、“全局信息”如何改善了表示的质量、如何训练以优化算法作为网络结构的隐式模型等话题进行探讨。
Hamburger的原始论文 Is Attention Better Than Matrix Decomposition? 以top 3%的分数被ICLR 2021接收,作者信息如下:
论文链接:https://openreview.net/forum?id=1FvkSpWosOl
一、引言
作为深度学习的基础模块,注意力机制[1][2]在过去的5年中受到了极大的关注。它被认为是在神经网络中提供了全局信息建模。基于注意力机制的Transformer[3]在自然语言处理[4][5]和计算机视觉[6][7]中均取得了令人赞叹的实践成果。研究社区对设计更加高效和强大的注意力机制[8][9][10][11][12][13]充满兴趣,解释注意力机制[14][15][16]也成为一个值得研究的问题。
然而,注意力机制真的如我们预想的一样强大吗?它的有效性来源于哪里呢?我们对它的底层机制仍然所知甚少——研究者打出“Attention is not all you need.”的口号[17],直指纯粹的注意力机制并非像大家认为的那样强大,并将注意力机制与skip connection以及FFN协作视为更加重要的原因。
本文绕开了直接针对现有注意力机制进行结构设计和理论分析。我们假设注意力机制可能不是最优的,可能并不能本质地反映注意力的motivation。因而,我们试图为注意力提供一个“参考坐标”。这个“参考坐标”应当是基于第一性原理设计的,从建模全局信息的角度进行假设并推导得出的。当以实践作为准绳的时候,它至少应与注意力机制旗鼓相当。虽然它与注意力享有共同的motivation,但我们并不断言任何它与注意力的等价性或者借由它解释已有的注意力——只是在一面铜镜中,我们试图看见自己。
简言之,我们找到的“参考坐标”是矩阵分解模型及其优化算法。一个令人印象深刻的观察是,注意力机制并不比20多年前的矩阵分解更优——仅是性能相当,但后者的计算和内存开销更低。
在寻找这个坐标系的过程中,我们发展了一些直觉,用于形式化地刻画注意力机制的“全局信息”建模,进而导出了一种具有一般性的全局信息模块的设计策略。我们将建模全局信息抽象为低秩矩阵恢复的数学模型,将全局信息假设为低秩矩阵,并将求解该类问题的优化算法作为神经网络的结构。当我们解决棘手的梯度和优化问题之后,我们的策略可以设计一系列在实践中有效的模型作为注意力机制的“参考坐标”——汉堡模型,Hamburger。或取其英文谐音,称为憨憨模型,如其中文名的含义,简单且平凡。
简单且平凡的方法可以有强大的性能。轻量化的憨憨模型在注意力机制建模全局信息具有决定作用的语义分割及大规模图像生成中展现出优异的性能,在PASCAL VOC和PASCAL Context获得state-of-the-art的成绩,并在ImageNet规模的图像生成中表现出相对于注意力机制的优势。
汉堡美味,请君一尝。
二、回顾
我们首先回顾矩阵分解的和注意力机制的思想,然后介绍憨憨模型。我们希望在形式化的描述之外提供更多直觉,帮助读者理解我们方法的动机,以及作为“参考坐标”的意义。
1. 矩阵分解
如果把给定的数据按列组织为矩阵 。一个常见的假设是 的有效信息实际嵌入在一个低维子空间或者多个子空间的并中。进而, 我们考虑一个字典矩阵 和对应的编码 从而将 的生成过程和对应的分解描述为
其中 是矩阵分解复原的低秩矩阵, 是噪声矩阵。我们进一步可以假设恢 复的矩阵 是低秩的, 即
当我们针对 ,和 假设不同的结构或者先验信息时, 可以进一步推出不同的矩阵分解模型, 而这些矩阵分解模型也对应不同的求解算法。经典矩阵分解模型的应用包括图像去噪 、图像补全 等。
2. 注意力机制
一种概括性的说法[20][21]是,注意力机制旨在从海量的无意识语境中找到一组概念进行进一步的有意识推理。作为其代表,Transformer提出了使用自注意力机制学习机器翻译中的长程依赖关系:
其中, 是对输入进行线性变换得到的特征。自注意力机制通过一次性关注所 有token来提取全局信息, 而非典型的循环神经网络(RNN)中逐个处理token。
自Transformer正式提出以来,注意力机制在自然语言处理和计算机视觉中获得了广泛的使用。然而,我们对注意力机制有效的深层原因还所知甚少。一种常见的观点[3]是,注意力机制建模了表示中的全局信息,因此优于卷积神经网络和循环神经网络。
三、正文
诚然,注意力及其变体取得了巨大的成功,它给我们留下了这样两个问题:
-
开发基于注意力机制的新的全局信息模块,通常是借助辛苦的手工设计; -
从理论层面解释已有注意力机制的有效性。
本文的憨憨模型试图解决这两个问题吗?不,我们实际上是绕过了这两个问题。
本文试图从第一性的视角去重新审视注意力机制。换言之,我们试图借助“假设->建模->求解->验证”的路线,从建模全局信息的motivation出发,建立模型并求解,最后通过验证看看假设是否正确,背后的本质原因是什么。并且,根据Occam准则:“如无必要,勿增实体”,我们希望这一过程保持一定的简洁与抽象。
就像参加数学建模比赛,我们会有一些基础的假设,在这些假设之上,我们会建立一个数学模型。它可能是一组偏微分方程,也可能是一个概率图,或者最简单地就是一个某种形式的优化问题。当我们求解的时候,我们会直接求闭解,或者使用数值方法,如优化算法、仿真或者采样。这是依据某些规则推导得出的,而非直接依赖于手工设计的。
在本文中,我们延续这样的逻辑,试图建立一些抽象和假设,并基于此设计优化模型,使得这个问题的解可以描述注意力机制的motivation,从而进一步将求解这个优化问题的算法当做神经网络的结构——求解过程自然产生了一个计算图,我们将它理解为神经网络的结构。
这样的想法是简单且平凡的,但是在state-of-the-art的深度学习模型中却不是非常常见。当我们谈论深度学习的时候,经常使用的语境是“学习某种要素”。我们会把神经网络的反向传播看作是学习,也就是追求泛化的优化问题,但相当少把神经网络的前向推理看做优化(或者数值解)。我们会为前向推理设计一些规则,也就是网络的结构,以期通过反向传播和随机优化得到的网络,可以从数据中学到我们期望的某种“要素”,或者具有某种“特性”。也许实验可以做通,但是我们并不清楚是否是这种“要素”起了作用,可能另有玄机。
将这番论断切换到注意力机制的语境中。我们手工设计了一个可以在“全局”层面一次性联系所有token的模块:注意力机制。我们看到注意力机制获得了强大的性能,并且通过可视化观察注意力中存在一些合理的相关性。因而我们得出结论,注意力机制建模了全局信息,建模全局信息是合理的、有效的,有助于下游任务。
那么,
-
“全局信息”是什么? -
“全局信息”如何改善了表示的质量? -
什么是好的表示?
我们切换到“假设->建模->求解->验证”的逻辑,尝试回答第一个问题,并且对第二个问题作出一些猜测,以期启发第三个问题。我们将大部分叙述集中于第一个问题,包括本文的主要内容,在实验观察中对第二个问题作出一定猜测,并在最终的结论环节反思第三个问题。
针对表示中的“全局信息”,我们的假设是,“全局信息”应当是表示中低秩(low-rank)的部分。我们通过简单的分析来展示基于这个假设的建模,并且以受到ICLR reviewer点赞的例子进一步展示其insight。
以卷积神经网络为例进一步讨论。当我们输入图像后, 网络会输出一个张量 。由于张量可以看作是一组 个 维的超像素, 我们将张量展开为一个矩阵 。当模块学习长程依赖性或全局上下文时, 隐藏的假设是“全局信息” 描述的超像素是内在相关的。进一步进行简化, 我们假设超像素是线性相关的。这意味着 中的每个超像素都可以表示为一组基的线性组合, 基的个数通常远小于 。在理想的情况下, 表示 可以是低秩的 (lowrank) 。
低秩代表了这样的一种先验信息, 即low-level的表示包含的相当有限的high-level概念, 而且比表示本身的规模少得多。想象一下, 在一幅图像中, 一个人走在路上。由CNN提取的许多超像素将描述道路。而道路可以被认为是基本道路方格的重复, 这意味着我们可以通过建模道路方格并重复来表示超像素中的道路(就如同你正在玩Minecraft)。在数学上, 这相当于找到一组对应不同道路方格的字典 和一个描述道路方格和超像素之间的关系的系数矩阵 。当然, 抛弃 和 的具体物理含义, 而为它们假设一些数学结构, 亦是可取的。
描述道路方格的超像素具有接近的语义属性, 然而, 由于vanilla CNN对全局上下文的建模能力较差, 学习到的 通常会被噪声、冗余或者缺失 所破坏。想象一下, 图像中的人戴着手套。当我们盖住其他部分, 仅仅在局部看到手套时, 我们认为这块区域在描述手套。但当我们考虑全局背景时, 我们可以理解, 手套是一个人的一部分。语义信息是分层次的, 取决于我们希望在哪个层次上理解它。在这里, 我们把从“全局信息”层面理解的冗几余和不完整的信息, 进一步建模为残差项 。
这些分析提示我们, 建模”全局信息”可以将表示 分解为两部分, 即低秩的”全局信息” 和残差项 。我们将结构化的, 全局层面相关的信息假设为低秩的, 应当是相当直观的。但是直接作出低秩的假设, 并不能帮助我们建立模型, 因为表示中可能存在的低秩结构是难以穷举的。我们可以获得怎样的低秩结构作为“全局信息”,一方面取决于对低秩结构本身做的假设, 或者另一方面取决于我们对低秩结构以外的残差项做的假设, 即我们的数学模型。
进一步的,我们考虑将这个过程写成一个优化问题,通过优化算法求解干净的信号子空间,丢弃残差项,并使用这个求解算法的计算图作为本文提出方法的核心。基于已有的假设分析和对矩阵分解模型的回顾,我们将建模“全局信息”的目标函数写为:
其中, 表示重构误差, 可以通过残差项 的元素分布导出, 和 分别表示对字典矩阵 和系数矩阵 的正则化, 可以由其先验分布导出。将求解该目标函数的优化算法记为 , 我们将 作为本文提出的憨憨模型的核心结构, 即 。
最简单形式下的憨憨模型形似汉堡, 即由两个线性变换中间包含一个矩阵分解模型, 按顺序分别记为Lower Bread, Ham, Upper Bread,其中Ham对应求解矩阵分解模型的数值方法 。
这里有一个观察,使用“假设->建模->求解->验证”的逻辑天然为 提供了有效的抽象。从神经网络结构设计的角度看, 的设计应当是具象化的,case-by-case的。但这种过度的具象化带来了理论分析和拓展的困难,我们往往难以确定到底是何种因素起了作用。抽象将求解矩阵分解的数值方法看作一个整体,以便于我们理解,即使从结构设计的角度来看,数值优化算法是“复杂”的结构,如果没有具体目标的指引,本身是难以手工设计的。
抽象的另一个好处在于,我们可以采用实际上不同的物理模型来验证抽象的合理性。这些模型的细节各有差异,求解算法和导出的网络结构 也大相径庭,但是一般意义上,它们都满足低秩分解的假设。这服务于本文的底层逻辑,即对“全局信息”这样一种相当模糊的概念提供一种一般性的数学刻画,并使用不同的模型支持这样的假设。
在实际计算层面,我们提供了三种“口味”的汉堡,即分别使用矢量量化(VQ)[22]、概念分解(CD)[23]、非负矩阵分解(NMF)[24]来作为 的憨憨模型。注意,我们将简单带过对这些模型的介绍——正如前文强调的一样,我们希望读者将这些模型抽象为一个整体。这是因为,本文的主要贡献并非改进了矩阵分解模型——这在过去的10年中有相当充分的文献[25][26][27][28]探讨如何更好地基于可学习的优化策略求解这些模型。本文侧重于为建模“全局信息”提供了一种数学刻画,在这种刻画中矩阵分解作为一种自然的策略用于求解。
在选择这些矩阵分解模型的背后,一种考虑是选择尽可能简单的模型。为改进矩阵分解的求解引入可学习的优化算法固然可以获得进一步的增益,但这使得我们不能确定增益是来自于额外的参数与计算量还是建模与假设本身,从而导致与注意力机制的比较变得不公平,同时引入了额外分析可学习优化算法性质的需求。这种考虑本身是一把“奥卡姆剃刀”,迫使我们选择了这三个经过时间检验且建模和求解都足够简单的矩阵分解模型,在保持尽可能简洁的同时确保一般性。进一步地,我们将在下文看到,这类模型真正的阿喀琉斯之踵在于计算梯度与保持可微分的方式,其本质困难并非模型本身的优化问题的求解质量。
在这里,我们展示了VQ和NMF作为 ——它们几乎与笔者同龄。即使如此简单且轻量化,后文的实验将证实其足够与视觉注意力机制相媲美,这充分支持了本文的论断。
当我们设计好憨憨模型作为神经网络的一个构建模块之后,一个问题是,如何为矩阵分解计算反向传播的梯度,即保持其可微分,这是与神经网络进行协作的关键。
三、正文:One-Step Gradient
当我们设计好憨憨模型作为神经网络的一个构建模块之后,一个问题是,如何为矩阵分解计算反向传播的梯度,即保持其可微分,这是与神经网络进行协作的关键。一种直觉性的策略是将求解矩阵分解的优化算法看做一个RNN,应用延时间轴反向传播(BPTT)算法[1]。进一步地,我们也可以使用黑盒的方法,对矩阵分解进行抽象从而应用隐式微分(Implicit Differentiation)[2][3]。在求解算法收敛的情况下(迭代步数t趋近于无穷),这两种策略是等价的,空间复杂度和计算效率上各有优劣。然而事实是,标准的策略在优化上并不令人青睐,而且严重损害了憨憨模型的潜力。在接下来的部分,我们将建立一个抽象模型来分析BPTT算法和隐式微分的问题,并最终通向本文提出的解决策略,One-Step Gradient。
我们把求解矩阵分解的优化算法抽象为一个简单的不动点迭代模型, 即给定输入 , 迭代函数 将中间变量 迭代 次得到 , 并最终通过函数 输出预测 用于损失函数 。
注意, 这个模型与常见的RNN略有不同, 它每个时间步接受相同的输入, 只输出最终状态 , 所有中间变量都被丢弃了。常见的RNN模型往往是“横着”的,自左至右逐个词阅读句子, 输出对每个词的理解; 这里给定的抽象模型更像是一个”坚着”的RNN,把所有词一次性读入,反复阅读直到理解。这个抽象模型适用于优化算法和不动点迭代等数值方法, 也适用于隐式模型 。
在憨憨模型的场景中, 输入 是由backbone处理得到的一个张量; 如 , 中间变量 对应于矩阵分解的待优化变量, 如 和 是无参数的简单函数, 对应求解矩阵分解的优化算法, 是处理矩阵分解结果的后续网络。我们关注的是关于输入变量 的梯度, 以及关于初始状态 的梯度。如果迭代函数 本身含有参数也是无妨的, 将参数看做输入变量即可。这意味着, 我们的分析不单适用于憨憨模型, 对于一般意义的隐式模型也是适用的。
通过链式法则,我们可以直接计算BPTT定义的雅克比矩阵:
进一步地, 通过假设 和 满足Lipschitz连续, 并记 关于输入 的Lipschitz常数为 , 关于状态变量 的Lipschitz常数为 的Lipschitz常数为 , 且 , 我们保证了对于任意输入 时有唯一与之对应收敛点 。此时, 由BPTT计算的梯度将有无穷多项求和, 而通过隐函数定理“算两次”, 我们可以知道BPTT算法与隐式微分等价。我们会有如下的观察:
这些观察提示了对于一个有收敛趋势的迭代过程进行标准的反向传播或隐式微分的数值特征。Prop. 1解释了迭代过程本身的收敛性质,对应到抽象模型的现实场景,即优化算法或者不动点迭代。Prop. 2基于隐函数定理给出了“算两次”的结果,即BPTT与隐式微分在此时是等价的。Prop. 3则解释了最终输出关于迭代的初始值 和输入变量 的雅克比矩阵的存在的梯度消失和梯度爆炸。
我们从Scale和Spectrum两个层次讨论雅克比矩阵存在的问题。
首先是Scale, 这里存在一个有趣的trade off。当 , 意味着在阶不变的情况下, 实际更快地收剑。这时, 对于初始化变量 的梯度消失会变严重, 对于输入变量 的梯度爆炸会减轻。相反, 时, 实际收敛需要更多的迭代步数, 此时, 对初始化变量 的梯度消失会减轻, 但对于输入变量 的梯度爆炸会变严重。这意味着, 在BPTT和隐式微分的框架内, 同时学习一个有收敛趋势的迭代算法的初始化参数和输入变量存在着不可调和的矛盾。
这两者对应着两种有实际意义的需求。前者对应针对非凸问题的优化算法的初始值, 初始值对于很多算法有相当可观的影响。对于攸散模型而言, 这断言通过反向传播学习矩阵分解的初始值 和 , 或者某个将输入变量映射为矩阵分解初始化的函数, 是不可行的。后者输入变量 则更为灵 型的梯度来训练backbone将出现梯度爆炸), 而对于隐式模型而言, 更常见的是 本身的参数。
在这两种需求里面,计算关于输入变量 的雅克比矩阵是一个更为重要的需求。因为对于憨憨模型中的优化算法而言,如求解NMF的MU rule,我们可以随机采样初始化,从而绕开学习 和 的初始值,但训练backbone的梯度则是一个无法绕开的需求。因此我们进一步观察最终输出 关于输入变量 的雅克比矩阵。
遗憾的是, 从Prop. 2中不难观察到, 由BPTT或隐式微分计算的雅克比矩阵 很可能是illconditioned的, 这从Spectrum层面上揭示了第二个问题。如果假设 可对角化, 再考虑高维矩阵特征值的经验分布, 往往是大量的集中在 0 附近的小特征值和少量偏离0的较大特征值 (考虑随机矩阵的Semicircle Law,或考虑数据分布的低维流形假设),当 含有趋近于1的特征值时候, 就不难看出Prop. 2中的 将会变得ill-conditioned。
这是一个超出Scale的问题,并不是通过截断梯度中过大的值或者进行缩放就可以解决的。可以类比的是当优化问题的Hessian矩阵变得ill-conditioned时,由BPTT和隐式微分计算的雅克比矩阵限制了优化算法在参数空间中搜索泛化较好的解的能力。因此观察到的情况往往是较为严重的泛化能力下降(Generalization Deterioration),即使作为优化部分的训练损失是正常的。
一个非常有趣的事情是,MoCo v3[4]针对训练ViT[5]给出了相似的经验观察,即不易观察到的训练不稳定和泛化损失,并且随着远离监督信号和靠近初始层而更加严重(类比于 )。即使从客观层面考虑,ViT基于注意力机制,而憨憨模型考虑的是使用矩阵分解建模全局信息,两者确实有相当大的差异,但如果进一步想到注意力机制与优化算法的微妙联系[6],不禁让人思考Transformer的雅可比矩阵是否也存在特征值谱上的ill-conditioned或者雅可比矩阵连乘后的Spectrum/Rank Collapse的问题,以及梯度数值上的长尾分布。这种反思,正是本文的出发点之一,即并非直接理解注意力机制,而是通过数学建模注意力机制的motivation,它提供了一种抽象,就像一面镜子,使得我们在镜子中看到自己。
现在我们对BPTT或者隐式微分计算的雅克比矩阵的问题有了一个较为清晰的认识,但是这种困境是如何产生的呢?笔者给出一种逻辑:
我们通过BPTT或者隐式微分计算雅克比矩阵,是一种手段,而非目的。只是因为我们在完全的端到端的框架下理解这个问题,想办法计算出梯度(如通过隐式微分将实际不可计算的无穷多项的BPTT变得可以计算),后面就可以交给我们的深度学习框架和优化器,从而把优化问题转化为如何计算梯度的问题,看上去是简化了这个问题。但是,我们的实际目标是找到泛化更好的优化策略,而不是如何从数值上计算一个真实的、误差更小的梯度(即隐式微分)。从这个角度来看,手段有问题,替换手段,服务于优化的最终目的即可。
因此在优化憨憨模型时, 我们实际采用的是One-Step Gradient, 一种forward和backward”解耦合”的策略。我们在分析BPTT和隐式微分存在的问题的时候, 已经清晰地看到了, 导致梯度爆炸和 ill-conditioned的原因是, BPTT的无穷多项求和 及其收敛到的隐式微分中的 。考虑到 的中的项的scale是指数衰减的,我们考虑将其截断到有限项。更极端的情况是, 仅保留其第一项, 也就是用 替换了 , 从而有One-Step Gradient:
显然, 完全不含有 的One-Step Gradient避免了BPTT中的求和和隐式微分中的求逆带来的诸多不利。实际中, 对于训练隐式模型而言, 采用多项的Neumann级数更为实用 (可以考虑steps ), 但是对于优化算法驱动的憨憨模型而言, One-Step Gradient是一个相当preferable的选择, 因为真实场景下优化算法可能是不满足上文抽象模型的假设的, 存在 的情况。尤其是当优化算法中含有 softmax 函数时, 即使拓展为steps为2的情况, 也可能损害其性能。
在这里,我们仅将One-Step Gradient声称为一种practical solution,而不是principle或者final solution。事实上,这个问题相当有趣,真实场景和理论分析之间存在一些微妙的差异。笔者将在后续的工作中分享更为细致的探讨。
另一方面,为One-Step Gradient提供理论保证并不困难,证明One-Step Gradient与BPTT和隐式微分计算的gradient的夹角小于90度即可,这保证其在优化上可用。但理解One-Step Gradient在改进泛化上的影响,需要更为深入的工作。值得注意的是,本文针对憨憨模型提出的One-Step Gradient是一种一般的策略,亦可以用于隐式模型的优化,这被最近的工作[7]所验证。
针对One-Step Gradient,我们希望在技术细节以外提供更多视角。有一句话在上文提及,但并未详细展开,即One-Step Gradient是一种forward和backward“解耦合”的策略。在这里,我们为读者提供更多细节。
不论显式模型,或者经典的隐式模型,其forward和backward都构成了某种意义下对称的镜像,如显式模型forward和backward都产生了一个layer by layer的计算图;而隐式模型中,Neural ODE[8]的forward和backward由两个相关的ODE构成(伴随方程,adjoint equation),DEQ[3]的forward和backward则都由解方程构成(隐式微分,implicit differentiation)。如果实际检查过forward和backward的实现,这种感觉将会更为强烈。
然而,One-Step Gradient实际上打破了这种对称性,实现了所谓“解耦合”。“解耦合”的意思是,我们可以把用于数值上计算输出的计算图和用于计算梯度的计算图相互分离,并不沿着计算输出的计算图反向传播计算梯度,而是在获得输出以后,定义另一个用于计算梯度的计算图,这个计算图实际上不改变输出的数值,但定义了可用的梯度。与DEQ中使用两个隐式模型解方程计算输出和梯度不同,One-Step Gradient给出的“解耦合”策略是使用隐式模型计算输出,在获得输出以后,将隐式模型当做显式函数运行forward用于计算梯度——将隐式微分替换为显式函数,将会获得相当大的时间节约,同时相比于BPTT则还有进一步的空间节约。
在憨憨模型中,One-Step Gradient可以用pytorch描述为:
with torch.no_grad():
h_star = find(h = F(h, x))
with torch.enable_grad():
for _ in range(steps):
h_star = F(h_star, x)
return h_star
其中,在憨憨模型中find表示使用优化算法求解 ,在隐式模型中则对应解方程或不动点迭代,steps表示Neumann级数的项数,对于憨憨模型而言为1,对于隐式模型而言,可以使用更多的steps。
使用后文的图像分割的消融分析的设置,基于三种不同的矩阵分解模型及其优化算法,本文验证了One-Step Gradient的通用性,以及其相对于BPTT算法和隐式微分(两者等价,隐式微分因为数值求解引入了额外的误差)的优越性。
One-Step Gradient将BPTT 的空间时间复杂度和隐式微分 的时间复杂度, 降为了 的空间时间复杂度——既不用像BPTT一样存储额外的中间变量用于反向传播, 也免去了隐式微分解方程求解梯度的额外时间开销和复杂代码实现, One-Step Gradient以简单的形式获得了可观的性能提升。
注意,不使用憨憨模型的baseline性能约在75.5~76%之间,这意味着,如果使用BPTT进行优化,几乎无法获得性能增益。然而,这并非是由于不当的假设或者错误的建模,而是因为建立的数学模型和与之进行协作的神经网络未能得到良好的训练。换言之,在矩阵分解以外,应当有相当数量的模型因为直接进行反向传播的性质不良好的而在一定尝试后,被迫接受在深度学习中坐冷板凳的命运——至少在常言道的监督学习的设置下。
对此,笔者的感叹是:
The devil is in the gradient.
当我们在深度中谈论模型A优于模型B的时候,这并不意味着,模型A的建模在合理程度上一定优于模型B。一个容易被忽略的前提是,在某种优化策略下,模型A实现了相对于模型B的优势。目标函数、优化算法、梯度的形式(如果是一阶方法),甚至数据集本身都可以形成这种bias。如同NLP中,SGD下的Transformer并不是一个优秀的模型,也如同BPTT和隐式微分下的憨憨模型并不是一个优秀的模型——这并不妨碍我们找到合适的优化策略从而使用它们。
某种意义上,我们的思维容易被现有的优化器和端到端的框架所绑架——它们形成了一种具有选择压力的优化环境,结构设计实际上在适应优化环境的选择压力。在这里,憨憨模型所尝试的就是“松绑”。
四、实验
实验部分分为消融实验,性能实验,开销对比和探究实验四部分。我们在本篇展示前三部分的结果,以支持憨憨模型在建模全局信息上的优越性。实验选择视觉中注意力机制建模全局信息较为经典的语义分割和图像生成任务,将注意力机制常用的位置替换为憨憨模型进行试验,更多细节可见正式论文。
1. 消融实验
即使仅使用跳接添加矩阵分解,即上图的“only ham”,并使用One-Step Gradient进行反向传播,在不使用任何参数的情况下也足以在语义分割上获得可见的提升。同时,Upper Bread的参数化贡献了相当的性能,因此,在公开代码中提供的V2版本额外在矩阵分解(Ham)和Upper Bread之间增加了Cheese (1*1 Conv -> BN -> ReLU),从而获得更高的性能。对于Upper Bread的重要性,我们在下篇中有进一步的论证和分析。
2. 性能实验
憨憨模型选择在语义分割和图像生成中进行性能实验。语义分割作为视觉注意力机制的“练兵场”,涌现了相当多有代表性的探究注意力机制和建模全局信息的工作[9][10]。而图像生成也是早期视觉注意力机制在建模全局信息上率先获得突破的领域[11]。我们用 ∗ 标记了基于注意力机制和全局信息模块的模型,可见憨憨模型在PASCAL VOC 2012和PASCAL Context上建立了state-of-the-art的性能,同时在ImageNet尺度的大规模图像生成中展现出优势。
3. 和注意力机制比较
给定输入 ,下表展示了憨憨相对于计算机视觉中经典的attention module和context module的计算开销对比。
注意,即使将NMF的字典尺寸削减到 ,以消融实验设置训练的性能仍有77.8%(77.2%)+,相比常用设置的78.3%(77.8%)只有部分降低,而此时的矩阵分解带来的计算开销相对于憨憨模型几乎是可以忽略不计的(0.25G / 8.84G ~ 3%)。
五、对憨憨模型的进一步观察
在上篇中,我们给出了三个问题:
-
“全局信息”是什么? -
“全局信息”如何改善了表示的质量? -
什么是好的表示?
前文使用分解与低秩建模“全局信息”的讨论较为系统地回答了第一个问题,但是对于2和3的答案仍然是未知的。在这里,我们试图通过实验对第二个问题作出一定的猜测。
我们分别将憨憨模型的输入(Before)和输出(After)张量,展开为 的矩阵,并在整个数据集(PASCAL VOC 2012)上计算了其前rrr 大的奇异值的平方和占所有奇异值的比重,记为累积比例,画出两条平均曲线如下:
累计比率
同时可视化憨憨模型前后的通道(Channel)图像:
通道可视化
我们能观察到的是,Hamburger使得累计比率更高了(improves the concentration of Spectrum),使得一个相对均匀的谱(Spectrum)变得不平衡,将由大到小排列的奇异值的衰减速度加快,这意味着前r个维度集中了更高的信息量,抑制了不重要的细节信息。这是个非常有趣的现象,因为这某种程度上反映了数据集和任务的偏好。对于语义分割而言,最终输出本身就要求这种近似低秩的特点——将 个超像素分到 个小类中。这是感知(Perception)的特点,即将复杂的观察抽象为简单的概念,而概念本身在数量上往往是少于观察的像素数的。
这很自然地启发了三个问题:
第一,是否存在情况,需要我们降低累计比率(reduce the concentration of Spectrum),将一个快速衰减的谱的结构变得更为平均?
答案是肯定的,与high-level的感知(Perception)相反,需要细节的任务,如low-level vision,可能需要充分利用谱尾巴上的信息恢复这部分细节,这一论断在TESA[1]的实验中得到进一步支持。对于憨憨模型而言,这相当于在改进谱的聚集时学习一个“加法”映射,通过跳接强化“全局信息”;相反则学习一个“减法”映射,通过跳接抑制“全局信息”——这实际上也支持了skip connection和Upper Bread的重要性。
第二,“全局信息”如何改善了表示的质量?
注意,我们使用低秩性和分解来建模“全局信息”,并不代表好的表示一定是低秩的。因为如果没有skip connection,那么一次应用矩阵分解就足以实现低秩,但低秩的多次堆叠并不会产生更多的效果,相反容易产生Rank Collapse,这对应于去除跳接后单纯堆叠自注意力的分析[2]。当退化为秩1的情况时,有效的信息会严重丢失,这与图神经网络中的过度平滑(over-smoothing)是类似的,平滑本身也是扩散(Diffusion)的特性。
那么,“全局信息”如何改善了表示的质量呢?
笔者的猜测是,“全局信息”通过rescale spectrum改善了表示的质量。
如果对于每个输入都存在某个最优的谱结构,网络通过多次变换实现特征空间的旋转以及谱的缩放,从而达到这一结构,那么所谓的“全局信息”模块,可能正是能够强力调整谱结构的操作。(一个问题是,如何从数学上定义“强力”?)
-
那么,能够实现强力rescale spectrum的操作都可以用来设计类比于attention的“全局信息”模块吗,包括但不限于…?(在处理好gradient的前提下,答案基本是肯定的) -
如果在特定任务下给定有限的budget,是否存在最优的调整操作,将输入的谱的分布转化为目标谱的分布,从而对应于网络结构的设计?(总让人想起optimal transport) -
如果在Transformer中,我们将注意力块理解为憨憨模型,那么skip connection和有相当宽隐层的FFN是否可以理解为一种“拮抗”的作用,从而保持谱以相对缓和的方式向目标结构演化?
笔者的一种直觉是,借助低秩假设(low-rankness)和分解(decomposition)实现“全局信息”建模的憨憨模型,更像是一剂猛药——它能够相当强力地干预谱的结构。对于需要对谱的结构进行较大变动的任务和数据集,以憨憨模型取得极大性能优势的PASCAL VOC 2012 Semantic Segmentation为例,数据集中的图片内容复杂,经常需要把大量的像素划分为同一类,且图片中的类别相对较少(单张图像素的类别数一般小于5),这时候一剂猛药再合适不过。
但是目前版本的憨憨模型,在Rescale Spectrum上并非非常精确,考虑到我们使用了20年前手工设计的矩阵分解模型,且受到矩阵分解本身及其优化算法的超参数的影响,同时skip connection和Upper Bread并非是复杂的融合策略。对于需要精细调整谱的需求,一种直觉是所谓提取“局部信息”的操作,目前憨憨模型的大刀阔斧可能并不是最优的选项——注意,这并不意味着不能通过恰当的设计实现它,关键在于对症下药,只有充分理解目的,才能寻找合适的手段。
(很惭愧在没有理论和实验支持的情况下谈论如此多“猜测”和“直觉”。本着科学的态度,这些分析可能并不正确,欢迎读者的批判和指正。去芜存菁是科学的使命,笔者致力于将这些猜测中合理的部分,通过理论和实验变为科学。)
第三,使用憨憨模型建模“全局信息”,到底是低秩性真正有效,还是分解真正有效?
这个问题相当tricky, 因为如果我们的最终目的是Rescale Spectrum来实现”全局信息”改善表示质量, 比如提升谱的聚集, 那么我们的手段可以是保留分解中低秩的部分 并且学习一个”加法”映射作为融合, 也可以选择保留分解中一般认为是噪声矩阵的部分 并且学习一个”减法”映射后者被笔者好友的工作 支持。
类比于憨憨模型, 这意味着使用 作为Upper Bread的输入( 为憨憨模型的输入)。注意, 这并不意味着直接使用 , 因为如果以Frobenius范数来计算重构误差, 在 增大的时候重构误差会以一种相当均匀的方式变小, 即 的scale会非常小, 这不利于后续Upper Bread 的处理。基于PCT的pipeline, 采用这种形式的攸悠模型足以在点云分类的ModelNet40上取得 93.3%+的state-of-the-art的性能。可见, 当我们对于目的有了更充分理解以后, 选择手段就有了更多灵活性。
从这个视角来看, 真正有效的是分解。通过对生成过程进行更为细致的假设, 我们可以通过分解来实现结构化信息的刻画, 不管是“全局信息”, 亦或是“局部信息”。而能够实现分解, 是因为我们对于生成过程进行了假设, 比如我们假设分解结果 为低秩的, 并对噪声类型 进行建模。因此, 即使并末使用低秩的 而是 , 也并不能否定低秩性的建模是不正确的一我们能这样做是因为我们部分理解了建模”全局信息”的目的。
另一个例子则是经典矩阵分解模型 的应用, 我们将矩阵 分解为低秩 和稀疏 两个部分。稀疏部分 一般可以被认为是不规律的野点噪声, 但在用于前景背景分离的情况下, 也可以认为是有实际物理含义的特征。考虑背景为规律排布的窗户, 前景为不规律的树叶遮挡, 此时分解的结果 即为窗户, 而 是作为前景的树叶, 并非是完全无规律的噪声。因此, 在合理假设下的分解为深度网络提供了强有力的先验, 而如何使用将是一个见仁见智的话题。
六、结论
表示学习无法绕开的问题是:什么是好的表示。这是一个相当系统和复杂的问题。本文以憨憨模型为例,从多个视角理解如何建模“全局信息”,“全局信息”如何改善了表示的质量。本文提出的One-Step Gradient改善了优化驱动的憨憨模型的训练,并且提示了其作为隐式模型的训练策略。
围观近日视觉领域的MLP打架,笔者不禁想到18年的BagNet[5],对于当下的“套娃”比赛还是感慨良多:
当我们能够看到问题的全貌的时候,尤其当我们有理论可以对有效策略进行抽象概括的时候,也许就不会出现“套娃”了。因为完全有可能模型A和模型B都满足理论抽象的要求,因此存在可行的解使得他们获得可比的性能——差异可能只是是否易于优化,或者说如何设计可行的优化策略找到这样的解,以及实践中模型的计算开销。
诚然,本文距离彻底从理论角度理解如何建模“全局信息”,“全局信息”如何改善了表示的质量等问题还很遥远。但是,憨憨模型已经向着理论上理解这个问题迈出了第一步:本文对于刻画“全局信息”建立了成功的数学抽象——它表现为能够预言有效的模型族,并且满足这种抽象的数学模型都可以work,也就是不同的低秩先验/矩阵分解模型都在建模“全局信息”中展现出有效性。这是合格的理论框架应当具备的特点,即能够指导实践,并预言实践中尚未发现的宝藏。
同时,对于“全局信息”如何改善了表示质量的探索,则跳出低秩假设和单纯建模“全局信息”的视角,从更一般的角度反思我们应该构建何种框架来描述这个问题——建模“全局信息”只是一种手段,最终的目的是使用“全局信息”改善表示的质量。因此,也许我们并不需要显式的获得“全局信息”,也可以基于它改善神经网络学习的表示?服务于这个目的,如Rescale Spectrum,则我们可以更为灵活的选取手段。笔者相信,这些讨论对于建立更一般的理论框架和更有效的实践模型应当是有启发的,需要做的是针对讨论中涌现的直觉建立精确且严密的数学刻画。
而憨憨模型的优化探索及One-Step Gradient则是在沙滩上拾取的珍珠——偶然且宝贵。它建立了憨憨模型与隐式模型的联系,并且成功作为隐式模型的一种快速且有效的训练策略。笔者的一项工作正致力于深入挖掘这背后有趣的故事。
总的来说,憨憨模型自18年底有初步想法,19年底完工,到21年初被ICLR接受,走过了一段漫长且崎岖的路——这里面的想法有比较多的层次和相对细密的逻辑,不易被写作呈现清楚。因此,在最终收到ICLR reviewer ”interesting, novel and impactful”的评价时,那种简单的快乐确实是发自内心的,感到为此花费的时间和努力是值得的。一个衷心的希望是,在很多年后回看憨憨模型的时候,可以评价它是在恰当的时间做了有趣的探索,能够为建立理论框架铺路。
诚挚感谢阅读至最后的读者。
Enjoy Hamburger, please!
参考
公众号后台回复“数据集”获取100+深度学习各方向资源整理
极市干货
点击阅读原文进入CV社区
收获更多技术干货