Closed ikanago closed 2 years ago
見ました。とりあえずpennylaneのチュートリアルにあった2qubitの回路を使うというので了解しました。また別の PR とかで違う量子回路を使って量子ビット数に対する時間の変化を見れればいいかなと思います。以下コメントです。
量子回路構成を pennylane のチュートリアルに合わせる
この実装では pennylane の回路は自動微分による誤差逆伝播を使っているので,勾配を使わない optimizer を使えば両方の実装を揃えられると思います.ドキュメントを探して試してみます.
epoch 数も双方で合わせていただきたいです
skqulacs の QNNRegressor
に渡す maxiter
が pennylane の実装における epoch に対応しているというので合っていますか?
skqulacs はミニバッチに対応していないので,pennylane の実装でミニバッチのサイズを1にすれば揃えられる思います.
このベンチマークが測っている時間って、binary_classification_pennylane() と binary_classification_skqulacs() が実行される時間であってますか?そうすると skqulacs のほうはデータや回路生成部が時間に入ってしまっていて若干不利になっているように見える
これはその通りなので,データセットを整える部分は外に出すようにします.
回路に関してですが、pennylane は
def prepare_state(a):
qml.RY(a[0], wires=0)
qml.CNOT(wires=[0, 1])
qml.RY(a[1], wires=1)
qml.CNOT(wires=[0, 1])
qml.RY(a[2], wires=1)
qml.PauliX(wires=0)
qml.CNOT(wires=[0, 1])
qml.RY(a[3], wires=1)
qml.CNOT(wires=[0, 1])
qml.RY(a[4], wires=1)
qml.PauliX(wires=0)
def layer(W):
qml.Rot(W[0, 0], W[0, 1], W[0, 2], wires=0)
qml.Rot(W[1, 0], W[1, 1], W[1, 2], wires=1)
qml.CNOT(wires=[0, 1])
@qml.qnode(dev)
def circuit(weights, angles):
prepare_state(angles)
for W in weights:
layer(W)
return qml.expval(qml.PauliZ(0))
で作っていると思います。特に scikit-qulacs で使えないゲートは使っていないと思うので、これのデッドコピーの回路を LearningCircuit として書けば良いかなと思うのですがいかがでしょうか。(Rot のところは任意の1量子ビットゲートだと思うので、scikit-qulacs 側では例えば RzRxRz の3パラメータゲートで実現すればいいと思います。)
epoch 数に関してはそうですね。バッチサイズをあわせていただければと思います。
scikit_qulacs の回路を PennyLane と同じものにして十分な精度を出すところまでできました. あとは PennyLane のベンチマークのコードをきれいにしてイテレーション数をそろえたらマージできそうです.
@kosukemtr ベンチマークのコードのリファクタリング終わりました.レビューお願いします 🙏
close #116 同じタスクに対する実装を Pennylane のものと比較できるようにしました. 現状は同程度の F1 score を出すのに scikit-qulacs のほうが圧倒的に速いです. また,pennylane の実装はあまり学習が安定していないです(参考: https://github.com/Qulacs-Osaka/scikit-qulacs/runs/5180091309?check_suite_focus=true).
注意点: