张量网络正越来越多地用于机器学习领域,它被用于执行复杂计算任务,但对于大多数人来说它仍然遥不可及——我们还没有开源库来大规模运行这种底层算法。幸运的是,谷歌正在解决这一问题。昨天,Google AI 发布了 TensorNetwork,它使用 TensorFlow 机器学习框架作为后端,并用 GPU 优化来提高张量计算的效率。
TensorNetwork 链接:https://github.com/google/tensornetwork
在科学领域有很多难度颇高的挑战,如开发高温超导体、理解时空的本质,这些任务需要处理复杂的量子系统。其中最具挑战的是系统中量子态的数量呈指数级增长,使得暴力计算变得不可行。为了解决这个问题,人们开发了张量网络(tensor network)这一数据结构。
张量网络让我们专注于量子态与现实世界问题最相关的部分——如低能态,并忽略那些不太相关的部分。张量网络也越来越多地出现在机器学习(ML)应用中。然而,我们仍然能在 ML 社区中看到广泛应用张量网络所面临的困难:1)目前还没有生产级的张量网络库用于规模化地运行张量网络算法;2)大多数张量网络文献是物理学应用方向的,这就产生了一种错误的固有印象:只有通晓量子力学知识才能理解张量网络算法。
为了解决这些问题,谷歌发布了 TensorNetwork:一个旨在提高张量计算效率的全新开源库。谷歌表示,这个工具是与加拿大圆周理论物理研究所(Perimeter Institute for Theoretical Physics)、谷歌 X 公司共同开发的产品。它使用 TensorFlow 作为后端,针对 GPU 进行优化,与 CPU 上的运行速度相比实现了 100 倍的加速。
谷歌还在一系列论文中介绍了 TensorNetwork,其中第一篇论文《TensorNetwork: A Library for Physics and Machine Learning》介绍了这个库及其 API,并为非物理背景读者介绍了张量网络的背景。在第二篇论文《TensorNetwork on TensorFlow: A Spin Chain Application Using Tree Tensor Networks》中,谷歌将重点放在一个物理问题的案例上,介绍了如何使用这一工具并获得 GPU 加速。
为何张量网络如此好用?
张量是多维数组,按照阶数分类:例如普通数是零阶张量(也被称为标量),向量是一阶张量,矩阵是二阶张量,以此类推……虽然低阶张量可以简单地使用数组或者 T_ijnklm 这样的数学符号来表示(其中指数的数字代表张量的阶数),但如果我们要处理高阶张量,这种符号表示法就会很繁琐。
在这种情况下使用图解表示法(diagrammatic notation)是更好的选择,人们只需要画一个圆(其他形状也行)和若干条线(或腿),腿的数量表示张量的阶数。在这种符号体系中,标量是一个圆,向量有一条腿,矩阵有两条腿,以此类推……张量的每一条腿也有一个维度,就是腿的长度。例如,代表物体在空间中速度的向量就是三维一阶张量。
张量的图解表示
以这种方式表示张量的优点是可以简洁地编码数学运算,例如将一个矩阵乘以一个向量以产生另一个向量,或者将两个向量相乘以产生标量。这些都是更为通用的「张量缩并」概念的示例。
张量缩并的图解表示法。以上示例包括向量和矩阵相乘,以及矩阵迹(即矩阵对角元素的总和)。
以下是张量网络的简单示例,它们用图的形式表示将多个张量进行缩并形成新张量的过程。每个张量组件的阶数由其腿的数量决定。腿相连形成一条边表示缩并,而「落单」的腿的个数决定最终张量的阶数。
左:四个矩阵乘积的迹 tr(ABCD),这是一个标量(该图中没有出现「落单」的腿)。右:三个三阶张量通过张量缩并过程生成新的三阶张量(其中有三个「落单」的腿)。
尽管这些示例很简单,但张量网络通常可以表示压缩后的数百个张量。使用传统符号描述这一过程比较困难,这也是 1971 年 Roger Penrose 创造图解表示法的原因。
实践中的张量网络
给出一些黑白图像,每一张图像都可以被认为是 N 个像素值的列表。单个图像中的单个像素可以被 one-hot-encode 为二维向量,将这些像素编码结果结合起来会得到整个图像的 2^N 维 one-hot-encoding 结果。谷歌将高维向量转化为 N 阶张量,然后将所有图像的所有张量聚合到一起得到张量 T_(i1,i2,...,iN)。
这看起来似乎是在浪费时间:用这种方式编码约 50 像素的图像就需要拍字节级别(petabytes)的内存。而这正是张量网络的作用所在。研究人员没有直接存储或操纵张量 T,而是将 T 表示为张量网络内的多个小的张量组合,这样就高效得多了。例如,流行的矩阵乘积态(matrix product state,MPS)网络可以将 T 表示为 N 个较小的张量,从而使总参数量为 N 的线性级,而不是指数级。
在 MPS 张量网络中,高阶张量 T 被表示为多个低阶张量。
这并不能表明,在高效创建或操纵大型张量网络的同时能够持续避免使用大量内存。但这至少说明在某些情况下是可能的,这也是张量网络广泛用于量子物理和机器学习领域的原因。Stoudenmire 和 Schwab 在论文《Supervised Learning with Quantum-Inspired Tensor Networks》中使用这种编码来创建图像分类模型,展示了张量网络的新用途。而谷歌开发的 TensorNetwork 库旨在推进这类工作,谷歌在 TensorNetwork 相关论文《TensorNetwork: A Library for Physics and Machine Learning》中介绍了该库的用途。
TensorNetwork 在物理场景中的性能
TensorNetwork 是一个针对张量网络算法的通用库,因此它适用于物理学场景。逼近量子态是张量网络在物理学领域的传统用法,恰好可以说明 TensorNetwork 库的能力。谷歌在另一篇论文《TensorNetwork on TensorFlow: A Spin Chain Application Using Tree Tensor Networks》中,介绍了一种树张量网络(tree tensor network,TTN),它可以逼近周期性量子自旋链(一维)或 thin torus 上点阵模型(二维)的真值状态。谷歌使用 TensorNetwork 库实现了该算法。此外,谷歌研究人员还对比了使用 CPU 和 GPU 的情况,发现在使用 GPU 和 TensorNetwork 库时出现了显著的计算加速(100 倍)。
连接维度 vs 计算时间。连接维度(bond dimension)决定张量网络中张量的大小。连接维度越大说明张量网络越强大,但同时也需要更多的计算资源。
结论和未来工作
谷歌表示这是阐述 TensorNetwork 在现实应用中作用的系列文章的第一篇,后续谷歌将使用 TensorNetwork 在 MNIST 和 Fashion-MNIST 上执行图像分类,以及时序分析、量子电路模拟等。谷歌希望 TensorNetwork 能够成为物理学家和机器学习从业者的得力助手。
原文链接:https://ai.googleblog.com/2019/06/introducing-tensornetwork-open-source.html