哪些是AI框架
AI框架是AI算法模型设计、训练和验证的一套标准插口、特性库和工具包,集成了算法的封装、数据的调用以及估算资源的使用,同时面向开发者提供了开发界面和高效的执行平台,是现阶段AI算法开发的必备工具。
AI框架负责给开发者提供完善神经网路模型的物理操作,把复杂的物理抒发转换成计算机可辨识的估算图,手动对神经网路进行训练,得到一个神经网路模型用于解决机器学习短发类、回归的问题,实现目标分类、语音辨识等应用场景。
主流AI框架热度排行
国外外AI框架在上的数据情况:
按照上表可知,的各项指标在AI框架中都是名列前茅的,而且和第二名的差别十分大,是全球目前活跃度最高、应用最广的AI框架。在排名榜中的第二名是,近几年在学术领域的表现比较亮眼,有很大的发展潜力,但总体而言,与有些差别。
聚焦于国外,目前是活跃度最高的框架,在贡献者的规模上也积累了一定的群体;排行第二的是,由于开源较早,早已积累了不小的优势,主要集中于点赞数目及贡献者规模上,但在整体活跃度上,稍劣于。
不过假如我们对国外最大的开源代码平台Gitee的数据进行剖析以后可以发觉,各项数据都远超其他框架,说明它近来在国外是关注度以及被应用最多的AI框架,发展的势头很猛。数据如下表:
主流AI框架介绍1.
(以下简称TF)是一个核心开源库,一个端到端的开源机器学习平台,在2015年11月由设计研制并开源。它拥有一个全面而灵活的生态系统,由编程语言编撰,包含各类工具、库和社区资源,可以帮助用户开发和训练机器学习模型,促使先进机器学习技术的发展。
TF可以轻松地安装在、MacOS以及Linux等主流操作系统上,用户甚至可以直接在浏览器中运行Colab电脑来快速上手,它还能帮助开发者轻松地建立和布署由机器学习提供支持的应用。但它丰富多样的API,也为新用户的上手提升了门槛。
目前对于工业环境有着建立的模型训练与布署的解决方案,所以在这种领域内,它的占有率也是最高的。同时TF可以轻松地使用高阶KerasAPI建立和训练模型,对于小型的机器学习训练任务,可以使用API在不同的硬件配置上进行分布式训练,而无需修改模型定义量子物理学基础知识网络图,大大地便捷了用户。
凭着着TF强悍而可靠的机器学习能力,研究人员可以建立和训练先进的模型,而且不会增加速率或性能。利用KerasAPI和ModelAPI等功能,TF可以助我们灵活地创建复杂拓扑并实现相关控制。
2.
是一个基于Torch的开源机器学习库,底层由C++实现,应用于人工智能领域,如自然语言处理等。它主要由的人工智能研究团队开发,自2017年开源以来,相继推出了与Numpy互转、与的融合、支持系统、ONNX转换、的发布、支持、分布式训练等功能。除了就能实现强悍的GPU加速,同时还支持动态神经网路,是目前市面上好多主流框架都不支持的。
提供了两个中级功能:
具有强悍的张量估算,可以使用GPU加速包含手动导数系统的深度神经网路
相较于来说,不是必须先建立一个神经网路,之后在想要改变网格的结构时就须要从头建立的操作方法。它通过反向导数技术,可以让用户零延后地任意改变神经网路的行为,灵活性是它最大的一个特点。并且的编程API风格简洁,直观易懂,也便捷新用户上手。
但由于还处于成长阶段,所以在全面性上还处于劣势,例如它还不支持快速傅里叶、沿维翻转张量和检测无穷与非数值张量等等功能;针对联通端和嵌入式布署等等性能表现方面,也还须要提供的空间。
3.(昇思)
是华为2019年8月推出的新一代全场景AI估算框架,于2020年3月28日开源。它的推出致力实现易开发、高效执行、全场景覆盖三大目标,其中易开发表现为API友好、调试难度低;高效执行包括估算效率、数据预处理效率和分布式训练效率;全场景则指框架同时支持云、边缘以及端侧场景。
具体来说,可以提供简单的开发体验,帮助开发者实现网路手动切分,只需串行抒发能够实现并行训练,增加开发门槛同时简化开发流程。同时它有灵活的调试模式,具备训练过程静态执行和动态调试能力,开发者通过变更一行代码即可切换运行模式,快速在线定位问题。而且它的适用范围也十分广,支持云、边缘和手机上的快速布署,实现更好的资源借助和隐私保护,让开发者专注于AI应用的创造。
凭着底层编译化手段,估算图的运行效率也很高,同时它还先后支持了强化版可视化功能、差分隐私、二阶优化算法、图神经网路、量化训练、混合异构、、PS分布式训练、、调试器等等功能。为促进人工智能软硬件应用生态的发展作出了贡献。
4.(飞桨)
在2016年8月由百度进行开源,是国外AI框架最早的探求与弘扬者。它支持申明式、命令式编程,兼顾开发灵活、高性能;网路结构手动设计,模型疗效赶超人类专家,开发上去方便就能提高效率。兼容多种开源框架训练的模型,不同构架的平台设备轻松布署推理速率全面领先。开源丰富算法和预训练模型,包括国际大赛亚军模型,快速推动产业应用。
的迭代节奏很快,目前为止,早已支持了全流程能力支持、大规模异步分布式训练等等新功能,.0还提供了Suite,支持了、PARL、、、等功能。
在国外,的社区也比较活跃,生态链也很完整完整,借助百度云的加持,对于国外的用户应用还是十分友好的。目前似乎也不乏有OPPO、京东货运以及度小满等国外厂商进行布署,但主要用户还是个人开发者居多。
AI框架用于量子技术
我们这儿以目前国内及国外使用率排行前列的两个AI框架来作为事例进行说明。
(TFQ)是一个量子机器学习库,可用于快速设计量子-精典机器学习混和模型的原型。研究人员在研究量子算法和应用时,可以借助的量子估算框架,而所有的这种框架都可以在中找到。
着重于量子数据和建立量子-精典混和模型。它集成了在Cirq中设计的量子估算算法和逻辑,并提供与现有API兼容的量子估算基元,还提供高性能量子电路模拟器。

安装
有多种可选择的版本可供安装。这儿我们选择稳定版:
pip3 install -U tensorflow-quantum
由于TF以编程语言为基础,所以我们还要设置.8开发环境:
sudo apt update
sudo apt-get install pkg-config zip g++ zlib1g-dev unzip python3.8
sudo apt install python3.8 python3.8-dev python3.8-venv python3-pip
python3.8 -m pip install --upgrade pip
接着为TFQ开发创建一个虚拟环境:
python3.8 -m venv quantum_env
source quantum_env/bin/activate
此后安装TF依赖项:
pip install -U pip six numpy wheel setuptools mock 'future>=0.17.1'
pip install -U keras_applications --no-deps
pip install -U keras_preprocessing --no-deps
pip install numpy==1.19.5
接着建立pip软件包并安装:
./configure.sh
bazel build -c opt --cxxopt="-O3" --cxxopt="-march=native" --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" release:build_pip_package
bazel-bin/release/build_pip_package /tmp/tfquantum/
python3 -m pip install /tmp/tfquantum/name_of_generated_wheel.whl
这般,安装完毕,环境也已调试好,可以运行测试代码瞧瞧实际情况:
./scripts/test_all.sh
运行示例
我们以二补码分类为例,瞧瞧是怎样完成相关操作的。我们晓得二补码分类是机器学习中的一项基本任务,也可以应用于量子数据,作为一个精典混和量子模型的最小示例。
我们首先为单个量子比特上的区域提供一个二元分类器,X与Y是其中的两个随机向量。选择布洛赫球面,围绕这两个向量,我们随机抽取两组量子数据积分,让机器学会怎样分辨这两组积分。
第一步,生成量子数据,我们可以使用Cirq完成此任务,具体操作如下:
import cirq , random , sympy
import numpy as np
import tensorflow as tf
import tensorflow_quantum as tfq
借助下边的函数生成量子数据集;标签使用单次编码:
def generate_dataset (
qubit , theta_a , theta_b , num_samples ):
q_data = []
labels = []
blob_size = abs( theta_a - theta_b ) / 5
for _ in range ( num_samples ):
coin = random . random () spread_x ,
spread_y = np . random . uniform (
- blob_size , blob_size , 2)
if coin < 0.5:
label = [1 , 0]
angle = theta_a + spread_y
else :
label = [0 , 1]
angle = theta_b + spread_y
labels . append ( label )
q_data . append ( cirq . Circuit (
cirq . Ry (- angle )( qubit ) ,
cirq . Rx (- spread_x ) ( qubit )) )
return ( tfq . convert_to_tensor ( q_data ) ,
np . array ( labels ))
我们可以在以后生成一个数据集和相关的标签,选择一些参数值:
qubit = cirq . GridQubit (0 , 0)
theta_a = 1
theta_b = 4
num_samples = 200
q_data , labels = generate_dataset (
qubit , theta_a , theta_b , num_samples )
将那些参考值作为我们的量子参数模型,使用最简单的通用量子鉴定器[43,66]的情况,单参数化旋转(线性)和沿Z轴(非线性)检测数据:
theta = sympy . Symbol (’theta ’)
q_model = cirq . Circuit ( cirq . Ry ( theta ) ( qubit ))
q_data_input = tf . keras . Input (
shape =() , dtype = tf . dtypes . string )
expectation = tfq . layers . PQC (
q_model , cirq .Z( qubit ))
expectation_output = expectation ( q_data_input )
旋转门的目的是为了使输入的量子数据叠加效应最小化,这样我们就可以从检测中最大限度的获得有用信息。之后我们将这个量子模型附加到一个小的分类器NN中完成所需的混和模型:
classifier = tf . keras . layers . Dense (
2, activation = tf . keras . activations . softmax )
classifier_output = classifier (
expectation_output ) model = tf . keras . Model ( inputs = q_data_input ,
outputs = classifier_output )
我们可以在量子数据上对这个混和模型进行训练。下边我们使用标签和预测数据之间的交叉熵作为损失函数,建立精典神经网路,选择ADAM优化器进行参数更新:
optimizer = tf . keras . optimizers . Adam (
learning_rate =0.1)
loss = tf . keras . losses . CategoricalCrossentropy ()
model . compile ( optimizer = optimizer , loss = loss )
history = model . fit (
x= q_data , y= labels , epochs =50)
最后我们可以用训练好的混和模型来对新的量子数据点进行分类:
test_data , _ = generate_dataset (
qubit , theta_a , theta_b , 1)
p = model . predict ( test_data ) [0]
print (f" prob (a)={p [0]:.4 f}, prob (b)={p [1]:.4 f}")
(量桨)
(量桨)是基于百度飞桨开发的量子机器学习工具集,支持量子神经网路的搭建与训练,提供易用的量子机器学习开发套件与量子优化、量子物理等前沿量子应用工具集,致使百度飞桨也因而成为国外首个支持量子机器学习的深度学习框架。
量桨构建起了人工智能与量子估算的桥梁,通过百度飞桨深度学习平台赋能量子估算,为领域内的科研人员以及开发者方便地开发量子人工智能的应用提供了强有力的支撑,同时也为广大量子估算爱好者提供了一条可行的学习途径。
量桨有丰富的在线教程,并才能通过模板高效搭建量子神经网路,再者还带有手动微分框架,满足轻松上手的需求;量桨的功能也十分的丰富,提供多种优化工具和GPU模式,高性能模拟器支持25+量子比特的模拟运算量子物理学基础知识网络图,且支持多种噪音模型的模拟;量桨还提供了十分有特色的工具集功能,提供了组合优化和量子物理等前沿领域的估算工具箱,提供了分布式量子信息处理模组,再者还提供了自研的多种量子机器学习算法。
安装
在安装时,可以通过以下方法安装:
pip install paddle-quantum
或则下载所有文件后,在本地进行安装:
git clone http://github.com/PaddlePaddle/quantum
cd quantum
pip install -e .
由于的模型是基于完成的,所以在执行量子物理操作前,须要安装包(建议安装在.8环境中)。安装命令为:
conda install psi4 -c psi4 -c conda-forge
当所有打算工作完成后,我们可以通过简单运行一些代码来验证是否成功配置好了的环境。这儿我们以量子近似优化算法(QAOA)为例。
cd paddle_quantum/QAOA/example
python main.py
假如可以成功运行,说明各项组件都已安装完毕,我们就可以运行整个系统来进行量子模拟了。
运行示例
目前业界普遍觉得,量子估算在处理量子物理问题上会有特别大的发展前景,而变分量子本征求解器(VQE)就是这个方向上的核心应用之一。接出来我们将演示怎么使用量桨完成相关问题的操作。
以解决氢分子H2能级能量问题为例,我们首先须要建立相关的量子物理工具包:
import paddle
import paddle_quantum.qchem as qchem
from paddle_quantum.loss import ExpecVal
from paddle_quantum import Hamiltonian
from paddle_quantum.state import zero_state, State
from paddle_quantum.ansatz import Circuit
from paddle_quantum.linalg import dagger
from paddle_quantum import Backend
import os
import matplotlib.pyplot as plt
import numpy
from numpy import pi as PI
from numpy import savez, zeros
# 无视警告
import warnings
warnings.filterwarnings("ignore")
对于具体剖析的分子,我们须要其几何构象、基组、多中度以及分子的净电荷数等多项信息来建模估算出该分子单体积分,双体积分以及乌鲁木齐顿量等信息。接出来,通过量桨的量子物理工具包将分子的喀什顿量提取下来并存储为的类,便捷下一步操作:
geo = qchem.geometry(structure=[['H', [-0., 0., 0.0]], ['H', [-0., 0., 0.74]]])
# geo = qchem.geometry(file='h2.xyz')
# 将分子信息存储在 molecule 里,包括单体积分(one-body integrations),双体积分(two-body integrations),分子的哈密顿量等
molecule = qchem.get_molecular_data(
geometry=geo,
basis='sto-3g',
charge=0,
multiplicity=1,
method="fci",
if_save=True,
if_print=True
)
# 提取哈密顿量
molecular_hamiltonian = qchem.spin_hamiltonian(molecule=molecule,
filename=None,
multiplicity=1,
mapping_method='jordan_wigner',)
# 打印结果
print("nThe generated h2 Hamiltonian is n", molecular_hamiltonian)
输出结果为:
FCI energy for H2_sto-3g_singlet (2 electrons) is -1.137283834485513.
The generated h2 Hamiltonian is
-0.09706626861762556 I
-0.04530261550868938 X0, X1, Y2, Y3
0.04530261550868938 X0, Y1, Y2, X3
0.04530261550868938 Y0, X1, X2, Y3
-0.04530261550868938 Y0, Y1, X2, X3
0.1714128263940239 Z0
0.16868898168693286 Z0, Z1
0.12062523481381837 Z0, Z2
0.16592785032250773 Z0, Z3
0.17141282639402394 Z1
0.16592785032250773 Z1, Z2
0.12062523481381837 Z1, Z3
-0.2234315367466399 Z2
0.17441287610651626 Z2, Z3
-0.2234315367466399 Z3
其实,在实现VQE的过程中,我们首先须要设计量子神经网路QNN(即参数化量子电路)来打算试探波函数()|Ψ(θ)〉,我们采用的电路图如图所示,实线框为第一层:
接出来,按照上图中的电路设计,通过的类和外置的()电路模板来高效搭建量子神经网路。
def U_theta(num_qubits: int, depth: int) -> Circuit:
"""
Quantum Neural Network
"""
# 按照量子比特数量/网络宽度初始化量子神经网络
cir = Circuit(num_qubits)
# 内置的 {R_y + CNOT} 电路模板
cir.real_entangled_layer(depth = depth)
# 铺上最后一列 R_y 旋转门
cir.ry()
return cir
完成数据和量子神经网路的构架以后,我们须要定义训练参数、模型和损失函数。其中损失函数公式如下:
min_{θ}{L(θ)}=min_{θ}〈Psi(θ)|H|Psi(θ)〉=min_{θ}sum_{k}{c_k}〈Psi(theta)|⨂_{j}{sigma_j}^{(k)}|Psi(theta)〉
class StateNet(paddle.nn.Layer):
"""
Construct the model net
"""
def __init__(self, num_qubits: int, depth: int):
super(StateNet, self).__init__()
self.depth = depth
self.num_qubits = num_qubits
self.cir = U_theta(self.num_qubits, self.depth)
# 定义损失函数和前向传播机制
def forward(self):
# 运行电路
state = self.cir(init_state)
# 计算损失函数
loss = loss_func(state)
return loss, self.cir
完成损失函数的定义后,我们就可以进行量子神经网路的训练了,不过在那之前,还须要设置一下超参数。通常来说,主要是学习速度、迭代次数和量子神经网路估算模块的深度等等。
ITR = 80 # 设置训练的总迭代次数
LR = 0.4 # 设置学习速率
D = 2 # 设置量子神经网络中重复计算模块的深度 Depth
N = molecular_hamiltonian.n_qubits # 设置参与计算的量子比特数
当训练模型的参数都设置完成后,我们将数据转化为中的张量,从而进行量子神经网路的训练:
# 确定网络的参数维度
net = StateNet(N, D)
# 一般来说,我们利用Adam优化器来获得相对好的收敛,
# 当然你可以改成SGD或者是RMS prop.
opt = paddle.optimizer.Adam(learning_rate=LR, parameters=net.parameters())
# 定义初始态
init_state = zero_state(N)
# 定义损失函数
loss_func = ExpecVal(molecular_hamiltonian)
# 记录优化结果
summary_iter, summary_loss = [], []
# 优化循环
for itr in range(1, ITR + 1):
# 前向传播计算损失函数
loss, cir = net()
# 在动态图机制下,反向传播极小化损失函数
loss.backward()
opt.minimize(loss)
opt.clear_grad()
# 更新优化结果
summary_loss.append(loss.numpy())
summary_iter.append(itr)
# 打印结果
if itr % 20 == 0:
print("iter:", itr, "loss:", "%.4f" % loss.numpy())
print("iter:", itr, "Ground state energy:", "%.4f Ha"
% loss.numpy())
if itr == ITR:
print("n训练后的电路:")
print(cir)
# 储存训练结果到 output 文件夹
os.makedirs("output", exist_ok=True)
savez("./output/summary_data", iter = summary_iter,
energy=summary_loss)
最后的输入结果为:
iter: 20 loss: -1.0700
iter: 20 Ground state energy: -1.0700 Ha
iter: 40 loss: -1.1309
iter: 40 Ground state energy: -1.1309 Ha
iter: 60 loss: -1.1362
iter: 60 Ground state energy: -1.1362 Ha
iter: 80 loss: -1.1372
iter: 80 Ground state energy: -1.1372 Ha
训练后的电路:
--Ry(7.856)----*--------------x----Ry(4.698)----*--------------x----Ry(6.277)--
| | | |
--Ry(1.548)----x----*---------|----Ry(-1.56)----x----*---------|----Ry(5.041)--
| | | |
--Ry(3.441)---------x----*----|----Ry(4.474)---------x----*----|----Ry(1.745)--
| | | |
--Ry(-0.17)--------------x----*----Ry(1.646)--------------x----*----Ry(3.152)--
至此,我们完成了量子神经网路的训练,通过VQE得到的能级能量恐怕值大约是E0≈−1.137Ha,这与通过psi4在sto-3g基底下,使用FCI方式得到的能级能量值E0=−1.在物理精度的角度上来说是相符合的。
测试疗效代码展示如下:
result = numpy.load('./output/summary_data.npz')
eig_val, eig_state = numpy.linalg.eig(
molecular_hamiltonian.construct_h_matrix())
min_eig_H = numpy.min(eig_val.real)
min_loss = numpy.ones([len(result['iter'])]) * min_eig_H
plt.figure(1)
func1, = plt.plot(result['iter'], result['energy'],
alpha=0.7, marker='', linestyle="-", color='r')
func_min, = plt.plot(result['iter'], min_loss,
alpha=0.7, marker='', linestyle=":", color='b')
plt.xlabel('Number of iteration')
plt.ylabel('Energy (Ha)')
plt.legend(handles=[
func1,
func_min
],
labels=[
r'$leftlangle {psi left( {theta } right)} '
r'right|Hleft| {psi left( {theta } right)} rightrangle #39;,
'Ground-state energy',
], loc='best')
plt.text(-15.5, -1.145, f'{min_eig_H:.5f}', fontsize=10, color='b')
#plt.savefig("vqe.png", bbox_inches='tight', dpi=300)
plt.show()
同时,我们可以借助VQE的数据完成检测原子间的最小间隔是在哪些距离发生的,右图展示的是借助检测所得的最小氢原子间隔:
可以看见,最小值确实发生在d=74pm附近,这个间隔就是真实原子间隔,这与物理中氢原子间原子间隔为74pm特别的相仿,说明实验数据是确切的。
参考链接:
量桨-()简介-官方教程英文版
