重力波検出を量子計算でやってみた（１）

## 0. 概要

- Kaggle の 重力波検出コンペ（[1回目](https://www.kaggle.com/c/g2net-gravitational-wave-detection)、[2回目](https://www.kaggle.com/competitions/g2net-detecting-continuous-gravitational-waves)）に触発されてやってみようと思った。
- 量子計算 [Quanvolutional Neural Network（QNN）](https://pennylane.ai/qml/demos/tutorial_quanvolution.html)を導入してみたらどうだろうか。
- トイ・データでは QNN 有り vs 無し で比較したところ QNN 有り の方が精度が良かった。

## 1. 重力波検出

重力波検出とは、読んで字の如く「**重力波を検出する**」試みです。本記事の内容に関連して押さえておいていただきたい重力波・重力波検出の特徴を下記に挙げておきます。

- 我々の住むこの世界には重力波というものが存在します。**重力波は、重力に関係する物理現象**です。そしてその重力波を検出しようという**重力波検出は、重力研究における重要な観測実験の１つ**です。

- 重力波は、「波」と名前が付いているように、どこかで**発生してから徐々に周囲に伝わっていく**性質を持っています。例えば水面に石が落ちてできる波紋や携帯電話の電波などを想像してもらうとイメージしやすいかもしれません。

- **重力波は（電波などに比べて）非常に微弱なので、観測機器で見つけにくい＆ノイズに埋もれやすいという検出の難しさ**があります。そのため、強い重力を発生させる天体であるブラックホールや中性子星から発生した重力波を検出のターゲットとすることが多いようです。

- [１回目の重力波検出コンペ](https://www.kaggle.com/c/g2net-gravitational-wave-detection)で対象とされたのは、２つのブラックホールが螺旋状に回転しながら近付き合体する過程で放出される重力波でした。比較的ゆっくりとした回転から始まり最終的に速い回転になっていくことを反映して、重力波は徐々に振動数が大きくなる波形（後述の図を参照）となります。

重力波の存在自体は一般相対性理論に基づきアインシュタインによって 1916 年から予言されていましたが、実際に直接検出されたのは比較的近年の2015年だったそうです（[Wikipedia](https://ja.wikipedia.org/wiki/%E9%87%8D%E5%8A%9B%E6%B3%A2_(%E7%9B%B8%E5%AF%BE%E8%AB%96))）。重力波検出の背景については Kaggle の [重力波検出コンペ](https://www.kaggle.com/c/g2net-gravitational-wave-detection) にも記載があるのでよければご覧下さい。


## 2. タスク

本記事の動機となった Kaggle コンペのタスクは、コンペ開催者が作成したシミュレーションデータに対して「重力波を含むか含まないか分類する」というものでした。これに倣い、今回は手元で作成した**トイ・データを対象に、重力波（と見做した信号）を含むか含まないか分類する**ことをタスクにします。  

また個人的に量子コンピュータ周辺に興味があるので、**量子機械学習アルゴリズムである QNN を導入**してやってみることにします。

今回のタスクについてまとめておきます。

- **トイ・データ**
- **重力波を含むか含まないか分類**
- **QNNを導入**

## 3. やったこと

以下の実験で使用したコードは[GitHub](https://github.com/p-circle-kuh/qc_gravitational_wave_detection)にあります。

### 3-1. トイ・データ作成

Kaggle の [1回目の重力波検出コンペ](https://www.kaggle.com/c/g2net-gravitational-wave-detection) と同様に、連星ブラックホールの合体によって放出される重力波を想定して、以下のようなデータを作成しました。

#### 重力波なしのデータ（ノイズ）

一様乱数で生成した、重力波なしのトイ・データの波形例を下図に示します。
※パラメータ
　・ノイズの振幅
![重力波なしのトイデータ](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219280/85a57b54-fcc1-b404-1b17-b06faacc6a22.jpeg)

#### 重力波ありのデータ

上のノイズに重力波信号を合わせた、重力波ありのトイ・データの波形例を下図に示します。
※パラメータ
　・重力波の初期振幅
　・連星合体の時刻
　・重力波の振幅の増幅率・減衰率
　・重力波の周波数
　・ノイズの振幅

![重力波ありのトイデータ波形](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219280/9d78398b-debb-76c4-3ecd-66aaca0eab61.jpeg)


#### 波形データの個数

重力波あり・なしのデータを100個ずつ作成し、合計200個のデータからランダムに100個を訓練用データ、残り100個をテスト用データにしました。

### 3-2. モデルの用意

今回は4つのモデルを比較し、QNNの性能を評価します。
QNNはPennyLaneの[デモ](https://pennylane.ai/qml/demos/tutorial_quanvolution.html)を、1DCNNはKerasの[Code example](https://keras.io/examples/timeseries/timeseries_classification_from_scratch/)を参考にしました。

#### Dense モデル

下記のように、全結合層のみのモデルです。
InputLayerの4はバッチサイズ、1024はデータのサンプリング数です。

![Denseモデル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219280/11a40854-f4c2-df18-ee64-98181948bbe9.png)


#### QNN + Dense モデル

Denseモデルの前に、QNN層を追加したものです。

![QNN+Denseモデル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219280/af6f6187-f739-0fd5-2e38-f36353c73699.png)

QNN層の中身は下記のようになっており、1024個のデータを4つずつ分け、QNNに通した後の出力を、量子ビットごとに繋げていきます。

![QNN_layer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219280/dfec6418-e918-5dda-c0fe-5fa4314538c6.png)


#### Conv1D + Dense モデル

Denseモデルの全結合層の前に、1DCNN層を追加したモデルです。

![1DCNN+Denseモデル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219280/f02a0192-c66f-9186-66b0-a6cb5f92f39e.png)

#### QNN + Conv1D + Dense モデル

Conv1D + Denseモデルの前に、QNN層を追加したモデルです。
QNN層の中身は、QNN+Denseモデルと同じです。

![QNN+1DCNN+Denseモデル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219280/b5d6dce3-b5ac-cbc8-c23b-a0d51a137409.png)

### 3-3. 結果

それぞれのモデルでの分類精度とLossは下図のようになりました。

![noise0.2_train100_test100_v2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1219280/9c04e212-b9a5-fea0-e034-c5037e1bea84.jpeg)

図の上グラフはテストデータに対する分類精度、下グラフはテストデータに対するLossの遷移を描画したものです。上下グラフとも横軸は学習のEpoch数です。

図から、NN単体であるDense(緑)以外のモデルでは、学習Epochが進むに従って精度が良くなっていっていることが見て取れます。これは意図通り重力波の有無を分類できるようになっていっていることを表しています。Dense(緑)については、学習が進むにつれてテストデータに対するLossが大きくなっており、過学習の傾向が見られます。最も性能が良さそうなのはDense+1DCNN＋QNN(水)で、収束も早く10Epoch頃から分類精度95%程度となりました。

個人的に興味のあった QNNあり vs QNNなし の観点では、下表のようになっていることが見て取れます。

|ベース|QNNあり|QNNなし|結果|
|:-:|:-:|:-:|:-:|
|**Conv1Dあり**|(水)|(赤)|(水)優勢|
|**Conv1Dなし**|(青)|(緑)|(青)優勢|

## 4. まとめ

今回は

- **(トイ・データに対して)重力波有無の分類ができた**
- **QNNを導入したほうが精度が良くなる**

という結果になりました。
ただし、以下のような点が気になっています。

- **ノイズの大きさ**
今回のトイ・データは重力波の有無が目視でも判定できた。
一方、実データはSN比が小さく目視で重力波の有無を判定するのは難しい。
- **学習データ数**
ノイズを大きくした場合に学習データを増やす必要があると考えられる。
また、学習データを増やした場合の各モデルの分類精度や QNN による改善効果の検証も行いたい。
- **モデル構成**
今回、QNN＋Conv1D＋Denseの性能が最も良かったのは、他のモデルよりも層が深いためではないかと考えられる。
他のモデルの層を深くした場合との精度比較も行いたい。

次回はこれらの点を検証したいと思います。