次元拡張したRNNでの画像処理。実行は量子コンピュータ。できればNeural ODEを用いて。
画像の識別処理にはCNNが一般的ですが、FFNNであれ、CNNであれ、ベクトルで処理していることにやや違和感があります。
画像は2次元ですので、行列のまま処理する方がむしろ自然に感じます。
行列のままであれば、縦横無尽にRNNの概念を適応することができるので、前後左右の情報を解釈したNetworkを組むことができるはずです。
この場合、計算はテンソルで考えることになります。
そうなると、計算が膨大になるはずですが、量子コンピュータを用いることで、同時処理ができるのではないかと思っています。
また、RNNを用いることで、離散→連続処理による恩恵を得ることもできそうです。
実現性については割と先の話になりそうですので現在ではタイミングでは思考実験までしか出来ないと思います。
この記事では、思考実験を行うための問題設定までをしてみます。
イントロダクション
画像処理はCNN(畳み込みニューラルネットワーク)が一般的です。
CNNでは、周囲のNxNの領域を取りそれを1つの特徴量として圧縮する(=畳み込む)ことで、周辺の情報に対する関係性を確保しています。
例えば、7x7の画像を3x3で畳み込む場合、畳み込んだ後のデータは 3x3=9次元として処理します。
参照:
CS231n Convolutional Neural Networks for Visual Recognition
よりシンプルなFNNでは7x7=49次元のデータとして処理をするわけですが、どちらのパターンにしても画像をベクトル(=1階のテンソル)で処理しています。
表現したい対象が2次元であるならば、行列(=2階のテンソル)で表現することで連続性を有意味にして描写することができるのではないかと思うのです。
その背景には、RNNの存在があります。RNNでは、サンプリング対象が時系列データである場合に有効なニューラルネットワークです。
直前のデータを学習した際の結果を、次のデータの学習にフィードバックすることを繰り返し行うことで、前後関係を学習結果に反映することができます。
前後関係という概念は、数直線上に設定された、いわば一次元のデータになります。概念的には、一次元上に構成されているRNNを二次元に拡張可能ではないか?というアプローチです。
拡張自体の数学的アプローチは後ほど考えるとして、厄介なのは計算量です。ベクトル(=一階)量のデータでも計算には時間がかかるのに、行列で解釈した場合に発生する処理量は膨大なものになるはずです。
現在のコンピュータの実行速度では、実験的なことはできたとしても、実用化に必要な複雑な計算に対しては到底追いつかないと予測できます。
そこで気になるのは、やはり量子コンピュータの存在です。
量子コンピュータは、量子が持つ複数の状態を利用して、複数の計算を同時に実行することが出来る為、並行処理を非常に高速に実現できるとされています。
その中でも特に近年注目されている量子アニーリング(量子焼きなまし法)は解候補の任意の集合から任意の目的関数の最小値を探す一般的な方法を提供してくれるようで、今回の様に指数関数的(かはまだ不明ですが..?)に増える計算量に追いつくことができる唯一の手段だと言えます。
また、RNNを軸におくことには、別のメリットもあります。Neural ODEの存在です。
ニューラル常微分方程式 / Neural Ordinary Differential Equations - neuralnetな日記
Neural ODEの特徴のひとつに、連続的な時系列のモデルを実現可能であることが挙げられます。
従来であれば、一つの学習器に入れることができるデータの大きさは固定されており、データに欠損がある場合は、なんらかの形でデータを保管する必要がありました。
Neural ODEを活用することで、仮に欠損情報があったとしても、それを無視して計算を進めることができる様になり、精度のさらなる向上が期待できます。
単純なRNNですと、勾配消失問題などの問題により思う通りに収束してくれないことが分かっており、現在の主流はLSTMです。
これを踏まえると各種実験については、RNNを基礎として検討した上で、LSTMまでの拡張をゴールとしておくのが妥当だと考えられます。
テンソルによるRNNの2次元拡張
入力データをx, 中間データを z, 出力結果を yとした時、RNNの伝播式は以下の様に表現できます。
z(t) = activation_hidden( W_xh * x(t) + b_xh + W_hh * z(t-1) + b_hh )
y(t+1) = activation_out( W_hy * z(t) + b_hy )
参考: https://www.renom.jp/ja/notebooks/tutorial/basic_algorithm/LSTM/notebook.html
ここで、W_oo は行列(二階のテンソル)、x(t)、b_oo、z(t)、y(t)はベクトル(一階のテンソル)です。
activation_oo はReLUやSoftmaxなどのなんらかの活性化関数です。
入力層である xをベクトルから行列として扱うのであれば、Wは三階のテンソルということになります。
演算の拡張をするためには、積、和のオペレーションに加え、活性化関数をどの様に扱うかが論点になります。
一般的なRNNの拡張であるLSTMを視野に入れるのであれば、これらを用いてLSTMの表現を確認しておくべきです。
また、次項に繋げるという意味でも、計算量がどのぐらい増えるかを把握しておく必要があります。
まとめると、RNNの画像への拡張において必要な考察は以下の通りとなります。
- 演算拡張のための積、和の定義と活性化関数の表現
- それを用いたLSTMの表現
- 計算量の試算
量子コンピューターによる計算の実現可能性
一般公開されている量子コンピュータは無いと思っていましたが、IBMさんが公開していました。
IBM Quantum Computing で計算してみよう
pythonによるオペレーションが可能なようであり、現在は5から32キュービットの量子コンピュータが利用可能なようです。
quantum-computing.ibm.com
記事を見る限り、量子コンピュータでは計算方法はやはり特殊なようです。
ところまで進めれば良いと思います。
次元拡張したRNNをNeural ODEを用いて解く
Neural ODE(ニューラル常微分方程式)は、文字通り常微分方程式によりニューラルネットワークを解く手法を提供しています。
自然数個のノードによって構成されている離散ネットワークを連続化しています。
連続化することで必ずしも同じステップにデータがある必要はなくなるため、データが不揃いであったとしても、柔軟に処理をすることができます。
RNNはもともと時系列データに向けられて構築されているので、連続化について高い親和性があるように見えます。
ただし、これを次元拡張したLSTMに対して適応するには、複数のステップが必要です。
まず、具体的にRNNをNeural ODEに適応させる必要があります。その後、RNNをLSTMへ拡張させる必要がありますが、これについは正直に申し上げて、イメージが沸いてないのも事実です。
その後、同様の作業を次元拡張したネットワーク上で行う必要があります。
量子コンピュータと直接紐づけるのは難易度が高いので、単純に必要な理論とコードを淡々と書いていくことで進めることとします。
- 一般的なRNNをNeural ODEで解くための理論を構築し、コードを書く
- 一般的なLSTMをNeural ODEで解くための理論を構築し、コードを書く
- 次元拡張したRNNをNeural ODEで解くための理論を構築し、コードを書く
- 次元拡張したLSTMをNeural ODEで解くための理論を構築し、コードを書く
ここまで到達すれば、おそらくこの先の視野が広がると思います。