Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >能「看到」的张量运算:​因子图可视化

能「看到」的张量运算:​因子图可视化

作者头像
机器之心
发布于 2019-11-04 19:53:29
发布于 2019-11-04 19:53:29
1.3K0
举报
文章被收录于专栏:机器之心机器之心

张量运算有时候并不容易直观地理解:为什么有时候改变计算顺序不会影响结果,同时又能极大节省计算成本?使用因子图来可视化或许能为人们提供简洁直观的理解方式。Rajat Vadiraj Dwaraknath 近日发布了一篇文章,介绍了他在使用因子图可视化张量运算方面的心得。

从格罗滕迪克那里,我学习到不要以证明过程的难度为荣:困难意味着我们尚未理解。也就是说我们要能绘制出让证明过程显而易见的图景。 ——著名数学家 Pierre Deligne

当维度超过 2 或 3 时,理解涉及多维数组的运算就会变得相当困难。但是,矩阵本身的特定性质可能让你在初次与它们相遇时深感惊讶。轨迹运算的循环性质就是其中一例。

我最近遇到个能可视化这些所谓的张量运算的好工具——因子图(factor graphs),它能得到视觉上很明显(如循环轨迹)的结果。尽管我最初是在图模型和消息传递的语境中遇到因子图的,但我很快就意识到它们体现了一种更通用和更简单的概念。在这篇文章中,我将主要在高层面介绍因子图,而不会涉及图模型或消息传递等算法的具体细节。

在深入因子图之前,我们先简单快速地介绍一下爱因斯坦求和符号。

爱因斯坦求和符号

爱因斯坦符号存在多种形式,尤其是在物理学领域,但我们要介绍的那种非常简单,没有任何物理学背景也能轻松掌握。

在矩阵乘法的定义中,

求和符号实际上是多余的。我们可以直接舍弃它,并推断出索引 k 必须被求和,因为它没有出现在左侧。

为什么要这么做?好吧,我们来看一个有一般张量的案例(将其看作是超过 2 维的 numpy 数组即可):

然后假设张量的形状如下:

其中交织着复杂的「和」与「积」,而不断写求和符号是非常烦人的。同样,我们不需要写这些求和符号,因为我们可以通过查看仅出现在右侧的索引来暗示所要求和的索引。用爱因斯坦表示法,写起来就简单多了:

但相比于公式 (4),这种表示方式确实丢失了一些信息——计算求和的顺序。现在,求和的顺序实际上不影响最终结果(福比尼定理),但事实表明某些顺序的求和过程比另一些顺序更高效(后面还会提到)。另外,你可以使用 numpy.einsum 在 Python 中轻松尝试这些。这篇文章更详细地介绍了 einsum,并给出了一些很好的示例:http://ajcr.net/Basic-guide-to-einsum/

因子图

带有多个不同大小的张量的和-积表达式也被称为张量网络。除了听起来炫酷之外,这个名字也是合理的,因为你写的任何有效的爱因斯坦求和实际上都可映射为一个张量图。(「有效」是指同样索引的不同张量的维度大小必须相等。)

我们可以很轻松地构建出这样的图。我们回头看看这个例子,了解下发生了什么:

  • 这个图有两种节点——因子和变量
  • 我们将用方框表示因子,用圆圈表示变量
  • 因子对应张量 (A,B,C)
  • 变量对应索引 (i,j,k)
  • 边仅出现在方框和圆圈之间
  • 边的规则很简单——每个因子都连接其每个索引。在上面的例子中,A_{ijk} 表示 A 连接着 i、j、k
  • 边的厚度对应于因子中轴(即数组分量的长度)的大小
  • 这使得图成为了方框和圆圈之间的二部图(bipartite graph)
  • 仅出现在等式右侧的索引(i 和 j)会被隐式地求和。我们通过加黑图中对应的变量节点来表示它。

上面动画的最后一部分给出了一个重要的直觉观察:

每个因子图都有一个完全收缩的状态——爱因斯坦求和的右侧(示例中的 2 维张量 D)。通过将图中的所有因子组合成单个因子,然后将每个灰色的变量求和,可以得到这个状态。现在剩下的是仅连接到未求和变量的单个因子——这就是收缩状态。示例中转变为因子 D 的绿色云很好地展示了这种收缩。

在我们继续探索这个奇特工具的能力之前,我们先谈谈它的来源。

名字从何而来?

这种图被称为因子图的一大原因是右侧看起来像是对左侧张量的因子分解。在离散随机变量的概率分布语境中,这会更加具体。如果张量为正且总和为 1,则它们可以表示在不同随机变量上的联合分布(这也是索引对应于变量的原因)。在这种设置中,因子图是将许多变量的大型联合分解成更小的互相独立的变量集的联合。

因子图不仅会在概率图模型中出现,而且也会现身于物理学当中,这时候它被称为张量网络或矩阵积状态(matrix product states)。但是,这里不会介绍这些应用的细节。

有一点需要注意,因子分解所需的内存实际上比整个联合要少得多(存储一个 10×10×10 张量对比存储三个 10 维张量)。

可视化的 numpy 运算

为什么这种表示方式有用?因为这能让我们将复杂的因子分解转换成更可视化的表示,从而更加轻松地处理。numpy 中的数值张量运算可以很好地适用于这个框架。下面给出了几个无需过多解释的示例:

矩阵-向量乘法

矩阵-矩阵乘法

逐元素求积

外积

轨迹

注意,没有边的因子是 0 维张量,其实就是单个数值(轨迹就该是这样)。

可视化证明

使用简洁的可视化证明,我们不仅可以理解 numpy 运算,还能迅速搞定数学定理。下面就简洁地证明了我一开始提到的轨迹恒等:

轨迹是循环的

张量收缩的计算成本

现在,我们已经将因子图中的那些绿色云压缩成了一个大因子,而没有探讨这种变换究竟是怎样计算的。将许多因子组合成单个因子并求灰色变量的和的过程涉及到两个基本的计算操作:

  • 求和:移除仅有一条边的灰色节点
  • 求积:将两个因子合并成一个因子

可以很容易看到,这样的操作能保留网络最终的收缩状态,所以如果我们不断应用它们直到只剩仅连接到未求和变量的单个因子,那么我们就实现了网络收缩。

求和

求和是不言自明的。基本上就是将 numpy.sum 运算应用于对应的轴。这涉及到对大小等于所有其它轴大小的积的张量求和,而且这些张量的数量就是被求和的轴的大小。因此,加法的总数量就是所有轴大小的积。我们也能从可视化表示中看出这一点:

求积

求积运算本质上就是两个张量的外积泛化为一般张量。用爱因斯坦表示法,组合两个因子就等同于通过两个因子的项相乘而将两个因子当成一个,从而得到一个更大的因子:

这种求积是用一个因子中的每个元素与另一个因子的整体相乘。因此最终结果的大小是各个因子的总大小的积,这会大很多。最终积的每个元素都只是两个数值相乘的结果,所以乘法总数量就是最终积的项总数。这也很容易可视化:

另外,如果两个因子共享一个变量,则两条边会结合成单条边——在效果上是执行类似于轨迹动画中的对角运算。

当收缩一个网络时,对变量求和并以不同的顺序组合因子会导致不同的计算成本。研究表明,寻找实现成本最小化的收缩一般因子图的最优顺序实际上是 NP-hard 问题。作为一个有趣的练习,你可以试试解读矩阵链乘法(matrix chain multiplication)过程,并使用因子图理解寻找一个链矩阵积的总计算成本是如何受乘法顺序影响的。这个特定案例有非常简洁的动态编程算法,可在平方时间内获得最优顺序。

希望我现在已经使你信服因子图是非常强大的可视化工具。我们不仅能用它证明一些简单的恒等关系,而且还能进一步将其用于理解一些复杂概念,比如用于概率图模型推理的有效方法。

一些细节

因子图其实不能精确地表示爱因斯坦求和。你们可能已经注意到我们丢失了张量的哪个轴对应于图中哪条边的信息。但是,只要将源自每个因子的边加上轴标签,就能轻松解决这个问题。但这会使可视化无必要地杂乱和丑陋,所以我决定不包含它们。

另外,我们还可将这种可视化扩展用于不只是求和变量节点的网络。将一个变量节点变为灰色在效果上就是将对应的轴约简为单个数值,因此我们可以用任何执行这种约简的运算替代求和。举个例子,我们不用求和,而是取该轴中所有元素的最大值,或者就简单地索引该轴上一个特定位置。这在 MAP 估计和最大积信念传播方面是相关的。我们甚至可以将这种解读方式扩展到连续域,并用积分替代求和,其中的因子也不再是离散矩阵,而是连续域上的多变量函数。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-11-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器之心 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
高效处理多维数组:einsum()函数从入门到精通
通常被视为NumPy文档中那个晦涩难懂的高级函数——功能强大但难以理解。不过一旦掌握其基本原理,
曾高飞
2025/06/05
2630
可以用爱因斯坦求和替代的那些矩阵运算
在前面的几篇文章中我们分别介绍过numpy中的爱因斯坦求和函数Einsum和MindSpore框架中的爱因斯坦求和算子Einsum的基本用法。而我们需要知道,爱因斯坦求和其实还可以实现非常多的功能,甚至可以替代大部分的矩阵运算,比如常见的点乘、元素乘、求和等等这些都是可以的。那我们就逐一看一下可以用爱因斯坦求和来替代的那些函数和方法。
DechinPhy
2022/09/28
1.4K0
可以用爱因斯坦求和替代的那些矩阵运算
einsum,一个函数走天下
【导读】einsum 全称 Einstein summation convention(爱因斯坦求和约定),又称为爱因斯坦标记法,是爱因斯坦 1916 年提出的一种标记约定,本文主要介绍了einsum 的应用。
AI科技大本营
2019/09/05
2.1K0
einsum,一个函数走天下
einsum is all you needed
不仅如此,和其它pytorch中的函数一样,torch.einsum是支持求导和反向传播的,并且计算效率非常高。
lyhue1991
2023/02/23
2K0
einsum is all you needed
一文读懂Python实现张量运算
量子化学计算中除了有大量的线性代数矩阵运算,也有一些张量计算。这些常见的张量计算出现在Fock算符构建、DIIS以及能量对坐标的一、二阶导数上。除此之外张量运算知识也用在Machine Learning以及一些特定的量化计算方法上。张量运算逐渐成为了必备的知识。
用户7592569
2020/07/27
4.1K1
一文读懂Python实现张量运算
3 | PyTorch张量操作:基本操作、索引、命名
看起来,张量是一个物理学概念,不过在这里,我们不用想的那么复杂,简单来理解,张量就是一个多维数组,当然如果它的维度是0那就是一个数,如果维度是1那就是一个矢量,或者称作一维数组。在PyTorch中都是使用张量的概念和数据结构来进行运算的。
机器学习之禅
2022/07/11
8780
3 | PyTorch张量操作:基本操作、索引、命名
盘一盘 Python 特别篇 23 - 爱因斯坦求和 einsum
最近我以电子版的形式出了第二本书《Python 从入门到入迷》,然后定期更新书中的内容,最先想到的便是 einsum。
用户5753894
2022/12/18
2.2K0
盘一盘 Python 特别篇 23 - 爱因斯坦求和 einsum
NumPy中einsum的基本介绍
einsum函数是NumPy的中最有用的函数之一。由于其强大的表现力和智能循环,它在速度和内存效率方面通常可以超越我们常见的array函数。但缺点是,可能需要一段时间才能理解符号,有时需要尝试才能将其正确的应用于棘手的问题。
AiTechYun
2018/12/07
12.5K0
特斯拉AI高管都推荐的张量工具,开源了三年后终于中顶会了! | ICLR 2022 Oral
博雯 发自 凹非寺 量子位 | 公众号 QbitAI 那个在GitHub标星4.3k的张量操作工具Einops,在开源三年后终于中了顶会! 这是一个统一的、通用的操作张量结构的方法,基于爱因斯坦求和约定(Einstein summation convention)的思路开发,能够大幅提高代码的可读性和易修改性。 同时,Einops支持Pytorch、TensorFlow、Chainer、Jax、Gluon等多个深度学习框架,以及Numpy、Cupy等张量计算框架。 ICLR 2022将其接收为Oral论文
量子位
2022/03/04
5220
一文学会 Pytorch 中的 einsum
爱因斯坦求和约定(einsum)提供了一套既简洁又优雅的规则,可实现包括但不限于:向量内积,向量外积,矩阵乘法,转置和张量收缩(tensor contraction)等张量操作,熟练运用 einsum 可以很方便的实现复杂的张量操作,而且不容易出错。
BBuf
2021/04/16
2.8K0
NumPy之:ndarray中的函数
在NumPy中,多维数组除了基本的算数运算之外,还内置了一些非常有用的函数,可以加快我们的科学计算的速度。
程序那些事
2021/05/24
1.7K0
以3D视角洞悉矩阵乘法,这就是AI思考的样子
如果能以 3D 方式展示矩阵乘法的执行过程,当年学习矩阵乘法时也就不会那么吃力了。
机器之心
2023/10/04
5190
以3D视角洞悉矩阵乘法,这就是AI思考的样子
Transformers是SSMs:通过结构化状态空间对偶性的广义模型和高效算法(一)
尽管Transformer一直是深度学习在语言建模中取得成功的主要架构,但最近的研究表明,如Mamba之类的状态空间模型(SSMs)在小到中等规模上能够匹敌或超越Transformer的性能。我们表明,这两类模型实际上是非常相关的,并在一个经过充分研究的结构化半可分离矩阵类的各种分解之间,发展出SSM和注意力变体之间丰富的理论联系框架。我们的状态空间对偶性(SSD)框架使我们能够设计一种新的架构(Mamba-2),其核心层是对Mamba的选择性SSM的改进,速度提高了2-8倍,同时在语言建模方面继续与Transformer保持竞争力。
AI浩
2024/10/22
3870
Transformers是SSMs:通过结构化状态空间对偶性的广义模型和高效算法(一)
不一样的 NumPy教程,数值处理可视化
在 Python 的生态环境中, NumPy 包是数据分析、机器学习和科学计算的主力军。它大大简化了向量和矩阵的操作及处理过程。一些领先的Python 包都依靠 NumPy 作为其基础架构中最基本的部分(例如scikit-learn、SciPy、pandas 和 tensorflow)。除了对数值数据进行分片和分块处理,在库中处理和调试高级用例时,掌握 NumPy 操作也能展现其优势。
昱良
2019/12/09
1.4K0
不一样的 NumPy教程,数值处理可视化
哈希算法、爱因斯坦求和约定,这是2020年的注意力机制
注意力机制是非常优美而神奇的机制,在神经网络「信息过载」的今天,让 NN 学会只关注特定的部分,无疑会大幅度提升任务的效果与效率。借助注意力机制,神经机器翻译、预训练语言模型等任务获得了前所未有的提升。
机器之心
2020/04/01
8440
哈希算法、爱因斯坦求和约定,这是2020年的注意力机制
基于numpy.einsum的张量网络计算
张量(Tensor)可以理解为广义的矩阵,其主要特点在于将数字化的矩阵用图形化的方式来表示,这就使得我们可以将一个大型的矩阵运算抽象化成一个具有良好性质的张量图。由一个个张量所共同构成的运算网络图,就称为张量网络(Tensor Network)。让我们用几个常用的图来看看张量网络大概长什么样子(下图转载自参考链接1):
DechinPhy
2021/05/21
1.8K0
TensorNetwork,一个能够提高张量计算效率的开源库
世界上许多最棘手的科学挑战,如开发高温超导体和了解空间和时间的本质,都涉及到处理量子系统的复杂性。使这些挑战变得困难的原因是这些系统中的量子态数量呈指数级增长,使得暴力计算变得不可行。为了解决这个问题,使用了称为张量网络的数据结构。张量网络让人们专注于与现实问题最相关的量子态 - 低能量状态,而忽略其他不相关的状态。张量网络也越来越多地在机器学习(ML)中找到应用。然而,仍存在阻碍它们在ML领域中广泛使用的困难:
AI研习社
2019/07/20
1.6K1
Python中的numpy模块
列表类占用的内存数倍于数据本身占用的内存,Python自带的列表类会储存每一个元素的数据信息,数据类型信息,数据大小信息等。这是因为Python语言是一种可以随时改变变量类型的动态类型语言,而C语言和Fortran语言是静态类型语言,静态类型语言一般会在建立变量前先定义变量,并且不可以修改变量的变量类型。总的来说,numpy模块有以下两个优点:
yhni
2022/11/17
2K0
FastAI 之书(面向程序员的 FastAI)(七)
本章开始了一段旅程,我们将深入研究我们在前几章中使用的模型的内部。我们将涵盖许多我们以前见过的相同内容,但这一次我们将更加密切地关注实现细节,而不那么密切地关注事物为什么是这样的实际问题。
ApacheCN_飞龙
2024/02/17
5730
PyTorch从入门到放弃之张量模块
张量(Tensor)是PyTorch最基本的操作对象。在几何定义中,张量是基于标量、向量和矩阵概念的眼神。通俗理解,可以讲标量视为0维张量,向量视为1维张量,矩阵视为2维张量。在深度学习领域,可以将张量视为一个数据的水桶,当水桶中只放一滴水时就是0维张量,多滴水排成一排就是1维张量,联排成面就是2维张量,以此类推,扩展到n维向量。
愷龍
2024/09/03
2840
PyTorch从入门到放弃之张量模块
推荐阅读
相关推荐
高效处理多维数组:einsum()函数从入门到精通
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档