加载中...请稍后..

金准数据 关于张量方法加速深度神经网络模型的研究报告

发布日期:
2018-06-09
浏览量:
74873

前言

现代的机器学习涵盖了大量的数据以及变量,构成了高维数据问题。张量方法在处理这种高维数据的机器学习方法中十分有效,而且已经应用到诸如社交网络分析、文档分类、基因学的诸多领域中,未来还会涉猎“对人脑神经元行为理解”这一问题。

 

用张量进行概率隐含变量的机器学习训练

当多个设备或者传感器在收集数据的时候,我们能不能设计出有效率的通信和路由机制,使得在“网络内部”已经开始数据整合,减少传输的数据量,同时又能为处理特定问题(比如工作状态异常)提供信息?金准数据从统计角度进行了该类问题的调研,整合了一些概率图模型,设计了一些显著减少数据通信需求的算法。

现代的机器学习问题经常发生于高维世界,在时间轴上产生了大量的多元数据,这其中也包含了很多数据噪声。从噪声里发现有用的信息有时就像大海捞针,是极具挑战性的。

工作的第一个步骤就是对隐藏信息和观测数据之间的关系进行建模。在一个推荐系统中,隐藏的信息就是用户对于商品的潜在兴趣,而观测数据包含了他们已经购买的商品。如果某个用户近期购买了自行车,说明她对骑车/户外运动感兴趣,而且很可能会在近期购买自行车配件。我们能够通过她的购买模式推断出隐含变量,从而对她的兴趣进行建模。然而问题在于,我们需要从大量用户的行为中获得大量购物模式的观测数据,于是这就变成了一个大数据问题。


图1:亚马逊推荐系统会告诉你推荐原因


现在的工作着力于如何高效地在大数据集上有效训练这种隐含变量模型。在这种无监督学习的方法中,算法能够自动发现潜在的、对解释观测数据有意义的变量。大体上而言,机器学习研究者们都同意这种算法能够解决本领域中一类悬而未决的挑战。

金准数据认为,一种新颖的算法能够去处理这个挑战性的难题,并展示了在没有监督数据的情况下,张量代数如何能够发现隐藏的结构性规律。张量是矩阵的高维推广。就像矩阵能够展示事物的两两关系一样,张量能够表现更高阶的关系(后面关于这一点会详述)。金准数据研究发现,对高阶张量进行操作可以有效地进行一大类概率隐含变量的机器学习训练。


图2:张量方法是矩阵方法的扩展

这些张量算法如何真正帮助我们解决机器学习问题呢?第一眼看过去,我们可能会认为张量跟这些机器学习任务没什么关系。把这二者联系起来需要一个额外的概念,就是“高阶关系”(或者高阶矩)。正如之前提到的,我们能够用张量表征变量之间的高阶矩关系。通过考察这些关系,我们对隐含变量模型就能进行更有效的训练。


张量算法应用场景

我们把算法应用于很多场景上。比如,在不知道主题先验分布的情况下,对文本文档进行分类。在这个场景下,主题本身就构成了一组隐含变量,必须把它们从观测数据中提炼出来。一种可能的解决方式可能会是“从词频里训练出主题”,但这种简单的处理方式无法合理解决“在不同上下文中出现同一个单词”的问题(注:语义消除歧义问题)。

考虑一下,如果我们不考虑单个词的词频而考虑“二元词组”的出现频率,将会导致一个更稳健的结果。但是我们为什么要止步于“二元词组”?我们为什么不检查一下“三元词组”乃至“多元词组”这种高维问题呢?这些高维关系又能揭示出哪些有意义的信息呢?金准数据认为,使用流行的潜变量狄利克雷分配(Latent Dirichlet Allocation,LDA)算法需要三元关系,仅有二元关系是不够的。

图3:社交网络

我们可以更进一步的扩展隐含变量模型的概念。这种方法更适合应用于一类问题,包括“对种族进化树的建模”,或者“理解人类疾病产生的层级结构”。在这里的例子中,我们的目标是通过给定的数据,学习出隐含变量的层级结构,训练出能够量化隐含变量影响的一组参数。

最终学习出来的的结构,揭示了位于叶子节点上的观测变量的层次聚类结果,以及量化的聚类强度参数。然后我们把问题简化为“找到某种层级性的张量分解”,针对这个问题我们已经构造出有效的算法了。


场景应用中张量的重要性

金准数据认为,这些张量算法绝不仅仅是理论上的研究兴趣,而是具有可信的证据的,它们不仅能够对算法进行加速,还能提高计算结果的精度。Rutgers大学的Kevin Chen在最近的NIPS工坊中进行了一次非常有说服力的演讲,其内容是关于在基因组学中张量算法的优越性:这种算法能够提供更好的生物学解释,相对于传统的期望-最大化算法(Expectation-Maximization,EM算法)而言,产生了100倍的计算加速。张量方法是如此有效,就是因为他们的算法利用已经高度优化过的线性代数计算库,跑在了时下流行的大规模计算集群上。总而言之,张量方法现在具备出人意料的可并行性,因此易于在异构硬件平台上进行大规模训练。

 

图4:Spark是一种基于内存的分布式机器学习工具



 

图5:LDA是一种自然语言处理(NLP)常见的算法


以上的直觉能够应用在更广泛的领域。就拿网络来说吧。你可能希望通过观察个体之间的互动来发现潜在的群体,像“社交网络中的朋友关系”,“推荐系统中的购买行为”,以及“大脑内神经元之间的彼此连接”都是一些直接的例子。金准数据相关研究揭示了“研究朋友的朋友”或者类似的高阶关系对于社群发现的必要性。尽管这些函数之前已经被广泛地研究过了,但是我们开创性地展现了这种关系所蕴含的信息量,以及如何提高计算这些指标的效率。

张量对一类更丰富的数据进行建模,使我们能够掌控“多元关系”的数据。这些数据同时具有空间特性和时间特性。张量中的不同方向表示着不同类型的数据。

 

图6:张量类似矩阵,是可分解的


张量能够用比矩阵更丰富的代数结构来对信息进行编码,这就是它的核心所在。如前文所述,考虑一个通过行和列来表达的矩阵——或者叫二维数组。张量把这个概念延拓到了高维数组。

一个矩阵的意义远比“仅仅是行和列”要多。你可以通过线性操作对矩阵进行重塑,这就是我们常说的“线性代数”。张量建立在一种更具有延展性的形式上,因此操作它们的学问也被扩展了,术语上叫做“多线性代数”。

在拥有这种有效的数学结构之后,我们如何压缩它们以获取信息?我们能够对张量操作算法进行设计和分析吗?为了解决这些问题,我们需要一组关于解决“非凸优化问题”的证明技巧。


基于低秩张量分解方法

基于低秩的张量分解方法,用于在现有的深度学习模型中进行分层并能使其更紧凑。加上裁剪(pruning),张量分解是加快现有深度神经网络的实用工具。

裁剪(pruning)技术能够减少模型中的参数数量。在一个数据集上正向传递(有时是反向传递)裁剪(pruning),然后根据网络中激活的一些标准对神经元进行排序。

完全不同的是,张量分解的办法只用到层的权重,假设网络层是参数化的,它的权重能够用一个矩阵或者是一个低秩的张量来表示。这意味这个它们在参数化的网络下效果最佳。像VGG神经网络设计为完全参数化的。另外一个关于参数化模型的例子是使用更少的类别对网络进行微调以实现更简单的任务。和裁剪(pruning)相似,分解之后通过模型需要微调来恢复准确性。

在我们会深入讨论细节之前,最后一件要说明的事是,虽然这些方法是实用的,并给出了很好的结果,但它们有一些缺点:

它们能够在一个线性权重上执行(比如一个卷积或者一个全连接的层),忽略了任何非线性的内容;它们是贪婪,自认为聪明地分解层,忽略了不同层之间的相互作用;目前还要试图解决这些问题,而且它仍然是一个活跃的研究领域。


1. 截断SVD用于分解完全连接的层

SVD概况

奇异值分解使我们能够分解任何具有n行和m列的矩阵A,S是一个对角矩阵,其对角线上有非负值(奇异值),并且通常被构造成奇异值按降序排列的,U和V是正交矩阵。如果我们取最大的奇异值并将其余的归零,我们得到A的近似值。具有作为Frobenius范数最接近于A的秩t矩阵的性质,所以如果t足够大,是A的良好近似。

 

在全连接层上的SVD

一个全连接层通常是做了矩阵乘法,输入一个矩阵A然后增加一个偏差b,我们可以取A的SVD,只保留第一个奇异值,这不是一个完全连接的层,而是指导我们如何实现它作为两个较小的:第一个将有一个mxt的形状,将没有偏差,其权重将取自第二个将有一个txn的形状,将有一个等于b的偏差,其权重将取自。权重总数从nxm下降到t(n + m)。

 

在卷积层上张量分解

二维卷积层是一个多维矩阵(后面用-张量),有四个维度:

cols x rows x input_channels x output_channels.

遵循SVD的例子,我们想要以某种方式将张量分解成几个更小的张量。卷积层转换为几个较小近似的卷积层。为此,我们将使用两种流行的(至少在Tensor算法的世界中)张量分解:CP分解和Tucker分解(也称为高阶SVD或其他名称)。

 

2. 1412.6553 使用微调CP分解加速卷积神经网络

如果CP分解能够用于卷积层的加速,正如我们会看到的,这将卷积层纳入类似移动网络的东西。他们使用它来加速网络的速度,而不会明显降低精度。在实验中,这个在基于VGG16的网络上获得x2加速,而不会降低准确度。使用这种方法需要非常仔细地选择学习率,微调以使其工作,学习率通常应该非常小(大约)。

一个秩R矩阵可以被视为R秩和1矩阵的和,每个秩1矩阵是一个列向量乘以一个行向量,SVD为我们提供了使用SVD中的U和V列来写矩阵和的方法,如果我们选择一个小于矩阵满秩的R,那么这个和就是一个近似值,就像截断SVD的情况一样。CP分解让我们推广了张量。使用CP分解,我们的卷积核,一个四维张量公式,可以近似为一个选定的R,我们希望R对于有效的分解是小的,但是对保持近似高精度是足够大的。

 

带CP分解的卷积正向传递

为了传递图层,我们使用输入进行卷积,这给了我们一个办法来解决这个问题:

首先做一个wise(1x1xS)与卷积。这减少了从S到R输入通道的数量。下一步将在较少数量的通道上完成卷积,使其更快。

其次,用在空间维度上执行分离的卷积。就像在移动网络中一样,卷积是深度可分的,分别在每个通道中完成。与mobilenets不同,卷积在空间维度上也是可分的

再次,做另一个逐点卷积来改变从R到T的通道数量如果原始卷积层有一个偏差,在这一点上加上它。

注意像在移动网中的逐点和深度卷积的组合。在使用mobilenets的时候,你必须从头开始训练一个网络来获得这个结构,在这里我们可以把现有的图层分解成这种形式。与移动网络一样,为了获得最快的速度,需要一个有效实现深度可分离卷积的平台。

用PyTorch和Tensorly卷积层CP分解

图7:用PyTorch和Tensorly卷积层CP分解

 

3. 1511.06530 用于快速和低功率移动应用的深度卷积神经网络的压缩

Tucker分解也称为高阶奇异值分解(HOSVD)或者其他名称,是对张量进行奇异值分解的一种推广。

它认为SVD的推广的原因是:

的分量通常是正交的,但这对于我们的目的并不重要;

被称为核心矩阵,并定义不同的轴如何相互作用;

在上面描述的CP分解中,沿着空间维度;

的分解导致空间上可分离的卷积。无论如何,过滤器是非常小的,通常是3x3或5x5,所以可分离的卷积并不节省我们大量的计算,而且是一个积极的近似。

Trucker分解有用的性质是,它不必沿着所有的轴(模式)分解。我们可以沿着输入和输出通道进行分解(模式2分解):

卷积正向传递与Tucker分解

像CP分解一样,写一下卷积公式并插入内核分解:

图8:卷积公式内核分解

这给了我们以下用Tucker分解进行卷积的配方:

1.与进行点对点卷积,信道从S减少到的数量。

2.用进行正则(不可分)卷积。这个卷积代替了原始层的S输入通道和T输出通道,具有输入通道和输出通道。如果这些等级小于S和T,这就是减少的原因。

3.用进行点对点卷积以回到原始卷积的T个输出通道。由于这是最后一次卷积,所以在这一点上,如果有偏差就加上偏差。

我们如何选择分解行列

一种方法是尝试不同的值并检查准确性。尝试后的启发是,效果很好。

理想情况下,选择行列应该是自动的。

使用变分贝叶斯矩阵分解(VBMF)(Nakajima等,2013)作为估计等级的方法。

VBMF很复杂,不在本文的讨论范围内,但是在一个非常高层次的总结中,他们所做的是将矩阵近似为低秩矩阵和高斯噪声之和。在找到A和B之后,H是等级的上限。为了将其用于Tucker分解,我们可以展开原始权重张量的s和t分量来创建矩阵。然后我们可以使用VBMF估计和作为矩阵的秩。我用这个在Python上实现的VBMF,相信它可以工作。VBMF通常返回的秩,非常接近我之前,仔细和乏味的手动调整得到的结果。这也可以用于估计完全连接层的截断SVD加速的等级。

用PyTorch和Tensorly卷积层Tucker分解


 

图9:用PyTorch和Tensorly卷积层Tucker分解

总结

本文中,我们讨论了几个张量分解的方法来加速深度神经网络。截断的SVD可用于加速完全连接的层。CP分解将卷积层分解成类似移动网络的东西,尽管它更具侵略性,因为它在空间维度上也是可分的。Tucker分解减少了二维卷积层操作的输入和输出通道的数量,并且使用逐点卷积来切换2D卷积之前和之后的通道数量。

同时,也明确了我们能够用张量方法训练相当一大批隐含变量模型,比如文档的主题模型,网络中的社群模型,高斯混合模型,混合排序模型等等。这些模型表面上看起来毫无联系,然而他们通过把类似于“条件无关”这种统计学属性转化为张量上的代数约束之后,就达到了形式上的统一。在所有这些模型中,分解合适的高阶矩张量(往往是三阶或四阶的统计相关性)就能够稳定地估计模型参数。我们更进一步地证明了,这种算法只需要很小的样本量以及计算量就能工作得很好了。(这里“很小的样本量”,精确来说,是和样本点特征数量的低阶多项式同阶)