inkscape生成g代码_三点二. 量子对抗生成网络 (Quantum GAN)

a6e05a0a99ac4c07813c0dde5a0e5c4c.png

理论基础

之前我们介绍了强化学习

Leo:和Leo一起学量子计算:三点一. 微分线路和强化学习​zhuanlan.zhihu.com
06231b3377d648ee94f984c08a62c5cf.png

上面这篇博文告诉我们如何把量子线路类比为神经网络,并获取它的导数。在可微分线路的基础上,我们可以做一些更加酷的事情,比如量子对抗学习。

2018年,量子机器学习领域出现了几篇夺人眼球的关于量子对抗生成学习的文章,它们分别是

  • Seth Lloyd, Christian Weedbrook
    • [1804.09139] Quantum generative adversarial learning
  • Quantum generative adversarial networks
    • [1804.08641] Quantum generative adversarial networks
  • Benedetti, M., Grant, E., Wossnig, L., & Severini, S.
    • [1806.00463] Adversarial quantum circuit learning for pure state approximation
  • Haozhen Situ, Zhimin He, Lvzhou Li, Shenggen Zheng
    • [1807.01235] Quantum generative adversarial network for generating discrete data
  • Jinfeng Zeng,Yufeng Wu,Jin-Guo Liu,Lei Wang,Jiangping Hu
    • [1808.03425] Learning and Inference on Generative Adversarial Quantum Circuits

理论基础

下面简单介绍下第三篇工作的基本思想,也就是今年 6 月份的这篇学习纯态波函数的文章, 他是对第一篇和第二篇文章思想的传承和简化版本。这篇文章要解决的问题是,给定一个未知量子线路T,它可以让波函数从

态演化到
。我们希望构造一个线路G生成另外一个波函数
,得到这个波函数的尽可能与目标线路产生的态相似, 也就是
。那么为什么要学习一个量子线路产生量子力学波函数呢?一个原因是量子波函数具有不可克隆的特性,为了能够随时随地复现它,一个好的想法就是把能够产生这个波函数的随机线路的参数,用经典浮点数把它保存在磁盘上。

4e19ee686dd5bd26435b426c1f2ab6b5.png
图1:量子线路对抗学习示意图,T, G 和 D 均为量子线路,T 即 Target,是需要被学习的线路,G 即 Generator,是用来仿制 T 的量子波函数生成线路,D 即 Discriminator,它通过对辅助比特的 POVM 测量来判别 T 和 G 的量子线路。(引自arXiv: 1806.00463)

如图1所示,QuGAN 的量子线路主体包括两个部分,生成线路和判别线路,生成线路尽量去仿制T线路的波函数以达到以假乱真的效果,而判别器则通过一个量子线路尽可能的仅通过辅助比特的测量知道输入的波函数是真还是假。Loss函数可以写作

其中,

分别是来自 T 和 G 的样本的概率,
则是定义在辅助比特上的POVM测量中的一个投影算符,一般可以取
. 当
, 判别器完美工作的情况下,这个Loss函数等价于 trace distance 的定义,生成器希望减少这个distance, 判别器则希望增加这个 distance 以探测区别。在对抗训练中, 良好的判别器是训练生成器的前提. 以下讨论认为
恒成立。

具体的线路细节以及Loss函数的描述请见arXiv: 1806.00463。


代码实现

首先申明下,Yao最近将会发布0.3更新,会有更加丰富的API和GPU的支持。但是也面临着API不稳定的问题,建议安装master分支 ]add Yao#master 以及`]add QuAlgorithmZoo#master`。如果在尝试实现Tutorial代码的过程中遇到了问题,请以知乎评论或者issue的形式反馈。我会在发布0.3版本后系统的更新这个系列的代码。

using LinearAlgebrausing Yao
using QuAlgorithmZoo: random_diff_circuit, pair_ring"""
Quantum GAN.Reference:Benedetti, M., Grant, E., Wossnig, L., & Severini, S. (2018). Adversarial quantum circuit learning for pure state approximation, 1–14.
"""
struct QuGAN{N}target::ArrayReggenerator::AbstractBlock{N}discriminator::AbstractBlockreg0::ArrayRegwitness_op::AbstractBlockcircuit::AbstractBlockgdiffsddiffsfunction QuGAN(target::DefaultRegister, gen::MatrixBlock, dis::MatrixBlock)N = nqubits(target)c = Sequence([gen, addbits!(1), dis])witness_op = put(N+1, (N+1)=>ConstGate.P0)gdiffs = chain(collect_blocks(AbstractDiff, gen))ddiffs = chain(collect_blocks(AbstractDiff, dis))new{N}(target, gen, dis, zero_state(N), witness_op, c, gdiffs, ddiffs)end
end

首先,申明QuGAN结构体,其中witness_op是loss中的

项,这里定义为在辅助比特 (也就是第N+1个qubit)
态的投影的算符。
gdiffsddiffs分别记录了生成器和判别器的微分模块,这些微分模块可以用collect函数来自动获取,该函数做的事情是对Block Tree做深度有限的搜索,把特定类型的gate放入sequence里面并返回。 整个线路(变量circuit)包含生成器,增加一个qubit,判别器三部分。
"""loss function"""
loss(qcg::QuGAN) = p0t(qcg) - p0g(qcg)
"""probability to get evidense qubit 0 on generation set."""
p0g(qg::QuGAN) = expect(qg.witness_op, psi_discgen(qg)) |> real
"""probability to get evidense qubit 0 on target set."""
p0t(qg::QuGAN) = expect(qg.witness_op, psi_disctarget(qg)) |> real
"""generated wave function"""
psi(qg::QuGAN) = copy(qg.reg0) |> qg.generator
"""input |> generator |> discriminator"""
psi_discgen(qg::QuGAN) = copy(qg.reg0) |> qg.circuit
"""target |> discriminator"""
psi_disctarget(qg::QuGAN) = copy(qg.target) |> qg.circuit[2:end]
"""tracedistance between target and generated wave function"""
distance(qg::QuGAN) = tracedist(qg.target, psi(qg))[]

p0g函数计算Loss中的第二项

p0t则计算Loss中第一项

我们用trace distance作为衡量训练结果的好坏的最终标准。但trace distance实验的操作性不强,这时候可以用swap test来计算两个态的overlap,也是不错的选择。

"""obtain the gradient"""
function grad(qcg::QuGAN)ggrad_g = opdiff.(()->psi_discgen(qcg), qcg.gdiffs, Ref(qcg.witness_op))dgrad_g = opdiff.(()->psi_discgen(qcg), qcg.ddiffs, Ref(qcg.witness_op))dgrad_t = opdiff.(()->psi_disctarget(qcg), qcg.ddiffs, Ref(qcg.witness_op))[-ggrad_g; dgrad_t - dgrad_g]
end"""the training process"""
function train(qcg::QuGAN{N}, g_learning_rate::Real, d_learning_rate::Real, niter::Int) where Nng = length(qcg.gdiffs)for i in 1:niterg = grad(qcg)dispatch!(+, qcg.generator, -g[1:ng]*g_learning_rate)dispatch!(-, qcg.discriminator, -g[ng+1:end]*d_learning_rate)(i*20)%niter==0 && println("Step = $i, Trance Distance = $(distance(qcg))")end
end

量子线路对于可观测量的微分可以见三点一章节的讨论。

在训练中,这里简单的给generator和discriminator定了两个不同的learning rate,但是梯度方向是相反的。生成器会往下降 loss 的方向训练, 而判别器则往提升 loss 的方向训练, 判别器的 learning rate 一般要高一点才有助于收敛. 其实更加妥当的做法是, 内部加一个对discriminator的训练的loop,保证discriminator总是收敛。

nbit = 3
target = rand_state(nbit)
gen = dispatch!(random_diff_circuit(nbit, 2, pair_ring(nbit)), :random) |> autodiff(:QC)
discriminator = dispatch!(random_diff_circuit(nbit+1, 5, pair_ring(nbit+1)), :random) |> autodiff(:QC)
qcg = QuGAN(target, gen, discriminator)
train(qcg, 0.1, 0.2, 1000)

这里尝试学习一个3 qubit的量子随机态, 生成和判别用的线路深度分别为 2 和 5, 学习速率分别是 0.1 和 0.2. 如果运行顺利,将会看到如下结果

Step = 50, Trance Distance = 0.6342280675404924
Step = 100, Trance Distance = 0.2556083335074918
Step = 150, Trance Distance = 0.20588883282356
Step = 200, Trance Distance = 0.18588876599788512
Step = 250, Trance Distance = 0.14383386098057532
Step = 300, Trance Distance = 0.11122073204131669
Step = 350, Trance Distance = 0.12055174236882853
Step = 400, Trance Distance = 0.08476938309711918
Step = 450, Trance Distance = 0.055730139169513575
Step = 500, Trance Distance = 0.0658058630141474
Step = 550, Trance Distance = 0.030654404721949198
Step = 600, Trance Distance = 0.05670115284050363
Step = 650, Trance Distance = 0.026043726656018153
Step = 700, Trance Distance = 0.03717624105785262
Step = 750, Trance Distance = 0.018583002816583323
Step = 800, Trance Distance = 0.038243650242252694
Step = 850, Trance Distance = 0.02220738846752642
Step = 900, Trance Distance = 0.016162779109655048
Step = 950, Trance Distance = 0.0070184081980637705
Step = 1000, Trance Distance = 0.016831931463320904

我们发现trace distance的确可以下降,可以学到目标状态,但是收敛的并不快。也是所有基于GAN的方法的通病吧~

这里谈一下 QuGAN 的优点和缺点, 优点是结构简单, 形式也很酷, 有很多可以继续玩的东西. 缺点也很明显.

首先文章里面用到的 loss 和经典 GAN 的 loss 其实不一样, 这种不一样是由于求导方案必须要求最终的输出为可观测量这个约束导致的. 这也是为什么 arXiv: 1807.01235 和 arXiv: 1808.03425 会采用量子经典的对抗学习的方案.

其次, 这里的生成型模型生成的是量子力学波函数, 一般生成型包括很多量子生成型模型的目标都是得到经典数据, 比如 arXiv: 1804.04168中提到的 Born Machine. 但是这里连同波函数相位一起学习了, 学习难度也高了很多, 作为经典数据的生成器是做了无用功的. 但也要考虑到它的应用场景不一样.

最后, 所有 GAN 的通病, Modal Collapse, 收敛慢, 它都有, 所有量子变分线路的通病, 比如求导复杂度高 (比如经典深度学习 BP 方案的O(N), 它是O(N^2), 其中 N 为参数个数), 它也有.

虽然有这么多缺点, 但是毫无疑问, 它为理论学家们提供了很不错的新玩具!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python用xpath爬取10页网站图片

#爬取网站图片 import requests from lxml import etree import osi0 #计数 #请求头 headers{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64)AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.103 Safari/537.36"} for x in range(…

MacBook外接显示器的显示模式介绍及设置说明(分屏/多屏)

文章目录一、显示模式的介绍(一)扩展模式(程序员开发模式)(二)合盖模式(三)镜像模式(四)混合模式二、显示模式的设置(一)扩展模式设置…

aws fargate_借助Fargate和EKS,AWS甚至可以实现Cloud-ier和Kuberneties-ier

aws fargate在本周的re:Invent大会上,AWS宣布了很多很棒的事情。 您应该检查一下他们的页面 ,以了解他们正在做的所有新工作的概况–内容很多,而且很多看起来立即有用。 如果您想了解更多信息,我的同事凯利安德鲁斯&am…

关键词分词工具_快图制作工具 | 如何制作词云图?

点击蓝字关注我们如何制作词云图?首先,我们需要对“词云”有个简单的概念。“词云”这个概念最先由美国西北大学新闻学副教授、新媒体专业主任里奇戈登(Rich Gordon)提出。“词云”(别名:文字云,外文名:wordle)即由词汇…

机器学习西瓜书各章详细目录定位

第一章 绪论 1.1 引言(P1) 1.2 基本术语(P2) 1.3 假设空间(P4) 1.4 归纳偏好(P6) 1.5 发展历程(P10) 1.6 应用现状(P13) 1.7 阅读材料(P16) 第二章 模型评估与选择 2.1 经验误差与过拟合(P23) 2.2 评估方法(P24) 2.2.1 留出法 2.2.2 交叉验证法 2.2.3 自助法 2.3 性能…

表达式中常用到的运算符

文章目录分组一元运算符算数运算符逻辑移位按位“与”按位“或”按位“异”赋值表达式分隔符分组 () 一元运算符 ! ~ - 算数运算符 * / % - 逻辑移位 << >> 按位“与” & 按位“或” | 按位“异” ^ 赋值 * / % - & ^ | << >>…

openhub_OpenHub框架–下一个有趣的功能

openhub这是有关OpenHub框架系列的第三篇文章-第一篇介绍OpenHub框架 &#xff0c;第二篇介绍异步消息传递模型 。 该系列的最后一篇文章将更详细地介绍其他一些有趣的功能&#xff0c;并说明为什么OpenHub可以成为您的集成项目的理想选择的原因。 节流 节流是一种功能&#…

Numpy常用基础

生成Numpy的一维数组 xnp.array([1.0,2.0,3.0]) #生成数组 print(x) xnp.array([1.1,2.2,3.3]) print(y.round(1)) #矩阵的结果保留一位小数#结果 [1. 2. 3.] #生成的数组默认省略小数点后面的0 [1.1 2.2 3.3]Numpy数组的算术运算 xnp.array([1,2,3]) ynp.array([4,5,6]) …

售票系统的组件图和部署图_识读配电箱系统图

配电箱确实有很多字母&#xff0c;要熟悉这些字母的基本含义&#xff0c;才能更准确地知道配电箱系统图的意思。网上查了一些资料&#xff0c;发现配电箱中的字母实在是太多了&#xff0c;先简单说几个需要基本认识的字母&#xff1a;GCK、GCS、MNS是低压抽出式开关柜&#xff…

Linux命令之 -- export 设置/显示系统环境变量

文章目录一、命令介绍二、export 的原理&#xff08;一&#xff09;什么是进程&#xff08;二&#xff09;父子进程关系&#xff08;三&#xff09;子 shell 如何访问父 shell 的变量&#xff08;export 实现原理&#xff09;&#xff08;四&#xff09;父 shell 如何访问子 sh…

packt_Packt和Java Code Geeks提供的$ 5 Java编程书籍!

packt你好&#xff0c;极客&#xff01; 今天&#xff0c;我们为您带来一些激动人心的消息&#xff01; Java Code Geeks和Packt联手为您提供广泛的书籍库每周折扣。 对于开发人员来说&#xff0c;Java仍然是最强大的选择之一&#xff0c;它是定义企业和移动设备的语言。 本…

Matplotlib常用库方法

模块pyplot常用方法 import matplotlib.pyplot as plt #pyplot模块包含很多用于生成图表的函数plt.plot(x,y,format_string) #x,y分别为x轴y轴的坐标值&#xff0c;第三个参数是风格&#xff0c;具体去查&#xff0c;这方法的参数很麻烦 plt.xlabel(x,fontsize14) #显示x轴的…

MacBook 如何一次性关闭所有程序的通知消息

特别反感应用程序经常弹出通知消息&#xff0c;挨个去关闭应用程序的通知消息又特别麻烦&#xff0c;可以打开『勿扰模式』&#xff0c;这就可以屏蔽掉所有的通知消息了。

反射获取list泛型_Android 从浅到懂使用反射机制

定义Java 反射机制是发生在运行状态中&#xff0c;对于任何一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任何一个对象&#xff0c;都能够调用它的任意方法和属性&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为 Java 语言的反射机制。使用…

谷歌 recaptcha_在Spring Boot应用程序中使用Google reCaptcha

谷歌 recaptcha介绍 Google的reCaptcha是一个库&#xff0c;用于防止漫游器将数据提交到您的公共表单或访问您的公共数据。 在本文中&#xff0c;我们将研究如何将reCaptcha与基于Spring Boot的Web应用程序集成 设置验证码 您应该从管理面板创建API密钥。 您必须创建一个示例…

数学建模python教材推荐_数模竞赛专攻python应该准备什么?

想起以前打开Matlab就不忍心关掉的阴影(无SSD打开及其慢)。没有什么非要二选一&#xff0c;喜欢哪个用哪个都行&#xff0c;两个都试试比一比也行&#xff0c;比赛更不会关心你的结果图哪儿来的(小孩才。。。大人全都。。。)。Matlab有Matlab的好处&#xff0c;非常成熟的软件包…

python中if __name__ == ‘__main__‘:的简单理解

举例说明&#xff0c;这里有两个模块 # ni模块 print("这是1.") if __name__ __main__:print("这是2.")输出结果: 这是1.这是2. #wo模块 import ni print("这是3.")输出结果: 这是1这是3 总结&#xff1a; 运行自己的模块时会运行if _…

Linux 命令之 wget -- 下载文件工具

文章目录一、命令介绍二、命令语法三、常用选项四、命令示例&#xff08;一&#xff09;下载并以不同的文件名保存&#xff08;二&#xff09;下载单个文件&#xff08;三&#xff09;限速下载&#xff08;四&#xff09;断点续传&#xff08;五&#xff09;使用 wget 后台下载…

创建react应用程序_使用SpringWebFlux的React式Web应用程序

创建react应用程序1.React式编程简介 React式编程是为具有以下特征的应用程序创造的术语&#xff1a; 非阻塞应用 事件驱动和异步 需要少量线程来垂直扩展&#xff08;即在JVM中&#xff09; 就像面向对象的编程&#xff0c;函数式编程或过程式编程一样&#xff0c;React式…

获取当地天气_Mac 天气预报动态壁纸工具Living Weather HD 4.4.4

这款独特的非凡应用程序将天气呈现在您的桌面上&#xff0c;它能够预报天气状况&#xff0c;并在桌面上使用相应的美丽动态壁纸场景。 天气HD也可以用作屏保。 主要功能&#xff1a; ● 在桌面上了解世界各地当前的天气状况和未来状况 ● 与当前天气状况、今天或明天预报相应的…