You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Qiskit的ADAM优化器中获取优化过程的中间步骤?

获取Qiskit v0.45.2 ADAM优化器训练VQC的中间步骤

在Qiskit v0.45.2中,虽然官方文档未专门提及,但可以通过两种方式实现类似PyTorch/TensorFlow的回调功能,获取优化过程的中间训练信息:

方法1:利用Optimizer.minimize的callback参数

Qiskit所有优化器(包括内置ADAM)的minimize方法都支持callback参数。你可以定义一个自定义函数,每次迭代后该函数会被自动调用,传入当前迭代次数、参数值、损失值等关键数据。

示例代码:

from qiskit.algorithms.optimizers import ADAM
from qiskit_machine_learning.algorithms import VQC
from qiskit.circuit.library import TwoLocal
from qiskit.primitives import Sampler
import numpy as np

# 假设已准备好数据集X(特征)、y(标签)
X = np.random.rand(10, 2)
y = np.random.randint(0, 2, 10)

# 定义量子电路与VQC核心组件
ansatz = TwoLocal(num_qubits=2, rotation_blocks='ry', entanglement_blocks='cz')
sampler = Sampler()
vqc = VQC(
    sampler=sampler,
    ansatz=ansatz,
    loss='cross_entropy'
)

# 自定义损失函数,复用VQC的内部计算逻辑
def loss_func(params):
    predictions = vqc._neural_network.forward(X, params)
    return vqc._loss(y, predictions)

# 初始化训练历史记录容器
training_history = []

# 定义回调函数:记录/打印每一步的训练信息
def callback(eval_count, params, value, meta):
    training_history.append({
        'iteration': eval_count,
        'params': params.tolist(),
        'loss': float(value)
    })
    print(f"Iteration {eval_count}: Loss = {value:.4f}")

# 初始化ADAM优化器与初始参数
adam = ADAM(maxiter=100, lr=0.01)
initial_params = ansatz.random_parameters()

# 启动优化并传入回调函数
optim_result = adam.minimize(
    fun=loss_func,
    x0=initial_params,
    callback=callback
)

# 训练完成后,training_history中存储了所有中间步骤数据
# print(training_history)

方法2:手动实现优化循环(更高灵活性)

如果需要对每一步优化做精细控制,可以手动循环执行优化步骤,自行计算损失、更新参数并记录中间状态。ADAM优化器提供了step方法支持单次参数更新:

示例代码:

from qiskit.algorithms.optimizers import ADAM

# 初始化ADAM优化器与状态
adam = ADAM(maxiter=100, lr=0.01)
optimizer_state = adam.init_state()

current_params = ansatz.random_parameters()
training_history = []

# 手动执行100次优化迭代
for iter_num in range(1, 101):
    # 计算当前参数下的损失值
    current_loss = loss_func(current_params)
    # 记录当前训练状态
    training_history.append({
        'iteration': iter_num,
        'params': current_params.tolist(),
        'loss': float(current_loss)
    })
    print(f"Iteration {iter_num}: Loss = {current_loss:.4f}")
    
    # 执行单次优化步骤,更新参数与优化器状态
    current_params, optimizer_state = adam.step(
        fun=loss_func,
        x=current_params,
        state=optimizer_state
    )

# 记录最终训练状态
final_loss = loss_func(current_params)
training_history.append({
    'iteration': 101,
    'params': current_params.tolist(),
    'loss': float(final_loss)
})

两种方法均能满足需求:方法1简洁高效,适合常规场景;方法2适合需要插入自定义逻辑(如早停、参数校验)的复杂训练流程。

内容的提问来源于stack exchange,提问作者user23385971

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:23:10