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
19 stars 6 forks source link

`QNNRegressor.n_outputs >= 2` のテストケース #202

Closed ikanago closed 2 years ago

ikanago commented 2 years ago

QNNRegressor.n_outputs >= 2 の場合のテストケースがなかったので追加しようと思うんですが、f(x, y) = (sin(x + y), cos(x - y)) みたいな2出力関数の回帰とかをやるとよさそうですかね? https://app.codecov.io/gh/Qulacs-Osaka/scikit-qulacs/blob/main/skqulacs/qnn/regressor.py

forest1040 commented 2 years ago

よいと思います。

ikanago commented 2 years ago

テストを書いてみたんですが、まったく収束しなくて kill されてしまいますね... https://github.com/Qulacs-Osaka/scikit-qulacs/blob/202-multi-value-regression/tests/test_qnn_regressor.py

forest1040 commented 2 years ago

自分もみてみます。

forest1040 commented 2 years ago

自分の環境では普通に実行できました。。

def main() -> None:
    x_test, y_test, y_pred = test_noisy_sine_two_vars(Bfgs(), 50)
    plt.plot(x_test, y_test, "o", label="Test")
    plt.plot(x_test, y_pred, "o", label="Prediction")
    plt.legend()
    plt.show()
    plt.savefig("test2.png")

test2

ikanago commented 2 years ago

それはもとからあって正常に動いてる2入力1出力のテストなんですが,いま動かないのは2入力2出力test_noisy_two_vars_two_outputs() のほうですね

forest1040 commented 2 years ago

なるほど! test_noisy_two_vars_two_outputs() 見てみます。

ikanago commented 2 years ago

190行目で print(grad) しても一度しか表示されないので,_cost_func_grad で呼ばれてる backprop で詰まってるっぽいですね

ikanago commented 2 years ago

出力次元数のぶんだけ QNNRegressor を用意して動かせばいいので,多出力をサポートしないという選択肢もありえますね. 他のライブラリの実装も見てみます.

forest1040 commented 2 years ago

業務時間外になりましたので、また来週にでも返事を頂ければ。。

test_noisy_two_vars_two_outputs() を実行しました。

なぜか、エラーになりました。。 自分の環境が変?

https://github.com/Qulacs-Osaka/scikit-qulacs/blob/202-multi-value-regression/skqulacs/qnn/regressor.py#L196 の箇所で、"Z {i}"f"Z {i}"にしないといけないような。。

loss値が、0.1499670818098086となり、assert loss < 0.1に引っかかってしまいました。。

ikanago commented 2 years ago

f"Z {i}" にしたら loss の値も同じになりました. これなんで今まで動いてたんでしょうね... Python はこれを黙って実行しちゃうのでつらいですね...

forest1040 commented 2 years ago

これなんで今まで動いてたんでしょうね...

n_outputsが2以上になるケースが少ないから、発覚しなかったんですかね。。