HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

谷歌开源用于训练量子模型的机器学习框架 TensorFlow Quantum

  • 2020-03-12
  • 本文字数:6802 字

    阅读完需:约 22 分钟

谷歌开源用于训练量子模型的机器学习框架TensorFlow Quantum

物理学家理查德· 费曼曾说过:


自然不是古板的,如果想要要模拟自然,最好使用量子力学定律。


2020 年 3 月 11 日,TensorFlow Dev Summit 峰会通过线上直播的方式与各位开发者见面。会上,谷歌介绍了近期宣布开源的一款用于训练量子模型的机器学习库 TensorFlow Quantum(简称 TFQ)。谷歌表示,该量子机器学习模型能够处理量子数据,并能够在量子计算机上执行。


量子机器学习库 TensorFlow Quantum

机器学习(ML)虽然不能精确模拟自然界中的系统,但却能够学习系统模型并预测系统行为。在过去几年,经典的 ML 模型解决了科学领域诸多难题,在癌症检测、地震余震预测、极端天气预测以及系外行星探测等方面发挥了巨大作用。


近年来,随着量子计算技术的发展,在量子机器学习模型上的新发现将对世界级重大问题产生深远影响,从而带来医学、材料、传感和通信领域的突破。但是,迄今为止我们遇到的瓶颈是,缺乏研究工具来发现有用的、可以处理量子数据并能在计算机上使用的量子机器学习模型。


基于此,谷歌最神秘的部门 Google X 与滑铁卢大学和大众汽车公司等合作,联合发布 TensorFlow Quantum(TFQ),这是一个用于快速建立量子 ML 模型原型的开源库。TFQ 为量子计算和机器学习研究社区的结合提供了必要工具,从而控制/建模自然或人工量子系统,比如内含大约 50~100 量子比特的噪声中级量子处理器(NISQ)。


在底层,TFQ 集成了 NISQ 算法的开源框架 Cirq(Cirq 是 Google 专为 NISQ 算法打造的框架,允许开发者为特定的量子处理器编写量子算法)和 TensorFlow,通过提供与现有 TensorFlow API 兼容的量子计算原语和高性能量子电路模拟器,为鉴别、生成量子经典模型的设计实现,提供高层次的抽象。

量子机器学习模型是什么?

量子模型能用量子力学原点表示和概括数据。但是,要了解量子模型,必须引入两个概念:量子数据模型和混合量子经典模型。


量子数据模型表现出量子叠加和量子纠缠的特性,导致联合概率分布,这可能需要成倍数量的经典计算资源来表示或存储。能够在量子处理器/传感器/网络上生成/模拟的量子数据包括化学物质和量子物质的模拟、量子控制、量子通信网络、量子计算学等。


但一个不容忽视的问题是,NISQ 处理器生成的量子数据是嘈杂的,通常在测量发生之前就被纠缠了。但是,将量子机器学习应用于嘈杂的纠缠量子数据上,可以最大程度地提取有用的经典信息。基于这种技术的启发,TFQ 库为模型的开发提供了基元(该模型可分解和概括量子数据中的关联),从而为改进现有量子算法或发现新的量子算法提供了可能。


引入的第二个概念是混合量子经典模型。由于近期的量子处理器仍然很小且嘈杂,因此量子模型不能单独使用量子处理器,NISQ 处理器需要与经典处理器协同工作才有效。由于 TensorFlow 已经支持跨 CPU、GPU 和 TPU 的异构计算,因此它是试验混合量子经典算法的天然平台。


TFQ 包含了特定量子计算所需的基本结构,例如量子比特、门、电路和测量运算符。用户指定的量子计算然后可以在模拟或真实硬件上执行。Cirq 也包含了大量机器,可帮助用户为 NISQ 机器(例如编译器和调度程序)设计出高效算法,并且能使混合量子经典算法的实现在量子电路模拟器上运行,并最终在量子处理器上运行。



如今,谷歌已经将 TFQ 应用到了混合量子经典卷积神经网络、量子控制的机器学习、量子神经网络的分层学习、量子动态学习、混合量子态的生成建模以及通过经典递归神经网络来学习量子神经网络等方面。以及通过经典循环神经网络,来学习量子神经网络等等方面。


谷歌团队在 TFQ 白皮书中放出了这些量子应用的示例,并能在浏览器中通过 Colab 运行(项目地址:https://github.com/tensorflow/quantum/tree/research)。

TFQ 的工作原理

TFQ 能够帮助研究人员在单个计算图中构建量子数据集、量子模型和作为张量的经典控制参数。导致经典概率事件的量子测量结果可通过 TensorFlow Ops 获得,可用标准 Keras 函数进行训练。


为直观地阐述如何使用量子数据,可以考虑使用量子神经网络对量子状态进行监督分类。正如经典 ML 一样,量子 ML 面临的关键问题是如何对“噪音数据”进行分类。为了建立和训练这种模型,研究人员需要做的工作有:


  • 准备一个量子数据集


量子数据被加载为张量(数字的多维数组)。每个量子数据张量都指定为用 Cirq 编写的量子电路,该电路可实时生成量子数据。张量由 TensorFlow 在量子计算机上执行以生成量子数据集。


  • 评估量子神经网络模型


研究人员可以使用 Cirq 设计量子神经网络原型,然后将其嵌入 TensorFlow 计算图中。基于对量子数据结构的认知,可以从几大类中选择参数化的量子模型。该模型的目标是执行量子处理,以提取隐藏在典型纠缠状态下的信息。换言之,量子模型本质上是对输入的量子数据进行分离,将隐藏的信息编码在经典关联中,从而使其可用于局部测量和经典后处理(算法)。


  • 样本或平均值


量子态的测量从经典随机变量中,以样本形式提取经典信息。来自该随机变量值的分布通常取决于量子态本身以及所测得的可观测值。由于许多变分算法依赖于测量值的平均值,因此 TFQ 提供了在涉及步骤(1)和(2)的多个运行中求平均值的方法。


  • 评估经典神经网络模型


提取经典信息后,其格式适用于进一步经典后处理。由于所提取的信息仍然可能被编码为测量期望之间的经典关联,因此可以使用经典的深度神经网络来提取这种关联。


  • 评估成本函数


根据经典后处理的结果,评估成本函数。这可以基于模型执行分类任务的准确性(如果量子数据被标记),或者基于其他标准(如果任务是无监督的)。


  • 评估梯度和更新参数


评估成本函数后,应更新管道中的自由参数,这通常是通过梯度下降执行的。



TensorFlow Quantum 的关键特征是它能够同时训练和执行多个量子电路。TensorFlow 能够跨计算机集群进行并行计算,并能够在多核计算机上模拟相对较大的量子电路。为了实现后者,谷歌还宣布发布新的高性能开源量子电路模拟器 qsim (项目地址:https://github.com/quantumlib/qsim),该模拟器已证明能够在 111 秒内模拟门深度为 14 的 32 比特量子电路。


接下来,谷歌列举了具体的示例来帮助开发者理解。

如何使用 TensorFlow Quantum?

安装 TensorFlow Quantum:


pip install -q tensorflow-quantum
复制代码


导入 TensorFlow 和模块依赖项:


import tensorflow as tfimport tensorflow_quantum as tfq
import cirqimport sympyimport numpy as np
# visualization tools%matplotlib inlineimport matplotlib.pyplot as pltfrom cirq.contrib.svg import SVGCircuit
复制代码

参数化量子电路

现在,使用 cirq 来模拟量子电路。Cirq 是谷歌提供的用于量子计算的 Python 库,可以使用它来定义电路,包括静态和参数化门。Cirq 使用 SymPy 符号表示自由参数:


a, b = sympy.symbols('a b')
复制代码


以下代码使用参数创建一个两比特电路:


# Create two qubitsq0, q1 = cirq.GridQubit.rect(1, 2)
# Create a circuit on these qubits using the parameters you created above.circuit = cirq.Circuit( cirq.rx(a).on(q0), cirq.ry(b).on(q1), cirq.CNOT(control=q0, target=q1))
SVGCircuit(circuit)
复制代码


findfont: Font family ['Arial'] not found. Falling back to DejaVu Sans.
复制代码



要评估电路,可以使用该 cirq.Simulator,可以通过传入 cirq.ParamResolver 对象来用特定编号替换电路中的自由参数。以下代码计算参数化电路的原始状态向量输出:


# Calculate a state vector with a=0.5 and b=-0.5.resolver = cirq.ParamResolver({a: 0.5, b: -0.5})output_state_vector = cirq.Simulator().simulate(circuit, resolver).final_stateoutput_state_vector
复制代码


我们得到具有 4 个元素的状态向量:


数组([0.9387913 + 0.j,-0.23971277 + 0.j,        0. + 0.06120872j,0. -0.23971277j],dtype = complex64)
复制代码


通常,我们不能直接从量子计算机获得状态向量。因此,我们通常不尝试读取状态向量,而是尝试计算与状态向量间接相关的特定值。


z0 = cirq.Z(q0)qubit_map = {q0:0,q1:1} z0.expectation_from_wavefunction(output_state_vector,qubit_map).real
复制代码


这是 Z 运算符的期望值。通常,我们在布洛球的 Z 轴上获得量子计算结果。通过获取样本,您可以轻松估算 pauli Z 运算符的期望值。



量子态表示为布洛球


结果是:


0.8775825500488281
复制代码


如果:


z0x1 = 0.5 * z0 + cirq.X(q1)z0x1.expectation_from_wavefunction(output_state_vector, qubit_map).real
复制代码


结果为:


-0.04063427448272705
复制代码

量子电路作为张量

TensorFlow Quantum(TFQ)提供 tfq.convert_to_tensor 将 Cirq 对象转换为张量,开发者可以将 Cirq 对象发送到谷歌的 quantum layers 和 quantum ops,可以在 Cirq 电路和 Cirq Paulis 的列表或数组上调用该函数:


# Rank 1 tensor containing 1 circuit.circuit_tensor = tfq.convert_to_tensor([circuit])
print(circuit_tensor.shape)print(circuit_tensor.dtype)
复制代码


结果如下:


(1,)<dtype: 'string'>
复制代码


这会将 Cirq 对象编码为 tf.string 张量,tfq 操作可根据需要对其进行解码:


# Rank 1 tensor containing 2 Pauli operators.pauli_tensor = tfq.convert_to_tensor([z0, z0x1])pauli_tensor.shape
复制代码


结果为:


TensorShape([2])
复制代码

量子经典混合

现在,开发者已经了解部分基础知识,让我们使用 TensorFlow Quantum 构建一个混合的量子经典神经网络,将训练经典的神经网络来控制单个量子位。将优化控制以正确准备处于 0 或 1 状态的量子位,从而克服模拟的系统校准误差。该图显示了体系结构:



即使没有神经网络,这也是一个直接解决的问题,但主题类似于可能使用 TFQ 解决的实际量子控制问题,演示了使用 tfq.layers.ControlledPQC 内部的(参数化量子电路)层进行量子经典计算的端到端示例 tf.keras.Model。


第一步:受控电路定义


# Parameters that the classical NN will feed values into.control_params = sympy.symbols('theta_1 theta_2 theta_3')
# Create the parameterized circuit.qubit = cirq.GridQubit(0, 0)model_circuit = cirq.Circuit( cirq.rz(control_params[0])(qubit), cirq.ry(control_params[1])(qubit), cirq.rx(control_params[2])(qubit))
SVGCircuit(model_circuit)
复制代码



第二步:定义控制器网络


# The classical neural network layers.controller = tf.keras.Sequential([    tf.keras.layers.Dense(10, activation='elu'),    tf.keras.layers.Dense(3)])
复制代码


给定一批命令,控制器为受控电路输出一批控制信号。


控制器是随机初始化的,因此,这些输出尚无用。


controller(tf.constant([[0.0],[1.0]])).numpy()
复制代码


结果为:


数组([[0.,0.,0.],       [-0.16003934,0.26334327,0.3790441]],dtype = float32)
复制代码


第三步:将控制器连接到电路


使用 tfq 将控制器连接到被控制电路,作为单一的 keras.Model。首先,定义模型的输入:


# This input is the simulated miscalibration that the model will learn to correct.circuits_input = tf.keras.Input(shape=(),                                # The circuit-tensor has dtype `tf.string`                                 dtype=tf.string,                                name='circuits_input')
# Commands will be either `0` or `1`, specifying the state to set the qubit to.commands_input = tf.keras.Input(shape=(1,), dtype=tf.dtypes.float32, name='commands_input')
复制代码


接下来,将运算应用于这些输入,以定义计算:


dense_2 = controller(commands_input)
# TFQ layer for classically controlled circuits.expectation_layer = tfq.layers.ControlledPQC(model_circuit, # Observe Z operators = cirq.Z(qubit))expectation = expectation_layer([circuits_input, dense_2])
复制代码


现在将此计算打包为 tf.keras.Model:


# The full Keras model is built from our layers.model = tf.keras.Model(inputs=[circuits_input, commands_input],                       outputs=expectation)
复制代码


注意:可能需要系统安装 graphviz 软件包。


tf.keras.utils.plot_model(model, show_shapes=True, dpi=70)
复制代码


结果为:


无法导入pydot。您必须安装pydot和graphviz才能使pydotprint运行。
复制代码


数据集


模型尝试为每个命令输出正确的正确测量值,命令和正确值定义如下:


# The command input values to the classical NN.commands = np.array([[0], [1]], dtype=np.float32)
# The desired Z expectation value at output of quantum circuit.expected_outputs = np.array([[1], [-1]], dtype=np.float32)
复制代码


这不是此任务的整个训练数据集。数据集中的每个数据点也需要一个输入电路。


输入点定义


下面的输入电路定义了模型将学习校正的随机失调:


random_rotations = np.random.uniform(0, 2 * np.pi, 3)noisy_preparation = cirq.Circuit(  cirq.rx(random_rotations[0])(qubit),  cirq.ry(random_rotations[1])(qubit),  cirq.rz(random_rotations[2])(qubit))datapoint_circuits = tfq.convert_to_tensor([  noisy_preparation] * 2)  # Make two copied of this circuit
复制代码


电路有两个副本,每个数据点一个。


datapoint_circuits.shape
复制代码


TensorShape([2])
复制代码


训练


使用定义的输入测试 tfq 模型:


model([datapoint_circuits, commands]).numpy()
复制代码


数组([[0.16693401],       [-0.17766671]],dtype = float32)
复制代码


现在,运行标准的训练过程将这些值调整为 expected_outputs。


optimizer = tf.keras.optimizers.Adam(learning_rate=0.05)loss = tf.keras.losses.MeanSquaredError()model.compile(optimizer=optimizer, loss=loss)history = model.fit(x=[datapoint_circuits, commands],                    y=expected_outputs,                    epochs=30,                    verbose=0)
复制代码


plt.plot(history.history['loss'])plt.title("Learning to Control a Qubit")plt.xlabel("Iterations")plt.ylabel("Error in Control")plt.show()
复制代码



从该图中可以看出,神经网络已经学会克服系统失调。


验证输出


现在,使用经过训练的模型来校正量子位校准误差。使用 Cirq:


现在,使用经过训练的模型来校正量子位校准误差。使用 Cirq:


def check_error(command_values, desired_values):  """Based on the value in `command_value` see how well you could prepare  the full circuit to have `desired_value` when taking expectation w.r.t. Z."""  params_to_prepare_output = controller(command_values).numpy()  full_circuit = noisy_preparation + model_circuit
# Test how well you can prepare a state to get expectation the expectation # value in `desired_values` for index in [0, 1]: state = cirq_simulator.simulate( full_circuit, {s:v for (s,v) in zip(control_params, params_to_prepare_output[index])} ).final_state expectation = z0.expectation_from_wavefunction(state, {qubit: 0}).real print(f'For a desired output (expectation) of {desired_values[index]} with' f' noisy preparation, the controller\nnetwork found the following ' f'values for theta: {params_to_prepare_output[index]}\nWhich gives an' f' actual expectation of: {expectation}\n')

check_error(commands, expected_outputs)
复制代码


For a desired output (expectation) of [1.] with noisy preparation, the controllernetwork found the following values for theta: [-0.22817115 -0.2512403  -1.5496594 ]Which gives an actual expectation of: 0.9663878679275513
For a desired output (expectation) of [-1.] with noisy preparation, the controllernetwork found the following values for theta: [-1.2500848 1.4088008 2.5982447]Which gives an actual expectation of: -0.9780153036117554
复制代码


训练期间损失函数的值提供了关于模型学习程度的粗略概念。损耗越小,上述单元格中的期望值越接近 desired_values。如果不关心参数值,则可以始终使用 tfq 命令检查上面的输出:


model([datapoint_circuits, commands])
复制代码


结果为:


<tf.Tensor: shape=(2, 1), dtype=float32, numpy=array([[ 0.96638787],       [-0.9780154 ]], dtype=float32)>
复制代码


如果想了解更多教程,可以访问 Tensorflow 网站。


教程链接:


https://www.tensorflow.org/quantum/tutorials/hello_many_worlds/


参考连接:


https://ai.googleblog.com/2020/03/announcing-tensorflow-quantum-open.html


论文地址:


https://arxiv.org/pdf/2003.02989.pdf


Crip 项目地址:


https://github.com/quantumlib/Cirq


2020-03-12 09:552247

评论

发布
暂无评论
发现更多内容

云原生运维入门必看!OpenTelemetry 三大数据类型及核心组件解析

Greptime 格睿科技

运维 云原生

配置 GreptimeDB 作为夜莺监控数据源,无缝替代 Prometheus/VictoriaMetrics

Greptime 格睿科技

Prometheus 时序数据库 Victoriametrics

Serverless + AI 让应用开发更简单

阿里巴巴云原生

阿里云 Serverless 云原生

网易伏羲:智能体驱动 未来可期 | 《天堂硅谷》杂志报道

网易伏羲

AI 网易伏羲 AI 人工智能

浅谈指标平台的价值:赋能企业决策、加速业务响应与提升技术效率

Aloudata

数据仓库 数据分析 指标平台

阿里巴巴API返回值全解析:轻松掌握1688店铺商品信息

代码忍者

API 接口 pinduoduo API

总计 30 万奖金,Spring AI Alibaba 应用框架挑战赛开赛

阿里巴巴云原生

阿里云 开源 云原生

麦肯锡8步框架:提升你的问题解决能力

爱吃小舅的鱼

项目管理 项目

PDF如何一键转为PPT?10个好用的格式转换工具汇总!

职场工具箱

效率 效率工具 PPT 办公软件 AI生成PPT

接单流程设计探索

京东科技开发者

揭秘JDQ限流架构:实时数据链路的多维动态带宽管控

京东科技开发者

论文领读|tDRO:面向大模型稠密检索的任务级分布鲁棒优化

澜舟孟子开源社区

人工智能 大模型 技术论文

未来已来:人工智能赋能软件开发新篇章

天津汇柏科技有限公司

人工智能 软件开发

应对市场和竞争对手变化的实用指南

爱吃小舅的鱼

市场 竞争 应对市场和竞争对手变化

ARB链挖矿DApp系统开发模式定制

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

从前线看IT集成项目:三年管理经验

爱吃小舅的鱼

项目管理 管理项目

企业如何同时维护旧系统与开发新产品

爱吃小舅的鱼

维护旧系统与开发新产品

如何在汽车中构建一个时序数据库 (TSDB)?

Greptime 格睿科技

边缘计算 时序数据库 新能源汽车

MindNode,一键开启思维整理新模式!

Rose

百度智能云携手面壁智能,深化大模型端云协同合作

Geek_2d6073

软件测试学习笔记丨测试平台的价值与体系

测试人

软件测试 测试平台

BOE(京东方)2024年前三季度净利润三位数增长 “屏之物联”引领企业高质发展

科技热闻

BOE(京东方)全新一代发光器件赋能iQOO 13 全面引领柔性显示行业性能新高度

爱极客侠

鸿蒙网络编程系列41-仓颉版HttpRequest模拟登录示例

长弓三石

DevEco Studio 开发实例 HarmonyOS NEXT 网络与连接

App Cleaner & Uninstaller Pro for Mac(苹果应用程序清理卸载软件)

Rose

Taro 鸿蒙技术内幕系列(二):如何让 W3C 标准的 CSS跑在鸿蒙上

京东科技开发者

IPQ5322 vs. IPQ9574: Choosing the Right Chipset for Enterprise Wi-Fi

wallyslilly

ipq9574 ipq5322

从数据提取到管理:合合信息的智能文档处理全方位解析【合合信息智能文档处理百宝箱】

申公豹

人工智能

Sound Control for Mac 强大的音量控制软件

Rose

【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit(5)

HarmonyOS SDK

HarmonyOS

什么是触发器?

Chat2DB

MySQL 数据库 sql 开源

谷歌开源用于训练量子模型的机器学习框架TensorFlow Quantum_语言 & 开发_Google AI_InfoQ精选文章