理论基础

之前我们介绍了强化学习

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

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

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生成另外一个波函数
,得到这个波函数的尽可能与目标线路产生的态相似, 也就是
。那么为什么要学习一个量子线路产生量子力学波函数呢?一个原因是量子波函数具有不可克隆的特性,为了能够随时随地复现它,一个好的想法就是把能够产生这个波函数的随机线路的参数,用经典浮点数把它保存在磁盘上。
图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 为参数个数), 它也有.

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

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

  1. axis2生成客户端代码_利用ApiPost一键、快速生成接口文档!女猿也过38节!

    对于我们这些程序员和程序媛来讲,最头疼的莫过于写文档. 我们可都是正个八经的理工校草和理工女神,研究github.逛逛csdn.写hello world是才我们的拿手菜,写文档是文科生的事情好不啦?( ...

  2. xml生成java代码_在Eclipse中从XML生成Java代码

    这正是模型到文本(M2T)项目中的JET组件的用途.实际上,您甚至可以使用JET创建项目,.classpath和任何其他文件. Jet模板如下.请注意,这些模板必须完全按照所示命名. /templat ...

  3. 利用R,G,B三通道对图像分别生成mask并叠加,最终得到背景和书两种区域

    利用R,G,B三通道对图像分别生成mask并叠加,最终得到背景和书两种区域 实验室的学长TQL,这个三色道方法是他教我的 import os import os.path as osp import ...

  4. python灰度图生成g代码_artcam pro 通过灰度图生成G代码详细图文教程

    本文是使用artcam pro 把灰度图转成G代码,看到喜欢的雕刻,可以自己先做成灰度图,然后转换成G代码,今天特地做了一个教程,仅供刚刚接触者使用! 新手可以看看,老手请高抬贵手,不要嘲笑.自己技术 ...

  5. 套料排版代码python_雕刻机排版下料套料软件,可生成G代码格式和DXF图形、木工下料...

    橱柜门自动排版软件现已升级为2017版本,新增排版完成后版面显示详细订单尺寸,省去人为测量麻烦,废料可以入后期的排版当中继续自动排版,板材优化率比2014更加优化,搜索精度更高,避免频繁换刀操作,单头 ...

  6. python灰度图生成g代码_Python打造一个在线G代码生成器

    用tornado框架做后端--,用bootstrap做前端 先上效果图: 生成出来的G代码: g.py源码: #coding=utf-8 # -*- coding: UTF-8 -*- #!/usr/ ...

  7. python灰度图生成g代码_Artcam2009利用灰度图生成雕刻机所需的G代码

    双击桌面的artcam快捷方式图标打开软件首先看到如下 的界面.点击"通过图像产生模型" 利用ART CAM 软件制作浮雕刀路的方法 Artcam2009利用灰度图生成雕刻机所需的 ...

  8. aixs1 生成java代码_通过axis1.4 来生成java客户端代码

    1.首先下载axis-1.4所有的jar包, 2.我是直接打开cmd,进入到该jar包的目录下, 3.直接运行命令(运行这个命令之前要确定java的环境变量都已配置好): java -Djava.ex ...

  9. wsdl2java生成客户端代码_利用wsdl2java工具生成webservice的客户端代码

    1.JDK环境 2.下载apache-cxf发布包:http://cxf.apache.org/download.html 目前最新版本为3.2.6, 解压后如下: 解压发布包,设置CXF_HOME, ...

最新文章

  1. Spring Autowired 注入失败总是Null
  2. 十六款值得关注的NoSQL与NewSQL数据库--转载
  3. 软件架构设计原则和大数据平台架构层
  4. 成功解决OSError: dlopen() failed to load a library: cairo / cairo-2 / cairo-gobject-2 / cairo.so.2
  5. Jerry Wang诚邀广大SAP同仁免费加入我的知识星球,共同探讨SAP技术问题
  6. 持续20年,一场威胁Linux存亡的诉讼终结束
  7. 工作87:element-ui el-table sortable属性 参数详解
  8. cisco学习笔记(6)-acl
  9. android架构图示
  10. EMNLP 2017 北京论文报告会笔记
  11. 图像处理-线性滤波-2 图像微分(1、2阶导数和拉普拉斯算子)
  12. cad导出pdf_手机如何一键分享CAD图纸?(差点成了背锅大侠)
  13. Win 双网卡上网冲突,网络设置
  14. matlab 提高运行速度,提高matlab运行速度
  15. RestTemplate.exchange各种用法(包括泛型等 --全)
  16. October 2019 Twice SQL Injection
  17. GLCC编程夏令营——LMP课题 周会分享
  18. 关于在 firefox 主页自定义背景可以用的图片
  19. 图片的轮播(轮播图)
  20. html背景音乐加载太慢,HTML插入背景音乐方法【全】

热门文章

  1. jvm高并发_JVM上的高并发HTTP客户端
  2. 存储过程 锁定并发_Java并发教程–锁定:显式锁定
  3. jmh 基准测试_JMH:如何设置和运行JMH基准
  4. 赞扬精心设计:基于属性的测试如何帮助我成为更好的开发人员
  5. 与OutOfMemoryError相关的JVM参数
  6. 保存您的lambda,以备不时之需-保存到文件
  7. Java 11即将发布的功能–启动单文件源程序
  8. JUnit 5 –基础
  9. JSP,JSF和EL简介
  10. 如果今天完成,ESB会是什么样子?