Qulacs-Osaka / scikit-qulacs

scikit-qulacs is a library for quantum neural network. This library is based on qulacs and named after scikit-learn.
https://qulacs-osaka.github.io/scikit-qulacs/index.html
MIT License
21 stars 6 forks source link

benchmark with pennylane #134

Closed ikanago closed 2 years ago

ikanago commented 2 years ago

close #116 同じタスクに対する実装を Pennylane のものと比較できるようにしました. 現状は同程度の F1 score を出すのに scikit-qulacs のほうが圧倒的に速いです. また,pennylane の実装はあまり学習が安定していないです(参考: https://github.com/Qulacs-Osaka/scikit-qulacs/runs/5180091309?check_suite_focus=true).

注意点:

kosukemtr commented 2 years ago

見ました。とりあえずpennylaneのチュートリアルにあった2qubitの回路を使うというので了解しました。また別の PR とかで違う量子回路を使って量子ビット数に対する時間の変化を見れればいいかなと思います。以下コメントです。

ikanago commented 2 years ago

量子回路構成を pennylane のチュートリアルに合わせる

この実装では pennylane の回路は自動微分による誤差逆伝播を使っているので,勾配を使わない optimizer を使えば両方の実装を揃えられると思います.ドキュメントを探して試してみます.

epoch 数も双方で合わせていただきたいです

skqulacs の QNNRegressor に渡す maxiter が pennylane の実装における epoch に対応しているというので合っていますか? skqulacs はミニバッチに対応していないので,pennylane の実装でミニバッチのサイズを1にすれば揃えられる思います.

このベンチマークが測っている時間って、binary_classification_pennylane() と binary_classification_skqulacs() が実行される時間であってますか?そうすると skqulacs のほうはデータや回路生成部が時間に入ってしまっていて若干不利になっているように見える

これはその通りなので,データセットを整える部分は外に出すようにします.

kosukemtr commented 2 years ago

回路に関してですが、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パラメータゲートで実現すればいいと思います。)

kosukemtr commented 2 years ago

epoch 数に関してはそうですね。バッチサイズをあわせていただければと思います。

ikanago commented 2 years ago

scikit_qulacs の回路を PennyLane と同じものにして十分な精度を出すところまでできました. あとは PennyLane のベンチマークのコードをきれいにしてイテレーション数をそろえたらマージできそうです.

ikanago commented 2 years ago

@kosukemtr ベンチマークのコードのリファクタリング終わりました.レビューお願いします 🙏